From 03ca6d70df192125a772dadd01acfe3905aa653f Mon Sep 17 00:00:00 2001 From: Luca Barbato Date: Fri, 12 Jun 2015 00:08:49 +0200 Subject: x264: Factor out the reconfiguration code --- libavcodec/libx264.c | 164 +++++++++++++++++++++++++++------------------------ 1 file changed, 86 insertions(+), 78 deletions(-) (limited to 'libavcodec') diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index d7d1df38db..7c502fd53b 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -128,6 +128,91 @@ static int encode_nals(AVCodecContext *ctx, AVPacket *pkt, return 1; } +static void reconfig_encoder(AVCodecContext *ctx, const AVFrame *frame) +{ + X264Context *x4 = ctx->priv_data; + AVFrameSideData *side_data; + + + if (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->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) { @@ -135,7 +220,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; - AVFrameSideData *side_data; x264_picture_init( &x4->pic ); x4->pic.img.i_csp = x4->params.i_csp; @@ -155,83 +239,7 @@ static int X264_frame(AVCodecContext *ctx, AVPacket *pkt, const AVFrame *frame, frame->pict_type == AV_PICTURE_TYPE_P ? X264_TYPE_P : frame->pict_type == AV_PICTURE_TYPE_B ? X264_TYPE_B : X264_TYPE_AUTO; - if (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->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) -- cgit v1.2.3