--- 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".