@ -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 ,