[Libva] [PATCH v2 2/2] Add phantom slice support on IVB+

Gwenole Beauchesne gb.devel at gmail.com
Tue Aug 26 20:51:05 PDT 2014


2014-08-08 5:50 GMT+02:00 Zhong Li <zhong.li at intel.com>:
> HW requires driver to add a phantom slice when FirstMbX and FirstMbY are
> not 0, in order to avc decoding error concealment. Otherwise, GPU may hang.
> This patch is a workround for bug: https://bugs.freedesktop.org/show_bug.cgi?id=81447
>
> v1->v2: Follow haihao's suggestion to use common funcion of gen6 phantom slice.
>
> Signed-off-by: Zhong Li <zhong.li at intel.com>
> ---
>  src/gen75_mfd.c |   12 ++++++++++++
>  src/gen7_mfd.c  |   12 ++++++++++++
>  src/gen8_mfd.c  |   13 +++++++++++++
>  3 files changed, 37 insertions(+)
>
> diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c
> index b14db61..1847d2c 100644
> --- a/src/gen75_mfd.c
> +++ b/src/gen75_mfd.c
> @@ -812,6 +812,15 @@ gen75_mfd_avc_directmode_state(VADriverContextP ctx,
>  }
>
>  static void
> +gen75_mfd_avc_phantom_slice_first(VADriverContextP ctx,
> +                                 VAPictureParameterBufferH264 *pic_param,
> +                                 VASliceParameterBufferH264 *next_slice_param,
> +                                 struct gen7_mfd_context *gen7_mfd_context)
> +{
> +    gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, gen7_mfd_context->base.batch);
> +}
> +
> +static void
>  gen75_mfd_avc_slice_state(VADriverContextP ctx,
>                           VAPictureParameterBufferH264 *pic_param,
>                           VASliceParameterBufferH264 *slice_param,
> @@ -1145,6 +1154,9 @@ gen75_mfd_avc_decode_picture(VADriverContextP ctx,
>          else
>              next_slice_group_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j + 1]->buffer;
>
> +        if (j == 0 && slice_param->first_mb_in_slice)
> +            gen75_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, gen7_mfd_context);
> +
>          for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
>              assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
>              assert((slice_param->slice_type == SLICE_TYPE_I) ||
> diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
> index 46a07a0..376eeb6 100755
> --- a/src/gen7_mfd.c
> +++ b/src/gen7_mfd.c
> @@ -506,6 +506,15 @@ gen7_mfd_avc_directmode_state(VADriverContextP ctx,
>  }
>
>  static void
> +gen7_mfd_avc_phantom_slice_first(VADriverContextP ctx,
> +                                 VAPictureParameterBufferH264 *pic_param,
> +                                 VASliceParameterBufferH264 *next_slice_param,
> +                                 struct gen7_mfd_context *gen7_mfd_context)
> +{
> +    gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, gen7_mfd_context->base.batch);
> +}
> +
> +static void
>  gen7_mfd_avc_slice_state(VADriverContextP ctx,
>                           VAPictureParameterBufferH264 *pic_param,
>                           VASliceParameterBufferH264 *slice_param,
> @@ -842,6 +851,9 @@ gen7_mfd_avc_decode_picture(VADriverContextP ctx,
>          else
>              next_slice_group_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j + 1]->buffer;
>
> +        if (j == 0 && slice_param->first_mb_in_slice)
> +            gen7_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, gen7_mfd_context);
> +
>          for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
>              assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
>              assert((slice_param->slice_type == SLICE_TYPE_I) ||
> diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c
> index d08dd43..83ca384 100644
> --- a/src/gen8_mfd.c
> +++ b/src/gen8_mfd.c
> @@ -575,6 +575,15 @@ gen8_mfd_avc_directmode_state(VADriverContextP ctx,
>  }
>
>  static void
> +gen8_mfd_avc_phantom_slice_first(VADriverContextP ctx,
> +                                 VAPictureParameterBufferH264 *pic_param,
> +                                 VASliceParameterBufferH264 *next_slice_param,
> +                                 struct gen7_mfd_context *gen7_mfd_context)
> +{
> +    gen6_mfd_avc_phantom_slice(ctx, pic_param, next_slice_param, gen7_mfd_context->base.batch);
> +}
> +
> +static void
>  gen8_mfd_avc_slice_state(VADriverContextP ctx,
>                           VAPictureParameterBufferH264 *pic_param,
>                           VASliceParameterBufferH264 *slice_param,

> @@ -908,6 +917,10 @@ gen8_mfd_avc_decode_picture(VADriverContextP ctx,
>          else
>              next_slice_group_param = (VASliceParameterBufferH264 *)decode_state->slice_params[j + 1]->buffer;
>
> +        if (j == 0 && slice_param->first_mb_in_slice)
> +            gen8_mfd_avc_phantom_slice_first(ctx, pic_param, slice_param, gen7_mfd_context);
> +
> +
>          for (i = 0; i < decode_state->slice_params[j]->num_elements; i++) {
>              assert(slice_param->slice_data_flag == VA_SLICE_DATA_FLAG_ALL);
>              assert((slice_param->slice_type == SLICE_TYPE_I) ||

Extraneous newline here, but overall OK.

Thanks,
-- 
Gwenole Beauchesne
Intel Corporation SAS / 2 rue de Paris, 92196 Meudon Cedex, France
Registration Number (RCS): Nanterre B 302 456 199


More information about the Libva mailing list