Based on code from cbs_h266. Signed-off-by: James Almer <jamr...@gmail.com> --- libavformat/vvc.c | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-)
diff --git a/libavformat/vvc.c b/libavformat/vvc.c index 98177a7ad8..e8301d4247 100644 --- a/libavformat/vvc.c +++ b/libavformat/vvc.c @@ -46,7 +46,7 @@ typedef struct VVCPTLRecord { uint8_t general_level_idc; uint8_t ptl_frame_only_constraint_flag; uint8_t ptl_multilayer_enabled_flag; - uint8_t general_constraint_info[9]; + uint8_t general_constraint_info[10]; uint8_t ptl_sublayer_level_present_flag[VVC_MAX_SUBLAYERS - 1]; uint8_t sublayer_level_idc[VVC_MAX_SUBLAYERS - 1]; uint8_t ptl_num_sub_profiles; @@ -77,8 +77,8 @@ typedef struct VVCCProfileTierLevel { uint8_t ptl_multilayer_enabled_flag; // general_constraint_info uint8_t gci_present_flag; - uint8_t gci_general_constraints[9]; - uint8_t gci_num_reserved_bits; + uint8_t gci_general_constraints[10]; + uint8_t num_bytes_constraint_info; // end general_constraint_info uint8_t ptl_sublayer_level_present_flag[VVC_MAX_SUBLAYERS - 1]; uint8_t sublayer_level_idc[VVC_MAX_SUBLAYERS - 1]; @@ -135,13 +135,12 @@ static void vvcc_update_ptl(VVCDecoderConfigurationRecord *vvcc, /* * Constraints Info */ + vvcc->ptl.num_bytes_constraint_info = ptl->num_bytes_constraint_info; if (ptl->gci_present_flag) { - vvcc->ptl.num_bytes_constraint_info = 9; memcpy(&vvcc->ptl.general_constraint_info[0], - &ptl->gci_general_constraints[0], sizeof(uint8_t) * 9); + &ptl->gci_general_constraints[0], ptl->num_bytes_constraint_info); } else { - vvcc->ptl.num_bytes_constraint_info = 0; - memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(uint8_t) * 9); + memset(&vvcc->ptl.general_constraint_info[0], 0, sizeof(vvcc->ptl.general_constraint_info)); } /* @@ -186,7 +185,6 @@ static void vvcc_parse_ptl(GetBitContext *gb, unsigned int max_sub_layers_minus1) { VVCCProfileTierLevel general_ptl = { 0 }; - int j; if (profileTierPresentFlag) { general_ptl.profile_idc = get_bits(gb, 7); @@ -199,12 +197,20 @@ static void vvcc_parse_ptl(GetBitContext *gb, if (profileTierPresentFlag) { // parse constraint info general_ptl.gci_present_flag = get_bits1(gb); if (general_ptl.gci_present_flag) { + int gci_num_reserved_bits, j; for (j = 0; j < 8; j++) general_ptl.gci_general_constraints[j] = get_bits(gb, 8); - general_ptl.gci_general_constraints[8] = get_bits(gb, 7); - - general_ptl.gci_num_reserved_bits = get_bits(gb, 8); - skip_bits(gb, general_ptl.gci_num_reserved_bits); + general_ptl.gci_general_constraints[j++] = get_bits(gb, 7); + + gci_num_reserved_bits = get_bits(gb, 8); + if (gci_num_reserved_bits > 5) { + general_ptl.gci_general_constraints[8] = + (general_ptl.gci_general_constraints[8] << 1) | get_bits1(gb); + general_ptl.gci_general_constraints[j++] = get_bits(gb, 5); + gci_num_reserved_bits -= 6; + } + general_ptl.num_bytes_constraint_info = j; + skip_bits(gb, gci_num_reserved_bits); } while (gb->index % 8 != 0) skip_bits1(gb); -- 2.45.1 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".