[FFmpeg-devel] [PATCH v2 08/13] lavc/vaapi_hevc: Pass SCC parameters Through VA-API

Xiang, Haihao haihao.xiang at intel.com
Tue Jan 3 08:56:35 EET 2023


On Ma, 2022-12-05 at 14:09 +0800, Fei Wang wrote:
> From: Linjie Fu <linjie.fu at intel.com>
> 
> Including sps/pps/slice parameters.
> 
> Signed-off-by: Linjie Fu <linjie.justin.fu at gmail.com>
> Signed-off-by: Fei Wang <fei.w.wang at intel.com>
> ---
>  libavcodec/vaapi_hevc.c | 52 +++++++++++++++++++++++++++++++++++++----
>  1 file changed, 47 insertions(+), 5 deletions(-)
> 
> diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c
> index 20fb36adfa..750738d36e 100644
> --- a/libavcodec/vaapi_hevc.c
> +++ b/libavcodec/vaapi_hevc.c
> @@ -124,7 +124,7 @@ static int
> vaapi_hevc_start_frame(AVCodecContext          *avctx,
>      const HEVCPPS          *pps = h->ps.pps;
>  
>      const ScalingList *scaling_list = NULL;
> -    int pic_param_size, err, i;
> +    int pic_param_size, num_comps, pre_palette_size, err, i;
>  
>      VAPictureParameterBufferHEVC *pic_param = (VAPictureParameterBufferHEVC
> *)&pic->pic_param;
>  
> @@ -245,8 +245,46 @@ static int
> vaapi_hevc_start_frame(AVCodecContext          *avctx,
>          for (i = 0; i < 6; i++)
>              pic->pic_param.rext.cr_qp_offset_list[i]        = pps-
> >cr_qp_offset_list[i];
>      }
> +
> +    pre_palette_size = pps->pps_palette_predictor_initializers_present_flag ?
> +                       pps->pps_num_palette_predictor_initializers :
> +                       (sps->sps_palette_predictor_initializers_present_flag
> ?
> +                       sps->sps_num_palette_predictor_initializers_minus1 + 1
> :
> +                       0);
> +
> +    if (avctx->profile == FF_PROFILE_HEVC_SCC) {
> +        pic->pic_param.scc = (VAPictureParameterBufferHEVCScc) {
> +            .screen_content_pic_fields.bits = {
> +                .pps_curr_pic_ref_enabled_flag              = pps-
> >pps_curr_pic_ref_enabled_flag,
> +                .palette_mode_enabled_flag                  = sps-
> >palette_mode_enabled_flag,
> +                .motion_vector_resolution_control_idc       = sps-
> >motion_vector_resolution_control_idc,
> +                .intra_boundary_filtering_disabled_flag     = sps-
> >intra_boundary_filtering_disabled_flag,
> +                .residual_adaptive_colour_transform_enabled_flag
> +                                                            = pps-
> >residual_adaptive_colour_transform_enabled_flag,
> +                .pps_slice_act_qp_offsets_present_flag      = pps-
> >pps_slice_act_qp_offsets_present_flag,
> +            },
> +            .palette_max_size                               = sps-
> >palette_max_size,
> +            .delta_palette_max_predictor_size               = sps-
> >delta_palette_max_predictor_size,
> +            .predictor_palette_size                         =
> pre_palette_size,
> +            .pps_act_y_qp_offset_plus5                      = pps-
> >residual_adaptive_colour_transform_enabled_flag ?
> +                                                              pps-
> >pps_act_y_qp_offset + 5 : 0,
> +            .pps_act_cb_qp_offset_plus5                     = pps-
> >residual_adaptive_colour_transform_enabled_flag ?
> +                                                              pps-
> >pps_act_cb_qp_offset + 5 : 0,
> +            .pps_act_cr_qp_offset_plus3                     = pps-
> >residual_adaptive_colour_transform_enabled_flag ?
> +                                                              pps-
> >pps_act_cr_qp_offset + 3 : 0,
> +        };
> +
> +        num_comps = pps->monochrome_palette_flag ? 1 : 3;
> +        for (int comp = 0; comp < num_comps; comp++)
> +            for (i = 0; i < pre_palette_size; i++)

for (int i = 0; ......)

Thanks
Haihao

> +                pic->pic_param.scc.predictor_palette_entries[comp][i] =
> +                    pps->pps_palette_predictor_initializers_present_flag ?
> +                    pps->pps_palette_predictor_initializer[comp][i]:
> +                    sps->sps_palette_predictor_initializer[comp][i];
> +    }
> +
>  #endif
> -    pic_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
> +    pic_param_size = avctx->profile >= FF_PROFILE_HEVC_REXT ?
>                              sizeof(pic->pic_param) :
> sizeof(VAPictureParameterBufferHEVC);
>  
>      err = ff_vaapi_decode_make_param_buffer(avctx, &pic->pic,
> @@ -299,7 +337,7 @@ static int vaapi_hevc_end_frame(AVCodecContext *avctx)
>      VASliceParameterBufferHEVC *last_slice_param =
> (VASliceParameterBufferHEVC *)&pic->last_slice_param;
>      int ret;
>  
> -    int slice_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
> +    int slice_param_size = avctx->profile >= FF_PROFILE_HEVC_REXT ?
>                              sizeof(pic->last_slice_param) :
> sizeof(VASliceParameterBufferHEVC);
>  
>      if (pic->last_size) {
> @@ -413,7 +451,7 @@ static int vaapi_hevc_decode_slice(AVCodecContext *avctx,
>      VAAPIDecodePictureHEVC *pic = h->ref->hwaccel_picture_private;
>      VASliceParameterBufferHEVC *last_slice_param =
> (VASliceParameterBufferHEVC *)&pic->last_slice_param;
>  
> -    int slice_param_size = avctx->profile == FF_PROFILE_HEVC_REXT ?
> +    int slice_param_size = avctx->profile >= FF_PROFILE_HEVC_REXT ?
>                              sizeof(pic->last_slice_param) :
> sizeof(VASliceParameterBufferHEVC);
>  
>      int nb_list = (sh->slice_type == HEVC_SLICE_B) ?
> @@ -478,11 +516,15 @@ static int vaapi_hevc_decode_slice(AVCodecContext
> *avctx,
>      fill_pred_weight_table(avctx, h, sh, last_slice_param);
>  
>  #if VA_CHECK_VERSION(1, 2, 0)
> -    if (avctx->profile == FF_PROFILE_HEVC_REXT) {
> +    if (avctx->profile >= FF_PROFILE_HEVC_REXT) {
>          pic->last_slice_param.rext = (VASliceParameterBufferHEVCRext) {
>              .slice_ext_flags.bits = {
>                  .cu_chroma_qp_offset_enabled_flag = sh-
> >cu_chroma_qp_offset_enabled_flag,
> +                .use_integer_mv_flag = sh->use_integer_mv_flag,
>              },
> +            .slice_act_y_qp_offset  = sh->slice_act_y_qp_offset,
> +            .slice_act_cb_qp_offset = sh->slice_act_cb_qp_offset,
> +            .slice_act_cr_qp_offset = sh->slice_act_cr_qp_offset,
>          };
>          for (i = 0; i < 15 && i < sh->nb_refs[L0]; i++) {
>              pic->last_slice_param.rext.luma_offset_l0[i] = sh-
> >luma_offset_l0[i];


More information about the ffmpeg-devel mailing list