[vlc-commits] hw:vaapi:fixed broken HEVC decoding

Oliver Collyer git at videolan.org
Mon Jul 24 09:05:23 CEST 2017


vlc | branch: master | Oliver Collyer <ovcollyer at mac.com> | Sun Jul 23 11:48:05 2017 +0300| [15c4f89c175f04ac3db480e7f6c605168ab5e593] | committer: Thomas Guillem

hw:vaapi:fixed broken HEVC decoding

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.

Signed-off-by: Thomas Guillem <thomas at gllm.fr>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=15c4f89c175f04ac3db480e7f6c605168ab5e593
---

 modules/codec/avcodec/vaapi.c | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

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;



More information about the vlc-commits mailing list