Merge commit '03ca6d70df192125a772dadd01acfe3905aa653f'
authorMichael Niedermayer <michaelni@gmx.at>
Mon, 15 Jun 2015 19:56:26 +0000 (21:56 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Mon, 15 Jun 2015 19:56:26 +0000 (21:56 +0200)
* commit '03ca6d70df192125a772dadd01acfe3905aa653f':
  x264: Factor out the reconfiguration code

Conflicts:
libavcodec/libx264.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/libx264.c

@@@ -138,34 -128,98 +138,122 @@@ static int encode_nals(AVCodecContext *
      return 1;
  }
  
 -    if (x4->params.b_tff != frame->top_field_first) {
 +static int avfmt2_num_planes(int avfmt)
 +{
 +    switch (avfmt) {
 +    case AV_PIX_FMT_YUV420P:
 +    case AV_PIX_FMT_YUVJ420P:
 +    case AV_PIX_FMT_YUV420P9:
 +    case AV_PIX_FMT_YUV420P10:
 +    case AV_PIX_FMT_YUV444P:
 +        return 3;
 +
 +    case AV_PIX_FMT_BGR0:
 +    case AV_PIX_FMT_BGR24:
 +    case AV_PIX_FMT_RGB24:
 +        return 1;
 +
 +    default:
 +        return 3;
 +    }
 +}
 +
+ 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)
  {
      X264Context *x4 = ctx->priv_data;
      x264_nal_t *nal;
      int nnal, i, ret;
 -    x264_picture_t pic_out;
 +    x264_picture_t pic_out = {0};
-     AVFrameSideData *side_data;
  
      x264_picture_init( &x4->pic );
      x4->pic.img.i_csp   = x4->params.i_csp;
              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->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)