History

add decoder syntax checks

Licai Guo committed 12 years ago

Commit 61b64191 parent fe766fe5 files · +261 −40Browse files

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

Unified · Split

codec/decoder/core/src/au_parser.cpp+98−22
@@ -600,6 +600,17 @@ void ParsePrefixNalUnit (PWelsDecoderContext pCtx, PBitStringAux pBs) { · 599 unmodified lines
600600 }
601601 }
602602
603+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_LEFT_OFFSET_MIN -32768
604+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_LEFT_OFFSET_MAX 32767
605+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_TOP_OFFSET_MIN -32768
606+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_TOP_OFFSET_MAX 32767
607+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_RIGHT_OFFSET_MIN -32768
608+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_RIGHT_OFFSET_MAX 32767
609+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_BOTTOM_OFFSET_MIN -32768
610+#define SUBSET_SPS_SEQ_SCALED_REF_LAYER_BOTTOM_OFFSET_MAX 32767
611+
612+
613+
603614
604615 int32_t DecodeSpsSvcExt (PWelsDecoderContext pCtx, PSubsetSps pSpsExt, PBitStringAux pBs) {
605616 PSpsSvcExt pExt = NULL;
@@ -633,9 +644,17 @@ int32_t DecodeSpsSvcExt (PWelsDecoderContext pCtx, PSubsetSps pSpsExt, PBitStrin · 27 unmodified lines
633644 pExt->uiSeqRefLayerChromaPhaseYPlus1 = BsGetBits (pBs, 2);
634645
635646 kpPos->iLeftOffset = BsGetSe (pBs);
647+ WELS_CHECK_SE_BOTH_WARNING (kpPos->iLeftOffset, SUBSET_SPS_SEQ_SCALED_REF_LAYER_LEFT_OFFSET_MIN,
648+ SUBSET_SPS_SEQ_SCALED_REF_LAYER_LEFT_OFFSET_MAX, "seq_scaled_ref_layer_left_offset");
636649 kpPos->iTopOffset = BsGetSe (pBs);
650+ WELS_CHECK_SE_BOTH_WARNING (kpPos->iTopOffset, SUBSET_SPS_SEQ_SCALED_REF_LAYER_TOP_OFFSET_MIN,
651+ SUBSET_SPS_SEQ_SCALED_REF_LAYER_TOP_OFFSET_MAX, "seq_scaled_ref_layer_top_offset");
637652 kpPos->iRightOffset = BsGetSe (pBs);
653+ WELS_CHECK_SE_BOTH_WARNING (kpPos->iRightOffset, SUBSET_SPS_SEQ_SCALED_REF_LAYER_RIGHT_OFFSET_MIN,
654+ SUBSET_SPS_SEQ_SCALED_REF_LAYER_RIGHT_OFFSET_MAX, "seq_scaled_ref_layer_right_offset");
638655 kpPos->iBottomOffset = BsGetSe (pBs);
656+ WELS_CHECK_SE_BOTH_WARNING (kpPos->iBottomOffset, SUBSET_SPS_SEQ_SCALED_REF_LAYER_BOTTOM_OFFSET_MIN,
657+ SUBSET_SPS_SEQ_SCALED_REF_LAYER_BOTTOM_OFFSET_MAX, "seq_scaled_ref_layer_bottom_offset");
639658 }
640659
641660 pExt->bSeqTCoeffLevelPredFlag = !!BsGetOneBit (pBs);
@@ -675,7 +694,7 @@ const SLevelLimits *GetLevelLimits(int32_t iLevelIdx, bool bConstraint3) { · 33 unmodified lines
675694 case 10:
676695 return &g_kSLevelLimits[0];
677696 case 11:
678− if(bConstraint3)
697+ if (bConstraint3)
679698 return &g_kSLevelLimits[1];
680699 else
681700 return &g_kSLevelLimits[2];
@@ -712,6 +731,16 @@ const SLevelLimits *GetLevelLimits(int32_t iLevelIdx, bool bConstraint3) { · 30 unmodified lines
712731 }
713732 return NULL;
714733 }
734+
735+#define SPS_LOG2_MAX_FRAME_NUM_MINUS4_MAX 12
736+#define SPS_LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4_MAX 12
737+#define SPS_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE_MAX 255
738+#define SPS_MAX_NUM_REF_FRAMES_MAX 16
739+#define PPS_PIC_INIT_QP_QS_MIN 0
740+#define PPS_PIC_INIT_QP_QS_MAX 51
741+#define PPS_CHROMA_QP_INDEX_OFFSET_MIN -12
742+#define PPS_CHROMA_QP_INDEX_OFFSET_MAX 12
743+
715744 /*!
716745 *************************************************************************************
717746 * \brief to parse Sequence Parameter Set (SPS)
@@ -728,7 +757,6 @@ const SLevelLimits *GetLevelLimits(int32_t iLevelIdx, bool bConstraint3) { · 10 unmodified lines
728757 *************************************************************************************
729758 */
730759
731−
732760 int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicWidth, int32_t* pPicHeight) {
733761 PBitStringAux pBs = pBsAux;
734762 PSps pSps = NULL;
@@ -737,10 +765,10 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 2 unmodified lines
737765 ProfileIdc uiProfileIdc;
738766 uint8_t uiLevelIdc;
739767 int32_t iSpsId;
768+ uint32_t uiTmp;
740769 bool bConstraintSetFlags[6] = { false };
741770 const bool kbUseSubsetFlag = IS_SUBSET_SPS_NAL (pNalHead->eNalUnitType);
742771
743−
744772 if (kbUseSubsetFlag) { // SubsetSps
745773 pCtx->bSubspsExistAheadFlag = true;
746774 } else { // Sps
@@ -799,12 +827,11 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 52 unmodified lines
799827 pCtx->bSpsAvailFlags[iSpsId] = true; // added for EC, 10/28/2009
800828 #endif //MOSAIC_AVOID_BASED_ON_SPS_PPS_ID
801829 }
802− const SLevelLimits *pSLevelLimits = GetLevelLimits(uiLevelIdc, bConstraintSetFlags[3]);
830+ const SLevelLimits* pSLevelLimits = GetLevelLimits (uiLevelIdc, bConstraintSetFlags[3]);
803831 if (NULL == pSLevelLimits) {
804− WelsLog (pCtx, WELS_LOG_WARNING, "ParseSps(): level_idx (%d).\n", uiLevelIdc);
805− return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_NON_BASELINE);
806− }
807− else pSps->pSLevelLimits = pSLevelLimits;
832+ WelsLog (pCtx, WELS_LOG_WARNING, "ParseSps(): level_idx (%d).\n", uiLevelIdc);
833+ return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_NON_BASELINE);
834+ } else pSps->pSLevelLimits = pSLevelLimits;
808835 // syntax elements in default
809836 pSps->uiChromaFormatIdc = 1;
810837 pSps->uiBitDepthLuma =
@@ -845,19 +872,29 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 34 unmodified lines
845872 return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_NON_BASELINE);
846873 }
847874 }
848−
849− pSps->uiLog2MaxFrameNum = 4 + BsGetUe (pBs); // log2_max_frame_num_minus4
875+ uiTmp = BsGetUe (pBs);
876+ WELS_CHECK_SE_UPPER_ERROR (uiTmp, SPS_LOG2_MAX_FRAME_NUM_MINUS4_MAX, "log2_max_frame_num_minus4",
877+ GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_LOG2_MAX_FRAME_NUM_MINUS4));
878+ pSps->uiLog2MaxFrameNum = LOG2_MAX_FRAME_NUM_OFFSET + uiTmp; // log2_max_frame_num_minus4
850879 pSps->uiPocType = BsGetUe (pBs); // pic_order_cnt_type
851880
852881 if (0 == pSps->uiPocType) {
853− pSps->iLog2MaxPocLsb = 4 + BsGetUe (pBs); // log2_max_pic_order_cnt_lsb_minus4
882+ uiTmp = BsGetUe (pBs);
883+ // log2_max_pic_order_cnt_lsb_minus4 should be in range 0 to 12, inclusive. (sec. 7.4.3)
884+ WELS_CHECK_SE_UPPER_ERROR (uiTmp, SPS_LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4_MAX, "log2_max_pic_order_cnt_lsb_minus4",
885+ GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_LOG2_MAX_PIC_ORDER_CNT_LSB_MINUS4));
886+ pSps->iLog2MaxPocLsb = LOG2_MAX_PIC_ORDER_CNT_LSB_OFFSET + uiTmp; // log2_max_pic_order_cnt_lsb_minus4
854887
855888 } else if (1 == pSps->uiPocType) {
856889 int32_t i;
857890 pSps->bDeltaPicOrderAlwaysZeroFlag = !!BsGetOneBit (pBs); // bDeltaPicOrderAlwaysZeroFlag
858891 pSps->iOffsetForNonRefPic = BsGetSe (pBs); // iOffsetForNonRefPic
859892 pSps->iOffsetForTopToBottomField = BsGetSe (pBs); // iOffsetForTopToBottomField
860− pSps->iNumRefFramesInPocCycle = BsGetUe (pBs); // num_ref_frames_in_pic_order_cnt_cycle
893+ uiTmp = BsGetUe (pBs);
894+ WELS_CHECK_SE_UPPER_ERROR (uiTmp, SPS_NUM_REF_FRAMES_IN_PIC_ORDER_CNT_CYCLE_MAX,
895+ "num_ref_frames_in_pic_order_cnt_cycle", GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS,
896+ ERR_INFO_INVALID_NUM_REF_FRAME_IN_PIC_ORDER_CNT_CYCLE));
897+ pSps->iNumRefFramesInPocCycle = uiTmp; // num_ref_frames_in_pic_order_cnt_cycle
861898 for (i = 0; i < pSps->iNumRefFramesInPocCycle; i++)
862899 pSps->iOffsetForRefFrame[ i ] = BsGetSe (pBs); // iOffsetForRefFrame[ i ]
863900 }
@@ -868,11 +905,39 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 4 unmodified lines
868905
869906 pSps->iNumRefFrames = BsGetUe (pBs); // max_num_ref_frames
870907 pSps->bGapsInFrameNumValueAllowedFlag = !!BsGetOneBit (pBs); // bGapsInFrameNumValueAllowedFlag
871− pSps->iMbWidth = 1 + BsGetUe (pBs); // pic_width_in_mbs_minus1
872− pSps->iMbHeight = 1 + BsGetUe (pBs); // pic_height_in_map_units_minus1
908+ uiTmp = BsGetUe (pBs); // pic_width_in_mbs_minus1
909+ if (uiTmp == 0xffffffff) {
910+ WelsLog (pCtx, WELS_LOG_ERROR, " pic_width_in_mbs read error!\n");
911+ return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_MB_SIZE_INFO);
912+ }
913+ pSps->iMbWidth = PIC_WIDTH_IN_MBS_OFFSET + uiTmp;
914+ if ((uint64_t) (pSps->iMbWidth * pSps->iMbWidth) > (8 * pSLevelLimits->iMaxFS)) {
915+ WelsLog (pCtx, WELS_LOG_WARNING, " the pic_width_in_mbs exceeds the level limits!\n");
916+ }
917+ uiTmp = BsGetUe (pBs); // pic_height_in_map_units_minus1
918+ if (uiTmp == 0xffffffff) {
919+ WelsLog (pCtx, WELS_LOG_ERROR, " pic_height_in_mbs read error!\n");
920+ return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_MB_SIZE_INFO);
921+ }
922+ pSps->iMbHeight = PIC_HEIGHT_IN_MAP_UNITS_OFFSET + uiTmp;
923+ if ((uint64_t) (pSps->iMbHeight * pSps->iMbHeight) > (8 * pSLevelLimits->iMaxFS)) {
924+ WelsLog (pCtx, WELS_LOG_WARNING, " the pic_height_in_mbs exceeds the level limits!\n");
925+ }
873926 pSps->uiTotalMbCount = pSps->iMbWidth * pSps->iMbHeight;
927+ if (pSps->uiTotalMbCount > (uint32_t)pSLevelLimits->iMaxFS) {
928+ WelsLog (pCtx, WELS_LOG_WARNING, " the total count of mb exceeds the level limits!\n");
929+ }
930+ WELS_CHECK_SE_UPPER_ERROR (pSps->iNumRefFrames, SPS_MAX_NUM_REF_FRAMES_MAX, "max_num_ref_frames",
931+ GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_MAX_NUM_REF_FRAMES));
932+ // here we check max_num_ref_frames
933+ uint32_t uiMaxDpbMbs = pSLevelLimits->iMaxDPBMbs;
934+ uint32_t uiMaxDpbFrames = uiMaxDpbMbs / pSps->uiTotalMbCount;
935+ if (uiMaxDpbFrames > SPS_MAX_NUM_REF_FRAMES_MAX)
936+ uiMaxDpbFrames = SPS_MAX_NUM_REF_FRAMES_MAX;
937+ if ((uint32_t)pSps->iNumRefFrames > uiMaxDpbFrames) {
938+ WelsLog (pCtx, WELS_LOG_WARNING, " max_num_ref_frames exceeds level limits!\n");
939+ }
874940 pSps->bFrameMbsOnlyFlag = !!BsGetOneBit (pBs); // frame_mbs_only_flag
875−
876941 if (!pSps->bFrameMbsOnlyFlag) {
877942 WelsLog (pCtx, WELS_LOG_WARNING, "ParseSps(): frame_mbs_only_flag (%d) not supported.\n", pSps->bFrameMbsOnlyFlag);
878943 return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_MBAFF);
@@ -882,8 +947,14 @@ int32_t ParseSps (PWelsDecoderContext pCtx, PBitStringAux pBsAux, int32_t* pPicW · 3 unmodified lines
882947 if (pSps->bFrameCroppingFlag) {
883948 pSps->sFrameCrop.iLeftOffset = BsGetUe (pBs); // frame_crop_left_offset
884949 pSps->sFrameCrop.iRightOffset = BsGetUe (pBs); // frame_crop_right_offset
950+ if ((pSps->sFrameCrop.iLeftOffset + pSps->sFrameCrop.iRightOffset) > ((int32_t)pSps->iMbWidth * 16 / 2)) {
951+ WelsLog (pCtx, WELS_LOG_WARNING, "frame_crop_left_offset + frame_crop_right_offset exceeds limits!\n");
952+ }
885953 pSps->sFrameCrop.iTopOffset = BsGetUe (pBs); // frame_crop_top_offset
886954 pSps->sFrameCrop.iBottomOffset = BsGetUe (pBs); // frame_crop_bottom_offset
955+ if ((pSps->sFrameCrop.iTopOffset + pSps->sFrameCrop.iBottomOffset) > ((int32_t)pSps->iMbHeight * 16 / 2)) {
956+ WelsLog (pCtx, WELS_LOG_WARNING, "frame_crop_top_offset + frame_crop_right_offset exceeds limits!\n");
957+ }
887958 } else {
888959 pSps->sFrameCrop.iLeftOffset = 0; // frame_crop_left_offset
889960 pSps->sFrameCrop.iRightOffset = 0; // frame_crop_right_offset
@@ -957,7 +1028,7 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux) · 67 unmodified lines
9571028 pPps->bEntropyCodingModeFlag = !!BsGetOneBit (pBsAux);
9581029 pPps->bPicOrderPresentFlag = !!BsGetOneBit (pBsAux);
9591030
960− pPps->uiNumSliceGroups = 1 + BsGetUe (pBsAux);
1031+ pPps->uiNumSliceGroups = NUM_SLICE_GROUPS_OFFSET + BsGetUe (pBsAux);
9611032
9621033 if (pPps->uiNumSliceGroups > MAX_SLICEGROUP_IDS) {
9631034 return ERR_INFO_INVALID_SLICEGROUP;
@@ -974,7 +1045,7 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux) · 10 unmodified lines
9741045 switch (pPps->uiSliceGroupMapType) {
9751046 case 0:
9761047 for (iTmp = 0; iTmp < pPps->uiNumSliceGroups; iTmp++) {
977− pPps->uiRunLength[iTmp] = 1 + BsGetUe (pBsAux);
1048+ pPps->uiRunLength[iTmp] = RUN_LENGTH_OFFSET + BsGetUe (pBsAux);
9781049 }
9791050 break;
9801051 default:
@@ -982,8 +1053,8 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux) · 1 unmodified line
9821053 }
9831054 }
9841055
985− pPps->uiNumRefIdxL0Active = 1 + BsGetUe (pBsAux);
986− pPps->uiNumRefIdxL1Active = 1 + BsGetUe (pBsAux);
1056+ pPps->uiNumRefIdxL0Active = NUM_REF_IDX_L0_DEFAULT_ACTIVE_OFFSET + BsGetUe (pBsAux);
1057+ pPps->uiNumRefIdxL1Active = NUM_REF_IDX_L1_DEFAULT_ACTIVE_OFFSET + BsGetUe (pBsAux);
9871058
9881059 if (pPps->uiNumRefIdxL0Active > MAX_REF_PIC_COUNT ||
9891060 pPps->uiNumRefIdxL1Active > MAX_REF_PIC_COUNT) {
@@ -998,10 +1069,15 @@ int32_t ParsePps (PWelsDecoderContext pCtx, PPps pPpsList, PBitStringAux pBsAux) · 8 unmodified lines
9981069 return GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_UNSUPPORTED_WP);
9991070 }
10001071
1001− pPps->iPicInitQp = 26 + BsGetSe (pBsAux);
1002− pPps->iPicInitQs = 26 + BsGetSe (pBsAux);
1003−
1072+ pPps->iPicInitQp = PIC_INIT_QP_OFFSET + BsGetSe (pBsAux);
1073+ WELS_CHECK_SE_BOTH_ERROR (pPps->iPicInitQp, PPS_PIC_INIT_QP_QS_MIN, PPS_PIC_INIT_QP_QS_MAX, "pic_init_qp_minus26 + 26",
1074+ GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_PIC_INIT_QP));
1075+ pPps->iPicInitQs = PIC_INIT_QS_OFFSET + BsGetSe (pBsAux);
1076+ WELS_CHECK_SE_BOTH_ERROR (pPps->iPicInitQs, PPS_PIC_INIT_QP_QS_MIN, PPS_PIC_INIT_QP_QS_MAX, "pic_init_qs_minus26 + 26",
1077+ GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_PIC_INIT_QS));
10041078 pPps->iChromaQpIndexOffset = BsGetSe (pBsAux);
1079+ WELS_CHECK_SE_BOTH_ERROR (pPps->iChromaQpIndexOffset, PPS_CHROMA_QP_INDEX_OFFSET_MIN, PPS_CHROMA_QP_INDEX_OFFSET_MAX,
1080+ "chroma_qp_index_offset", GENERATE_ERROR_NO (ERR_LEVEL_PARAM_SETS, ERR_INFO_INVALID_CHROMA_QP_INDEX_OFFSET));
10051081 pPps->bDeblockingFilterControlPresentFlag = !!BsGetOneBit (pBsAux);
10061082 pPps->bConstainedIntraPredFlag = !!BsGetOneBit (pBsAux);
10071083 pPps->bRedundantPicCntPresentFlag = !!BsGetOneBit (pBsAux);

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