---
On 12/04/2020 13:14, Mark Thompson wrote:
> ...  This does rather suggest that the error messages in that file should be 
> clearer, though - it would be nice if it could distinguish between "this 
> codec isn't supported by libavcodec at all", "this codec might work but 
> hasn't built into this libavcodec" and "this codec is supported by libavcodec 
> but not by your hardware".

Something like this?


 libavcodec/vaapi_decode.c | 39 +++++++++++++++++++++++++++++++--------
 1 file changed, 31 insertions(+), 8 deletions(-)

diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c
index 54a0ecb47a..a191850e36 100644
--- a/libavcodec/vaapi_decode.c
+++ b/libavcodec/vaapi_decode.c
@@ -429,6 +429,7 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
     const AVCodecDescriptor *codec_desc;
     VAProfile *profile_list = NULL, matched_va_profile, va_profile;
     int profile_count, exact_match, matched_ff_profile, codec_profile;
+    int found_codec, found_profile;
 
     AVHWDeviceContext    *device = (AVHWDeviceContext*)device_ref->data;
     AVVAAPIDeviceContext *hwctx = device->hwctx;
@@ -457,15 +458,19 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
     }
 
     matched_va_profile = VAProfileNone;
+    found_codec = found_profile = 0;
     exact_match = 0;
 
     for (i = 0; i < FF_ARRAY_ELEMS(vaapi_profile_map); i++) {
         int profile_match = 0;
         if (avctx->codec_id != vaapi_profile_map[i].codec_id)
             continue;
+        found_codec = 1;
         if (avctx->profile == vaapi_profile_map[i].codec_profile ||
-            vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN)
+            vaapi_profile_map[i].codec_profile == FF_PROFILE_UNKNOWN) {
             profile_match = 1;
+            found_profile = 1;
+        }
 
         va_profile = vaapi_profile_map[i].profile_parser ?
                      vaapi_profile_map[i].profile_parser(avctx) :
@@ -487,24 +492,42 @@ static int vaapi_decode_make_config(AVCodecContext *avctx,
     }
     av_freep(&profile_list);
 
-    if (matched_va_profile == VAProfileNone) {
-        av_log(avctx, AV_LOG_ERROR, "No support for codec %s "
-               "profile %d.\n", codec_desc->name, avctx->profile);
+    if (!found_codec) {
+        av_log(avctx, AV_LOG_ERROR, "This libavcodec build does not "
+               "support VAAPI decoding of codec %s.\n",
+               codec_desc->name);
+        err = AVERROR(ENOSYS);
+        goto fail;
+    }
+    if (!found_profile && !(avctx->hwaccel_flags &
+                            AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH)) {
+        // We allow this case with profile-mismatch enabled to support
+        // things like trying to decode H.264 extended profile.
+        av_log(avctx, AV_LOG_ERROR, "This libavcodec build does not "
+               "support VAAPI decoding of codec %s profile %d.\n",
+               codec_desc->name, avctx->profile);
         err = AVERROR(ENOSYS);
         goto fail;
     }
+    if (matched_va_profile == VAProfileNone) {
+        av_log(avctx, AV_LOG_ERROR, "This VAAPI driver does not "
+               "support decoding of codec %s.\n",
+               codec_desc->name);
+        err = AVERROR(EINVAL);
+        goto fail;
+    }
     if (!exact_match) {
         if (avctx->hwaccel_flags &
             AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH) {
-            av_log(avctx, AV_LOG_VERBOSE, "Codec %s profile %d not "
-                   "supported for hardware decode.\n",
+            av_log(avctx, AV_LOG_WARNING, "This VAAPI driver does not "
+                   "support decoding of codec %s profile %d.\n",
                    codec_desc->name, avctx->profile);
             av_log(avctx, AV_LOG_WARNING, "Using possibly-"
                    "incompatible profile %d instead.\n",
                    matched_ff_profile);
         } else {
-            av_log(avctx, AV_LOG_VERBOSE, "Codec %s profile %d not "
-                   "supported for hardware decode.\n",
+            av_log(avctx, AV_LOG_ERROR, "This VAAPI driver does not "
+                   "support decoding of codec %s profile %d.\n",
                    codec_desc->name, avctx->profile);
             err = AVERROR(EINVAL);
             goto fail;
-- 
2.25.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to