[FFmpeg-devel] [PATCH 2/7] lavc/hevc_ps: Add sps parse support for HEVC SCC extension syntax

James Almer jamrial at gmail.com
Thu Jul 9 19:53:51 EEST 2020


On 7/9/2020 1:51 PM, James Almer wrote:
> On 7/9/2020 1:17 PM, Linjie Fu wrote:
>> According to 7.3.2.2.3 in T-REC-H.265-201911.
>>
>> Signed-off-by: Linjie Fu <linjie.justin.fu at gmail.com>
>> ---
>>  libavcodec/hevc.h    |  3 +++
>>  libavcodec/hevc_ps.c | 32 +++++++++++++++++++++++++++++---
>>  libavcodec/hevc_ps.h | 15 +++++++++++++++
>>  3 files changed, 47 insertions(+), 3 deletions(-)
>>
>> diff --git a/libavcodec/hevc.h b/libavcodec/hevc.h
>> index 1804755..6b454a7 100644
>> --- a/libavcodec/hevc.h
>> +++ b/libavcodec/hevc.h
>> @@ -154,6 +154,9 @@ enum {
>>      // get near that, though, so set a lower limit here with the maximum
>>      // possible value for 4K video (at most 135 16x16 Ctb rows).
>>      HEVC_MAX_ENTRY_POINT_OFFSETS = HEVC_MAX_TILE_COLUMNS * 135,
>> +
>> +    // A.3.7: Screen content coding extensions
>> +    HEVC_MAX_PALETTE_PREDICTOR_SIZE = 128,
>>  };
>>  
>>  
>> diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
>> index 584e2ba..7610d3b 100644
>> --- a/libavcodec/hevc_ps.c
>> +++ b/libavcodec/hevc_ps.c
>> @@ -909,7 +909,7 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
>>      HEVCWindow *ow;
>>      int ret = 0;
>>      int log2_diff_max_min_transform_block_size;
>> -    int bit_depth_chroma, start, vui_present, sublayer_ordering_info;
>> +    int bit_depth_chroma, start, vui_present, sublayer_ordering_info, num_comps;
>>      int i;
>>  
>>      // Coded parameters
>> @@ -1130,8 +1130,11 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
>>          decode_vui(gb, avctx, apply_defdispwin, sps);
>>  
>>      if (get_bits1(gb)) { // sps_extension_flag
>> -        sps->sps_range_extension_flag = get_bits1(gb);
>> -        skip_bits(gb, 7); //sps_extension_7bits = get_bits(gb, 7);
>> +        sps->sps_range_extension_flag      = get_bits1(gb);
>> +        sps->sps_multilayer_extension_flag = get_bits1(gb);
>> +        sps->sps_3d_extension_flag         = get_bits1(gb);
>> +        sps->sps_scc_extension_flag        = get_bits1(gb);
>> +        skip_bits(gb, 4); //sps_extension_4bits = get_bits(gb, 4);
>>          if (sps->sps_range_extension_flag) {
>>              sps->transform_skip_rotation_enabled_flag = get_bits1(gb);
>>              sps->transform_skip_context_enabled_flag  = get_bits1(gb);
>> @@ -1157,6 +1160,29 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
>>                  av_log(avctx, AV_LOG_WARNING,
>>                     "cabac_bypass_alignment_enabled_flag not yet implemented\n");
>>          }
>> +        if (sps->sps_multilayer_extension_flag || sps->sps_3d_extension_flag)
>> +            av_log(avctx, AV_LOG_WARNING,
>> +                   "multilayer_extension or 3d_extension not yet implemented\n");

Also, you can't just ignore these. If you don't parse both, you'll be
reading the wrong bits for SCC.

Either add support for these two, or return AVERROR_PATCHWELCOME. Same
for PPS.

>> +
>> +        if (sps->sps_scc_extension_flag) {
>> +            sps->sps_curr_pic_ref_enabled_flag = get_bits1(gb);
>> +            sps->palette_mode_enabled_flag     = get_bits1(gb);
>> +            if (sps->palette_mode_enabled_flag) {
>> +                sps->palette_max_size = get_ue_golomb_long(gb);
>> +                sps->delta_palette_max_predictor_size = get_ue_golomb_long(gb);
>> +                sps->sps_palette_predictor_initializers_present_flag = get_bits1(gb);
>> +
>> +                if (sps->sps_palette_predictor_initializers_present_flag) {
>> +                    sps->sps_num_palette_predictor_initializers_minus1 = get_ue_golomb_long(gb);
>> +                    num_comps = sps->chroma_format_idc == 0 ? 1 : 3;
>> +                    for (int comp = 0; comp < num_comps; comp++)
>> +                        for (i = 0; i <= sps->sps_num_palette_predictor_initializers_minus1; i++)
>> +                            sps->sps_palette_predictor_initializer[comp][i] = get_ue_golomb_long(gb);
> 
> This isn't an ue value. Its length is a fixed value (each plane's
> bitdepth, afaics).
> 
>> +                }
>> +            }
>> +            sps->motion_vector_resolution_control_idc   = get_bits(gb, 2);
>> +            sps->intra_boundary_filtering_disabled_flag = get_bits1(gb);
>> +        }
>>      }
>>      if (apply_defdispwin) {
>>          sps->output_window.left_offset   += sps->vui.def_disp_win.left_offset;
>> diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h
>> index 2a1bbf6..1501811 100644
>> --- a/libavcodec/hevc_ps.h
>> +++ b/libavcodec/hevc_ps.h
>> @@ -223,6 +223,21 @@ typedef struct HEVCSPS {
>>      int persistent_rice_adaptation_enabled_flag;
>>      int cabac_bypass_alignment_enabled_flag;
>>  
>> +    // not yet implemented
>> +    int sps_multilayer_extension_flag;
>> +    int sps_3d_extension_flag;
>> +
>> +    int sps_scc_extension_flag;
>> +    int sps_curr_pic_ref_enabled_flag;
>> +    int palette_mode_enabled_flag;
>> +    int palette_max_size;
>> +    int delta_palette_max_predictor_size;
>> +    int sps_palette_predictor_initializers_present_flag;
>> +    int sps_num_palette_predictor_initializers_minus1;
>> +    int sps_palette_predictor_initializer[3][HEVC_MAX_PALETTE_PREDICTOR_SIZE];
>> +    int motion_vector_resolution_control_idc;
>> +    int intra_boundary_filtering_disabled_flag;
>> +
>>      ///< coded frame dimension in various units
>>      int width;
>>      int height;
>>
> 



More information about the ffmpeg-devel mailing list