[Libva] [PATCH] H264: Use macroblock pair to calculate H264 decoding parameter under MBAFF flag

Zhao, Yakui yakui.zhao at intel.com
Mon Jul 6 00:10:00 PDT 2015


On Mon, 2015-07-06 at 11:49 -0600, Zhao, Yakui wrote:
> Based on the H264 spec the macroblock pair should be used to calculate
> the corresponding parameters under MBAFF.(mb-adaptive frame-field).
> Otherwise the wrong parameter is sent to GPU HW.
> 
> Fix the GPU hang issue in https://bugs.freedesktop.org/show_bug.cgi?id=91207

Add
 Tested-by: Lim, Siew Hoon <siew.hoon.lim at intel.com>

And the patch will be pushed.

Thanks.
   Yakui
> 
> Signed-off-by: Zhao Yakui <yakui.zhao at intel.com>
> ---
>  src/gen6_mfd.c  |   10 ++++++++--
>  src/gen75_mfd.c |   10 ++++++++--
>  src/gen7_mfd.c  |   10 ++++++++--
>  src/gen8_mfd.c  |    9 +++++++--
>  4 files changed, 31 insertions(+), 8 deletions(-)
> 
> diff --git a/src/gen6_mfd.c b/src/gen6_mfd.c
> index 95a8e92..2dd05a1 100755
> --- a/src/gen6_mfd.c
> +++ b/src/gen6_mfd.c
> @@ -551,14 +551,20 @@ gen6_mfd_avc_slice_state(VADriverContextP ctx,
>          }
>      }
>  
> -    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
> +    first_mb_in_slice = slice_param->first_mb_in_slice;
>      slice_hor_pos = first_mb_in_slice % width_in_mbs; 
>      slice_ver_pos = first_mb_in_slice / width_in_mbs;
>  
> +    if (mbaff_picture)
> +        slice_ver_pos = slice_ver_pos << 1;
> +
>      if (next_slice_param) {
> -        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
> +        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
>          next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
>          next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
> +
> +        if (mbaff_picture)
> +            next_slice_ver_pos = next_slice_ver_pos << 1;
>      } else {
>          next_slice_hor_pos = 0;
>          next_slice_ver_pos = height_in_mbs;
> diff --git a/src/gen75_mfd.c b/src/gen75_mfd.c
> index 5171bd9..11cde1f 100644
> --- a/src/gen75_mfd.c
> +++ b/src/gen75_mfd.c
> @@ -862,14 +862,20 @@ gen75_mfd_avc_slice_state(VADriverContextP ctx,
>          num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
>      }
>  
> -    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
> +    first_mb_in_slice = slice_param->first_mb_in_slice;
>      slice_hor_pos = first_mb_in_slice % width_in_mbs; 
>      slice_ver_pos = first_mb_in_slice / width_in_mbs;
>  
> +    if (mbaff_picture)
> +        slice_ver_pos = slice_ver_pos << 1;
> +
>      if (next_slice_param) {
> -        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
> +        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
>          next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
>          next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
> +
> +        if (mbaff_picture)
> +            next_slice_ver_pos = next_slice_ver_pos << 1;
>      } else {
>          next_slice_hor_pos = 0;
>          next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
> diff --git a/src/gen7_mfd.c b/src/gen7_mfd.c
> index 40a6db4..1d04ed4 100755
> --- a/src/gen7_mfd.c
> +++ b/src/gen7_mfd.c
> @@ -556,14 +556,20 @@ gen7_mfd_avc_slice_state(VADriverContextP ctx,
>          num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
>      }
>  
> -    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
> +    first_mb_in_slice = slice_param->first_mb_in_slice;
>      slice_hor_pos = first_mb_in_slice % width_in_mbs; 
>      slice_ver_pos = first_mb_in_slice / width_in_mbs;
>  
> +    if (mbaff_picture)
> +        slice_ver_pos = slice_ver_pos << 1;
> +
>      if (next_slice_param) {
> -        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
> +        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
>          next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
>          next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
> +
> +        if (mbaff_picture)
> +            next_slice_ver_pos = next_slice_ver_pos << 1;
>      } else {
>          next_slice_hor_pos = 0;
>          next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);
> diff --git a/src/gen8_mfd.c b/src/gen8_mfd.c
> index c15184d..c55cb4e 100644
> --- a/src/gen8_mfd.c
> +++ b/src/gen8_mfd.c
> @@ -625,14 +625,19 @@ gen8_mfd_avc_slice_state(VADriverContextP ctx,
>          num_ref_idx_l1 = slice_param->num_ref_idx_l1_active_minus1 + 1;
>      }
>  
> -    first_mb_in_slice = slice_param->first_mb_in_slice << mbaff_picture;
> +    first_mb_in_slice = slice_param->first_mb_in_slice;
>      slice_hor_pos = first_mb_in_slice % width_in_mbs; 
>      slice_ver_pos = first_mb_in_slice / width_in_mbs;
>  
> +    if (mbaff_picture)
> +        slice_ver_pos = slice_ver_pos << 1;
>      if (next_slice_param) {
> -        first_mb_in_next_slice = next_slice_param->first_mb_in_slice << mbaff_picture;
> +        first_mb_in_next_slice = next_slice_param->first_mb_in_slice;
>          next_slice_hor_pos = first_mb_in_next_slice % width_in_mbs; 
>          next_slice_ver_pos = first_mb_in_next_slice / width_in_mbs;
> +
> +        if (mbaff_picture)
> +            next_slice_ver_pos = next_slice_ver_pos << 1;
>      } else {
>          next_slice_hor_pos = 0;
>          next_slice_ver_pos = height_in_mbs / (1 + !!pic_param->pic_fields.bits.field_pic_flag);




More information about the Libva mailing list