]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/libx264.c
Merge remote branch 'qatar/master'
[ffmpeg] / libavcodec / libx264.c
index 29c535c5bc8779f0b3fb361700e6f03b45af1cf1..1b4e88b75b151f9efb33e75691dca5fb5e6e8873 100644 (file)
@@ -40,6 +40,7 @@ typedef struct X264Context {
     const char *profile;
     const char *level;
     int fastfirstpass;
+    const char *stats;
 } X264Context;
 
 static void X264_log(void *p, int level, const char *fmt, va_list args)
@@ -164,6 +165,31 @@ static av_cold int X264_close(AVCodecContext *avctx)
     return 0;
 }
 
+/**
+ * Detect default settings and use default profile to avoid libx264 failure.
+ */
+static void check_default_settings(AVCodecContext *avctx)
+{
+    X264Context *x4 = avctx->priv_data;
+
+    int score = 0;
+    score += x4->params.analyse.i_me_range == 0;
+    score += x4->params.rc.i_qp_step == 3;
+    score += x4->params.i_keyint_max == 12;
+    score += x4->params.rc.i_qp_min == 2;
+    score += x4->params.rc.i_qp_max == 31;
+    score += x4->params.rc.f_qcompress == 0.5;
+    score += fabs(x4->params.rc.f_ip_factor - 1.25) < 0.01;
+    score += fabs(x4->params.rc.f_pb_factor - 1.25) < 0.01;
+    score += x4->params.analyse.inter == 0 && x4->params.analyse.i_subpel_refine == 8;
+    if (score >= 5) {
+        av_log(avctx, AV_LOG_ERROR, "Default settings detected, using medium profile\n");
+        x4->preset = "medium";
+        if (avctx->bit_rate == 200*100)
+            avctx->crf = 23;
+    }
+}
+
 #define OPT_STR(opt, param)                                             \
     do {                                                                \
         if (param && x264_param_parse(&x4->params, opt, param) < 0) {   \
@@ -264,6 +290,9 @@ static av_cold int X264_init(AVCodecContext *avctx)
     x4->params.rc.f_pb_factor             = avctx->b_quant_factor;
     x4->params.analyse.i_chroma_qp_offset = avctx->chromaoffset;
 
+    if (!x4->preset)
+        check_default_settings(avctx);
+
     if (x4->preset || x4->tune) {
         if (x264_param_default_preset(&x4->params, x4->preset, x4->tune) < 0)
             return -1;
@@ -291,6 +320,8 @@ static av_cold int X264_init(AVCodecContext *avctx)
         }
     }
 
+    OPT_STR("stats", x4->stats);
+
     // if neither crf nor cqp modes are selected we have to enable the RC
     // we do it this way because we cannot check if the bitrate has been set
     if (!(avctx->crf || (avctx->cqp > -1)))
@@ -335,7 +366,8 @@ static av_cold int X264_init(AVCodecContext *avctx)
         x4->params.b_repeat_headers = 0;
 
     // update AVCodecContext with x264 parameters
-    avctx->has_b_frames = x4->params.i_bframe_pyramid ? 2 : !!x4->params.i_bframe;
+    avctx->has_b_frames = x4->params.i_bframe ?
+        x4->params.i_bframe_pyramid ? 2 : 1 : 0;
     avctx->bit_rate = x4->params.rc.i_bitrate*1000;
     avctx->crf = x4->params.rc.f_rf_constant;
 
@@ -371,6 +403,7 @@ static const AVOption options[] = {
     {"fastfirstpass", "Use fast settings when encoding first pass", OFFSET(fastfirstpass), FF_OPT_TYPE_INT, 1, 0, 1, VE},
     {"profile", "Set profile restrictions", OFFSET(profile), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
     {"level", "Specify level (as defined by Annex A)", OFFSET(level), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
+    {"passlogfile", "Filename for 2 pass stats", OFFSET(stats), FF_OPT_TYPE_STRING, 0, 0, 0, VE},
     { NULL },
 };