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>
This commit is contained in:
Zhong Li 2019-04-25 18:51:10 +08:00
parent 0b5c93b276
commit 48627aaf64
1 changed files with 33 additions and 0 deletions

View File

@ -120,6 +120,33 @@ static inline unsigned int qsv_fifo_size(const AVFifoBuffer* fifo)
return av_fifo_size(fifo) / qsv_fifo_item_size(); 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) static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
{ {
const AVPixFmtDescriptor *desc; const AVPixFmtDescriptor *desc;
@ -206,6 +233,12 @@ static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
param.ExtParam = q->ext_buffers; param.ExtParam = q->ext_buffers;
param.NumExtParam = q->nb_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); ret = MFXVideoDECODE_Init(q->session, &param);
if (ret < 0) if (ret < 0)
return ff_qsv_print_error(avctx, ret, return ff_qsv_print_error(avctx, ret,