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 | return iRet; | 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 | * 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 | ||