| @@ -207,7 +207,7 @@ static int do_hex_dump = 0; | |||||
| static int do_pkt_dump = 0; | static int do_pkt_dump = 0; | ||||
| static int do_psnr = 0; | static int do_psnr = 0; | ||||
| static int do_pass = 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 audio_stream_copy = 0; | ||||
| static int video_stream_copy = 0; | static int video_stream_copy = 0; | ||||
| static int subtitle_stream_copy = 0; | static int subtitle_stream_copy = 0; | ||||
| @@ -2331,7 +2331,7 @@ static int transcode(AVFormatContext **output_files, | |||||
| break; | break; | ||||
| } | } | ||||
| /* two pass mode */ | /* 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))) { | (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) { | ||||
| char logfilename[1024]; | char logfilename[1024]; | ||||
| FILE *f; | 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[] = { | static const OptionDef options[] = { | ||||
| /* main options */ | /* main options */ | ||||
| #include "cmdutils_common_opts.h" | #include "cmdutils_common_opts.h" | ||||
| @@ -4341,7 +4347,7 @@ static const OptionDef options[] = { | |||||
| { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, | { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality}, | ||||
| "use same quantizer as source (implies VBR)" }, | "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" }, | { "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", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace}, | ||||
| "deinterlace pictures" }, | "deinterlace pictures" }, | ||||
| { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" }, | { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" }, | ||||
| @@ -40,6 +40,7 @@ typedef struct X264Context { | |||||
| const char *profile; | const char *profile; | ||||
| const char *level; | const char *level; | ||||
| int fastfirstpass; | int fastfirstpass; | ||||
| const char *stats; | |||||
| } X264Context; | } X264Context; | ||||
| static void X264_log(void *p, int level, const char *fmt, va_list args) | static void X264_log(void *p, int level, const char *fmt, va_list args) | ||||
| @@ -164,6 +165,15 @@ static av_cold int X264_close(AVCodecContext *avctx) | |||||
| return 0; | return 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); \ | |||||
| #define OPT_STR(opt, param) \ | #define OPT_STR(opt, param) \ | ||||
| do { \ | do { \ | ||||
| if (param && x264_param_parse(&x4->params, opt, param) < 0) { \ | if (param && x264_param_parse(&x4->params, opt, param) < 0) { \ | ||||
| @@ -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 | // 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 | // we do it this way because we cannot check if the bitrate has been set | ||||
| if (!(avctx->crf || (avctx->cqp > -1))) | 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}, | {"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}, | {"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}, | {"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 }, | { NULL }, | ||||
| }; | }; | ||||