diff mbox series

[FFmpeg-devel,v3,08/11] lavc/vaapi_hevc: Pass SCC parameters Through VA-API

Message ID 20230103125952.2707824-8-fei.w.wang@intel.com
State New
Headers show
Series [FFmpeg-devel,v3,01/11] lavc/hevc_ps: remove profile limitation of pps_range_extensions() | expand

Checks

Context Check Description
yinshiyou/make_loongarch64 success Make finished
yinshiyou/make_fate_loongarch64 success Make fate finished
andriy/make_fate_x86 success Make fate finished
andriy/make_x86 warning New warnings during build

Commit Message

Wang, Fei W Jan. 3, 2023, 12:59 p.m. UTC
From: Linjie Fu <linjie.fu@intel.com>

Including sps/pps/slice parameters.

Signed-off-by: Linjie Fu <linjie.justin.fu@gmail.com>
Signed-off-by: Fei Wang <fei.w.wang@intel.com>
---
 libavcodec/vaapi_hevc.c | 52 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 47 insertions(+), 5 deletions(-)

Comments

Wang, Fei W Jan. 11, 2023, 2:45 a.m. UTC | #1
> -----Original Message-----
> From: Wang, Fei W <fei.w.wang@intel.com>
> Sent: Tuesday, January 3, 2023 9:00 PM
> To: ffmpeg-devel@ffmpeg.org
> Cc: Linjie Fu <linjie.fu@intel.com>; Linjie Fu <linjie.justin.fu@gmail.com>; Wang,
> Fei W <fei.w.wang@intel.com>
> Subject: [FFmpeg-devel][PATCH v3 08/11] lavc/vaapi_hevc: Pass SCC parameters
> Through VA-API
> 
> From: Linjie Fu <linjie.fu@intel.com>
> 
> Including sps/pps/slice parameters.
> 
> Signed-off-by: Linjie Fu <linjie.justin.fu@gmail.com>
> Signed-off-by: Fei Wang <fei.w.wang@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..73a8f5b4ce 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 (int j = 0; j < pre_palette_size; j++)
> +                pic->pic_param.scc.predictor_palette_entries[comp][j] =
> +                    pps->pps_palette_predictor_initializers_present_flag ?
> +                    pps->pps_palette_predictor_initializer[comp][j]:
> +                    sps->sps_palette_predictor_initializer[comp][j];
> +    }
> +
>  #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,

Hello,

https://patchwork.ffmpeg.org/project/ffmpeg/patch/20230103125952.2707824-8-fei.w.wang@intel.com/

A new warning during build reported in patchwork, but didn't appear in my local build. 
Does anyone can help tell me how to reproduce this warning? Any special configuration or build environment needed?

Thanks
Fei

>          };
>          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];
> --
> 2.25.1
diff mbox series

Patch

diff --git a/libavcodec/vaapi_hevc.c b/libavcodec/vaapi_hevc.c
index 20fb36adfa..73a8f5b4ce 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 (int j = 0; j < pre_palette_size; j++)
+                pic->pic_param.scc.predictor_palette_entries[comp][j] =
+                    pps->pps_palette_predictor_initializers_present_flag ?
+                    pps->pps_palette_predictor_initializer[comp][j]:
+                    sps->sps_palette_predictor_initializer[comp][j];
+    }
+
 #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];