ref: dbd994ee852e77583186f0ebc18f0bcf3aae090f
parent: be66f01228b3bc33958f8082aa038b92140461ab
author: Sigrid Solveig Haflínudóttir <ftrvxmtrx@gmail.com>
date: Thu Feb 11 07:32:25 EST 2021
h264: remove more of treason-specific code, reuse what is already in openh264
--- a/decoder_h264.c
+++ b/decoder_h264.c
@@ -11,6 +11,9 @@
typedef struct Aux Aux;
struct Aux {+ SPictReoderingStatus;
+ SPictInfo pics[16];
+
SWelsDecoderContext ctx;
SLogContext logctx;
SBufferInfo info;
@@ -18,15 +21,6 @@
SVlcTable vlctbl;
SDecoderStatistics stat;
uint8_t *data[3];
-
- /* reordering */
- SPictInfo pics[16];
- int npics;
- int lastgopremain;
- int lastwritten;
- int lbufpicind;
- int minpoc;
- int picind;
};
static void
@@ -46,17 +40,17 @@
{int i, firstvalid;
- if(a->npics > 0){+ if(a->iNumOfPicts > 0){ if(a->ctx.pLastDecPicInfo->pPreviousDecodedPictureInDpb && a->ctx.pLastDecPicInfo->pPreviousDecodedPictureInDpb->bNewSeqBegin){- a->lastgopremain = a->npics;
+ a->iLastGOPRemainPicts = a->iNumOfPicts;
- for(i = 0; i <= a->lbufpicind; i++)
+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++)
a->pics[i].bLastGOP = a->pics[i].iPOC > IMinInt32;
}else{- for(i = 0; i <= a->lbufpicind; i++){+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++){ if(a->pics[i].iPOC == a->ctx.pSliceHeader->iPicOrderCntLsb){- a->lastgopremain = a->npics;
- for(i = 0; i <= a->lbufpicind; i++)
+ a->iLastGOPRemainPicts = a->iNumOfPicts;
+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++)
a->pics[i].bLastGOP = a->pics[i].iPOC > IMinInt32;
break;
}
@@ -73,100 +67,84 @@
a->ctx.pLastDecPicInfo->pPreviousDecodedPictureInDpb->iRefCount++;
a->pics[i].bLastGOP = false;
a->info.iBufferStatus = 0;
- a->npics++;
- if(i > a->lbufpicind)
- a->lbufpicind = i;
+ a->iNumOfPicts++;
+ if(a->iLargestBufferedPicIndex < i)
+ a->iLargestBufferedPicIndex = i;
break;
}
}
PPicBuff picbuf = a->ctx.pPicBuff;
- if(a->lastgopremain > 0){- a->minpoc = IMinInt32;
+ if(a->iLastGOPRemainPicts > 0){+ a->iMinPOC = IMinInt32;
firstvalid = -1;
- for(i = 0; i <= a->lbufpicind; i++){- if(a->minpoc == IMinInt32 && a->pics[i].iPOC > IMinInt32 && a->pics[i].bLastGOP){- a->minpoc = a->pics[i].iPOC;
- a->picind = i;
+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++){+ if(a->iMinPOC == IMinInt32 && a->pics[i].iPOC > IMinInt32 && a->pics[i].bLastGOP){+ a->iMinPOC = a->pics[i].iPOC;
+ a->iPictInfoIndex = i;
firstvalid = i;
break;
}
}
- for(i = 0; i <= a->lbufpicind; i++){+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++){if(i == firstvalid)
continue;
- if(a->pics[i].iPOC > IMinInt32 && a->pics[i].iPOC < a->minpoc && a->pics[i].bLastGOP){- a->minpoc = a->pics[i].iPOC;
- a->picind = i;
+ if(a->pics[i].iPOC > IMinInt32 && a->pics[i].iPOC < a->iMinPOC && a->pics[i].bLastGOP){+ a->iMinPOC = a->pics[i].iPOC;
+ a->iPictInfoIndex = i;
}
}
- a->lastwritten = a->minpoc;
- memmove(&a->info, &a->pics[a->picind].sBufferInfo, sizeof(a->info));
+ a->iLastWrittenPOC = a->iMinPOC;
+ memmove(&a->info, &a->pics[a->iPictInfoIndex].sBufferInfo, sizeof(a->info));
a->data[0] = a->info.pDst[0];
a->data[1] = a->info.pDst[1];
a->data[2] = a->info.pDst[2];
- a->pics[a->picind].iPOC = IMinInt32;
- picbuf->ppPic[a->pics[a->picind].iPicBuffIdx]->iRefCount--;
- a->pics[a->picind].bLastGOP = false;
- a->minpoc = IMinInt32;
- a->npics--;
- a->lastgopremain--;
- if(a->lastgopremain == 0)
- a->lastwritten = IMinInt32;
+ a->pics[a->iPictInfoIndex].iPOC = IMinInt32;
+ picbuf->ppPic[a->pics[a->iPictInfoIndex].iPicBuffIdx]->iRefCount--;
+ a->pics[a->iPictInfoIndex].bLastGOP = false;
+ a->iMinPOC = IMinInt32;
+ a->iNumOfPicts--;
+ a->iLastGOPRemainPicts--;
+ if(a->iLastGOPRemainPicts == 0)
+ a->iLastWrittenPOC = IMinInt32;
return;
}
- if(a->npics > 0){- a->minpoc = IMinInt32;
+ if(a->iNumOfPicts > 0){+ a->iMinPOC = IMinInt32;
firstvalid = -1;
- for(i = 0; i <= a->lbufpicind; i++){- if(a->minpoc == IMinInt32 && a->pics[i].iPOC > IMinInt32){- a->minpoc = a->pics[i].iPOC;
- a->picind = i;
+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++){+ if(a->iMinPOC == IMinInt32 && a->pics[i].iPOC > IMinInt32){+ a->iMinPOC = a->pics[i].iPOC;
+ a->iPictInfoIndex = i;
firstvalid = i;
break;
}
}
- for(i = 0; i <= a->lbufpicind; i++){+ for(i = 0; i <= a->iLargestBufferedPicIndex; i++){if(i == firstvalid)
continue;
- if(a->pics[i].iPOC > IMinInt32 && a->pics[i].iPOC < a->minpoc){- a->minpoc = a->pics[i].iPOC;
- a->picind = i;
+ if(a->pics[i].iPOC > IMinInt32 && a->pics[i].iPOC < a->iMinPOC){+ a->iMinPOC = a->pics[i].iPOC;
+ a->iPictInfoIndex = i;
}
}
}
- if(a->minpoc > IMinInt32 && ((a->lastwritten > IMinInt32 && a->minpoc - a->lastwritten <= 1) || a->minpoc < a->ctx.pSliceHeader->iPicOrderCntLsb)){- a->lastwritten = a->minpoc;
- memmove(&a->info, &a->pics[a->picind].sBufferInfo, sizeof(a->info));
+
+ if(a->iMinPOC > IMinInt32 && ((a->iLastWrittenPOC > IMinInt32 && a->iMinPOC - a->iLastWrittenPOC <= 1) || a->iMinPOC < a->ctx.pSliceHeader->iPicOrderCntLsb)){+ a->iLastWrittenPOC = a->iMinPOC;
+ memmove(&a->info, &a->pics[a->iPictInfoIndex].sBufferInfo, sizeof(a->info));
a->data[0] = a->info.pDst[0];
a->data[1] = a->info.pDst[1];
a->data[2] = a->info.pDst[2];
- a->pics[a->picind].iPOC = IMinInt32;
- picbuf->ppPic[a->pics[a->picind].iPicBuffIdx]->iRefCount--;
- a->pics[a->picind].bLastGOP = false;
- a->minpoc = IMinInt32;
- a->npics--;
+ a->pics[a->iPictInfoIndex].iPOC = IMinInt32;
+ picbuf->ppPic[a->pics[a->iPictInfoIndex].iPicBuffIdx]->iRefCount--;
+ a->pics[a->iPictInfoIndex].bLastGOP = false;
+ a->iMinPOC = IMinInt32;
+ a->iNumOfPicts--;
}
}
-static void
-resetreorder(Aux *a, int full)
-{- int i;
-
- a->npics = 0;
- a->lastgopremain = 0;
- a->lastwritten = IMinInt32;
- a->minpoc = IMinInt32;
- a->picind = 0;
- for(i = 0; i < (full ? nelem(a->pics) : (a->lbufpicind+1)); i++){- a->pics[i].bLastGOP = false;
- a->pics[i].iPOC = IMinInt32;
- }
- a->lbufpicind = 0;
-}
-
static char *
err2s(int err)
{@@ -283,7 +261,7 @@
fprint(2, "h264: frame %llud: %r\n", framenum);
/* FIXME the frames are finished but there might still be left-overs */
- resetreorder(a, 0);
+ ResetReorderingPictureBuffers(a, a->pics, false);
WelsResetRefPic(&a->ctx);
done:
@@ -307,6 +285,7 @@
a->ctx.pVlcTable = &a->vlctbl;
a->ctx.pDecoderStatistics = &a->stat;
a->ctx.pMemAlign = &cMemoryAlign;
+ a->ctx.pPictReoderingStatus = a;
a->logctx.pfLog = logfun;
a->ctx.sLogCtx = a->logctx;
@@ -313,7 +292,7 @@
a->ctx.pParam = calloc(1, sizeof(SDecodingParam));
a->ctx.pParam->sVideoProperty.eVideoBsType = VIDEO_BITSTREAM_DEFAULT;
- resetreorder(a, 1);
+ ResetReorderingPictureBuffers(a, a->pics, true);
if((res = WelsInitDecoder(&a->ctx, &a->logctx)) != 0){ werrstr("WelsInitDecoder: %s", err2s(res));--
⑨