summaryrefslogtreecommitdiff
path: root/libavcodec/qsvdec.c
diff options
context:
space:
mode:
authorZhong Li <zhong.li@intel.com>2019-04-25 18:51:10 +0800
committerZhong Li <zhong.li@intel.com>2019-05-07 11:00:05 +0800
commit48627aaf646270a8c98337ee208574543e499bfd (patch)
tree28f799f347239a229afc60e79e6553ef7a7e68dc /libavcodec/qsvdec.c
parent0b5c93b276a14d1990aaabd77410a562f4b242c3 (diff)
downloadffmpeg-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>
Diffstat (limited to 'libavcodec/qsvdec.c')
-rw-r--r--libavcodec/qsvdec.c33
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, &param_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, &param)) {
+ //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, &param);
if (ret < 0)
return ff_qsv_print_error(avctx, ret,