[FFmpeg-devel] [PATCH 2/3] avformat/vvc: include additional bits in general_constraint_info
James Almer
jamrial at gmail.com
Fri May 17 16:42:27 EEST 2024
Based on code from cbs_h266.
Signed-off-by: James Almer <jamrial at 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
More information about the ffmpeg-devel
mailing list