Decoder WP support
Showing the changes to codec/decoder/core/src/decoder_core.cpp (1 of 6 files). Show all
Unified · Split
| @@ -179,6 +179,78 @@ inline int32_t WelsDecodeConstructSlice (PWelsDecoderContext pCtx, PNalUnit pCu · 178 unmodified lines | ||
| 179 | 179 | return iRet; |
| 180 | 180 | } |
| 181 | 181 | |
| 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 | + | |
| 182 | 254 | /* |
| 183 | 255 | * Predeclared function routines .. |
| 184 | 256 | */ |
| @@ -728,6 +800,14 @@ int32_t ParseSliceHeaderSyntaxs (PWelsDecoderContext pCtx, PBitStringAux pBs, co · 543 unmodified lines | ||
| 728 | 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 | 811 | if (kbExtensionFlag) { |
| 732 | 812 | if (pNalHeaderExt->iNoInterLayerPredFlag || pNalHeaderExt->uiQualityId > 0) |
| 733 | 813 | pSliceHeadExt->bBasePredWeightTableFlag = false; |
| @@ -1876,6 +1956,14 @@ static inline void InitDqLayerInfo (PDqLayer pDqLayer, PLayerInfo pLayerInfo, PN · 1142 unmodified lines | ||
| 1876 | 1956 | if (kuiQualityId == BASE_QUALITY_ID) { |
| 1877 | 1957 | pDqLayer->pRefPicListReordering = &pSh->pRefPicListReordering; |
| 1878 | 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 | 1967 | pDqLayer->pRefPicBaseMarking = &pShExt->sRefBasePicMarking; |
| 1880 | 1968 | } |
| 1881 | 1969 | |