[FFmpeg-devel] [PATCH 2/2] lavc/cbs_h265: Add pps_multilayer_extension support
Jun Zhao
mypopydev at gmail.com
Fri Nov 17 15:03:22 EET 2023
Add pps_multilayer_extensio support.
Signed-off-by: Jun Zhao <barryjzhao at tencent.com>
---
libavcodec/cbs_h265.h | 28 ++++++++++++++++
libavcodec/cbs_h265_syntax_template.c | 48 ++++++++++++++++++++++++++-
2 files changed, 75 insertions(+), 1 deletion(-)
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)
--
2.25.1
More information about the ffmpeg-devel
mailing list