From 2c18893a911657205bd45ff8a666882610e57700 Mon Sep 17 00:00:00 2001 From: Baptiste Coudurier Date: Wed, 20 Apr 2011 15:46:20 -0700 Subject: [PATCH] In libx264 wrapper, correctly support 2pass log filename option. --- ffmpeg.c | 12 +++++++++--- libavcodec/libx264.c | 13 +++++++++++++ 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/ffmpeg.c b/ffmpeg.c index ec0a0235d..b91e9d3ea 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -207,7 +207,7 @@ static int do_hex_dump = 0; static int do_pkt_dump = 0; static int do_psnr = 0; static int do_pass = 0; -static char *pass_logfilename_prefix = NULL; +static const char *pass_logfilename_prefix; static int audio_stream_copy = 0; static int video_stream_copy = 0; static int subtitle_stream_copy = 0; @@ -2331,7 +2331,7 @@ static int transcode(AVFormatContext **output_files, break; } /* two pass mode */ - if (ost->encoding_needed && + if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 && (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) { char logfilename[1024]; FILE *f; @@ -4268,6 +4268,12 @@ static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl) { } +static void opt_passlogfile(const char *arg) +{ + pass_logfilename_prefix = arg; + opt_default("passlogfile", arg); +} + static const OptionDef options[] = { /* main options */ #include "cmdutils_common_opts.h" @@ -4341,7 +4347,7 @@ static const OptionDef options[] = { { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, "use same quantizer as source (implies VBR)" }, { "pass", HAS_ARG | OPT_FUNC2 | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" }, - { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" }, + { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" }, { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace}, "deinterlace pictures" }, { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" }, diff --git a/libavcodec/libx264.c b/libavcodec/libx264.c index 29c535c5b..bd85e060c 100644 --- a/libavcodec/libx264.c +++ b/libavcodec/libx264.c @@ -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) @@ -173,6 +174,15 @@ static av_cold int X264_close(AVCodecContext *avctx) } \ } while (0); \ +#define OPT_STR(opt, param) \ + do { \ + if (param && x264_param_parse(&x4->params, opt, param) < 0) { \ + av_log(avctx, AV_LOG_ERROR, \ + "bad value for '%s': '%s'\n", opt, param); \ + return -1; \ + } \ + } while (0); \ + static av_cold int X264_init(AVCodecContext *avctx) { X264Context *x4 = avctx->priv_data; @@ -291,6 +301,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))) @@ -371,6 +383,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 }, }; -- 2.11.0