diff mbox series

[FFmpeg-devel,2/2] lavc/cbs_h265: Add pps_multilayer_extension support

Message ID 20231117130322.3502477-2-mypopydev@gmail.com
State New
Headers show
Series [FFmpeg-devel,1/2] lavc/cbs_h265: Add sps_multilayer_extension support | 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

Jun Zhao Nov. 17, 2023, 1:03 p.m. UTC
Add pps_multilayer_extensio support.

Signed-off-by: Jun Zhao <barryjzhao@tencent.com>
---
 libavcodec/cbs_h265.h                 | 28 ++++++++++++++++
 libavcodec/cbs_h265_syntax_template.c | 48 ++++++++++++++++++++++++++-
 2 files changed, 75 insertions(+), 1 deletion(-)
diff mbox series

Patch

diff --git a/libavcodec/cbs_h265.h b/libavcodec/cbs_h265.h
index 15951269fd..d83dc97072 100644
--- a/libavcodec/cbs_h265.h
+++ b/libavcodec/cbs_h265.h
@@ -421,6 +421,34 @@  typedef struct H265RawPPS {
     uint8_t log2_sao_offset_scale_luma;
     uint8_t log2_sao_offset_scale_chroma;
 
+    // Multilayer extension
+    uint8_t poc_reset_info_present_flag;
+    uint8_t pps_infer_scaling_list_flag;
+    uint8_t pps_scaling_list_ref_layer_id;
+    uint8_t num_ref_loc_offsets;
+    uint8_t ref_loc_offset_layer_id[HEVC_MAX_LAYERS];
+
+    uint8_t scaled_ref_layer_offset_present_flag[HEVC_MAX_LAYERS];
+    int16_t scaled_ref_layer_left_offset[HEVC_MAX_LAYERS];
+    int16_t scaled_ref_layer_top_offset[HEVC_MAX_LAYERS];
+    int16_t scaled_ref_layer_right_offset[HEVC_MAX_LAYERS];
+    int16_t scaled_ref_layer_bottom_offset[HEVC_MAX_LAYERS];
+
+    uint8_t ref_region_offset_present_flag[HEVC_MAX_LAYERS];
+    int16_t ref_region_left_offset[HEVC_MAX_LAYERS];
+    int16_t ref_region_top_offset[HEVC_MAX_LAYERS];
+    int16_t ref_region_right_offset[HEVC_MAX_LAYERS];
+    int16_t ref_region_bottom_offset[HEVC_MAX_LAYERS];
+
+    uint8_t resample_phase_set_present_flag[HEVC_MAX_LAYERS];
+    uint8_t phase_hor_luma[HEVC_MAX_LAYERS];
+    uint8_t phase_ver_luma[HEVC_MAX_LAYERS];
+    uint8_t phase_hor_chroma_plus8[HEVC_MAX_LAYERS];
+    uint8_t phase_ver_chroma_plus8[HEVC_MAX_LAYERS];
+
+    uint8_t colour_mapping_enabled_flag;
+    // TODO: colour_mapping_table
+
     // Screen content coding extension.
     uint8_t pps_curr_pic_ref_enabled_flag;
     uint8_t residual_adaptive_colour_transform_enabled_flag;
diff --git a/libavcodec/cbs_h265_syntax_template.c b/libavcodec/cbs_h265_syntax_template.c
index 1e3bc1acd8..de8b838209 100644
--- a/libavcodec/cbs_h265_syntax_template.c
+++ b/libavcodec/cbs_h265_syntax_template.c
@@ -1003,6 +1003,52 @@  static int FUNC(pps_range_extension)(CodedBitstreamContext *ctx, RWContext *rw,
     return 0;
 }
 
+static int FUNC(pps_multilayer_extension)(CodedBitstreamContext *ctx, RWContext *rw,
+                                          H265RawPPS *current)
+{
+    int err, i, index;
+
+    flag(poc_reset_info_present_flag);
+    flag(pps_infer_scaling_list_flag);
+    if (current->pps_infer_scaling_list_flag)
+        ub(6, pps_scaling_list_ref_layer_id);
+    ue(num_ref_loc_offsets, 0, HEVC_MAX_LAYERS);
+
+    for (i=0; i<current->num_ref_loc_offsets; i++) {
+        ub(6, ref_loc_offset_layer_id[i]);
+        index = current->ref_loc_offset_layer_id[i];
+
+        flag(scaled_ref_layer_offset_present_flag[i]);
+        if (current->scaled_ref_layer_offset_present_flag[i]) {
+            se(scaled_ref_layer_left_offset[index],    -16383, +16384);
+            se(scaled_ref_layer_top_offset[index],     -16383, +16384);
+            se(scaled_ref_layer_right_offset[index],   -16383, +16384);
+            se(scaled_ref_layer_bottom_offset[index],  -16383, +16384);
+        }
+
+        flag(ref_region_offset_present_flag[i]);
+        if (current->ref_region_offset_present_flag[i]) {
+            se(ref_region_left_offset[index],    -16383, +16384);
+            se(ref_region_top_offset[index],     -16383, +16384);
+            se(ref_region_right_offset[index],   -16383, +16384);
+            se(ref_region_bottom_offset[index],  -16383, +16384);
+        }
+
+        flag(resample_phase_set_present_flag[i]);
+        if (current->resample_phase_set_present_flag[i]) {
+            ue(phase_hor_luma[index],           0, 31);
+            ue(phase_ver_luma[index],           0, 31);
+            ue(phase_hor_chroma_plus8[index],   0, 63);
+            ue(phase_ver_chroma_plus8[index],   0, 63);
+        }
+    }
+
+    flag(colour_mapping_enabled_flag);
+    if (current->colour_mapping_enabled_flag)
+        return AVERROR_PATCHWELCOME;
+    return 0;
+}
+
 static int FUNC(pps_scc_extension)(CodedBitstreamContext *ctx, RWContext *rw,
                                    H265RawPPS *current)
 {
@@ -1153,7 +1199,7 @@  static int FUNC(pps)(CodedBitstreamContext *ctx, RWContext *rw,
     if (current->pps_range_extension_flag)
         CHECK(FUNC(pps_range_extension)(ctx, rw, current));
     if (current->pps_multilayer_extension_flag)
-        return AVERROR_PATCHWELCOME;
+        CHECK(FUNC(pps_multilayer_extension)(ctx, rw, current));
     if (current->pps_3d_extension_flag)
         return AVERROR_PATCHWELCOME;
     if (current->pps_scc_extension_flag)