diff options
author | Zhong Li <zhong.li@intel.com> | 2019-04-25 18:51:10 +0800 |
---|---|---|
committer | Zhong Li <zhong.li@intel.com> | 2019-05-07 11:00:05 +0800 |
commit | 48627aaf646270a8c98337ee208574543e499bfd (patch) | |
tree | 28f799f347239a229afc60e79e6553ef7a7e68dc | |
parent | 0b5c93b276a14d1990aaabd77410a562f4b242c3 (diff) | |
download | ffmpeg-48627aaf646270a8c98337ee208574543e499bfd.tar.gz |
lavc/qsvdec: add query function and provide error message
It is helpful to know why some clips decoding failed.
Ticket#7330 is a good example, with this patch it is easily to
know bitstream codec level is out of support range.
Signed-off-by: Zhong Li <zhong.li@intel.com>
-rw-r--r-- | libavcodec/qsvdec.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 4a0be811fb..2a8a032111 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -120,6 +120,33 @@ static inline unsigned int qsv_fifo_size(const AVFifoBuffer* fifo) return av_fifo_size(fifo) / qsv_fifo_item_size(); } +static int check_dec_param(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param_in) +{ + mfxVideoParam param_out = { .mfx.CodecId = param_in->mfx.CodecId }; + mfxStatus ret; + +#define CHECK_MATCH(x) \ + do { \ + if (param_out.mfx.x != param_in->mfx.x) { \ + av_log(avctx, AV_LOG_WARNING, "Required "#x" %d is unsupported\n", \ + param_in->mfx.x); \ + } \ + } while (0) + + ret = MFXVideoDECODE_Query(q->session, param_in, ¶m_out); + + if (ret < 0) { + CHECK_MATCH(CodecId); + CHECK_MATCH(CodecProfile); + CHECK_MATCH(CodecLevel); + CHECK_MATCH(FrameInfo.Width); + CHECK_MATCH(FrameInfo.Height); +#undef CHECK_MATCH + return 0; + } + return 1; +} + static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q) { const AVPixFmtDescriptor *desc; @@ -206,6 +233,12 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q) param.ExtParam = q->ext_buffers; param.NumExtParam = q->nb_ext_buffers; + if (!check_dec_param(avctx, q, ¶m)) { + //Just give a warning instead of an error since it is still decodable possibly. + av_log(avctx, AV_LOG_WARNING, + "Current input bitstream is not supported by QSV decoder.\n"); + } + ret = MFXVideoDECODE_Init(q->session, ¶m); if (ret < 0) return ff_qsv_print_error(avctx, ret, |