History

Merge pull request #1829 from syureyi/wp_p

Decoder WP support

dongzha committed 11 years ago

Commit 5b125782 parents 5a1aedb 9ef0c746 files · +229 −5Browse files

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

Unified · Split

codec/decoder/core/src/decoder_core.cpp+88−0
@@ -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 */
@@ -728,6 +800,14 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 543 unmodified lines
728800 return iRet;
729801 }
730802
803+ if (pPps->bWeightedPredFlag && (uiSliceType == P_SLICE)) {
804+ iRet = ParsePredWeightedTable (pBs, pSliceHead);
805+ if (iRet != ERR_NONE) {
806+ WelsLog (pLogCtx, WELS_LOG_WARNING, "invalid weighted prediction syntaxs!");
807+ return iRet;
808+ }
809+ }
810+
731811 if (kbExtensionFlag) {
732812 if (pNalHeaderExt->iNoInterLayerPredFlag || pNalHeaderExt->uiQualityId > 0)
733813 pSliceHeadExt->bBasePredWeightTableFlag = false;
@@ -1876,6 +1956,14 @@ static inline void InitDqLayerInfo (PDqLayer pDqLayer, PLayerInfo pLayerInfo, PN · 1142 unmodified lines
18761956 if (kuiQualityId == BASE_QUALITY_ID) {
18771957 pDqLayer->pRefPicListReordering = &pSh->pRefPicListReordering;
18781958 pDqLayer->pRefPicMarking = &pSh->sRefMarking;
1959+
1960+ if (pSh->pPps->bWeightedPredFlag) {
1961+ pDqLayer->bUseWeightPredictionFlag = true;
1962+ pDqLayer->pPredWeightTable = &pSh->sPredWeightTable;
1963+
1964+ } else
1965+ pDqLayer->bUseWeightPredictionFlag = false;
1966+
18791967 pDqLayer->pRefPicBaseMarking = &pShExt->sRefBasePicMarking;
18801968 }
18811969

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