From 20a160484f33e0d6b40ce905a89c5c6e8282704b Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Thu, 21 Apr 2011 09:01:31 -0700 Subject: [PATCH] In libx264 wrapper, detect default settings and use medium profile to avoid failure. --- libavcodec/libx264.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) 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;