> From: ffmpeg-devel <ffmpeg-devel-boun...@ffmpeg.org> On Behalf Of > Mark Thompson > Sent: Sunday, April 12, 2020 21:00 > To: ffmpeg-devel@ffmpeg.org > Subject: [FFmpeg-devel] [PATCH] vaapi_decode: Improve logging around > codec/profile selection > > --- > 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; > -- Generally makes sense, however there is one concern if I got it correctly:
If a codec is not supported by VAAPI in current libavcodec build, ff_get_format() would not select VAAPI as the HW acceleration. Instead, it would fallback to the native software decoding path, and won't trigger the (!found_codec) logic. ./configure --enable-vaapi --disable-hwaccel=hevc_vaapi $ ffmpeg -v debug -hwaccel vaapi -i ./hevc_rext_decode/Main_422_10_A_RExt_Sony_2.bin -f null - Log: [hevc @ 0x5592f7b0fec0] Format yuv422p10le chosen by get_format(). VAAPI error return would not be triggered. - Linjie _______________________________________________ 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".