History

fix subsetsps parse and scalinglist bug fix

huili2 committed 9 years ago

Commit c5a09fa1 parent d0719d59 files · +157 −36Browse files

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

Unified · Split

codec/decoder/core/src/au_parser.cpp+84−19
@@ -1005,7 +1005,7 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 1004 unmodified lines
10051005 pSps->bSeqScalingMatrixPresentFlag = !!uiCode;
10061006
10071007 if (pSps->bSeqScalingMatrixPresentFlag) {
1008− WELS_READ_VERIFY (ParseScalingList (pSps, pBs, 0, pSps->bSeqScalingListPresentFlag, pSps->iScalingList4x4,
1008+ WELS_READ_VERIFY (ParseScalingList (pSps, pBs, 0, 0, pSps->bSeqScalingListPresentFlag, pSps->iScalingList4x4,
10091009 pSps->iScalingList8x8));
10101010 }
10111011 }
@@ -1134,9 +1134,18 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 122 unmodified lines
11341134 }
11351135 WELS_READ_VERIFY (BsGetOneBit (pBs, &uiCode)); //vui_parameters_present_flag
11361136 pSps->bVuiParamPresentFlag = !!uiCode;
1137− if (pSps->bVuiParamPresentFlag && !kbUseSubsetFlag) { //parse Part of Vui Parameters in avc sps only
1138− WELS_READ_VERIFY (ParseVui (pCtx, pSps, pBsAux));
1137+ if (pSps->bVuiParamPresentFlag) {
1138+ int iRetVui = ParseVui (pCtx, pSps, pBsAux);
1139+ if (iRetVui == GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_VUI_HRD)) {
1140+ if (kbUseSubsetFlag) { //Currently do no support VUI with HRD enable in subsetSPS
1141+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_ERROR, "hrd parse in vui of subsetSPS is not supported!");
1142+ return iRetVui;
1143+ }
1144+ } else {
1145+ WELS_READ_VERIFY (iRetVui);
1146+ }
11391147 }
1148+
11401149 if (pCtx->pParam->bParseOnly) {
11411150 if (kSrcNalLen >= SPS_PPS_BS_SIZE - 4) { //sps bs exceeds!
11421151 pCtx->iErrorCode |= dsOutOfMemory;
@@ -1408,12 +1417,12 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux, · 265 unmodified lines
14081417 pPps->bPicScalingMatrixPresentFlag = !!uiCode;
14091418 if (pPps->bPicScalingMatrixPresentFlag) {
14101419 if (pCtx->bSpsAvailFlags[pPps->iSpsId]) {
1411− WELS_READ_VERIFY (ParseScalingList (&pCtx->sSpsBuffer[pPps->iSpsId], pBsAux, 1, pPps->bPicScalingListPresentFlag,
1412− pPps->iScalingList4x4, pPps->iScalingList8x8));
1420+ WELS_READ_VERIFY (ParseScalingList (&pCtx->sSpsBuffer[pPps->iSpsId], pBsAux, 1, pPps->bTransform8x8ModeFlag,
1421+ pPps->bPicScalingListPresentFlag, pPps->iScalingList4x4, pPps->iScalingList8x8));
14131422 } else {
14141423 pCtx->bSpsLatePps = true;
1415− WELS_READ_VERIFY (ParseScalingList (NULL, pBsAux, 1, pPps->bPicScalingListPresentFlag, pPps->iScalingList4x4,
1416− pPps->iScalingList8x8));
1424+ WELS_READ_VERIFY (ParseScalingList (NULL, pBsAux, 1, pPps->bTransform8x8ModeFlag, pPps->bPicScalingListPresentFlag,
1425+ pPps->iScalingList4x4, pPps->iScalingList8x8));
14171426 }
14181427 }
14191428 WELS_READ_VERIFY (BsGetSe (pBsAux, &iCode)); //second_chroma_qp_index_offset
@@ -1459,6 +1468,15 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux, · 39 unmodified lines
14591468 }
14601469 return ERR_NONE;
14611470 }
1471+
1472+#define VUI_MAX_CHROMA_LOG_TYPE_TOP_BOTTOM_FIELD_MAX 5
1473+#define VUI_NUM_UNITS_IN_TICK_MIN 1
1474+#define VUI_TIME_SCALE_MIN 1
1475+#define VUI_MAX_BYTES_PER_PIC_DENOM_MAX 16
1476+#define VUI_MAX_BITS_PER_MB_DENOM_MAX 16
1477+#define VUI_LOG2_MAX_MV_LENGTH_HOR_MAX 16
1478+#define VUI_LOG2_MAX_MV_LENGTH_VER_MAX 16
1479+#define VUI_MAX_DEC_FRAME_BUFFERING_MAX 16
14621480 int32_t ParseVui (PWelsDecoderContext pCtx, PSps pSps, PBitStringAux pBsAux) {
14631481 uint32_t uiCode;
14641482 PVui pVui = &pSps->sVui;
@@ -1506,11 +1524,11 @@ int32_t ParseVui (PWelsDecoderContext pCtx, PSps pSps, PBitStringAux pBsAux) { · 41 unmodified lines
15061524 if (pVui->bChromaLocInfoPresentFlag) {
15071525 WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //chroma_sample_loc_type_top_field
15081526 pVui->uiChromaSampleLocTypeTopField = uiCode;
1509− WELS_CHECK_SE_UPPER_WARNING (pVui->uiChromaSampleLocTypeTopField, VUI_MAX_CHROMA_LOG_TYPE_TOP_BOTTOM_FIELD,
1527+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiChromaSampleLocTypeTopField, VUI_MAX_CHROMA_LOG_TYPE_TOP_BOTTOM_FIELD_MAX,
15101528 "chroma_sample_loc_type_top_field");
15111529 WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //chroma_sample_loc_type_bottom_field
15121530 pVui->uiChromaSampleLocTypeBottomField = uiCode;
1513− WELS_CHECK_SE_UPPER_WARNING (pVui->uiChromaSampleLocTypeBottomField, VUI_MAX_CHROMA_LOG_TYPE_TOP_BOTTOM_FIELD,
1531+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiChromaSampleLocTypeBottomField, VUI_MAX_CHROMA_LOG_TYPE_TOP_BOTTOM_FIELD_MAX,
15141532 "chroma_sample_loc_type_bottom_field");
15151533 }
15161534 WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //timing_info_present_flag
@@ -1522,17 +1540,60 @@ int32_t ParseVui (PWelsDecoderContext pCtx, PSps pSps, PBitStringAux pBsAux) { · 5 unmodified lines
15221540 WELS_READ_VERIFY (BsGetBits (pBsAux, 16, &uiCode)); //num_units_in_tick
15231541 uiTmp |= uiCode;
15241542 pVui->uiNumUnitsInTick = uiTmp;
1525− WELS_CHECK_SE_LOWER_WARNING (pVui->uiNumUnitsInTick, 1, "num_units_in_tick");
1543+ WELS_CHECK_SE_LOWER_WARNING (pVui->uiNumUnitsInTick, VUI_NUM_UNITS_IN_TICK_MIN, "num_units_in_tick");
15261544 WELS_READ_VERIFY (BsGetBits (pBsAux, 16, &uiCode)); //time_scale
15271545 uiTmp = (uiCode << 16);
15281546 WELS_READ_VERIFY (BsGetBits (pBsAux, 16, &uiCode)); //time_scale
15291547 uiTmp |= uiCode;
15301548 pVui->uiTimeScale = uiTmp;
1549+ WELS_CHECK_SE_LOWER_WARNING (pVui->uiNumUnitsInTick, VUI_TIME_SCALE_MIN, "time_scale");
15311550 WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //fixed_frame_rate_flag
15321551 pVui->bFixedFrameRateFlag = !!uiCode;
15331552 }
1534− //following HRD related parameters, omitted
1535−
1553+ WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //nal_hrd_parameters_present_flag
1554+ pVui->bNalHrdParamPresentFlag = !!uiCode;
1555+ if (pVui->bNalHrdParamPresentFlag) { //HRD parse not supported
1556+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "nal_hrd_parameters_present_flag = 1 not supported.");
1557+ return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_VUI_HRD);
1558+ }
1559+ WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //vcl_hrd_parameters_present_flag
1560+ pVui->bVclHrdParamPresentFlag = !!uiCode;
1561+ if (pVui->bVclHrdParamPresentFlag) { //HRD parse not supported
1562+ WelsLog (& (pCtx->sLogCtx), WELS_LOG_WARNING, "vcl_hrd_parameters_present_flag = 1 not supported.");
1563+ return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_VUI_HRD);
1564+ }
1565+ WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //pic_struct_present_flag
1566+ pVui->bPicStructPresentFlag = !!uiCode;
1567+ WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //bitstream_restriction_flag
1568+ pVui->bBitstreamRestrictionFlag = !!uiCode;
1569+ if (pVui->bBitstreamRestrictionFlag) {
1570+ WELS_READ_VERIFY (BsGetOneBit (pBsAux, &uiCode)); //motion_vectors_over_pic_boundaries_flag
1571+ pVui->bMotionVectorsOverPicBoundariesFlag = !!uiCode;
1572+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //max_bytes_per_pic_denom
1573+ pVui->uiMaxBytesPerPicDenom = uiCode;
1574+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiMaxBytesPerPicDenom, VUI_MAX_BYTES_PER_PIC_DENOM_MAX,
1575+ "max_bytes_per_pic_denom");
1576+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //max_bits_per_mb_denom
1577+ pVui->uiMaxBitsPerMbDenom = uiCode;
1578+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiMaxBitsPerMbDenom, VUI_MAX_BITS_PER_MB_DENOM_MAX,
1579+ "max_bits_per_mb_denom");
1580+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //log2_max_mv_length_horizontal
1581+ pVui->uiLog2MaxMvLengthHorizontal = uiCode;
1582+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiLog2MaxMvLengthHorizontal, VUI_LOG2_MAX_MV_LENGTH_HOR_MAX,
1583+ "log2_max_mv_length_horizontal");
1584+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //log2_max_mv_length_vertical
1585+ pVui->uiLog2MaxMvLengthVertical = uiCode;
1586+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiLog2MaxMvLengthVertical, VUI_LOG2_MAX_MV_LENGTH_VER_MAX,
1587+ "log2_max_mv_length_vertical");
1588+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //max_num_reorder_frames
1589+ pVui->uiMaxNumReorderFrames = uiCode;
1590+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiMaxNumReorderFrames, VUI_MAX_DEC_FRAME_BUFFERING_MAX,
1591+ "max_num_reorder_frames");
1592+ WELS_READ_VERIFY (BsGetUe (pBsAux, &uiCode)); //max_dec_frame_buffering
1593+ pVui->uiMaxDecFrameBuffering = uiCode;
1594+ WELS_CHECK_SE_UPPER_WARNING (pVui->uiMaxDecFrameBuffering, VUI_MAX_DEC_FRAME_BUFFERING_MAX,
1595+ "max_num_reorder_frames");
1596+ }
15361597 return ERR_NONE;
15371598 }
15381599 /*!
@@ -1593,8 +1654,8 @@ int32_t SetScalingListValue (uint8_t* pScalingList, int iScalingListNum, bool* b · 54 unmodified lines
15931654 return ERR_NONE;
15941655 }
15951656
1596−int32_t ParseScalingList (PSps pSps, PBitStringAux pBs, bool bPPS, bool* pScalingListPresentFlag,
1597− uint8_t (*iScalingList4x4)[16], uint8_t (*iScalingList8x8)[64]) {
1657+int32_t ParseScalingList (PSps pSps, PBitStringAux pBs, bool bPPS, const bool kbTrans8x8ModeFlag,
1658+ bool* pScalingListPresentFlag, uint8_t (*iScalingList4x4)[16], uint8_t (*iScalingList8x8)[64]) {
15981659 uint32_t uiScalingListNum;
15991660 uint32_t uiCode;
16001661
@@ -1603,11 +1664,15 @@ int32_t ParseScalingList (PSps pSps, PBitStringAux pBs, bool bPPS, bool* pScalin · 2 unmodified lines
16031664 bool bInit = false;
16041665 const uint8_t* defaultScaling[4];
16051666
1606− if (pSps != NULL) {
1607− uiScalingListNum = (pSps->uiChromaFormatIdc != 3) ? 8 : 12;
1608− bInit = bPPS && pSps->bSeqScalingMatrixPresentFlag;
1609− } else
1610− uiScalingListNum = 12;
1667+ if (!bPPS) { //sps scaling_list
1668+ if (pSps != NULL) {
1669+ uiScalingListNum = (pSps->uiChromaFormatIdc != 3) ? 8 : 12;
1670+ bInit = bPPS && pSps->bSeqScalingMatrixPresentFlag;
1671+ } else
1672+ uiScalingListNum = 12;
1673+ } else { //pps scaling_list
1674+ uiScalingListNum = 6 + (int32_t) kbTrans8x8ModeFlag * ((pSps->uiChromaFormatIdc != 3) ? 2 : 6);
1675+ }
16111676
16121677 //Init default_scaling_list value for sps or pps
16131678 defaultScaling[0] = bInit ? pSps->iScalingList4x4[0] : g_kuiDequantScaling4x4Default[0];

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