aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec
diff options
context:
space:
mode:
authorBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-04-21 09:01:31 -0700
committerBaptiste Coudurier <baptiste.coudurier@gmail.com>2011-04-21 09:01:35 -0700
commit20a160484f33e0d6b40ce905a89c5c6e8282704b (patch)
tree7861f61d828f88665119639510cf7b5318a10155 /libavcodec
parent9bf81b49cff3945a76ac776f086a1d1adc120e6d (diff)
downloadffmpeg-20a160484f33e0d6b40ce905a89c5c6e8282704b.tar.gz
In libx264 wrapper, detect default settings and use medium profile to avoid failure.
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/libx264.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c
index bd85e060c6..c1e60e6d5f 100644
--- a/libavcodec/libx264.c
+++ b/libavcodec/libx264.c
@@ -165,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) { \
@@ -274,6 +299,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;