summaryrefslogtreecommitdiffstats
path: root/libavcodec/libx264.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2015-06-15 21:56:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2015-06-15 21:56:26 +0200
commit4ed3a01d717f120ba6881815ad6c40ad3f625825 (patch)
tree22db0ca8a7b66a399221bbf955145d78e9ad8e11 /libavcodec/libx264.c
parentefcf8cfa48c84676417d40689e63a37d5190a8ed (diff)
parent03ca6d70df192125a772dadd01acfe3905aa653f (diff)
downloadffmpeg-streaming-4ed3a01d717f120ba6881815ad6c40ad3f625825.zip
ffmpeg-streaming-4ed3a01d717f120ba6881815ad6c40ad3f625825.tar.gz
Merge commit '03ca6d70df192125a772dadd01acfe3905aa653f'
* commit '03ca6d70df192125a772dadd01acfe3905aa653f': x264: Factor out the reconfiguration code Conflicts: libavcodec/libx264.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/libx264.c')
-rw-r--r--libavcodec/libx264.c171
1 files changed, 90 insertions, 81 deletions
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index 9020a40..220d43e 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -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)
OpenPOWER on IntegriCloud