mirror of https://git.ffmpeg.org/ffmpeg.git
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:
parent
0b5c93b276
commit
48627aaf64
|
@ -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, ¶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)
|
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, ¶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);
|
ret = MFXVideoDECODE_Init(q->session, ¶m);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ff_qsv_print_error(avctx, ret,
|
return ff_qsv_print_error(avctx, ret,
|
||||||
|
|
Loading…
Reference in New Issue