@ -158,6 +158,95 @@ static int avfmt2_num_planes(int avfmt)
}
}
static void reconfig_encoder ( AVCodecContext * ctx , const AVFrame * frame )
{
X264Context * x4 = ctx - > priv_data ;
AVFrameSideData * side_data ;
if ( x4 - > avcintra_class < 0 ) {
if ( x4 - > params . b_interlaced & & x4 - > params . b_tff ! = frame - > top_field_first ) {
x4 - > params . b_tff = frame - > top_field_first ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . vui . i_sar_height ! = ctx - > sample_aspect_ratio . den | |
x4 - > params . vui . i_sar_width ! = ctx - > sample_aspect_ratio . num ) {
x4 - > params . vui . i_sar_height = ctx - > sample_aspect_ratio . den ;
x4 - > params . vui . i_sar_width = ctx - > sample_aspect_ratio . num ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_vbv_buffer_size ! = ctx - > rc_buffer_size / 1000 | |
x4 - > params . rc . i_vbv_max_bitrate ! = ctx - > rc_max_rate / 1000 ) {
x4 - > params . rc . i_vbv_buffer_size = ctx - > rc_buffer_size / 1000 ;
x4 - > params . rc . i_vbv_max_bitrate = ctx - > rc_max_rate / 1000 ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_rc_method = = X264_RC_ABR & &
x4 - > params . rc . i_bitrate ! = ctx - > bit_rate / 1000 ) {
x4 - > params . rc . i_bitrate = ctx - > bit_rate / 1000 ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > crf > = 0 & &
x4 - > params . rc . i_rc_method = = X264_RC_CRF & &
x4 - > params . rc . f_rf_constant ! = x4 - > crf ) {
x4 - > params . rc . f_rf_constant = x4 - > crf ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_rc_method = = X264_RC_CQP & &
x4 - > cqp > = 0 & &
x4 - > params . rc . i_qp_constant ! = x4 - > cqp ) {
x4 - > params . rc . i_qp_constant = x4 - > cqp ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > crf_max > = 0 & &
x4 - > params . rc . f_rf_constant_max ! = x4 - > crf_max ) {
x4 - > params . rc . f_rf_constant_max = x4 - > crf_max ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
side_data = av_frame_get_side_data ( frame , AV_FRAME_DATA_STEREO3D ) ;
if ( side_data ) {
AVStereo3D * stereo = ( AVStereo3D * ) side_data - > data ;
int fpa_type ;
switch ( stereo - > type ) {
case AV_STEREO3D_CHECKERBOARD :
fpa_type = 0 ;
break ;
case AV_STEREO3D_COLUMNS :
fpa_type = 1 ;
break ;
case AV_STEREO3D_LINES :
fpa_type = 2 ;
break ;
case AV_STEREO3D_SIDEBYSIDE :
fpa_type = 3 ;
break ;
case AV_STEREO3D_TOPBOTTOM :
fpa_type = 4 ;
break ;
case AV_STEREO3D_FRAMESEQUENCE :
fpa_type = 5 ;
break ;
default :
fpa_type = - 1 ;
break ;
}
if ( fpa_type ! = x4 - > params . i_frame_packing ) {
x4 - > params . i_frame_packing = fpa_type ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
}
static int X264_frame ( AVCodecContext * ctx , AVPacket * pkt , const AVFrame * frame ,
int * got_packet )
{
@ -165,7 +254,6 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
x264_nal_t * nal ;
int nnal , i , ret ;
x264_picture_t pic_out = { 0 } ;
AVFrameSideData * side_data ;
x264_picture_init ( & x4 - > pic ) ;
x4 - > pic . img . i_csp = x4 - > params . i_csp ;
@ -186,86 +274,7 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame,
frame - > pict_type = = AV_PICTURE_TYPE_B ? X264_TYPE_B :
X264_TYPE_AUTO ;
if ( x4 - > avcintra_class < 0 ) {
if ( x4 - > params . b_interlaced & & x4 - > params . b_tff ! = frame - > top_field_first ) {
x4 - > params . b_tff = frame - > top_field_first ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . vui . i_sar_height ! = ctx - > sample_aspect_ratio . den | |
x4 - > params . vui . i_sar_width ! = ctx - > sample_aspect_ratio . num ) {
x4 - > params . vui . i_sar_height = ctx - > sample_aspect_ratio . den ;
x4 - > params . vui . i_sar_width = ctx - > sample_aspect_ratio . num ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_vbv_buffer_size ! = ctx - > rc_buffer_size / 1000 | |
x4 - > params . rc . i_vbv_max_bitrate ! = ctx - > rc_max_rate / 1000 ) {
x4 - > params . rc . i_vbv_buffer_size = ctx - > rc_buffer_size / 1000 ;
x4 - > params . rc . i_vbv_max_bitrate = ctx - > rc_max_rate / 1000 ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_rc_method = = X264_RC_ABR & &
x4 - > params . rc . i_bitrate ! = ctx - > bit_rate / 1000 ) {
x4 - > params . rc . i_bitrate = ctx - > bit_rate / 1000 ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > crf > = 0 & &
x4 - > params . rc . i_rc_method = = X264_RC_CRF & &
x4 - > params . rc . f_rf_constant ! = x4 - > crf ) {
x4 - > params . rc . f_rf_constant = x4 - > crf ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > params . rc . i_rc_method = = X264_RC_CQP & &
x4 - > cqp > = 0 & &
x4 - > params . rc . i_qp_constant ! = x4 - > cqp ) {
x4 - > params . rc . i_qp_constant = x4 - > cqp ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
if ( x4 - > crf_max > = 0 & &
x4 - > params . rc . f_rf_constant_max ! = x4 - > crf_max ) {
x4 - > params . rc . f_rf_constant_max = x4 - > crf_max ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
side_data = av_frame_get_side_data ( frame , AV_FRAME_DATA_STEREO3D ) ;
if ( side_data ) {
AVStereo3D * stereo = ( AVStereo3D * ) side_data - > data ;
int fpa_type ;
switch ( stereo - > type ) {
case AV_STEREO3D_CHECKERBOARD :
fpa_type = 0 ;
break ;
case AV_STEREO3D_COLUMNS :
fpa_type = 1 ;
break ;
case AV_STEREO3D_LINES :
fpa_type = 2 ;
break ;
case AV_STEREO3D_SIDEBYSIDE :
fpa_type = 3 ;
break ;
case AV_STEREO3D_TOPBOTTOM :
fpa_type = 4 ;
break ;
case AV_STEREO3D_FRAMESEQUENCE :
fpa_type = 5 ;
break ;
default :
fpa_type = - 1 ;
break ;
}
if ( fpa_type ! = x4 - > params . i_frame_packing ) {
x4 - > params . i_frame_packing = fpa_type ;
x264_encoder_reconfig ( x4 - > enc , & x4 - > params ) ;
}
}
reconfig_encoder ( ctx , frame ) ;
}
do {
if ( x264_encoder_encode ( x4 - > enc , & nal , & nnal , frame ? & x4 - > pic : NULL , & pic_out ) < 0 )