@ -69,6 +69,8 @@ enum var_name {
VARS_NB
VARS_NB
} ;
} ;
# define QSV_HAVE_SCALING_CONFIG QSV_VERSION_ATLEAST(1, 19)
typedef struct QSVScaleContext {
typedef struct QSVScaleContext {
const AVClass * class ;
const AVClass * class ;
@ -88,7 +90,14 @@ typedef struct QSVScaleContext {
int nb_surface_ptrs_out ;
int nb_surface_ptrs_out ;
mfxExtOpaqueSurfaceAlloc opaque_alloc ;
mfxExtOpaqueSurfaceAlloc opaque_alloc ;
mfxExtBuffer * ext_buffers [ 1 ] ;
# if QSV_HAVE_SCALING_CONFIG
mfxExtVPPScaling scale_conf ;
# endif
int mode ;
mfxExtBuffer * ext_buffers [ 1 + QSV_HAVE_SCALING_CONFIG ] ;
int num_ext_buf ;
int shift_width , shift_height ;
int shift_width , shift_height ;
@ -285,6 +294,8 @@ static int init_out_session(AVFilterContext *ctx)
mfxStatus err ;
mfxStatus err ;
int i ;
int i ;
s - > num_ext_buf = 0 ;
/* extract the properties of the "master" session given to us */
/* extract the properties of the "master" session given to us */
err = MFXQueryIMPL ( device_hwctx - > session , & impl ) ;
err = MFXQueryIMPL ( device_hwctx - > session , & impl ) ;
if ( err = = MFX_ERR_NONE )
if ( err = = MFX_ERR_NONE )
@ -357,10 +368,7 @@ static int init_out_session(AVFilterContext *ctx)
s - > opaque_alloc . Header . BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION ;
s - > opaque_alloc . Header . BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION ;
s - > opaque_alloc . Header . BufferSz = sizeof ( s - > opaque_alloc ) ;
s - > opaque_alloc . Header . BufferSz = sizeof ( s - > opaque_alloc ) ;
s - > ext_buffers [ 0 ] = ( mfxExtBuffer * ) & s - > opaque_alloc ;
s - > ext_buffers [ s - > num_ext_buf + + ] = ( mfxExtBuffer * ) & s - > opaque_alloc ;
par . ExtParam = s - > ext_buffers ;
par . NumExtParam = FF_ARRAY_ELEMS ( s - > ext_buffers ) ;
par . IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY ;
par . IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | MFX_IOPATTERN_OUT_OPAQUE_MEMORY ;
} else {
} else {
@ -396,6 +404,18 @@ static int init_out_session(AVFilterContext *ctx)
par . IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY ;
par . IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | MFX_IOPATTERN_OUT_VIDEO_MEMORY ;
}
}
# if QSV_HAVE_SCALING_CONFIG
memset ( & s - > scale_conf , 0 , sizeof ( mfxExtVPPScaling ) ) ;
s - > scale_conf . Header . BufferId = MFX_EXTBUFF_VPP_SCALING ;
s - > scale_conf . Header . BufferSz = sizeof ( mfxExtVPPScaling ) ;
s - > scale_conf . ScalingMode = s - > mode ;
s - > ext_buffers [ s - > num_ext_buf + + ] = ( mfxExtBuffer * ) & s - > scale_conf ;
av_log ( ctx , AV_LOG_VERBOSE , " Scaling mode: % " PRIu16 " \n " , s - > mode ) ;
# endif
par . ExtParam = s - > ext_buffers ;
par . NumExtParam = s - > num_ext_buf ;
par . AsyncDepth = 1 ; // TODO async
par . AsyncDepth = 1 ; // TODO async
par . vpp . In = in_frames_hwctx - > surfaces [ 0 ] . Info ;
par . vpp . In = in_frames_hwctx - > surfaces [ 0 ] . Info ;
@ -595,6 +615,16 @@ static const AVOption options[] = {
{ " h " , " Output video height " , OFFSET ( h_expr ) , AV_OPT_TYPE_STRING , { . str = " ih " } , . flags = FLAGS } ,
{ " h " , " Output video height " , OFFSET ( h_expr ) , AV_OPT_TYPE_STRING , { . str = " ih " } , . flags = FLAGS } ,
{ " format " , " Output pixel format " , OFFSET ( format_str ) , AV_OPT_TYPE_STRING , { . str = " same " } , . flags = FLAGS } ,
{ " format " , " Output pixel format " , OFFSET ( format_str ) , AV_OPT_TYPE_STRING , { . str = " same " } , . flags = FLAGS } ,
# if QSV_HAVE_SCALING_CONFIG
{ " mode " , " set scaling mode " , OFFSET ( mode ) , AV_OPT_TYPE_INT , { . i64 = MFX_SCALING_MODE_DEFAULT } , MFX_SCALING_MODE_DEFAULT , MFX_SCALING_MODE_QUALITY , FLAGS , " mode " } ,
{ " low_power " , " low power mode " , 0 , AV_OPT_TYPE_CONST , { . i64 = MFX_SCALING_MODE_LOWPOWER } , INT_MIN , INT_MAX , FLAGS , " mode " } ,
{ " hq " , " high quality mode " , 0 , AV_OPT_TYPE_CONST , { . i64 = MFX_SCALING_MODE_QUALITY } , INT_MIN , INT_MAX , FLAGS , " mode " } ,
# else
{ " mode " , " (not supported) " , OFFSET ( mode ) , AV_OPT_TYPE_INT , { . i64 = 0 } , 0 , INT_MAX , FLAGS , " mode " } ,
{ " low_power " , " " , 0 , AV_OPT_TYPE_CONST , { . i64 = 1 } , 0 , 0 , FLAGS , " mode " } ,
{ " hq " , " " , 0 , AV_OPT_TYPE_CONST , { . i64 = 2 } , 0 , 0 , FLAGS , " mode " } ,
# endif
{ NULL } ,
{ NULL } ,
} ;
} ;