diff mbox series

[FFmpeg-devel,2/3] avformat/vvc: include additional bits in general_constraint_info

Message ID 20240517134228.288-2-jamrial@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/3,v3] avformat/vvc: fix writing general_constraint_info bytes | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

James Almer May 17, 2024, 1:42 p.m. UTC
Based on code from cbs_h266.

Signed-off-by: James Almer <jamrial@gmail.com>
---
 libavformat/vvc.c | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)
diff mbox series

Patch

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);