@ -50,14 +50,14 @@ struct FrameListData {
} ;
typedef struct VP8EncoderContext {
AVClass * av_ class;
AVClass * class ;
struct vpx_codec_ctx encoder ;
struct vpx_image rawimg ;
struct vpx_fixed_buf twopass_stats ;
int deadline ; //i.e., RT/GOOD/BEST
struct FrameListData * coded_frame_list ;
int cpuused ;
int cpu_ used ;
/**
* VP8 specific flags , see VP8F_ * below .
@ -70,7 +70,7 @@ typedef struct VP8EncoderContext {
int arnr_strength ;
int arnr_type ;
int rc_lookahead ;
int lag_in_frames ;
int crf ;
} VP8Context ;
@ -245,10 +245,10 @@ static av_cold int vp8_init(AVCodecContext *avctx)
enccfg . g_threads = avctx - > thread_count ;
# if FF_API_X264_GLOBAL_OPTS
enccfg . g_lag_in_frames = FFMIN ( avctx - > rc_lookahead , 25 ) ; //0-25, avoids init failure
if ( ctx - > rc_lookahead > = 0 )
enccfg . g_lag_in_frames = ctx - > rc_lookahead ;
if ( ctx - > lag_in_frames > = 0 )
enccfg . g_lag_in_frames = ctx - > lag_in_frames ;
# else
enccfg . g_lag_in_frames = ctx - > rc_lookahead ;
enccfg . g_lag_in_frames = ctx - > lag_in_frames ;
# endif
if ( avctx - > flags & CODEC_FLAG_PASS1 )
@ -345,7 +345,11 @@ static av_cold int vp8_init(AVCodecContext *avctx)
//codec control failures are currently treated only as warnings
av_log ( avctx , AV_LOG_DEBUG , " vpx_codec_control \n " ) ;
codecctl_int ( avctx , VP8E_SET_CPUUSED , ctx - > cpuused ) ;
codecctl_int ( avctx , VP8E_SET_CPUUSED , ctx - > cpu_used ) ;
codecctl_int ( avctx , VP8E_SET_ENABLEAUTOALTREF , ! ! ( ctx - > flags & VP8F_AUTO_ALT_REF ) ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_MAXFRAMES , ctx - > arnr_max_frames ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_STRENGTH , ctx - > arnr_strength ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_TYPE , ctx - > arnr_type ) ;
codecctl_int ( avctx , VP8E_SET_NOISE_SENSITIVITY , avctx - > noise_reduction ) ;
codecctl_int ( avctx , VP8E_SET_TOKEN_PARTITIONS , av_log2 ( avctx - > slices ) ) ;
codecctl_int ( avctx , VP8E_SET_STATIC_THRESHOLD , avctx - > mb_threshold ) ;
@ -356,10 +360,6 @@ static av_cold int vp8_init(AVCodecContext *avctx)
# else
codecctl_int ( avctx , VP8E_SET_CQ_LEVEL , ctx - > crf ) ;
# endif
codecctl_int ( avctx , VP8E_SET_ENABLEAUTOALTREF , ! ! ( ctx - > flags & VP8F_AUTO_ALT_REF ) ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_MAXFRAMES , ctx - > arnr_max_frames ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_STRENGTH , ctx - > arnr_strength ) ;
codecctl_int ( avctx , VP8E_SET_ARNR_TYPE , ctx - > arnr_type ) ;
av_log ( avctx , AV_LOG_DEBUG , " Using deadline: %d \n " , ctx - > deadline ) ;
@ -545,34 +545,30 @@ static int vp8_encode(AVCodecContext *avctx, uint8_t *buf, int buf_size,
return coded_size ;
}
# define V AV_OPT_FLAG_VIDEO_PARAM
# define E AV_OPT_FLAG_ENCODING_PARAM
# define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
static const AVOption options [ ] = {
{ " speed " , " " , offsetof ( VP8Context , cpuused ) , FF_OPT_TYPE_INT , { . dbl = 3 } , - 16 , 16 , V | E } ,
{ " quality " , " " , offsetof ( VP8Context , deadline ) , FF_OPT_TYPE_INT , { . dbl = VPX_DL_GOOD_QUALITY } , INT_MIN , INT_MAX , V | E , " quality " } ,
{ " best " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_BEST_QUALITY } , INT_MIN , INT_MAX , V | E , " quality " } ,
{ " good " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_GOOD_QUALITY } , INT_MIN , INT_MAX , V | E , " quality " } ,
{ " realtime " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_REALTIME } , INT_MIN , INT_MAX , V | E , " quality " } ,
{ " vp8flags " , " " , offsetof ( VP8Context , flags ) , FF_OPT_TYPE_FLAGS , { . dbl = 0 } , 0 , UINT_MAX , V | E , " flags " } ,
{ " error_resilient " , " enable error resilience " , 0 , FF_OPT_TYPE_CONST , { . dbl = VP8F_ERROR_RESILIENT } , INT_MIN , INT_MAX , V | E , " flags " } ,
{ " altref " , " enable use of alternate reference frames (VP8/2-pass only) " , 0 , FF_OPT_TYPE_CONST , { . dbl = VP8F_AUTO_ALT_REF } , INT_MIN , INT_MAX , V | E , " flags " } ,
{ " arnr_max_frames " , " altref noise reduction max frame count " , offsetof ( VP8Context , arnr_max_frames ) , FF_OPT_TYPE_INT , { . dbl = 0 } , 0 , 15 , V | E } ,
{ " arnr_strength " , " altref noise reduction filter strength " , offsetof ( VP8Context , arnr_strength ) , FF_OPT_TYPE_INT , { . dbl = 3 } , 0 , 6 , V | E } ,
{ " arnr_type " , " altref noise reduction filter type " , offsetof ( VP8Context , arnr_type ) , FF_OPT_TYPE_INT , { . dbl = 3 } , 1 , 3 , V | E } ,
{ " speed " , " " , offsetof ( VP8Context , cpu_ used ) , FF_OPT_TYPE_INT , { . dbl = 3 } , - 16 , 16 , VE } ,
{ " quality " , " " , offsetof ( VP8Context , deadline ) , FF_OPT_TYPE_INT , { . dbl = VPX_DL_GOOD_QUALITY } , INT_MIN , INT_MAX , VE , " quality " } ,
{ " best " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_BEST_QUALITY } , INT_MIN , INT_MAX , VE , " quality " } ,
{ " good " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_GOOD_QUALITY } , INT_MIN , INT_MAX , VE , " quality " } ,
{ " realtime " , NULL , 0 , FF_OPT_TYPE_CONST , { . dbl = VPX_DL_REALTIME } , INT_MIN , INT_MAX , VE , " quality " } ,
{ " vp8flags " , " " , offsetof ( VP8Context , flags ) , FF_OPT_TYPE_FLAGS , { . dbl = 0 } , 0 , UINT_MAX , VE , " flags " } ,
{ " error_resilient " , " enable error resilience " , 0 , FF_OPT_TYPE_CONST , { . dbl = VP8F_ERROR_RESILIENT } , INT_MIN , INT_MAX , VE , " flags " } ,
{ " altref " , " enable use of alternate reference frames (VP8/2-pass only) " , 0 , FF_OPT_TYPE_CONST , { . dbl = VP8F_AUTO_ALT_REF } , INT_MIN , INT_MAX , VE , " flags " } ,
{ " arnr_max_frames " , " altref noise reduction max frame count " , offsetof ( VP8Context , arnr_max_frames ) , FF_OPT_TYPE_INT , { . dbl = 0 } , 0 , 15 , VE } ,
{ " arnr_strength " , " altref noise reduction filter strength " , offsetof ( VP8Context , arnr_strength ) , FF_OPT_TYPE_INT , { . dbl = 3 } , 0 , 6 , VE } ,
{ " arnr_type " , " altref noise reduction filter type " , offsetof ( VP8Context , arnr_type ) , FF_OPT_TYPE_INT , { . dbl = 3 } , 1 , 3 , VE } ,
# if FF_API_X264_GLOBAL_OPTS
{ " rc_lookahead " , " Number of frames to look ahead for alternate reference frame selection " , offsetof ( VP8Context , rc_lookahead ) , FF_OPT_TYPE_INT , { . dbl = - 1 } , - 1 , 25 , V | E } ,
{ " crf " , " Select the quality for constant quality mode " , offsetof ( VP8Context , crf ) , FF_OPT_TYPE_INT , { . dbl = - 1 } , - 1 , 63 , V | E } ,
{ " rc_lookahead " , " Number of frames to look ahead for alternate reference frame selection " , offsetof ( VP8Context , lag_in_frames ) , FF_OPT_TYPE_INT , { . dbl = - 1 } , - 1 , 25 , VE } ,
{ " crf " , " Select the quality for constant quality mode " , offsetof ( VP8Context , crf ) , FF_OPT_TYPE_INT , { . dbl = - 1 } , - 1 , 63 , VE } ,
# else
{ " rc_lookahead " , " Number of frames to look ahead for alternate reference frame selection " , offsetof ( VP8Context , rc_lookahead ) , FF_OPT_TYPE_INT , { . dbl = 25 } , 0 , 25 , V | E } ,
{ " crf " , " Select the quality for constant quality mode " , offsetof ( VP8Context , crf ) , FF_OPT_TYPE_INT , { . dbl = 0 } , 0 , 63 , V | E } ,
{ " rc_lookahead " , " Number of frames to look ahead for alternate reference frame selection " , offsetof ( VP8Context , lag_in_frames ) , FF_OPT_TYPE_INT , { . dbl = 25 } , 0 , 25 , VE } ,
{ " crf " , " Select the quality for constant quality mode " , offsetof ( VP8Context , crf ) , FF_OPT_TYPE_INT , { . dbl = 0 } , 0 , 63 , VE } ,
# endif
{ NULL }
} ;
# undef V
# undef E
static const AVClass class = {
. class_name = " libvpx encoder " ,
. item_name = av_default_item_name ,