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
179 return iRet;179 return iRet;
180}180}
181 181
182int32_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
182/*254/*
183 * Predeclared function routines ..255 * Predeclared function routines ..
184 */256 */
@@ -728,6 +800,14 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 543 unmodified lines
728 return iRet;800 return iRet;
729 }801 }
730 802
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
731 if (kbExtensionFlag) {811 if (kbExtensionFlag) {
732 if (pNalHeaderExt->iNoInterLayerPredFlag || pNalHeaderExt->uiQualityId > 0)812 if (pNalHeaderExt->iNoInterLayerPredFlag || pNalHeaderExt->uiQualityId > 0)
733 pSliceHeadExt->bBasePredWeightTableFlag = false;813 pSliceHeadExt->bBasePredWeightTableFlag = false;
@@ -1876,6 +1956,14 @@ static inline void InitDqLayerInfo (PDqLayer pDqLayer, PLayerInfo pLayerInfo, PN · 1142 unmodified lines
1876 if (kuiQualityId == BASE_QUALITY_ID) {1956 if (kuiQualityId == BASE_QUALITY_ID) {
1877 pDqLayer->pRefPicListReordering = &pSh->pRefPicListReordering;1957 pDqLayer->pRefPicListReordering = &pSh->pRefPicListReordering;
1878 pDqLayer->pRefPicMarking = &pSh->sRefMarking;1958 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
1879 pDqLayer->pRefPicBaseMarking = &pShExt->sRefBasePicMarking;1967 pDqLayer->pRefPicBaseMarking = &pShExt->sRefBasePicMarking;
1880 }1968 }
1881 1969

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