diff options
author | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2011-04-21 09:01:31 -0700 |
---|---|---|
committer | Baptiste Coudurier <baptiste.coudurier@gmail.com> | 2011-04-21 09:01:35 -0700 |
commit | 20a160484f33e0d6b40ce905a89c5c6e8282704b (patch) | |
tree | 7861f61d828f88665119639510cf7b5318a10155 /libavcodec | |
parent | 9bf81b49cff3945a76ac776f086a1d1adc120e6d (diff) | |
download | ffmpeg-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.c | 28 |
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; |