History

Decoder WP suppor

missed some part fix clip value update according to wayne's suggestion

zhuiling committed 11 years ago

Commit 9ef0c741 parent 2da0ce66 files · +235 −8Browse files

Showing the changes to codec/decoder/core/src (3 of 6 files). Show all

Unified · Split

3 files
  1. codec/decoder/core/src/au_parser.cpp +3 −3
  2. codec/decoder/core/src/decoder_core.cpp +94 −3
  3. codec/decoder/core/src/rec_mb.cpp +127 −1
codec/decoder/core/src/au_parser.cpp+3−3
@@ -1342,10 +1342,10 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux, · 1341 unmodified lines
13421342 pPps->bWeightedPredFlag = !!uiCode;
13431343 WELS_READ_VERIFY (BsGetBits (pBsAux, 2, &uiCode)); //weighted_bipred_idc
13441344 pPps->uiWeightedBipredIdc = uiCode;
1345− if (pPps->bWeightedPredFlag || pPps->uiWeightedBipredIdc != 0) {
1345+ if (pPps->uiWeightedBipredIdc != 0) {
13461346 WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING,
1347− "ParsePps(): weighted_pred_flag (%d) weighted_bipred_idc (%d) neither supported.\n",
1348− pPps->bWeightedPredFlag, pPps->uiWeightedBipredIdc);
1347+ "ParsePps(): weighted_bipred_idc (%d) not supported.\n",
1348+ pPps->uiWeightedBipredIdc);
13491349 return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_WP);
13501350 }
13511351
codec/decoder/core/src/decoder_core.cpp+94−3
@@ -179,6 +179,78 @@ inline int32_t WelsDecodeConstructSlice (PWelsDecoderContext pCtx, PNalUnit pCu · 178 unmodified lines
179179 return iRet;
180180 }
181181
182+int32_t ParsePredWeightedTable (PBitStringAux pBs, PSliceHeader pSh) {
183+ uint32_t uiCode;
184+ int32_t iList = 0;
185+ int32_t iCode;
186+
187+ WELS_READ_VERIFY (BsGetUe (pBs, &uiCode));
188+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (uiCode, 0, 7, "luma_log2_weight_denom",
189+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_LUMA_LOG2_WEIGHT_DENOM));
190+ pSh->sPredWeightTable.uiLumaLog2WeightDenom = uiCode;
191+ if (pSh->pSps->uiChromaArrayType != 0) {
192+ WELS_READ_VERIFY (BsGetUe (pBs, &uiCode));
193+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (uiCode, 0, 7, "chroma_log2_weight_denom",
194+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_CHROMA_LOG2_WEIGHT_DENOM));
195+ pSh->sPredWeightTable.uiChromaLog2WeightDenom = uiCode;
196+ }
197+
198+
199+ do {
200+
201+ for (int i = 0; i < pSh->uiRefCount[iList]; i++) {
202+ //luma
203+ WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode));
204+ if (!!uiCode) {
205+
206+ WELS_READ_VERIFY (BsGetSe (pBs, &iCode));
207+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (iCode, -128, 127, "luma_weight",
208+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_LUMA_WEIGHT));
209+ pSh->sPredWeightTable.sPredList[iList].iLumaWeight[i] = iCode;
210+
211+ WELS_READ_VERIFY (BsGetSe (pBs, &iCode));
212+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (iCode, -128, 127, "luma_offset",
213+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_LUMA_OFFSET));
214+ pSh->sPredWeightTable.sPredList[iList].iLumaOffset[i] = iCode;
215+ } else {
216+ pSh->sPredWeightTable.sPredList[iList].iLumaWeight[i] = 1 << (pSh->sPredWeightTable.uiLumaLog2WeightDenom);
217+ pSh->sPredWeightTable.sPredList[iList].iLumaOffset[i] = 0;
218+
219+ }
220+ //chroma
221+ if (pSh->pSps->uiChromaArrayType == 0)
222+ continue;
223+
224+ WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode));
225+ if (!!uiCode) {
226+ for (int j = 0; j < 2; j++) {
227+
228+
229+ WELS_READ_VERIFY (BsGetSe (pBs, &iCode));
230+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (iCode, -128, 127, "chroma_weight",
231+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_CHROMA_WEIGHT));
232+ pSh->sPredWeightTable.sPredList[iList].iChromaWeight[i][j] = iCode;
233+
234+ WELS_READ_VERIFY (BsGetSe (pBs, &iCode));
235+ WELS_CHECK_SE_BOTH_ERROR_NOLOG (iCode, -128, 127, "chroma_offset",
236+ GENERATE_ERROR_NO (ERR_LEVEL_SLICE_HEADER, ERR_INFO_INVALID_CHROMA_OFFSET));
237+ pSh->sPredWeightTable.sPredList[iList].iChromaOffset[i][j] = iCode;
238+ }
239+ } else {
240+ for (int j = 0; j < 2; j++) {
241+
242+
243+ pSh->sPredWeightTable.sPredList[iList].iChromaWeight[i][j] = 1 << (pSh->sPredWeightTable.uiChromaLog2WeightDenom);
244+ pSh->sPredWeightTable.sPredList[iList].iChromaOffset[i][j] = 0;
245+ }
246+ }
247+
248+ }
249+ ++iList;
250+ } while (iList < LIST_1);//TODO: SUPPORT LIST_A
251+ return ERR_NONE;
252+}
253+
182254 /*
183255 * Predeclared function routines ..
184256 */
@@ -701,6 +773,14 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 516 unmodified lines
701773 return iRet;
702774 }
703775
776+ if (pPps->bWeightedPredFlag && (uiSliceType == P_SLICE)) {
777+ iRet = ParsePredWeightedTable (pBs, pSliceHead);
778+ if (iRet != ERR_NONE) {
779+ WelsLog (pLogCtx, WELS_LOG_WARNING, "invalid weighted prediction syntaxs!");
780+ return iRet;
781+ }
782+ }
783+
704784 if (kbExtensionFlag) {
705785 if (pNalHeaderExt->iNoInterLayerPredFlag || pNalHeaderExt->uiQualityId > 0)
706786 pSliceHeadExt->bBasePredWeightTableFlag = false;
@@ -1042,7 +1122,8 @@ int32_t InitialDqLayersContext (PWelsDecoderContext pCtx, const int32_t kiMaxWid · 335 unmodified lines
10421122 "pCtx->sMb.pMbType[]");
10431123 pCtx->sMb.pMv[i][0] = (int16_t (*)[16][2])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
10441124 int16_t) * MV_A * MB_BLOCK4x4_NUM, "pCtx->sMb.pMv[][]");
1045− pCtx->sMb.pRefIndex[i][0] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
1125+ pCtx->sMb.pRefIndex[i][0] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
1126+ sizeof (
10461127 int8_t) * MB_BLOCK4x4_NUM, "pCtx->sMb.pRefIndex[][]");
10471128 pCtx->sMb.pLumaQp[i] = (int8_t*)WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t),
10481129 "pCtx->sMb.pLumaQp[]");
@@ -1058,7 +1139,8 @@ int32_t InitialDqLayersContext (PWelsDecoderContext pCtx, const int32_t kiMaxWid · 9 unmodified lines
10581139 "pCtx->sMb.pNzcRs[]");
10591140 pCtx->sMb.pScaledTCoeff[i] = (int16_t (*)[MB_COEFF_LIST_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
10601141 sizeof (int16_t) * MB_COEFF_LIST_SIZE, "pCtx->sMb.pScaledTCoeff[]");
1061− pCtx->sMb.pIntraPredMode[i] = (int8_t (*)[8])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t) * 8,
1142+ pCtx->sMb.pIntraPredMode[i] = (int8_t (*)[8])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
1143+ int8_t) * 8,
10621144 "pCtx->sMb.pIntraPredMode[]");
10631145 pCtx->sMb.pIntra4x4FinalMode[i] = (int8_t (*)[MB_BLOCK4x4_NUM])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
10641146 sizeof (int8_t) * MB_BLOCK4x4_NUM, "pCtx->sMb.pIntra4x4FinalMode[]");
@@ -1066,7 +1148,8 @@ int32_t InitialDqLayersContext (PWelsDecoderContext pCtx, const int32_t kiMaxWid · 1 unmodified line
10661148 "pCtx->sMb.pChromaPredMode[]");
10671149 pCtx->sMb.pCbp[i] = (int8_t*)WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int8_t),
10681150 "pCtx->sMb.pCbp[]");
1069− pCtx->sMb.pSubMbType[i] = (int8_t (*)[MB_PARTITION_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (
1151+ pCtx->sMb.pSubMbType[i] = (int8_t (*)[MB_PARTITION_SIZE])WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight *
1152+ sizeof (
10701153 int8_t) * MB_PARTITION_SIZE, "pCtx->sMb.pSubMbType[]");
10711154 pCtx->sMb.pSliceIdc[i] = (int32_t*) WelsMallocz (pCtx->sMb.iMbWidth * pCtx->sMb.iMbHeight * sizeof (int32_t),
10721155 "pCtx->sMb.pSliceIdc[]"); // using int32_t for slice_idc, 4/21/2010
@@ -1846,6 +1929,14 @@ static inline void InitDqLayerInfo (PDqLayer pDqLayer, PLayerInfo pLayerInfo, PN · 773 unmodified lines
18461929 if (kuiQualityId == BASE_QUALITY_ID) {
18471930 pDqLayer->pRefPicListReordering = &pSh->pRefPicListReordering;
18481931 pDqLayer->pRefPicMarking = &pSh->sRefMarking;
1932+
1933+ if (pSh->pPps->bWeightedPredFlag) {
1934+ pDqLayer->bUseWeightPredictionFlag = true;
1935+ pDqLayer->pPredWeightTable = &pSh->sPredWeightTable;
1936+
1937+ } else
1938+ pDqLayer->bUseWeightPredictionFlag = false;
1939+
18491940 pDqLayer->pRefPicBaseMarking = &pShExt->sRefBasePicMarking;
18501941 }
18511942
codec/decoder/core/src/rec_mb.cpp+127−1
@@ -186,7 +186,7 @@ static inline void GetRefPic (sMCRefMember* pMCRefMem, PWelsDecoderContext pCtx, · 185 unmodified lines
186186 #define MC_FLOW_SIMPLE_JUDGE 1
187187 #endif //MC_FLOW_SIMPLE_JUDGE
188188 void BaseMC (sMCRefMember* pMCRefMem, int32_t iXOffset, int32_t iYOffset, SMcFunc* pMCFunc,
189− int32_t iBlkWidth, int32_t iBlkHeight, int16_t iMVs[2]) {
189+ int32_t iBlkWidth, int32_t iBlkHeight, int16_t iMVs[2]) {
190190 int32_t iFullMVx = (iXOffset << 2) + iMVs[0]; //quarter pixel
191191 int32_t iFullMVy = (iYOffset << 2) + iMVs[1];
192192 iFullMVx = WELS_CLIP3 (iFullMVx, ((-PADDING_LENGTH + 2) << 2), ((pMCRefMem->iPicWidth + PADDING_LENGTH - 19) << 2));
@@ -214,6 +214,74 @@ void BaseMC (sMCRefMember* pMCRefMem, int32_t iXOffset, int32_t iYOffset, SMcFun · 21 unmodified lines
214214
215215 }
216216
217+void WeightPrediction (PDqLayer pCurDqLayer, sMCRefMember* pMCRefMem, int32_t iRefIdx, int32_t iBlkWidth,
218+ int32_t iBlkHeight) {
219+
220+
221+ int32_t iLog2denom, iWoc, iOoc;
222+ int32_t iPredTemp, iLineStride;
223+ int32_t iPixel = 0;
224+ uint8_t* pDst;
225+ //luma
226+ iLog2denom = pCurDqLayer->pPredWeightTable->uiLumaLog2WeightDenom;
227+ iWoc = pCurDqLayer->pPredWeightTable->sPredList[LIST_0].iLumaWeight[iRefIdx];
228+ iOoc = pCurDqLayer->pPredWeightTable->sPredList[LIST_0].iLumaOffset[iRefIdx];
229+ iLineStride = pMCRefMem->iDstLineLuma;
230+
231+ for (int i = 0; i < iBlkHeight; i++) {
232+ for (int j = 0; j < iBlkWidth; j++) {
233+ iPixel = j + i * (iLineStride);
234+ if (iLog2denom >= 1) {
235+ iPredTemp = ((pMCRefMem->pDstY[iPixel] * iWoc + (1 << (iLog2denom - 1))) >> iLog2denom) + iOoc;
236+
237+ pMCRefMem->pDstY[iPixel] = WELS_CLIP3 (iPredTemp, 0, 255);
238+ } else {
239+ iPredTemp = pMCRefMem->pDstY[iPixel] * iWoc + iOoc;
240+
241+ pMCRefMem->pDstY[iPixel] = WELS_CLIP3 (iPredTemp, 0, 255);
242+
243+ }
244+ }
245+ }
246+
247+
248+ //UV
249+ iBlkWidth = iBlkWidth >> 2;
250+ iBlkHeight = iBlkHeight >> 2;
251+ iLog2denom = pCurDqLayer->pPredWeightTable->uiChromaLog2WeightDenom;
252+ iLineStride = pMCRefMem->iDstLineChroma;
253+
254+ for (int i = 0; i < 2; i++) {
255+
256+
257+ //iLog2denom = pCurDqLayer->pPredWeightTable->uiChromaLog2WeightDenom;
258+ iWoc = pCurDqLayer->pPredWeightTable->sPredList[LIST_0].iChromaWeight[iRefIdx][i];
259+ iOoc = pCurDqLayer->pPredWeightTable->sPredList[LIST_0].iChromaOffset[iRefIdx][i];
260+ pDst = i ? pMCRefMem->pDstV : pMCRefMem->pDstU;
261+ //iLineStride = pMCRefMem->iDstLineChroma;
262+
263+ for (int i = 0; i < iBlkHeight ; i++) {
264+ for (int j = 0; j < iBlkWidth; j++) {
265+ iPixel = j + i * (iLineStride);
266+ if (iLog2denom >= 1) {
267+ iPredTemp = ((pDst[iPixel] * iWoc + (1 << (iLog2denom - 1))) >> iLog2denom) + iOoc;
268+
269+ pDst[iPixel] = WELS_CLIP3 (iPredTemp, 0, 255);
270+ } else {
271+ iPredTemp = pDst[iPixel] * iWoc + iOoc;
272+
273+ pDst[iPixel] = WELS_CLIP3 (iPredTemp, 0, 255);
274+
275+ }
276+ }
277+
278+ }
279+
280+
281+ }
282+}
283+
284+
217285 void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDecoderContext pCtx) {
218286 sMCRefMember pMCRefMem;
219287 PDqLayer pCurDqLayer = pCtx->pCurDqLayer;
@@ -242,6 +310,9 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 22 unmodified lines
242310
243311 pMCRefMem.iDstLineLuma = iDstLineLuma;
244312 pMCRefMem.iDstLineChroma = iDstLineChroma;
313+
314+ int32_t iRefIndex = 0;
315+
245316 switch (iMBType) {
246317 case MB_TYPE_SKIP:
247318 case MB_TYPE_16x16:
@@ -249,6 +320,11 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 1 unmodified line
249320 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][0][1];
250321 GetRefPic (&pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0);
251322 BaseMC (&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 16, 16, iMVs);
323+
324+ if (pCurDqLayer->bUseWeightPredictionFlag) {
325+ iRefIndex = pCurDqLayer->pRefIndex[0][iMBXY][0];
326+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 16, 16);
327+ }
252328 break;
253329 case MB_TYPE_16x8:
254330 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][0][0];
@@ -256,6 +332,11 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 1 unmodified line
256332 GetRefPic (&pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0);
257333 BaseMC (&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 16, 8, iMVs);
258334
335+ if (pCurDqLayer->bUseWeightPredictionFlag) {
336+ iRefIndex = pCurDqLayer->pRefIndex[0][iMBXY][0];
337+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 16, 8);
338+ }
339+
259340 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][8][0];
260341 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][8][1];
261342 GetRefPic (&pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 8);
@@ -263,12 +344,21 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 1 unmodified line
263344 pMCRefMem.pDstU = pPredCb + (iDstLineChroma << 2);
264345 pMCRefMem.pDstV = pPredCr + (iDstLineChroma << 2);
265346 BaseMC (&pMCRefMem, iMBOffsetX, iMBOffsetY + 8, pMCFunc, 16, 8, iMVs);
347+
348+ if (pCurDqLayer->bUseWeightPredictionFlag) {
349+ iRefIndex = pCurDqLayer->pRefIndex[0][iMBXY][8];
350+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 16, 8);
351+ }
266352 break;
267353 case MB_TYPE_8x16:
268354 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][0][0];
269355 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][0][1];
270356 GetRefPic (&pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], 0);
271357 BaseMC (&pMCRefMem, iMBOffsetX, iMBOffsetY, pMCFunc, 8, 16, iMVs);
358+ if (pCurDqLayer->bUseWeightPredictionFlag) {
359+ iRefIndex = pCurDqLayer->pRefIndex[0][iMBXY][0];
360+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 8, 16);
361+ }
272362
273363 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][2][0];
274364 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][2][1];
@@ -277,6 +367,11 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 2 unmodified lines
277367 pMCRefMem.pDstU = pPredCb + 4;
278368 pMCRefMem.pDstV = pPredCr + 4;
279369 BaseMC (&pMCRefMem, iMBOffsetX + 8, iMBOffsetY, pMCFunc, 8, 16, iMVs);
370+
371+ if (pCurDqLayer->bUseWeightPredictionFlag) {
372+ iRefIndex = pCurDqLayer->pRefIndex[0][iMBXY][2];
373+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 8, 16);
374+ }
280375 break;
281376 case MB_TYPE_8x8:
282377 case MB_TYPE_8x8_REF0: {
@@ -292,6 +387,7 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 9 unmodified lines
292387
293388 iIIdx = ((i >> 1) << 3) + ((i & 1) << 1);
294389 GetRefPic (&pMCRefMem, pCtx, pCurDqLayer->pRefIndex[0][iMBXY], iIIdx);
390+ iRefIndex = pCurDqLayer->bUseWeightPredictionFlag ? pCurDqLayer->pRefIndex[0][iMBXY][iIIdx] : 0;
295391
296392 pDstY = pPredY + iBlk8X + iBlk8Y * iDstLineLuma;
297393 pDstU = pPredCb + (iBlk8X >> 1) + (iBlk8Y >> 1) * iDstLineChroma;
@@ -304,11 +400,21 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 6 unmodified lines
304400 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
305401 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
306402 BaseMC (&pMCRefMem, iXOffset, iYOffset, pMCFunc, 8, 8, iMVs);
403+ if (pCurDqLayer->bUseWeightPredictionFlag) {
404+
405+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 8, 8);
406+ }
407+
307408 break;
308409 case SUB_MB_TYPE_8x4:
309410 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
310411 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
311412 BaseMC (&pMCRefMem, iXOffset, iYOffset, pMCFunc, 8, 4, iMVs);
413+ if (pCurDqLayer->bUseWeightPredictionFlag) {
414+
415+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 8, 4);
416+ }
417+
312418
313419 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx + 4][0];
314420 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx + 4][1];
@@ -316,11 +422,21 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 1 unmodified line
316422 pMCRefMem.pDstU += (iDstLineChroma << 1);
317423 pMCRefMem.pDstV += (iDstLineChroma << 1);
318424 BaseMC (&pMCRefMem, iXOffset, iYOffset + 4, pMCFunc, 8, 4, iMVs);
425+ if (pCurDqLayer->bUseWeightPredictionFlag) {
426+
427+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 8, 4);
428+ }
429+
319430 break;
320431 case SUB_MB_TYPE_4x8:
321432 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx][0];
322433 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx][1];
323434 BaseMC (&pMCRefMem, iXOffset, iYOffset, pMCFunc, 4, 8, iMVs);
435+ if (pCurDqLayer->bUseWeightPredictionFlag) {
436+
437+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 4, 8);
438+ }
439+
324440
325441 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx + 1][0];
326442 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx + 1][1];
@@ -328,6 +444,11 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 1 unmodified line
328444 pMCRefMem.pDstU += 2;
329445 pMCRefMem.pDstV += 2;
330446 BaseMC (&pMCRefMem, iXOffset + 4, iYOffset, pMCFunc, 4, 8, iMVs);
447+ if (pCurDqLayer->bUseWeightPredictionFlag) {
448+
449+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 4, 8);
450+ }
451+
331452 break;
332453 case SUB_MB_TYPE_4x4: {
333454 for (j = 0; j < 4; j++) {
@@ -345,6 +466,11 @@ void GetInterPred (uint8_t* pPredY, uint8_t* pPredCb, uint8_t* pPredCr, PWelsDec · 11 unmodified lines
345466 iMVs[0] = pCurDqLayer->pMv[0][iMBXY][iIIdx + iJIdx][0];
346467 iMVs[1] = pCurDqLayer->pMv[0][iMBXY][iIIdx + iJIdx][1];
347468 BaseMC (&pMCRefMem, iXOffset + iBlk4X, iYOffset + iBlk4Y, pMCFunc, 4, 4, iMVs);
469+ if (pCurDqLayer->bUseWeightPredictionFlag) {
470+
471+ WeightPrediction (pCurDqLayer, &pMCRefMem, iRefIndex, 4, 4);
472+ }
473+
348474 }
349475 }
350476 break;

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t