[vlc-devel] [PATCH] hw:vaapi:fixed broken HEVC decoding

Thomas Guillem thomas at gllm.fr
Mon Jul 24 09:05:53 CEST 2017


Merged, thanks !

I think the regression was introduced by me.

On Sun, Jul 23, 2017, at 10:48, Oliver Collyer wrote:
> Since around middle of July the GetVAProfile function has been failing
> for the HEVC codec because cxt->profile contains '-99' meaning unknown.
> At least, this is the case for mpeg-ts anyway. I haven't tried any
> others.
> 
> If we instead pass in fmt and use fmt->i_profile it fixes this and HEVC
> decoding works again.
> 
> I don't know what has caused this, but I can see that dxva2 references
> fmt->i_profile when checking the profile, and not ctx->profile so this
> patch brings vaapi into line with that.
> 
> diff --git a/modules/codec/avcodec/vaapi.c
> b/modules/codec/avcodec/vaapi.c
> old mode 100644
> new mode 100755
> index a9609b5838..61d9c7ce47
> --- a/modules/codec/avcodec/vaapi.c
> +++ b/modules/codec/avcodec/vaapi.c
> @@ -62,8 +62,8 @@ struct vlc_va_sys_t
>  #endif
>  };
>  
> -static int GetVaProfile(AVCodecContext *ctx, VAProfile *va_profile,
> -                        unsigned *pic_count)
> +static int GetVaProfile(AVCodecContext *ctx, const es_format_t *fmt,
> +                        VAProfile *va_profile, unsigned *pic_count)
>  {
>      VAProfile i_profile;
>      unsigned count = 3;
> @@ -89,9 +89,9 @@ static int GetVaProfile(AVCodecContext *ctx, VAProfile
> *va_profile,
>          count = 18;
>          break;
>      case AV_CODEC_ID_HEVC:
> -        if (ctx->profile == FF_PROFILE_HEVC_MAIN)
> +        if (fmt->i_profile == FF_PROFILE_HEVC_MAIN)
>              i_profile = VAProfileHEVCMain;
> -        else if (ctx->profile == FF_PROFILE_HEVC_MAIN_10)
> +        else if (fmt->i_profile == FF_PROFILE_HEVC_MAIN_10)
>              i_profile = VAProfileHEVCMain10;
>          else
>              return VLC_EGENERIC;
> @@ -102,10 +102,10 @@ static int GetVaProfile(AVCodecContext *ctx,
> VAProfile *va_profile,
>          count = 5;
>          break;
>      case AV_CODEC_ID_VP9:
> -        if (ctx->profile == FF_PROFILE_VP9_0)
> +        if (fmt->i_profile == FF_PROFILE_VP9_0)
>              i_profile = VAProfileVP9Profile0;
>  #if VA_CHECK_VERSION( 0, 39, 0 )
> -        else if (ctx->profile == FF_PROFILE_VP9_2)
> +        else if (fmt->i_profile == FF_PROFILE_VP9_2)
>              i_profile = VAProfileVP9Profile2;
>  #endif
>          else
> @@ -171,7 +171,7 @@ static int CreateDR(vlc_va_t *va, AVCodecContext
> *ctx, enum PixelFormat pix_fmt,
>  
>      VAProfile i_profile;
>      unsigned count;
> -    if (GetVaProfile(ctx, &i_profile, &count) != VLC_SUCCESS)
> +    if (GetVaProfile(ctx, fmt, &i_profile, &count) != VLC_SUCCESS)
>          goto error;
>  
>      sys = malloc(sizeof *sys);
> @@ -287,7 +287,7 @@ static int Create(vlc_va_t *va, AVCodecContext *ctx,
> enum PixelFormat pix_fmt,
>  
>      VAProfile i_profile;
>      unsigned count;
> -    if (GetVaProfile(ctx, &i_profile, &count) != VLC_SUCCESS)
> +    if (GetVaProfile(ctx, fmt, &i_profile, &count) != VLC_SUCCESS)
>          return VLC_EGENERIC;
>  
>      vlc_va_sys_t *sys;
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list