[FFmpeg-devel] [PATCH 1/2] avcodec/vaapi: slice_vertical_position starts from zero for the second field

Xiang, Haihao haihao.xiang at intel.com
Wed May 9 11:54:57 EEST 2018


On Wed, 2018-05-09 at 07:50 +0200, Jerome Borsboom wrote:
> Contrary to VC-1 spec, VAAPI expects the row address of the first
> macroblock row in the first slice to start from zero for the second
> field in a field interlaced picture.
> 
> Signed-off-by: Jerome Borsboom <jerome.borsboom at carpalis.nl>
> ---
> This patch set adds support for hardware decoding multi-slice field interlaced
> pictures. With this patch set, the SA10180 test file decodes correctly with
> VAAPI hardware acceleration. This was succesfully tested on Intel Haswell
> platform.
> 

I still see lots of artifacts for a multi-slice field interfaced VC-1 video on
Coffee Lake, maybe we should fix it in the driver 

Thanks
Haihao


>  libavcodec/vaapi_vc1.c | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/vaapi_vc1.c b/libavcodec/vaapi_vc1.c
> index bdb5e24cc5..921ca6391b 100644
> --- a/libavcodec/vaapi_vc1.c
> +++ b/libavcodec/vaapi_vc1.c
> @@ -467,6 +467,7 @@ static int vaapi_vc1_decode_slice(AVCodecContext *avctx,
> const uint8_t *buffer,
>      const MpegEncContext *s = &v->s;
>      VAAPIDecodePicture *pic = s->current_picture_ptr-
> >hwaccel_picture_private;
>      VASliceParameterBufferVC1 slice_param;
> +    int mb_height;
>      int err;
>  
>      /* Current bit buffer is beyond any marker for VC-1, so skip it */
> @@ -475,12 +476,17 @@ static int vaapi_vc1_decode_slice(AVCodecContext *avctx,
> const uint8_t *buffer,
>          size -= 4;
>      }
>  
> +    if (v->fcm == ILACE_FIELD)
> +        mb_height = avctx->coded_height + 31 >> 5;
> +    else
> +        mb_height = avctx->coded_height + 15 >> 4;
> +
>      slice_param = (VASliceParameterBufferVC1) {
>          .slice_data_size         = size,
>          .slice_data_offset       = 0,
>          .slice_data_flag         = VA_SLICE_DATA_FLAG_ALL,
>          .macroblock_offset       = get_bits_count(&s->gb),
> -        .slice_vertical_position = s->mb_y,
> +        .slice_vertical_position = s->mb_y % mb_height,
>      };
>  
>      err = ff_vaapi_decode_make_slice_buffer(avctx, pic,


More information about the ffmpeg-devel mailing list