@ -356,15 +356,34 @@ static int select_rc_mode(AVCodecContext *avctx, QSVEncContext *q)
return 0 ;
}
static int rc_supported ( QSVEncContext * q )
static int check_enc_param ( AVCodecContext * avctx , QSVEncContext * q )
{
mfxVideoParam param_out = { . mfx . CodecId = q - > param . mfx . CodecId } ;
mfxStatus ret ;
# define UNMATCH(x) (param_out.mfx.x != q->param.mfx.x)
ret = MFXVideoENCODE_Query ( q - > session , & q - > param , & param_out ) ;
if ( ret < 0 | |
param_out . mfx . RateControlMethod ! = q - > param . mfx . RateControlMethod )
if ( ret < 0 ) {
if ( UNMATCH ( CodecId ) )
av_log ( avctx , AV_LOG_ERROR , " Current codec type is unsupported \n " ) ;
if ( UNMATCH ( CodecProfile ) )
av_log ( avctx , AV_LOG_ERROR , " Current profile is unsupported \n " ) ;
if ( UNMATCH ( RateControlMethod ) )
av_log ( avctx , AV_LOG_ERROR , " Selected ratecontrol mode is unsupported \n " ) ;
if ( UNMATCH ( LowPower ) )
av_log ( avctx , AV_LOG_ERROR , " Low power mode is unsupported \n " ) ;
if ( UNMATCH ( FrameInfo . FrameRateExtN ) | | UNMATCH ( FrameInfo . FrameRateExtN ) )
av_log ( avctx , AV_LOG_ERROR , " Current frame rate is unsupported \n " ) ;
if ( UNMATCH ( FrameInfo . PicStruct ) )
av_log ( avctx , AV_LOG_ERROR , " Current picture structure is unsupported \n " ) ;
if ( UNMATCH ( FrameInfo . Width ) | | UNMATCH ( FrameInfo . Height ) )
av_log ( avctx , AV_LOG_ERROR , " Current resolution is unsupported \n " ) ;
if ( UNMATCH ( FrameInfo . FourCC ) )
av_log ( avctx , AV_LOG_ERROR , " Current pixel format is unsupported \n " ) ;
return 0 ;
}
return 1 ;
}
@ -639,10 +658,10 @@ FF_ENABLE_DEPRECATION_WARNINGS
# endif
}
if ( ! rc_supported ( q ) ) {
if ( ! check_enc_param ( avctx , q ) ) {
av_log ( avctx , AV_LOG_ERROR ,
" Selected ratecontrol mode is not supported by the QSV "
" runtime. Choose a different mode . \n " ) ;
" some encoding parameters are not supported by the QSV "
" runtime. Please double check the input parameters . \n " ) ;
return AVERROR ( ENOSYS ) ;
}