2 * Copyright (c) 2000-2003 Fabrice Bellard
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * multimedia converter based on the FFmpeg libraries
37 #include "libavformat/avformat.h"
38 #include "libavdevice/avdevice.h"
39 #include "libswscale/swscale.h"
40 #include "libswresample/swresample.h"
41 #include "libavutil/opt.h"
42 #include "libavutil/audioconvert.h"
43 #include "libavutil/parseutils.h"
44 #include "libavutil/samplefmt.h"
45 #include "libavutil/colorspace.h"
46 #include "libavutil/fifo.h"
47 #include "libavutil/intreadwrite.h"
48 #include "libavutil/dict.h"
49 #include "libavutil/mathematics.h"
50 #include "libavutil/pixdesc.h"
51 #include "libavutil/avstring.h"
52 #include "libavutil/libm.h"
53 #include "libavutil/imgutils.h"
54 #include "libavutil/timestamp.h"
55 #include "libavutil/bprint.h"
56 #include "libavutil/time.h"
57 #include "libavformat/os_support.h"
59 #include "libavformat/ffm.h" // not public API
61 # include "libavfilter/avcodec.h"
62 # include "libavfilter/avfilter.h"
63 # include "libavfilter/avfiltergraph.h"
64 # include "libavfilter/buffersrc.h"
65 # include "libavfilter/buffersink.h"
67 #if HAVE_SYS_RESOURCE_H
68 #include <sys/types.h>
69 #include <sys/resource.h>
70 #elif HAVE_GETPROCESSTIMES
73 #if HAVE_GETPROCESSMEMORYINFO
79 #include <sys/select.h>
84 #include <sys/ioctl.h>
99 #include "libavutil/avassert.h"
101 #define VSYNC_AUTO -1
102 #define VSYNC_PASSTHROUGH 0
105 #define VSYNC_DROP 0xff
107 const char program_name[] = "ffmpeg";
108 const int program_birth_year = 2000;
110 /* select an input stream for an output stream */
111 typedef struct StreamMap {
112 int disabled; /** 1 is this mapping is disabled by a negative map */
116 int sync_stream_index;
117 char *linklabel; /** name of an output link, for mapping lavfi outputs */
121 int file_idx, stream_idx, channel_idx; // input
122 int ofile_idx, ostream_idx; // output
125 static const OptionDef options[];
127 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
129 static int frame_bits_per_raw_sample = 0;
130 static int video_discard = 0;
131 static int same_quant = 0;
132 static int do_deinterlace = 0;
133 static int intra_dc_precision = 8;
134 static int qp_hist = 0;
135 static int intra_only = 0;
136 static const char *video_codec_name = NULL;
137 static const char *audio_codec_name = NULL;
138 static const char *subtitle_codec_name = NULL;
140 static int file_overwrite = 0;
141 static int no_file_overwrite = 0;
142 static int do_benchmark = 0;
143 static int do_benchmark_all = 0;
144 static int do_hex_dump = 0;
145 static int do_pkt_dump = 0;
146 static int do_psnr = 0;
147 static int do_pass = 0;
148 static const char *pass_logfilename_prefix;
149 static int video_sync_method = VSYNC_AUTO;
150 static int audio_sync_method = 0;
151 static float audio_drift_threshold = 0.1;
152 static int copy_ts = 0;
153 static int copy_tb = -1;
154 static int opt_shortest = 0;
155 static char *vstats_filename;
156 static FILE *vstats_file;
158 static int audio_volume = 256;
160 static int exit_on_error = 0;
161 static int stdin_interaction = 1;
162 static int run_as_daemon = 0;
163 static volatile int received_nb_signals = 0;
164 static int64_t video_size = 0;
165 static int64_t audio_size = 0;
166 static int64_t subtitle_size = 0;
167 static int64_t extra_size = 0;
168 static int nb_frames_dup = 0;
169 static int nb_frames_drop = 0;
170 static int input_sync;
172 static float dts_delta_threshold = 10;
173 static float dts_error_threshold = 3600*30;
175 static int print_stats = 1;
176 static int debug_ts = 0;
177 static int current_time;
178 static AVIOContext *progress_avio = NULL;
180 static uint8_t *subtitle_out;
183 /* signal to input threads that they should exit; set by the main thread */
184 static int transcoding_finished;
187 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
189 typedef struct InputFilter {
190 AVFilterContext *filter;
191 struct InputStream *ist;
192 struct FilterGraph *graph;
196 typedef struct OutputFilter {
197 AVFilterContext *filter;
198 struct OutputStream *ost;
199 struct FilterGraph *graph;
202 /* temporary storage until stream maps are processed */
203 AVFilterInOut *out_tmp;
206 typedef struct FilterGraph {
208 const char *graph_desc;
210 AVFilterGraph *graph;
212 InputFilter **inputs;
214 OutputFilter **outputs;
218 typedef struct InputStream {
221 int discard; /* true if stream data should be discarded */
222 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
224 AVFrame *decoded_frame;
226 int64_t start; /* time when read started */
227 /* predicted dts of the next packet read for this stream or (when there are
228 * several frames in a packet) of the next frame in current packet */
230 /* dts of the last packet read for this stream */
233 int64_t next_pts; /* synthetic pts for the next decode frame */
234 int64_t pts; /* current pts of the decoded frame */
236 int is_start; /* is 1 at the start and after a discontinuity */
238 int showed_multi_packet_warning;
240 AVRational framerate; /* framerate forced with -r */
245 int resample_pix_fmt;
247 int resample_sample_fmt;
248 int resample_sample_rate;
249 int resample_channels;
250 uint64_t resample_channel_layout;
252 /* a pool of free buffers for decoded data */
253 FrameBuffer *buffer_pool;
256 /* decoded data from this stream goes into all those filters
257 * currently video and audio only */
258 InputFilter **filters;
262 typedef struct InputFile {
263 AVFormatContext *ctx;
264 int eof_reached; /* true if eof reached */
265 int unavailable; /* true if the file is unavailable (possibly temporarily) */
266 int ist_index; /* index of first stream in input_streams */
268 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
269 from ctx.nb_streams if new streams appear during av_read_frame() */
273 pthread_t thread; /* thread reading from this file */
274 int finished; /* the thread has exited */
275 int joined; /* the thread has been joined */
276 pthread_mutex_t fifo_lock; /* lock for access to fifo */
277 pthread_cond_t fifo_cond; /* the main thread will signal on this cond after reading from fifo */
278 AVFifoBuffer *fifo; /* demuxed packets are stored here; freed by the main thread */
282 typedef struct OutputStream {
283 int file_index; /* file index */
284 int index; /* stream index in the output file */
285 int source_index; /* InputStream index */
286 AVStream *st; /* stream in the output file */
287 int encoding_needed; /* true if encoding needed for this stream */
289 /* input pts and corresponding output pts
291 struct InputStream *sync_ist; /* input stream to sync against */
292 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
293 /* pts of the first frame encoded for this stream, used for limiting
296 AVBitStreamFilterContext *bitstream_filters;
299 AVFrame *filtered_frame;
302 AVRational frame_rate;
306 float frame_aspect_ratio;
309 /* forced key frames */
310 int64_t *forced_kf_pts;
313 char *forced_keyframes;
316 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
317 int audio_channels_mapped; /* number of channels in audio_channels_map */
321 OutputFilter *filter;
325 int64_t swr_dither_method;
326 double swr_dither_scale;
328 int is_past_recording_time;
329 int unavailable; /* true if the steram is unavailable (possibly temporarily) */
331 const char *attachment_filename;
332 int copy_initial_nonkeyframes;
340 /* init terminal so that we can grab keys */
341 static struct termios oldtty;
342 static int restore_tty;
345 typedef struct OutputFile {
346 AVFormatContext *ctx;
348 int ost_index; /* index of the first stream in output_streams */
349 int64_t recording_time; /* desired length of the resulting file in microseconds */
350 int64_t start_time; /* start time in microseconds */
351 uint64_t limit_filesize; /* filesize limit expressed in bytes */
354 static InputStream **input_streams = NULL;
355 static int nb_input_streams = 0;
356 static InputFile **input_files = NULL;
357 static int nb_input_files = 0;
359 static OutputStream **output_streams = NULL;
360 static int nb_output_streams = 0;
361 static OutputFile **output_files = NULL;
362 static int nb_output_files = 0;
364 static FilterGraph **filtergraphs;
367 typedef struct OptionsContext {
368 /* input/output options */
372 SpecifierOpt *codec_names;
374 SpecifierOpt *audio_channels;
375 int nb_audio_channels;
376 SpecifierOpt *audio_sample_rate;
377 int nb_audio_sample_rate;
378 SpecifierOpt *frame_rates;
380 SpecifierOpt *frame_sizes;
382 SpecifierOpt *frame_pix_fmts;
383 int nb_frame_pix_fmts;
386 int64_t input_ts_offset;
389 SpecifierOpt *ts_scale;
391 SpecifierOpt *dump_attachment;
392 int nb_dump_attachment;
395 StreamMap *stream_maps;
397 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
398 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
399 int metadata_global_manual;
400 int metadata_streams_manual;
401 int metadata_chapters_manual;
402 const char **attachments;
405 int chapters_input_file;
407 int64_t recording_time;
408 uint64_t limit_filesize;
414 int subtitle_disable;
417 /* indexed by output file stream index */
421 SpecifierOpt *metadata;
423 SpecifierOpt *max_frames;
425 SpecifierOpt *bitstream_filters;
426 int nb_bitstream_filters;
427 SpecifierOpt *codec_tags;
429 SpecifierOpt *sample_fmts;
431 SpecifierOpt *qscale;
433 SpecifierOpt *forced_key_frames;
434 int nb_forced_key_frames;
435 SpecifierOpt *force_fps;
437 SpecifierOpt *frame_aspect_ratios;
438 int nb_frame_aspect_ratios;
439 SpecifierOpt *rc_overrides;
441 SpecifierOpt *intra_matrices;
442 int nb_intra_matrices;
443 SpecifierOpt *inter_matrices;
444 int nb_inter_matrices;
445 SpecifierOpt *top_field_first;
446 int nb_top_field_first;
447 SpecifierOpt *metadata_map;
449 SpecifierOpt *presets;
451 SpecifierOpt *copy_initial_nonkeyframes;
452 int nb_copy_initial_nonkeyframes;
453 SpecifierOpt *filters;
457 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
459 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
462 for (i = 0; i < o->nb_ ## name; i++) {\
463 char *spec = o->name[i].specifier;\
464 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
465 outvar = o->name[i].u.type;\
471 static int64_t getutime(void)
474 struct rusage rusage;
476 getrusage(RUSAGE_SELF, &rusage);
477 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
478 #elif HAVE_GETPROCESSTIMES
481 proc = GetCurrentProcess();
482 GetProcessTimes(proc, &c, &e, &k, &u);
483 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
489 static void update_benchmark(const char *fmt, ...)
491 if (do_benchmark_all) {
492 int64_t t = getutime();
498 vsnprintf(buf, sizeof(buf), fmt, va);
500 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
506 static void reset_options(OptionsContext *o, int is_input)
508 const OptionDef *po = options;
509 OptionsContext bak= *o;
512 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
514 void *dst = (uint8_t*)o + po->u.off;
516 if (po->flags & OPT_SPEC) {
517 SpecifierOpt **so = dst;
518 int i, *count = (int*)(so + 1);
519 for (i = 0; i < *count; i++) {
520 av_freep(&(*so)[i].specifier);
521 if (po->flags & OPT_STRING)
522 av_freep(&(*so)[i].u.str);
526 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
531 for (i = 0; i < o->nb_stream_maps; i++)
532 av_freep(&o->stream_maps[i].linklabel);
533 av_freep(&o->stream_maps);
534 av_freep(&o->audio_channel_maps);
535 av_freep(&o->streamid_map);
537 memset(o, 0, sizeof(*o));
540 o->recording_time = bak.recording_time;
541 if (o->recording_time != INT64_MAX)
542 av_log(NULL, AV_LOG_WARNING,
543 "-t is not an input option, keeping it for the next output;"
544 " consider fixing your command line.\n");
546 o->recording_time = INT64_MAX;
547 o->mux_max_delay = 0.7;
548 o->limit_filesize = UINT64_MAX;
549 o->chapters_input_file = INT_MAX;
555 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
557 if (codec && codec->pix_fmts) {
558 const enum PixelFormat *p = codec->pix_fmts;
559 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
560 enum PixelFormat best= PIX_FMT_NONE;
561 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
562 if (st->codec->codec_id == CODEC_ID_MJPEG) {
563 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
564 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
565 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
566 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
569 for (; *p != PIX_FMT_NONE; p++) {
570 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
574 if (*p == PIX_FMT_NONE) {
575 if (target != PIX_FMT_NONE)
576 av_log(NULL, AV_LOG_WARNING,
577 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
578 av_pix_fmt_descriptors[target].name,
580 av_pix_fmt_descriptors[best].name);
587 static char *choose_pix_fmts(OutputStream *ost)
589 if (ost->keep_pix_fmt) {
591 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
592 AVFILTER_AUTO_CONVERT_NONE);
593 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
595 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
597 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
598 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
599 } else if (ost->enc && ost->enc->pix_fmts) {
600 const enum PixelFormat *p;
601 AVIOContext *s = NULL;
605 if (avio_open_dyn_buf(&s) < 0)
608 p = ost->enc->pix_fmts;
609 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
610 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
611 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
612 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
613 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
614 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
618 for (; *p != PIX_FMT_NONE; p++) {
619 const char *name = av_get_pix_fmt_name(*p);
620 avio_printf(s, "%s:", name);
622 len = avio_close_dyn_buf(s, &ret);
630 * Define a function for building a string containing a list of
633 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
634 static char *choose_ ## var ## s(OutputStream *ost) \
636 if (ost->st->codec->var != none) { \
637 get_name(ost->st->codec->var); \
638 return av_strdup(name); \
639 } else if (ost->enc->supported_list) { \
641 AVIOContext *s = NULL; \
645 if (avio_open_dyn_buf(&s) < 0) \
648 for (p = ost->enc->supported_list; *p != none; p++) { \
650 avio_printf(s, "%s" separator, name); \
652 len = avio_close_dyn_buf(s, &ret); \
659 #define GET_PIX_FMT_NAME(pix_fmt)\
660 const char *name = av_get_pix_fmt_name(pix_fmt);
662 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
663 // GET_PIX_FMT_NAME, ":")
665 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
666 const char *name = av_get_sample_fmt_name(sample_fmt)
668 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
669 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
671 #define GET_SAMPLE_RATE_NAME(rate)\
673 snprintf(name, sizeof(name), "%d", rate);
675 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
676 GET_SAMPLE_RATE_NAME, ",")
678 #define GET_CH_LAYOUT_NAME(ch_layout)\
680 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
682 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
683 GET_CH_LAYOUT_NAME, ",")
685 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
687 FilterGraph *fg = av_mallocz(sizeof(*fg));
691 fg->index = nb_filtergraphs;
693 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
695 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
697 fg->outputs[0]->ost = ost;
698 fg->outputs[0]->graph = fg;
700 ost->filter = fg->outputs[0];
702 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
704 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
706 fg->inputs[0]->ist = ist;
707 fg->inputs[0]->graph = fg;
709 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
710 &ist->nb_filters, ist->nb_filters + 1);
711 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
713 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
714 &nb_filtergraphs, nb_filtergraphs + 1);
715 filtergraphs[nb_filtergraphs - 1] = fg;
720 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
722 InputStream *ist = NULL;
723 enum AVMediaType type = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
726 // TODO: support other filter types
727 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
728 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
737 int file_idx = strtol(in->name, &p, 0);
739 if (file_idx < 0 || file_idx >= nb_input_files) {
740 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
741 file_idx, fg->graph_desc);
744 s = input_files[file_idx]->ctx;
746 for (i = 0; i < s->nb_streams; i++) {
747 if (s->streams[i]->codec->codec_type != type)
749 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
755 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
756 "matches no streams.\n", p, fg->graph_desc);
759 ist = input_streams[input_files[file_idx]->ist_index + st->index];
761 /* find the first unused stream of corresponding type */
762 for (i = 0; i < nb_input_streams; i++) {
763 ist = input_streams[i];
764 if (ist->st->codec->codec_type == type && ist->discard)
767 if (i == nb_input_streams) {
768 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
769 "unlabeled input pad %d on filter %s\n", in->pad_idx,
770 in->filter_ctx->name);
777 ist->decoding_needed = 1;
778 ist->st->discard = AVDISCARD_NONE;
780 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
781 &fg->nb_inputs, fg->nb_inputs + 1);
782 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
784 fg->inputs[fg->nb_inputs - 1]->ist = ist;
785 fg->inputs[fg->nb_inputs - 1]->graph = fg;
787 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
788 &ist->nb_filters, ist->nb_filters + 1);
789 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
792 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
795 OutputStream *ost = ofilter->ost;
796 AVCodecContext *codec = ost->st->codec;
797 AVFilterContext *last_filter = out->filter_ctx;
798 int pad_idx = out->pad_idx;
801 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
803 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
804 ret = avfilter_graph_create_filter(&ofilter->filter,
805 avfilter_get_by_name("buffersink"),
806 name, NULL, NULL/*buffersink_params*/, fg->graph);
807 av_freep(&buffersink_params);
812 if (codec->width || codec->height) {
814 AVFilterContext *filter;
816 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
819 (unsigned)ost->sws_flags);
820 snprintf(name, sizeof(name), "scaler for output stream %d:%d",
821 ost->file_index, ost->index);
822 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
823 name, args, NULL, fg->graph)) < 0)
825 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
828 last_filter = filter;
832 if ((pix_fmts = choose_pix_fmts(ost))) {
833 AVFilterContext *filter;
834 snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
835 ost->file_index, ost->index);
836 if ((ret = avfilter_graph_create_filter(&filter,
837 avfilter_get_by_name("format"),
838 "format", pix_fmts, NULL,
841 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
844 last_filter = filter;
849 if (ost->frame_rate.num && 0) {
850 AVFilterContext *fps;
853 snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
854 ost->frame_rate.den);
855 snprintf(name, sizeof(name), "fps for output stream %d:%d",
856 ost->file_index, ost->index);
857 ret = avfilter_graph_create_filter(&fps, avfilter_get_by_name("fps"),
858 name, args, NULL, fg->graph);
862 ret = avfilter_link(last_filter, pad_idx, fps, 0);
869 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
875 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
877 OutputStream *ost = ofilter->ost;
878 AVCodecContext *codec = ost->st->codec;
879 AVFilterContext *last_filter = out->filter_ctx;
880 int pad_idx = out->pad_idx;
881 char *sample_fmts, *sample_rates, *channel_layouts;
886 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
887 ret = avfilter_graph_create_filter(&ofilter->filter,
888 avfilter_get_by_name("abuffersink"),
889 name, NULL, NULL, fg->graph);
893 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
894 AVFilterContext *filt_ctx; \
896 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
897 "similarly to -af " filter_name "=%s.\n", arg); \
899 ret = avfilter_graph_create_filter(&filt_ctx, \
900 avfilter_get_by_name(filter_name), \
901 filter_name, arg, NULL, fg->graph); \
905 ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
909 last_filter = filt_ctx; \
912 if (ost->audio_channels_mapped) {
915 av_bprint_init(&pan_buf, 256, 8192);
916 av_bprintf(&pan_buf, "0x%"PRIx64,
917 av_get_default_channel_layout(ost->audio_channels_mapped));
918 for (i = 0; i < ost->audio_channels_mapped; i++)
919 if (ost->audio_channels_map[i] != -1)
920 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
922 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
923 av_bprint_finalize(&pan_buf, NULL);
926 if (codec->channels && !codec->channel_layout)
927 codec->channel_layout = av_get_default_channel_layout(codec->channels);
929 sample_fmts = choose_sample_fmts(ost);
930 sample_rates = choose_sample_rates(ost);
931 channel_layouts = choose_channel_layouts(ost);
932 if (sample_fmts || sample_rates || channel_layouts) {
933 AVFilterContext *format;
938 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
941 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
944 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
948 av_freep(&sample_fmts);
949 av_freep(&sample_rates);
950 av_freep(&channel_layouts);
952 snprintf(name, sizeof(name), "audio format for output stream %d:%d",
953 ost->file_index, ost->index);
954 ret = avfilter_graph_create_filter(&format,
955 avfilter_get_by_name("aformat"),
956 name, args, NULL, fg->graph);
960 ret = avfilter_link(last_filter, pad_idx, format, 0);
964 last_filter = format;
968 if (audio_volume != 256 && 0) {
971 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
972 AUTO_INSERT_FILTER("-vol", "volume", args);
975 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
981 #define DESCRIBE_FILTER_LINK(f, inout, in) \
983 AVFilterContext *ctx = inout->filter_ctx; \
984 AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads; \
985 int nb_pads = in ? ctx->input_count : ctx->output_count; \
988 if (avio_open_dyn_buf(&pb) < 0) \
991 avio_printf(pb, "%s", ctx->filter->name); \
993 avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));\
995 avio_close_dyn_buf(pb, &f->name); \
998 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1000 av_freep(&ofilter->name);
1001 DESCRIBE_FILTER_LINK(ofilter, out, 0);
1003 switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
1004 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1005 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1006 default: av_assert0(0);
1010 static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
1013 AVFilterContext *first_filter = in->filter_ctx;
1014 AVFilter *filter = avfilter_get_by_name("buffer");
1015 InputStream *ist = ifilter->ist;
1016 AVRational tb = ist->framerate.num ? (AVRational){ist->framerate.den,
1017 ist->framerate.num} :
1019 AVRational fr = ist->framerate.num ? ist->framerate :
1020 ist->st->r_frame_rate;
1024 int pad_idx = in->pad_idx;
1027 sar = ist->st->sample_aspect_ratio.num ?
1028 ist->st->sample_aspect_ratio :
1029 ist->st->codec->sample_aspect_ratio;
1031 sar = (AVRational){0,1};
1032 av_bprint_init(&args, 0, 1);
1034 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
1035 "pixel_aspect=%d/%d:sws_param=flags=%d", ist->st->codec->width,
1036 ist->st->codec->height, ist->st->codec->pix_fmt,
1037 tb.num, tb.den, sar.num, sar.den,
1038 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
1039 if (fr.num && fr.den)
1040 av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
1041 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1042 ist->file_index, ist->st->index);
1044 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter, name,
1045 args.str, NULL, fg->graph)) < 0)
1048 if (ist->framerate.num) {
1049 AVFilterContext *setpts;
1051 snprintf(name, sizeof(name), "force CFR for input from stream %d:%d",
1052 ist->file_index, ist->st->index);
1053 if ((ret = avfilter_graph_create_filter(&setpts,
1054 avfilter_get_by_name("setpts"),
1059 if ((ret = avfilter_link(setpts, 0, first_filter, pad_idx)) < 0)
1062 first_filter = setpts;
1066 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1071 static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
1074 AVFilterContext *first_filter = in->filter_ctx;
1075 AVFilter *filter = avfilter_get_by_name("abuffer");
1076 InputStream *ist = ifilter->ist;
1077 int pad_idx = in->pad_idx;
1078 char args[255], name[255];
1081 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
1082 ":channel_layout=0x%"PRIx64,
1083 1, ist->st->codec->sample_rate,
1084 ist->st->codec->sample_rate,
1085 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1086 ist->st->codec->channel_layout);
1087 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1088 ist->file_index, ist->st->index);
1090 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
1095 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
1096 AVFilterContext *filt_ctx; \
1098 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1099 "similarly to -af " filter_name "=%s.\n", arg); \
1101 snprintf(name, sizeof(name), "graph %d %s for input stream %d:%d", \
1102 fg->index, filter_name, ist->file_index, ist->st->index); \
1103 ret = avfilter_graph_create_filter(&filt_ctx, \
1104 avfilter_get_by_name(filter_name), \
1105 name, arg, NULL, fg->graph); \
1109 ret = avfilter_link(filt_ctx, 0, first_filter, pad_idx); \
1113 first_filter = filt_ctx; \
1116 if (audio_sync_method > 0) {
1117 char args[256] = {0};
1119 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
1120 if (audio_sync_method > 1)
1121 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)ist->st->codec->sample_rate);
1122 AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
1125 // if (ost->audio_channels_mapped) {
1127 // AVBPrint pan_buf;
1128 // av_bprint_init(&pan_buf, 256, 8192);
1129 // av_bprintf(&pan_buf, "0x%"PRIx64,
1130 // av_get_default_channel_layout(ost->audio_channels_mapped));
1131 // for (i = 0; i < ost->audio_channels_mapped; i++)
1132 // if (ost->audio_channels_map[i] != -1)
1133 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
1134 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
1135 // av_bprint_finalize(&pan_buf, NULL);
1138 if (audio_volume != 256) {
1141 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
1142 AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
1144 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1150 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
1153 av_freep(&ifilter->name);
1154 DESCRIBE_FILTER_LINK(ifilter, in, 1);
1156 switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
1157 case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
1158 case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
1159 default: av_assert0(0);
1163 static int configure_filtergraph(FilterGraph *fg)
1165 AVFilterInOut *inputs, *outputs, *cur;
1166 int ret, i, init = !fg->graph, simple = !fg->graph_desc;
1167 const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1170 avfilter_graph_free(&fg->graph);
1171 if (!(fg->graph = avfilter_graph_alloc()))
1172 return AVERROR(ENOMEM);
1175 OutputStream *ost = fg->outputs[0]->ost;
1177 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1178 fg->graph->scale_sws_opts = av_strdup(args);
1181 if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1184 if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1185 av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
1186 "exactly one input and output.\n", graph_desc);
1187 return AVERROR(EINVAL);
1190 for (cur = inputs; !simple && init && cur; cur = cur->next)
1191 init_input_filter(fg, cur);
1193 for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1194 if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
1196 avfilter_inout_free(&inputs);
1198 if (!init || simple) {
1199 /* we already know the mappings between lavfi outputs and output streams,
1200 * so we can finish the setup */
1201 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1202 configure_output_filter(fg, fg->outputs[i], cur);
1203 avfilter_inout_free(&outputs);
1205 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1208 /* wait until output mappings are processed */
1209 for (cur = outputs; cur;) {
1210 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1211 &fg->nb_outputs, fg->nb_outputs + 1);
1212 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1214 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1215 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1217 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1224 static int configure_complex_filters(void)
1228 for (i = 0; i < nb_filtergraphs; i++)
1229 if (!filtergraphs[i]->graph &&
1230 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1235 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1238 for (i = 0; i < fg->nb_inputs; i++)
1239 if (fg->inputs[i]->ist == ist)
1244 static void term_exit(void)
1246 av_log(NULL, AV_LOG_QUIET, "%s", "");
1249 tcsetattr (0, TCSANOW, &oldtty);
1253 static volatile int received_sigterm = 0;
1255 static void sigterm_handler(int sig)
1257 received_sigterm = sig;
1258 received_nb_signals++;
1260 if(received_nb_signals > 3)
1264 static void term_init(void)
1271 istty = isatty(0) && isatty(2);
1273 if (istty && tcgetattr (0, &tty) == 0) {
1278 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1279 |INLCR|IGNCR|ICRNL|IXON);
1280 tty.c_oflag |= OPOST;
1281 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1282 tty.c_cflag &= ~(CSIZE|PARENB);
1285 tty.c_cc[VTIME] = 0;
1287 tcsetattr (0, TCSANOW, &tty);
1289 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1292 avformat_network_deinit();
1294 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1295 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1297 signal(SIGXCPU, sigterm_handler);
1301 /* read a key without blocking */
1302 static int read_key(void)
1314 n = select(1, &rfds, NULL, NULL, &tv);
1316 n = read(0, &ch, 1);
1323 # if HAVE_PEEKNAMEDPIPE
1325 static HANDLE input_handle;
1328 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1329 is_pipe = !GetConsoleMode(input_handle, &dw);
1332 if (stdin->_cnt > 0) {
1337 /* When running under a GUI, you will end here. */
1338 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1355 static int decode_interrupt_cb(void *ctx)
1357 return received_nb_signals > 1;
1360 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1362 void av_noreturn exit_program(int ret)
1366 for (i = 0; i < nb_filtergraphs; i++) {
1367 avfilter_graph_free(&filtergraphs[i]->graph);
1368 for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
1369 av_freep(&filtergraphs[i]->inputs[j]->name);
1370 av_freep(&filtergraphs[i]->inputs[j]);
1372 av_freep(&filtergraphs[i]->inputs);
1373 for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
1374 av_freep(&filtergraphs[i]->outputs[j]->name);
1375 av_freep(&filtergraphs[i]->outputs[j]);
1377 av_freep(&filtergraphs[i]->outputs);
1378 av_freep(&filtergraphs[i]);
1380 av_freep(&filtergraphs);
1382 av_freep(&subtitle_out);
1385 for (i = 0; i < nb_output_files; i++) {
1386 AVFormatContext *s = output_files[i]->ctx;
1387 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1389 avformat_free_context(s);
1390 av_dict_free(&output_files[i]->opts);
1391 av_freep(&output_files[i]);
1393 for (i = 0; i < nb_output_streams; i++) {
1394 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1396 AVBitStreamFilterContext *next = bsfc->next;
1397 av_bitstream_filter_close(bsfc);
1400 output_streams[i]->bitstream_filters = NULL;
1402 av_freep(&output_streams[i]->forced_keyframes);
1403 av_freep(&output_streams[i]->filtered_frame);
1404 av_freep(&output_streams[i]->avfilter);
1405 av_freep(&output_streams[i]);
1407 for (i = 0; i < nb_input_files; i++) {
1408 avformat_close_input(&input_files[i]->ctx);
1409 av_freep(&input_files[i]);
1411 for (i = 0; i < nb_input_streams; i++) {
1412 av_freep(&input_streams[i]->decoded_frame);
1413 av_dict_free(&input_streams[i]->opts);
1414 free_buffer_pool(&input_streams[i]->buffer_pool);
1415 av_freep(&input_streams[i]->filters);
1416 av_freep(&input_streams[i]);
1420 fclose(vstats_file);
1421 av_free(vstats_filename);
1423 av_freep(&input_streams);
1424 av_freep(&input_files);
1425 av_freep(&output_streams);
1426 av_freep(&output_files);
1431 avformat_network_deinit();
1433 if (received_sigterm) {
1434 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1435 (int) received_sigterm);
1442 static void assert_avoptions(AVDictionary *m)
1444 AVDictionaryEntry *t;
1445 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1446 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1451 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1453 const char *codec_string = encoder ? "encoder" : "decoder";
1455 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1456 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1457 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1458 "results.\nAdd '-strict experimental' if you want to use it.\n",
1459 codec_string, c->codec->name);
1460 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1461 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1462 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1463 codec_string, codec->name);
1468 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1470 if (codec && codec->sample_fmts) {
1471 const enum AVSampleFormat *p = codec->sample_fmts;
1472 for (; *p != -1; p++) {
1473 if (*p == st->codec->sample_fmt)
1477 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1478 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1479 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1480 av_log(NULL, AV_LOG_WARNING,
1481 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1482 av_get_sample_fmt_name(st->codec->sample_fmt),
1484 av_get_sample_fmt_name(codec->sample_fmts[0]));
1485 st->codec->sample_fmt = codec->sample_fmts[0];
1490 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1492 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1493 AVCodecContext *avctx = ost->st->codec;
1496 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1497 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1498 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1500 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1501 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1502 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1503 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1504 pkt->pts = pkt->dts = max;
1509 * Audio encoders may split the packets -- #frames in != #packets out.
1510 * But there is no reordering, so we can limit the number of output packets
1511 * by simply dropping them here.
1512 * Counting encoded video frames needs to be done separately because of
1513 * reordering, see do_video_out()
1515 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1516 if (ost->frame_number >= ost->max_frames) {
1517 av_free_packet(pkt);
1520 ost->frame_number++;
1524 AVPacket new_pkt = *pkt;
1525 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1526 &new_pkt.data, &new_pkt.size,
1527 pkt->data, pkt->size,
1528 pkt->flags & AV_PKT_FLAG_KEY);
1530 av_free_packet(pkt);
1531 new_pkt.destruct = av_destruct_packet;
1533 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1534 bsfc->filter->name, pkt->stream_index,
1535 avctx->codec ? avctx->codec->name : "copy");
1545 pkt->stream_index = ost->index;
1546 ret = av_interleaved_write_frame(s, pkt);
1548 print_error("av_interleaved_write_frame()", ret);
1553 static int check_recording_time(OutputStream *ost)
1555 OutputFile *of = output_files[ost->file_index];
1557 if (of->recording_time != INT64_MAX &&
1558 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1559 AV_TIME_BASE_Q) >= 0) {
1560 ost->is_past_recording_time = 1;
1566 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1569 AVCodecContext *enc = ost->st->codec;
1573 av_init_packet(&pkt);
1577 if (!check_recording_time(ost))
1580 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1581 frame->pts = ost->sync_opts;
1582 ost->sync_opts = frame->pts + frame->nb_samples;
1584 av_assert0(pkt.size || !pkt.data);
1585 update_benchmark(NULL);
1586 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1587 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1590 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1593 if (pkt.pts != AV_NOPTS_VALUE)
1594 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1595 if (pkt.dts != AV_NOPTS_VALUE)
1596 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1597 if (pkt.duration > 0)
1598 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1601 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1602 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1603 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1604 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1607 write_frame(s, &pkt, ost);
1609 audio_size += pkt.size;
1610 av_free_packet(&pkt);
1614 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1616 AVCodecContext *dec;
1617 AVPicture *picture2;
1618 AVPicture picture_tmp;
1621 dec = ist->st->codec;
1623 /* deinterlace : must be done before any resize */
1624 if (do_deinterlace) {
1627 /* create temporary picture */
1628 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1629 buf = av_malloc(size);
1633 picture2 = &picture_tmp;
1634 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1636 if (avpicture_deinterlace(picture2, picture,
1637 dec->pix_fmt, dec->width, dec->height) < 0) {
1638 /* if error, do not deinterlace */
1639 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1648 if (picture != picture2)
1649 *picture = *picture2;
1653 static void do_subtitle_out(AVFormatContext *s,
1659 int subtitle_out_max_size = 1024 * 1024;
1660 int subtitle_out_size, nb, i;
1661 AVCodecContext *enc;
1664 if (pts == AV_NOPTS_VALUE) {
1665 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1671 enc = ost->st->codec;
1673 if (!subtitle_out) {
1674 subtitle_out = av_malloc(subtitle_out_max_size);
1677 /* Note: DVB subtitle need one packet to draw them and one other
1678 packet to clear them */
1679 /* XXX: signal it in the codec context ? */
1680 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1685 for (i = 0; i < nb; i++) {
1686 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1687 if (!check_recording_time(ost))
1690 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1691 // start_display_time is required to be 0
1692 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1693 sub->end_display_time -= sub->start_display_time;
1694 sub->start_display_time = 0;
1695 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1696 subtitle_out_max_size, sub);
1697 if (subtitle_out_size < 0) {
1698 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1702 av_init_packet(&pkt);
1703 pkt.data = subtitle_out;
1704 pkt.size = subtitle_out_size;
1705 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1706 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
1707 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1708 /* XXX: the pts correction is handled here. Maybe handling
1709 it in the codec would be better */
1711 pkt.pts += 90 * sub->start_display_time;
1713 pkt.pts += 90 * sub->end_display_time;
1715 write_frame(s, &pkt, ost);
1716 subtitle_size += pkt.size;
1720 static void do_video_out(AVFormatContext *s,
1722 AVFrame *in_picture,
1725 int ret, format_video_sync;
1727 AVCodecContext *enc = ost->st->codec;
1729 double sync_ipts, delta;
1730 double duration = 0;
1732 InputStream *ist = NULL;
1734 if (ost->source_index >= 0)
1735 ist = input_streams[ost->source_index];
1737 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1738 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1740 sync_ipts = in_picture->pts;
1741 delta = sync_ipts - ost->sync_opts + duration;
1743 /* by default, we output a single frame */
1746 format_video_sync = video_sync_method;
1747 if (format_video_sync == VSYNC_AUTO)
1748 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1750 switch (format_video_sync) {
1752 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1755 else if (delta > 1.1)
1756 nb_frames = lrintf(delta);
1761 else if (delta > 0.6)
1762 ost->sync_opts = lrint(sync_ipts);
1765 case VSYNC_PASSTHROUGH:
1766 ost->sync_opts = lrint(sync_ipts);
1772 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1773 if (nb_frames == 0) {
1775 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1777 } else if (nb_frames > 1) {
1778 if (nb_frames > dts_error_threshold * 30) {
1779 av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skiping\n", nb_frames - 1);
1783 nb_frames_dup += nb_frames - 1;
1784 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1787 /* duplicates frame if needed */
1788 for (i = 0; i < nb_frames; i++) {
1789 av_init_packet(&pkt);
1793 in_picture->pts = ost->sync_opts;
1795 if (!check_recording_time(ost))
1798 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1799 enc->codec->id == CODEC_ID_RAWVIDEO) {
1800 /* raw pictures are written as AVPicture structure to
1801 avoid any copies. We support temporarily the older
1803 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1804 enc->coded_frame->top_field_first = in_picture->top_field_first;
1805 pkt.data = (uint8_t *)in_picture;
1806 pkt.size = sizeof(AVPicture);
1807 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1808 pkt.flags |= AV_PKT_FLAG_KEY;
1810 write_frame(s, &pkt, ost);
1811 video_size += pkt.size;
1814 AVFrame big_picture;
1816 big_picture = *in_picture;
1817 /* better than nothing: use input picture interlaced
1819 big_picture.interlaced_frame = in_picture->interlaced_frame;
1820 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1821 if (ost->top_field_first == -1)
1822 big_picture.top_field_first = in_picture->top_field_first;
1824 big_picture.top_field_first = !!ost->top_field_first;
1827 /* handles same_quant here. This is not correct because it may
1828 not be a global option */
1829 big_picture.quality = quality;
1830 if (!enc->me_threshold)
1831 big_picture.pict_type = 0;
1832 if (ost->forced_kf_index < ost->forced_kf_count &&
1833 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1834 big_picture.pict_type = AV_PICTURE_TYPE_I;
1835 ost->forced_kf_index++;
1837 update_benchmark(NULL);
1838 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1839 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1841 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1846 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1847 pkt.pts = ost->sync_opts;
1849 if (pkt.pts != AV_NOPTS_VALUE)
1850 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1851 if (pkt.dts != AV_NOPTS_VALUE)
1852 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1855 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1856 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1857 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1858 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1861 write_frame(s, &pkt, ost);
1862 frame_size = pkt.size;
1863 video_size += pkt.size;
1864 av_free_packet(&pkt);
1866 /* if two pass, output log */
1867 if (ost->logfile && enc->stats_out) {
1868 fprintf(ost->logfile, "%s", enc->stats_out);
1874 * For video, number of frames in == number of packets out.
1875 * But there may be reordering, so we can't throw away frames on encoder
1876 * flush, we need to limit them here, before they go into encoder.
1878 ost->frame_number++;
1881 if (vstats_filename && frame_size)
1882 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1885 static double psnr(double d)
1887 return -10.0 * log(d) / log(10.0);
1890 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1893 AVCodecContext *enc;
1895 double ti1, bitrate, avg_bitrate;
1897 /* this is executed just the first time do_video_stats is called */
1899 vstats_file = fopen(vstats_filename, "w");
1906 enc = ost->st->codec;
1907 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1908 frame_number = ost->frame_number;
1909 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1910 if (enc->flags&CODEC_FLAG_PSNR)
1911 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1913 fprintf(vstats_file,"f_size= %6d ", frame_size);
1914 /* compute pts value */
1915 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1919 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1920 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1921 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1922 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1923 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1927 /* check for new output on any of the filtergraphs */
1928 static int poll_filters(void)
1930 AVFilterBufferRef *picref;
1931 AVFrame *filtered_frame = NULL;
1932 int i, ret, ret_all;
1933 unsigned nb_success = 1, av_uninit(nb_eof);
1937 /* Reap all buffers present in the buffer sinks */
1938 for (i = 0; i < nb_output_streams; i++) {
1939 OutputStream *ost = output_streams[i];
1940 OutputFile *of = output_files[ost->file_index];
1946 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1947 return AVERROR(ENOMEM);
1949 avcodec_get_frame_defaults(ost->filtered_frame);
1950 filtered_frame = ost->filtered_frame;
1953 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1954 AV_BUFFERSINK_FLAG_NO_REQUEST);
1956 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1958 av_strerror(ret, buf, sizeof(buf));
1959 av_log(NULL, AV_LOG_WARNING,
1960 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1964 frame_pts = AV_NOPTS_VALUE;
1965 if (picref->pts != AV_NOPTS_VALUE) {
1966 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1967 ost->filter->filter->inputs[0]->time_base,
1968 ost->st->codec->time_base) -
1969 av_rescale_q(of->start_time,
1971 ost->st->codec->time_base);
1973 if (of->start_time && filtered_frame->pts < 0) {
1974 avfilter_unref_buffer(picref);
1978 //if (ost->source_index >= 0)
1979 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1982 switch (ost->filter->filter->inputs[0]->type) {
1983 case AVMEDIA_TYPE_VIDEO:
1984 avfilter_copy_buf_props(filtered_frame, picref);
1985 filtered_frame->pts = frame_pts;
1986 if (!ost->frame_aspect_ratio)
1987 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1989 do_video_out(of->ctx, ost, filtered_frame,
1990 same_quant ? ost->last_quality :
1991 ost->st->codec->global_quality);
1993 case AVMEDIA_TYPE_AUDIO:
1994 avfilter_copy_buf_props(filtered_frame, picref);
1995 filtered_frame->pts = frame_pts;
1996 do_audio_out(of->ctx, ost, filtered_frame);
1999 // TODO support subtitle filters
2003 avfilter_unref_buffer(picref);
2006 if (!nb_success) /* from last round */
2008 /* Request frames through all the graphs */
2009 ret_all = nb_success = nb_eof = 0;
2010 for (i = 0; i < nb_filtergraphs; i++) {
2011 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2014 } else if (ret == AVERROR_EOF) {
2016 } else if (ret != AVERROR(EAGAIN)) {
2018 av_strerror(ret, buf, sizeof(buf));
2019 av_log(NULL, AV_LOG_WARNING,
2020 "Error in request_frame(): %s\n", buf);
2024 /* Try again if anything succeeded */
2026 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2029 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2032 AVBPrint buf_script;
2034 AVFormatContext *oc;
2036 AVCodecContext *enc;
2037 int frame_number, vid, i;
2039 int64_t pts = INT64_MAX;
2040 static int64_t last_time = -1;
2041 static int qp_histogram[52];
2042 int hours, mins, secs, us;
2044 if (!print_stats && !is_last_report && !progress_avio)
2047 if (!is_last_report) {
2048 if (last_time == -1) {
2049 last_time = cur_time;
2052 if ((cur_time - last_time) < 500000)
2054 last_time = cur_time;
2058 oc = output_files[0]->ctx;
2060 total_size = avio_size(oc->pb);
2061 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2062 total_size = avio_tell(oc->pb);
2069 av_bprint_init(&buf_script, 0, 1);
2070 for (i = 0; i < nb_output_streams; i++) {
2072 ost = output_streams[i];
2073 enc = ost->st->codec;
2074 if (!ost->stream_copy && enc->coded_frame)
2075 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2076 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2077 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2078 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2079 ost->file_index, ost->index, q);
2081 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2082 float fps, t = (cur_time-timer_start) / 1000000.0;
2084 frame_number = ost->frame_number;
2085 fps = t > 1 ? frame_number / t : 0;
2086 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2087 frame_number, fps < 9.95, fps, q);
2088 av_bprintf(&buf_script, "frame=%d\n", frame_number);
2089 av_bprintf(&buf_script, "fps=%.1f\n", fps);
2090 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2091 ost->file_index, ost->index, q);
2093 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2097 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2099 for (j = 0; j < 32; j++)
2100 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2102 if (enc->flags&CODEC_FLAG_PSNR) {
2104 double error, error_sum = 0;
2105 double scale, scale_sum = 0;
2107 char type[3] = { 'Y','U','V' };
2108 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2109 for (j = 0; j < 3; j++) {
2110 if (is_last_report) {
2111 error = enc->error[j];
2112 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2114 error = enc->coded_frame->error[j];
2115 scale = enc->width * enc->height * 255.0 * 255.0;
2121 p = psnr(error / scale);
2122 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p);
2123 av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
2124 ost->file_index, ost->index, type[i] | 32, p);
2126 p = psnr(error_sum / scale_sum);
2127 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2128 av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
2129 ost->file_index, ost->index, p);
2133 /* compute min output value */
2134 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2135 ost->st->time_base, AV_TIME_BASE_Q));
2138 secs = pts / AV_TIME_BASE;
2139 us = pts % AV_TIME_BASE;
2145 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2147 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2148 "size=%8.0fkB time=", total_size / 1024.0);
2149 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2150 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2151 (100 * us) / AV_TIME_BASE);
2152 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2153 "bitrate=%6.1fkbits/s", bitrate);
2154 av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
2155 av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
2156 av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n",
2157 hours, mins, secs, us);
2159 if (nb_frames_dup || nb_frames_drop)
2160 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2161 nb_frames_dup, nb_frames_drop);
2162 av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
2163 av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
2165 if (print_stats || is_last_report) {
2166 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2171 if (progress_avio) {
2172 av_bprintf(&buf_script, "progress=%s\n",
2173 is_last_report ? "end" : "continue");
2174 avio_write(progress_avio, buf_script.str,
2175 FFMIN(buf_script.len, buf_script.size - 1));
2176 avio_flush(progress_avio);
2177 av_bprint_finalize(&buf_script, NULL);
2178 if (is_last_report) {
2179 avio_close(progress_avio);
2180 progress_avio = NULL;
2184 if (is_last_report) {
2185 int64_t raw= audio_size + video_size + subtitle_size + extra_size;
2186 av_log(NULL, AV_LOG_INFO, "\n");
2187 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
2188 video_size / 1024.0,
2189 audio_size / 1024.0,
2190 subtitle_size / 1024.0,
2191 extra_size / 1024.0,
2192 100.0 * (total_size - raw) / raw
2194 if(video_size + audio_size + subtitle_size + extra_size == 0){
2195 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2200 static void flush_encoders(void)
2204 for (i = 0; i < nb_output_streams; i++) {
2205 OutputStream *ost = output_streams[i];
2206 AVCodecContext *enc = ost->st->codec;
2207 AVFormatContext *os = output_files[ost->file_index]->ctx;
2208 int stop_encoding = 0;
2210 if (!ost->encoding_needed)
2213 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2215 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2219 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2223 switch (ost->st->codec->codec_type) {
2224 case AVMEDIA_TYPE_AUDIO:
2225 encode = avcodec_encode_audio2;
2229 case AVMEDIA_TYPE_VIDEO:
2230 encode = avcodec_encode_video2;
2241 av_init_packet(&pkt);
2245 update_benchmark(NULL);
2246 ret = encode(enc, &pkt, NULL, &got_packet);
2247 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2249 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2253 if (ost->logfile && enc->stats_out) {
2254 fprintf(ost->logfile, "%s", enc->stats_out);
2260 if (pkt.pts != AV_NOPTS_VALUE)
2261 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2262 if (pkt.dts != AV_NOPTS_VALUE)
2263 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2264 write_frame(os, &pkt, ost);
2274 * Check whether a packet from ist should be written into ost at this time
2276 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2278 OutputFile *of = output_files[ost->file_index];
2279 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2281 if (ost->source_index != ist_index)
2284 if (of->start_time && ist->pts < of->start_time)
2290 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2292 OutputFile *of = output_files[ost->file_index];
2293 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2297 av_init_packet(&opkt);
2299 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2300 !ost->copy_initial_nonkeyframes)
2303 if (of->recording_time != INT64_MAX &&
2304 ist->pts >= of->recording_time + of->start_time) {
2305 ost->is_past_recording_time = 1;
2309 /* force the input stream PTS */
2310 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2311 audio_size += pkt->size;
2312 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2313 video_size += pkt->size;
2315 } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2316 subtitle_size += pkt->size;
2319 if (pkt->pts != AV_NOPTS_VALUE)
2320 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2322 opkt.pts = AV_NOPTS_VALUE;
2324 if (pkt->dts == AV_NOPTS_VALUE)
2325 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2327 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2328 opkt.dts -= ost_tb_start_time;
2330 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2331 opkt.flags = pkt->flags;
2333 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2334 if ( ost->st->codec->codec_id != CODEC_ID_H264
2335 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2336 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2337 && ost->st->codec->codec_id != CODEC_ID_VC1
2339 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2340 opkt.destruct = av_destruct_packet;
2342 opkt.data = pkt->data;
2343 opkt.size = pkt->size;
2345 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2346 /* store AVPicture in AVPacket, as expected by the output format */
2347 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2348 opkt.data = (uint8_t *)&pict;
2349 opkt.size = sizeof(AVPicture);
2350 opkt.flags |= AV_PKT_FLAG_KEY;
2353 write_frame(of->ctx, &opkt, ost);
2354 ost->st->codec->frame_number++;
2355 av_free_packet(&opkt);
2358 static void rate_emu_sleep(InputStream *ist)
2360 if (input_files[ist->file_index]->rate_emu) {
2361 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2362 int64_t now = av_gettime() - ist->start;
2364 av_usleep(pts - now);
2368 static int guess_input_channel_layout(InputStream *ist)
2370 AVCodecContext *dec = ist->st->codec;
2372 if (!dec->channel_layout) {
2373 char layout_name[256];
2375 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2376 if (!dec->channel_layout)
2378 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2379 dec->channels, dec->channel_layout);
2380 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2381 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2386 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2388 AVFrame *decoded_frame;
2389 AVCodecContext *avctx = ist->st->codec;
2390 int i, ret, resample_changed;
2392 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2393 return AVERROR(ENOMEM);
2395 avcodec_get_frame_defaults(ist->decoded_frame);
2396 decoded_frame = ist->decoded_frame;
2398 update_benchmark(NULL);
2399 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2400 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2404 if (avctx->sample_rate <= 0) {
2405 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2406 return AVERROR_INVALIDDATA;
2410 /* no audio frame */
2412 for (i = 0; i < ist->nb_filters; i++)
2413 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2414 AV_BUFFERSRC_FLAG_NO_COPY);
2418 /* if the decoder provides a pts, use it instead of the last packet pts.
2419 the decoder could be delaying output by a packet or more. */
2420 if (decoded_frame->pts != AV_NOPTS_VALUE)
2421 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2422 else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
2423 decoded_frame->pts = decoded_frame->pkt_pts;
2424 pkt->pts = AV_NOPTS_VALUE;
2425 } else if (pkt->pts != AV_NOPTS_VALUE) {
2426 decoded_frame->pts = pkt->pts;
2427 pkt->pts = AV_NOPTS_VALUE;
2429 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2433 /* increment next_dts to use for the case where the input stream does not
2434 have timestamps or there are multiple frames in the packet */
2435 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2437 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2441 rate_emu_sleep(ist);
2443 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2444 ist->resample_channels != avctx->channels ||
2445 ist->resample_channel_layout != decoded_frame->channel_layout ||
2446 ist->resample_sample_rate != decoded_frame->sample_rate;
2447 if (resample_changed) {
2448 char layout1[64], layout2[64];
2450 if (!guess_input_channel_layout(ist)) {
2451 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2452 "layout for Input Stream #%d.%d\n", ist->file_index,
2456 decoded_frame->channel_layout = avctx->channel_layout;
2458 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2459 ist->resample_channel_layout);
2460 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2461 decoded_frame->channel_layout);
2463 av_log(NULL, AV_LOG_INFO,
2464 "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d chl:%s to rate:%d fmt:%s ch:%d chl:%s\n",
2465 ist->file_index, ist->st->index,
2466 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2467 ist->resample_channels, layout1,
2468 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2469 avctx->channels, layout2);
2471 ist->resample_sample_fmt = decoded_frame->format;
2472 ist->resample_sample_rate = decoded_frame->sample_rate;
2473 ist->resample_channel_layout = decoded_frame->channel_layout;
2474 ist->resample_channels = avctx->channels;
2476 for (i = 0; i < nb_filtergraphs; i++)
2477 if (ist_in_filtergraph(filtergraphs[i], ist)) {
2478 FilterGraph *fg = filtergraphs[i];
2480 if (configure_filtergraph(fg) < 0) {
2481 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2484 for (j = 0; j < fg->nb_outputs; j++) {
2485 OutputStream *ost = fg->outputs[j]->ost;
2486 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2487 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2488 av_buffersink_set_frame_size(ost->filter->filter,
2489 ost->st->codec->frame_size);
2494 if (decoded_frame->pts != AV_NOPTS_VALUE)
2495 decoded_frame->pts = av_rescale_q(decoded_frame->pts,
2497 (AVRational){1, ist->st->codec->sample_rate});
2498 for (i = 0; i < ist->nb_filters; i++)
2499 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2504 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2506 AVFrame *decoded_frame;
2507 void *buffer_to_free = NULL;
2508 int i, ret = 0, resample_changed;
2509 int64_t best_effort_timestamp;
2510 AVRational *frame_sample_aspect;
2513 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2514 return AVERROR(ENOMEM);
2516 avcodec_get_frame_defaults(ist->decoded_frame);
2517 decoded_frame = ist->decoded_frame;
2518 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2520 update_benchmark(NULL);
2521 ret = avcodec_decode_video2(ist->st->codec,
2522 decoded_frame, got_output, pkt);
2523 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2527 quality = same_quant ? decoded_frame->quality : 0;
2529 /* no picture yet */
2531 for (i = 0; i < ist->nb_filters; i++)
2532 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2536 if(ist->top_field_first>=0)
2537 decoded_frame->top_field_first = ist->top_field_first;
2539 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2540 if(best_effort_timestamp != AV_NOPTS_VALUE)
2541 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2544 av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
2545 "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d \n",
2546 ist->st->index, av_ts2str(decoded_frame->pts),
2547 av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
2548 best_effort_timestamp,
2549 av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
2550 decoded_frame->key_frame, decoded_frame->pict_type);
2554 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2556 rate_emu_sleep(ist);
2558 if (ist->st->sample_aspect_ratio.num)
2559 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2561 resample_changed = ist->resample_width != decoded_frame->width ||
2562 ist->resample_height != decoded_frame->height ||
2563 ist->resample_pix_fmt != decoded_frame->format;
2564 if (resample_changed) {
2565 av_log(NULL, AV_LOG_INFO,
2566 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2567 ist->file_index, ist->st->index,
2568 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2569 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2571 ist->resample_width = decoded_frame->width;
2572 ist->resample_height = decoded_frame->height;
2573 ist->resample_pix_fmt = decoded_frame->format;
2575 for (i = 0; i < nb_filtergraphs; i++)
2576 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2577 configure_filtergraph(filtergraphs[i]) < 0) {
2578 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2583 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2584 for (i = 0; i < ist->nb_filters; i++) {
2585 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2586 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2587 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2588 // XXX what an ugly hack
2589 if (ist->filters[i]->graph->nb_outputs == 1)
2590 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2592 if (!frame_sample_aspect->num)
2593 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2594 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2595 FrameBuffer *buf = decoded_frame->opaque;
2596 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2597 decoded_frame->data, decoded_frame->linesize,
2598 AV_PERM_READ | AV_PERM_PRESERVE,
2599 ist->st->codec->width, ist->st->codec->height,
2600 ist->st->codec->pix_fmt);
2602 avfilter_copy_frame_props(fb, decoded_frame);
2603 fb->buf->priv = buf;
2604 fb->buf->free = filter_release_buffer;
2606 av_assert0(buf->refcount>0);
2608 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2609 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2610 AV_BUFFERSRC_FLAG_NO_COPY);
2612 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2613 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2619 av_free(buffer_to_free);
2623 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2625 AVSubtitle subtitle;
2626 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2627 &subtitle, got_output, pkt);
2633 rate_emu_sleep(ist);
2635 for (i = 0; i < nb_output_streams; i++) {
2636 OutputStream *ost = output_streams[i];
2638 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2641 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2644 avsubtitle_free(&subtitle);
2648 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2649 static int output_packet(InputStream *ist, const AVPacket *pkt)
2655 if (!ist->saw_first_ts) {
2656 ist->dts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames * AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
2658 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2659 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2660 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2662 ist->saw_first_ts = 1;
2665 if (ist->next_dts == AV_NOPTS_VALUE)
2666 ist->next_dts = ist->dts;
2667 if (ist->next_pts == AV_NOPTS_VALUE)
2668 ist->next_pts = ist->pts;
2672 av_init_packet(&avpkt);
2680 if (pkt->dts != AV_NOPTS_VALUE) {
2681 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2682 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2683 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2686 // while we have more to decode or while the decoder did output something on EOF
2687 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2691 ist->pts = ist->next_pts;
2692 ist->dts = ist->next_dts;
2694 if (avpkt.size && avpkt.size != pkt->size) {
2695 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2696 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2697 ist->showed_multi_packet_warning = 1;
2700 switch (ist->st->codec->codec_type) {
2701 case AVMEDIA_TYPE_AUDIO:
2702 ret = decode_audio (ist, &avpkt, &got_output);
2704 case AVMEDIA_TYPE_VIDEO:
2705 ret = decode_video (ist, &avpkt, &got_output);
2706 if (avpkt.duration) {
2707 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2708 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2709 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2710 duration = ((int64_t)AV_TIME_BASE *
2711 ist->st->codec->time_base.num * ticks) /
2712 ist->st->codec->time_base.den;
2716 if(ist->dts != AV_NOPTS_VALUE && duration) {
2717 ist->next_dts += duration;
2719 ist->next_dts = AV_NOPTS_VALUE;
2722 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2724 case AVMEDIA_TYPE_SUBTITLE:
2725 ret = transcode_subtitles(ist, &avpkt, &got_output);
2735 avpkt.pts= AV_NOPTS_VALUE;
2737 // touch data and size only if not EOF
2739 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2749 /* handle stream copy */
2750 if (!ist->decoding_needed) {
2751 rate_emu_sleep(ist);
2752 ist->dts = ist->next_dts;
2753 switch (ist->st->codec->codec_type) {
2754 case AVMEDIA_TYPE_AUDIO:
2755 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2756 ist->st->codec->sample_rate;
2758 case AVMEDIA_TYPE_VIDEO:
2759 if (pkt->duration) {
2760 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2761 } else if(ist->st->codec->time_base.num != 0) {
2762 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2763 ist->next_dts += ((int64_t)AV_TIME_BASE *
2764 ist->st->codec->time_base.num * ticks) /
2765 ist->st->codec->time_base.den;
2769 ist->pts = ist->dts;
2770 ist->next_pts = ist->next_dts;
2772 for (i = 0; pkt && i < nb_output_streams; i++) {
2773 OutputStream *ost = output_streams[i];
2775 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2778 do_streamcopy(ist, ost, pkt);
2784 static void print_sdp(void)
2788 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2792 for (i = 0; i < nb_output_files; i++)
2793 avc[i] = output_files[i]->ctx;
2795 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2796 printf("SDP:\n%s\n", sdp);
2801 static int init_input_stream(int ist_index, char *error, int error_len)
2803 InputStream *ist = input_streams[ist_index];
2805 if (ist->decoding_needed) {
2806 AVCodec *codec = ist->dec;
2808 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2809 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2810 return AVERROR(EINVAL);
2813 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2814 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2815 ist->st->codec->get_buffer = codec_get_buffer;
2816 ist->st->codec->release_buffer = codec_release_buffer;
2817 ist->st->codec->opaque = &ist->buffer_pool;
2820 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2821 av_dict_set(&ist->opts, "threads", "auto", 0);
2822 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2823 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2824 ist->file_index, ist->st->index);
2825 return AVERROR(EINVAL);
2827 assert_codec_experimental(ist->st->codec, 0);
2828 assert_avoptions(ist->opts);
2831 ist->next_pts = AV_NOPTS_VALUE;
2832 ist->next_dts = AV_NOPTS_VALUE;
2838 static InputStream *get_input_stream(OutputStream *ost)
2840 if (ost->source_index >= 0)
2841 return input_streams[ost->source_index];
2845 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2846 AVCodecContext *avctx)
2852 for (p = kf; *p; p++)
2855 ost->forced_kf_count = n;
2856 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2857 if (!ost->forced_kf_pts) {
2858 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2863 for (i = 0; i < n; i++) {
2864 char *next = strchr(p, ',');
2869 t = parse_time_or_die("force_key_frames", p, 1);
2870 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2876 static int transcode_init(void)
2878 int ret = 0, i, j, k;
2879 AVFormatContext *oc;
2880 AVCodecContext *codec, *icodec = NULL;
2886 /* init framerate emulation */
2887 for (i = 0; i < nb_input_files; i++) {
2888 InputFile *ifile = input_files[i];
2889 if (ifile->rate_emu)
2890 for (j = 0; j < ifile->nb_streams; j++)
2891 input_streams[j + ifile->ist_index]->start = av_gettime();
2894 /* output stream init */
2895 for (i = 0; i < nb_output_files; i++) {
2896 oc = output_files[i]->ctx;
2897 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2898 av_dump_format(oc, i, oc->filename, 1);
2899 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2900 return AVERROR(EINVAL);
2904 /* init complex filtergraphs */
2905 for (i = 0; i < nb_filtergraphs; i++)
2906 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2909 /* for each output stream, we compute the right encoding parameters */
2910 for (i = 0; i < nb_output_streams; i++) {
2911 ost = output_streams[i];
2912 oc = output_files[ost->file_index]->ctx;
2913 ist = get_input_stream(ost);
2915 if (ost->attachment_filename)
2918 codec = ost->st->codec;
2921 icodec = ist->st->codec;
2923 ost->st->disposition = ist->st->disposition;
2924 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2925 codec->chroma_sample_location = icodec->chroma_sample_location;
2928 if (ost->stream_copy) {
2929 uint64_t extra_size;
2931 av_assert0(ist && !ost->filter);
2933 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2935 if (extra_size > INT_MAX) {
2936 return AVERROR(EINVAL);
2939 /* if stream_copy is selected, no need to decode or encode */
2940 codec->codec_id = icodec->codec_id;
2941 codec->codec_type = icodec->codec_type;
2943 if (!codec->codec_tag) {
2944 if (!oc->oformat->codec_tag ||
2945 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2946 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2947 codec->codec_tag = icodec->codec_tag;
2950 codec->bit_rate = icodec->bit_rate;
2951 codec->rc_max_rate = icodec->rc_max_rate;
2952 codec->rc_buffer_size = icodec->rc_buffer_size;
2953 codec->field_order = icodec->field_order;
2954 codec->extradata = av_mallocz(extra_size);
2955 if (!codec->extradata) {
2956 return AVERROR(ENOMEM);
2958 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2959 codec->extradata_size= icodec->extradata_size;
2960 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2962 codec->time_base = ist->st->time_base;
2964 * Avi is a special case here because it supports variable fps but
2965 * having the fps and timebase differe significantly adds quite some
2968 if(!strcmp(oc->oformat->name, "avi")) {
2969 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2970 && av_q2d(ist->st->time_base) < 1.0/500
2972 codec->time_base = icodec->time_base;
2973 codec->time_base.num *= icodec->ticks_per_frame;
2974 codec->time_base.den *= 2;
2975 codec->ticks_per_frame = 2;
2977 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2978 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2979 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2981 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2982 && av_q2d(ist->st->time_base) < 1.0/500
2984 codec->time_base = icodec->time_base;
2985 codec->time_base.num *= icodec->ticks_per_frame;
2989 if(ost->frame_rate.num)
2990 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2992 av_reduce(&codec->time_base.num, &codec->time_base.den,
2993 codec->time_base.num, codec->time_base.den, INT_MAX);
2995 switch (codec->codec_type) {
2996 case AVMEDIA_TYPE_AUDIO:
2997 if (audio_volume != 256) {
2998 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3001 codec->channel_layout = icodec->channel_layout;
3002 codec->sample_rate = icodec->sample_rate;
3003 codec->channels = icodec->channels;
3004 codec->frame_size = icodec->frame_size;
3005 codec->audio_service_type = icodec->audio_service_type;
3006 codec->block_align = icodec->block_align;
3007 if((codec->block_align == 1 || codec->block_align == 1152) && codec->codec_id == CODEC_ID_MP3)
3008 codec->block_align= 0;
3009 if(codec->codec_id == CODEC_ID_AC3)
3010 codec->block_align= 0;
3012 case AVMEDIA_TYPE_VIDEO:
3013 codec->pix_fmt = icodec->pix_fmt;
3014 codec->width = icodec->width;
3015 codec->height = icodec->height;
3016 codec->has_b_frames = icodec->has_b_frames;
3017 if (!codec->sample_aspect_ratio.num) {
3018 codec->sample_aspect_ratio =
3019 ost->st->sample_aspect_ratio =
3020 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3021 ist->st->codec->sample_aspect_ratio.num ?
3022 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3024 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3026 case AVMEDIA_TYPE_SUBTITLE:
3027 codec->width = icodec->width;
3028 codec->height = icodec->height;
3030 case AVMEDIA_TYPE_DATA:
3031 case AVMEDIA_TYPE_ATTACHMENT:
3038 ost->enc = avcodec_find_encoder(codec->codec_id);
3040 /* should only happen when a default codec is not present. */
3041 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3042 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3043 ret = AVERROR(EINVAL);
3048 ist->decoding_needed = 1;
3049 ost->encoding_needed = 1;
3051 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3052 if (ost->filter && !ost->frame_rate.num)
3053 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
3054 if (ist && !ost->frame_rate.num)
3055 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3056 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3057 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3058 ost->frame_rate = ost->enc->supported_framerates[idx];
3063 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3064 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3066 fg = init_simple_filtergraph(ist, ost);
3067 if (configure_filtergraph(fg)) {
3068 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3073 switch (codec->codec_type) {
3074 case AVMEDIA_TYPE_AUDIO:
3075 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3076 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3077 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3078 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3079 codec->time_base = (AVRational){ 1, codec->sample_rate };
3081 case AVMEDIA_TYPE_VIDEO:
3082 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3083 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
3084 codec->time_base = ost->filter->filter->inputs[0]->time_base;
3085 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3086 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3087 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3088 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3090 for (j = 0; j < ost->forced_kf_count; j++)
3091 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3095 codec->width = ost->filter->filter->inputs[0]->w;
3096 codec->height = ost->filter->filter->inputs[0]->h;
3097 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3098 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3099 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3100 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3101 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3104 codec->width != icodec->width ||
3105 codec->height != icodec->height ||
3106 codec->pix_fmt != icodec->pix_fmt) {
3107 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3110 if (ost->forced_keyframes)
3111 parse_forced_key_frames(ost->forced_keyframes, ost,
3114 case AVMEDIA_TYPE_SUBTITLE:
3115 codec->time_base = (AVRational){1, 1000};
3122 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3123 char logfilename[1024];
3126 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3127 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3129 if (!strcmp(ost->enc->name, "libx264")) {
3130 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3132 if (codec->flags & CODEC_FLAG_PASS2) {
3134 size_t logbuffer_size;
3135 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3136 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3140 codec->stats_in = logbuffer;
3142 if (codec->flags & CODEC_FLAG_PASS1) {
3143 f = fopen(logfilename, "wb");
3145 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3146 logfilename, strerror(errno));
3156 /* open each encoder */
3157 for (i = 0; i < nb_output_streams; i++) {
3158 ost = output_streams[i];
3159 if (ost->encoding_needed) {
3160 AVCodec *codec = ost->enc;
3161 AVCodecContext *dec = NULL;
3163 if ((ist = get_input_stream(ost)))
3164 dec = ist->st->codec;
3165 if (dec && dec->subtitle_header) {
3166 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3167 if (!ost->st->codec->subtitle_header) {
3168 ret = AVERROR(ENOMEM);
3171 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3172 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3174 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3175 av_dict_set(&ost->opts, "threads", "auto", 0);
3176 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3177 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3178 ost->file_index, ost->index);
3179 ret = AVERROR(EINVAL);
3182 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3183 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
3184 av_buffersink_set_frame_size(ost->filter->filter,
3185 ost->st->codec->frame_size);
3186 assert_codec_experimental(ost->st->codec, 1);
3187 assert_avoptions(ost->opts);
3188 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3189 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3190 " It takes bits/s as argument, not kbits/s\n");
3191 extra_size += ost->st->codec->extradata_size;
3193 if (ost->st->codec->me_threshold)
3194 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3198 /* init input streams */
3199 for (i = 0; i < nb_input_streams; i++)
3200 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3203 /* discard unused programs */
3204 for (i = 0; i < nb_input_files; i++) {
3205 InputFile *ifile = input_files[i];
3206 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3207 AVProgram *p = ifile->ctx->programs[j];
3208 int discard = AVDISCARD_ALL;
3210 for (k = 0; k < p->nb_stream_indexes; k++)
3211 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3212 discard = AVDISCARD_DEFAULT;
3215 p->discard = discard;
3219 /* open files and write file headers */
3220 for (i = 0; i < nb_output_files; i++) {
3221 oc = output_files[i]->ctx;
3222 oc->interrupt_callback = int_cb;
3223 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3225 const char *errbuf_ptr = errbuf;
3226 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3227 errbuf_ptr = strerror(AVUNERROR(ret));
3228 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3229 ret = AVERROR(EINVAL);
3232 // assert_avoptions(output_files[i]->opts);
3233 if (strcmp(oc->oformat->name, "rtp")) {
3239 /* dump the file output parameters - cannot be done before in case
3241 for (i = 0; i < nb_output_files; i++) {
3242 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3245 /* dump the stream mapping */
3246 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3247 for (i = 0; i < nb_input_streams; i++) {
3248 ist = input_streams[i];
3250 for (j = 0; j < ist->nb_filters; j++) {
3251 if (ist->filters[j]->graph->graph_desc) {
3252 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3253 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3254 ist->filters[j]->name);
3255 if (nb_filtergraphs > 1)
3256 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3257 av_log(NULL, AV_LOG_INFO, "\n");
3262 for (i = 0; i < nb_output_streams; i++) {
3263 ost = output_streams[i];
3265 if (ost->attachment_filename) {
3266 /* an attached file */
3267 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3268 ost->attachment_filename, ost->file_index, ost->index);
3272 if (ost->filter && ost->filter->graph->graph_desc) {
3273 /* output from a complex graph */
3274 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3275 if (nb_filtergraphs > 1)
3276 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3278 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3279 ost->index, ost->enc ? ost->enc->name : "?");
3283 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3284 input_streams[ost->source_index]->file_index,
3285 input_streams[ost->source_index]->st->index,
3288 if (ost->sync_ist != input_streams[ost->source_index])
3289 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3290 ost->sync_ist->file_index,
3291 ost->sync_ist->st->index);
3292 if (ost->stream_copy)
3293 av_log(NULL, AV_LOG_INFO, " (copy)");
3295 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3296 input_streams[ost->source_index]->dec->name : "?",
3297 ost->enc ? ost->enc->name : "?");
3298 av_log(NULL, AV_LOG_INFO, "\n");
3302 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3314 * @return 1 if there are still streams where more output is wanted,
3317 static int need_output(void)
3321 for (i = 0; i < nb_output_streams; i++) {
3322 OutputStream *ost = output_streams[i];
3323 OutputFile *of = output_files[ost->file_index];
3324 AVFormatContext *os = output_files[ost->file_index]->ctx;
3326 if (ost->is_past_recording_time ||
3327 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3329 if (ost->frame_number >= ost->max_frames) {
3331 for (j = 0; j < of->ctx->nb_streams; j++)
3332 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3342 static int input_acceptable(InputStream *ist)
3344 av_assert1(!ist->discard);
3345 return !input_files[ist->file_index]->unavailable &&
3346 !input_files[ist->file_index]->eof_reached;
3349 static int find_graph_input(FilterGraph *graph)
3351 int i, nb_req_max = 0, file_index = -1;
3353 for (i = 0; i < graph->nb_inputs; i++) {
3354 int nb_req = av_buffersrc_get_nb_failed_requests(graph->inputs[i]->filter);
3355 if (nb_req > nb_req_max) {
3356 InputStream *ist = graph->inputs[i]->ist;
3357 if (input_acceptable(ist)) {
3358 nb_req_max = nb_req;
3359 file_index = ist->file_index;
3368 * Select the input file to read from.
3370 * @return >=0 index of the input file to use;
3371 * -1 if no file is acceptable;
3372 * -2 to read from filters without reading from a file
3374 static int select_input_file(void)
3376 int i, ret, nb_active_out = nb_output_streams, ost_index = -1;
3379 AVFilterBufferRef *dummy;
3381 for (i = 0; i < nb_output_streams; i++)
3382 nb_active_out -= output_streams[i]->unavailable =
3383 output_streams[i]->is_past_recording_time;
3384 while (nb_active_out) {
3385 opts_min = INT64_MAX;
3387 for (i = 0; i < nb_output_streams; i++) {
3388 OutputStream *ost = output_streams[i];
3389 int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
3391 if (!ost->unavailable && opts < opts_min) {
3399 ost = output_streams[ost_index];
3400 if (ost->source_index >= 0) {
3401 /* ost is directly connected to an input */
3402 InputStream *ist = input_streams[ost->source_index];
3403 if (input_acceptable(ist))
3404 return ist->file_index;
3406 /* ost is connected to a complex filtergraph */
3407 av_assert1(ost->filter);
3408 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &dummy,
3409 AV_BUFFERSINK_FLAG_PEEK);
3412 ret = find_graph_input(ost->filter->graph);
3416 ost->unavailable = 1;
3422 static int check_keyboard_interaction(int64_t cur_time)
3425 static int64_t last_time;
3426 if (received_nb_signals)
3427 return AVERROR_EXIT;
3428 /* read_key() returns 0 on EOF */
3429 if(cur_time - last_time >= 100000 && !run_as_daemon){
3431 last_time = cur_time;
3435 return AVERROR_EXIT;
3436 if (key == '+') av_log_set_level(av_log_get_level()+10);
3437 if (key == '-') av_log_set_level(av_log_get_level()-10);
3438 if (key == 's') qp_hist ^= 1;
3441 do_hex_dump = do_pkt_dump = 0;
3442 } else if(do_pkt_dump){
3446 av_log_set_level(AV_LOG_DEBUG);
3448 if (key == 'c' || key == 'C'){
3449 char buf[4096], target[64], command[256], arg[256] = {0};
3452 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3454 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3459 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3460 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3461 target, time, command, arg);
3462 for (i = 0; i < nb_filtergraphs; i++) {
3463 FilterGraph *fg = filtergraphs[i];
3466 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3467 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3468 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3470 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3475 av_log(NULL, AV_LOG_ERROR,
3476 "Parse error, at least 3 arguments were expected, "
3477 "only %d given in string '%s'\n", n, buf);
3480 if (key == 'd' || key == 'D'){
3483 debug = input_streams[0]->st->codec->debug<<1;
3484 if(!debug) debug = 1;
3485 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3488 if(scanf("%d", &debug)!=1)
3489 fprintf(stderr,"error parsing debug value\n");
3490 for(i=0;i<nb_input_streams;i++) {
3491 input_streams[i]->st->codec->debug = debug;
3493 for(i=0;i<nb_output_streams;i++) {
3494 OutputStream *ost = output_streams[i];
3495 ost->st->codec->debug = debug;
3497 if(debug) av_log_set_level(AV_LOG_DEBUG);
3498 fprintf(stderr,"debug=%d\n", debug);
3501 fprintf(stderr, "key function\n"
3502 "? show this help\n"
3503 "+ increase verbosity\n"
3504 "- decrease verbosity\n"
3505 "c Send command to filtergraph\n"
3506 "D cycle through available debug modes\n"
3507 "h dump packets/hex press to cycle through the 3 states\n"
3509 "s Show QP histogram\n"
3516 static void *input_thread(void *arg)
3521 while (!transcoding_finished && ret >= 0) {
3523 ret = av_read_frame(f->ctx, &pkt);
3525 if (ret == AVERROR(EAGAIN)) {
3532 pthread_mutex_lock(&f->fifo_lock);
3533 while (!av_fifo_space(f->fifo))
3534 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3536 av_dup_packet(&pkt);
3537 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3539 pthread_mutex_unlock(&f->fifo_lock);
3546 static void free_input_threads(void)
3550 if (nb_input_files == 1)
3553 transcoding_finished = 1;
3555 for (i = 0; i < nb_input_files; i++) {
3556 InputFile *f = input_files[i];
3559 if (!f->fifo || f->joined)
3562 pthread_mutex_lock(&f->fifo_lock);
3563 while (av_fifo_size(f->fifo)) {
3564 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3565 av_free_packet(&pkt);
3567 pthread_cond_signal(&f->fifo_cond);
3568 pthread_mutex_unlock(&f->fifo_lock);
3570 pthread_join(f->thread, NULL);
3573 while (av_fifo_size(f->fifo)) {
3574 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3575 av_free_packet(&pkt);
3577 av_fifo_free(f->fifo);
3581 static int init_input_threads(void)
3585 if (nb_input_files == 1)
3588 for (i = 0; i < nb_input_files; i++) {
3589 InputFile *f = input_files[i];
3591 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3592 return AVERROR(ENOMEM);
3594 pthread_mutex_init(&f->fifo_lock, NULL);
3595 pthread_cond_init (&f->fifo_cond, NULL);
3597 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3598 return AVERROR(ret);
3603 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3607 pthread_mutex_lock(&f->fifo_lock);
3609 if (av_fifo_size(f->fifo)) {
3610 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3611 pthread_cond_signal(&f->fifo_cond);
3616 ret = AVERROR(EAGAIN);
3619 pthread_mutex_unlock(&f->fifo_lock);
3625 static int get_input_packet(InputFile *f, AVPacket *pkt)
3628 if (nb_input_files > 1)
3629 return get_input_packet_mt(f, pkt);
3631 return av_read_frame(f->ctx, pkt);
3635 * The following code is the main loop of the file converter
3637 static int transcode(void)
3640 AVFormatContext *is, *os;
3643 int no_packet_count = 0;
3644 int64_t timer_start;
3646 ret = transcode_init();
3650 if (stdin_interaction) {
3651 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3654 timer_start = av_gettime();
3657 if ((ret = init_input_threads()) < 0)
3661 for (; received_sigterm == 0;) {
3662 int file_index, ist_index;
3664 int64_t cur_time= av_gettime();
3666 /* if 'q' pressed, exits */
3667 if (stdin_interaction)
3668 if (check_keyboard_interaction(cur_time) < 0)
3671 /* check if there's any stream where output is still needed */
3672 if (!need_output()) {
3673 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3677 /* select the stream that we must read now */
3678 file_index = select_input_file();
3679 /* if none, if is finished */
3680 if (file_index == -2) {
3684 if (file_index < 0) {
3685 if (no_packet_count) {
3686 no_packet_count = 0;
3687 for (i = 0; i < nb_input_files; i++)
3688 input_files[i]->unavailable = 0;
3692 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3696 is = input_files[file_index]->ctx;
3697 ret = get_input_packet(input_files[file_index], &pkt);
3699 if (ret == AVERROR(EAGAIN)) {
3700 input_files[file_index]->unavailable = 1;
3705 if (ret != AVERROR_EOF) {
3706 print_error(is->filename, ret);
3710 input_files[file_index]->eof_reached = 1;
3712 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3713 ist = input_streams[input_files[file_index]->ist_index + i];
3714 if (ist->decoding_needed)
3715 output_packet(ist, NULL);
3725 no_packet_count = 0;
3726 for (i = 0; i < nb_input_files; i++)
3727 input_files[i]->unavailable = 0;
3730 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3731 is->streams[pkt.stream_index]);
3733 /* the following test is needed in case new streams appear
3734 dynamically in stream : we ignore them */
3735 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3736 goto discard_packet;
3737 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3738 ist = input_streams[ist_index];
3740 goto discard_packet;
3742 if (pkt.dts != AV_NOPTS_VALUE)
3743 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3744 if (pkt.pts != AV_NOPTS_VALUE)
3745 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3747 if (pkt.pts != AV_NOPTS_VALUE)
3748 pkt.pts *= ist->ts_scale;
3749 if (pkt.dts != AV_NOPTS_VALUE)
3750 pkt.dts *= ist->ts_scale;
3753 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3754 "next_dts:%s next_dts_time:%s next_pts:%s next_pts_time:%s pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s off:%"PRId64"\n",
3755 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3756 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3757 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3758 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3759 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3760 input_files[ist->file_index]->ts_offset);
3763 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3764 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3765 int64_t delta = pkt_dts - ist->next_dts;
3766 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3767 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3768 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3769 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3770 pkt_dts+1<ist->pts){
3771 input_files[ist->file_index]->ts_offset -= delta;
3772 av_log(NULL, AV_LOG_DEBUG,
3773 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3774 delta, input_files[ist->file_index]->ts_offset);
3775 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3776 if (pkt.pts != AV_NOPTS_VALUE)
3777 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3780 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3781 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3782 pkt_dts+1<ist->pts){
3783 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3784 pkt.dts = AV_NOPTS_VALUE;
3786 if (pkt.pts != AV_NOPTS_VALUE){
3787 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3788 delta = pkt_pts - ist->next_dts;
3789 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3790 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3791 pkt_pts+1<ist->pts) {
3792 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3793 pkt.pts = AV_NOPTS_VALUE;
3799 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3800 if ((ret = output_packet(ist, &pkt)) < 0 ||
3801 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3803 av_strerror(ret, buf, sizeof(buf));
3804 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3805 ist->file_index, ist->st->index, buf);
3808 av_free_packet(&pkt);
3813 av_free_packet(&pkt);
3815 /* dump report by using the output first video and audio streams */
3816 print_report(0, timer_start, cur_time);
3819 free_input_threads();
3822 /* at the end of stream, we must flush the decoder buffers */
3823 for (i = 0; i < nb_input_streams; i++) {
3824 ist = input_streams[i];
3825 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3826 output_packet(ist, NULL);
3834 /* write the trailer if needed and close file */
3835 for (i = 0; i < nb_output_files; i++) {
3836 os = output_files[i]->ctx;
3837 av_write_trailer(os);
3840 /* dump report by using the first video and audio streams */
3841 print_report(1, timer_start, av_gettime());
3843 /* close each encoder */
3844 for (i = 0; i < nb_output_streams; i++) {
3845 ost = output_streams[i];
3846 if (ost->encoding_needed) {
3847 av_freep(&ost->st->codec->stats_in);
3848 avcodec_close(ost->st->codec);
3852 /* close each decoder */
3853 for (i = 0; i < nb_input_streams; i++) {
3854 ist = input_streams[i];
3855 if (ist->decoding_needed) {
3856 avcodec_close(ist->st->codec);
3865 free_input_threads();
3868 if (output_streams) {
3869 for (i = 0; i < nb_output_streams; i++) {
3870 ost = output_streams[i];
3872 if (ost->stream_copy)
3873 av_freep(&ost->st->codec->extradata);
3875 fclose(ost->logfile);
3876 ost->logfile = NULL;
3878 av_freep(&ost->st->codec->subtitle_header);
3879 av_free(ost->forced_kf_pts);
3880 av_dict_free(&ost->opts);
3887 static int opt_frame_crop(const char *opt, const char *arg)
3889 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3890 return AVERROR(EINVAL);
3893 static int opt_pad(const char *opt, const char *arg)
3895 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3899 static int opt_video_channel(const char *opt, const char *arg)
3901 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3902 return opt_default("channel", arg);
3905 static int opt_video_standard(const char *opt, const char *arg)
3907 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3908 return opt_default("standard", arg);
3911 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3913 audio_codec_name = arg;
3914 return parse_option(o, "codec:a", arg, options);
3917 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3919 video_codec_name = arg;
3920 return parse_option(o, "codec:v", arg, options);
3923 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3925 subtitle_codec_name = arg;
3926 return parse_option(o, "codec:s", arg, options);
3929 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3931 return parse_option(o, "codec:d", arg, options);
3934 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3936 StreamMap *m = NULL;
3937 int i, negative = 0, file_idx;
3938 int sync_file_idx = -1, sync_stream_idx = 0;
3946 map = av_strdup(arg);
3948 /* parse sync stream first, just pick first matching stream */
3949 if (sync = strchr(map, ',')) {
3951 sync_file_idx = strtol(sync + 1, &sync, 0);
3952 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3953 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3958 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3959 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3960 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3961 sync_stream_idx = i;
3964 if (i == input_files[sync_file_idx]->nb_streams) {
3965 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3966 "match any streams.\n", arg);
3972 if (map[0] == '[') {
3973 /* this mapping refers to lavfi output */
3974 const char *c = map + 1;
3975 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3976 &o->nb_stream_maps, o->nb_stream_maps + 1);
3977 m = &o->stream_maps[o->nb_stream_maps - 1];
3978 m->linklabel = av_get_token(&c, "]");
3979 if (!m->linklabel) {
3980 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3984 file_idx = strtol(map, &p, 0);
3985 if (file_idx >= nb_input_files || file_idx < 0) {
3986 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3990 /* disable some already defined maps */
3991 for (i = 0; i < o->nb_stream_maps; i++) {
3992 m = &o->stream_maps[i];
3993 if (file_idx == m->file_index &&
3994 check_stream_specifier(input_files[m->file_index]->ctx,
3995 input_files[m->file_index]->ctx->streams[m->stream_index],
3996 *p == ':' ? p + 1 : p) > 0)
4000 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
4001 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
4002 *p == ':' ? p + 1 : p) <= 0)
4004 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
4005 &o->nb_stream_maps, o->nb_stream_maps + 1);
4006 m = &o->stream_maps[o->nb_stream_maps - 1];
4008 m->file_index = file_idx;
4009 m->stream_index = i;
4011 if (sync_file_idx >= 0) {
4012 m->sync_file_index = sync_file_idx;
4013 m->sync_stream_index = sync_stream_idx;
4015 m->sync_file_index = file_idx;
4016 m->sync_stream_index = i;
4022 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
4030 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
4032 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
4033 &o->nb_attachments, o->nb_attachments + 1);
4034 o->attachments[o->nb_attachments - 1] = arg;
4038 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
4044 o->audio_channel_maps =
4045 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
4046 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
4047 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
4049 /* muted channel syntax */
4050 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
4051 if ((n == 1 || n == 3) && m->channel_idx == -1) {
4052 m->file_idx = m->stream_idx = -1;
4054 m->ofile_idx = m->ostream_idx = -1;
4059 n = sscanf(arg, "%d.%d.%d:%d.%d",
4060 &m->file_idx, &m->stream_idx, &m->channel_idx,
4061 &m->ofile_idx, &m->ostream_idx);
4063 if (n != 3 && n != 5) {
4064 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
4065 "[file.stream.channel|-1][:syncfile:syncstream]\n");
4069 if (n != 5) // only file.stream.channel specified
4070 m->ofile_idx = m->ostream_idx = -1;
4073 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
4074 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
4078 if (m->stream_idx < 0 ||
4079 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
4080 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
4081 m->file_idx, m->stream_idx);
4084 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
4085 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
4086 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
4087 m->file_idx, m->stream_idx);
4090 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
4091 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
4092 m->file_idx, m->stream_idx, m->channel_idx);
4099 * Parse a metadata specifier in arg.
4100 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
4101 * @param index for type c/p, chapter/program index is written here
4102 * @param stream_spec for type s, the stream specifier is written here
4104 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
4112 if (*(++arg) && *arg != ':') {
4113 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
4116 *stream_spec = *arg == ':' ? arg + 1 : "";
4120 if (*(++arg) == ':')
4121 *index = strtol(++arg, NULL, 0);
4124 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
4131 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4133 AVDictionary **meta_in = NULL;
4134 AVDictionary **meta_out = NULL;
4136 char type_in, type_out;
4137 const char *istream_spec = NULL, *ostream_spec = NULL;
4138 int idx_in = 0, idx_out = 0;
4140 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4141 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4144 if (type_out == 'g' || !*outspec)
4145 o->metadata_global_manual = 1;
4146 if (type_out == 's' || !*outspec)
4147 o->metadata_streams_manual = 1;
4148 if (type_out == 'c' || !*outspec)
4149 o->metadata_chapters_manual = 1;
4153 if (type_in == 'g' || type_out == 'g')
4154 o->metadata_global_manual = 1;
4155 if (type_in == 's' || type_out == 's')
4156 o->metadata_streams_manual = 1;
4157 if (type_in == 'c' || type_out == 'c')
4158 o->metadata_chapters_manual = 1;
4160 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4161 if ((index) < 0 || (index) >= (nb_elems)) {\
4162 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4167 #define SET_DICT(type, meta, context, index)\
4170 meta = &context->metadata;\
4173 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4174 meta = &context->chapters[index]->metadata;\
4177 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4178 meta = &context->programs[index]->metadata;\
4180 default: av_assert0(0);\
4183 SET_DICT(type_in, meta_in, ic, idx_in);
4184 SET_DICT(type_out, meta_out, oc, idx_out);
4186 /* for input streams choose first matching stream */
4187 if (type_in == 's') {
4188 for (i = 0; i < ic->nb_streams; i++) {
4189 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4190 meta_in = &ic->streams[i]->metadata;
4196 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4201 if (type_out == 's') {
4202 for (i = 0; i < oc->nb_streams; i++) {
4203 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4204 meta_out = &oc->streams[i]->metadata;
4205 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4210 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4215 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4218 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4219 struct tm time = *gmtime((time_t*)&recording_timestamp);
4220 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4221 parse_option(o, "metadata", buf, options);
4223 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4224 "tag instead.\n", opt);
4228 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4230 const char *codec_string = encoder ? "encoder" : "decoder";
4234 avcodec_find_encoder_by_name(name) :
4235 avcodec_find_decoder_by_name(name);
4237 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4240 if (codec->type != type) {
4241 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4247 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4249 char *codec_name = NULL;
4251 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4253 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4254 st->codec->codec_id = codec->id;
4257 return avcodec_find_decoder(st->codec->codec_id);
4261 * Add all the streams from the given input file to the global
4262 * list of input streams.
4264 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4267 char *next, *codec_tag = NULL;
4269 for (i = 0; i < ic->nb_streams; i++) {
4270 AVStream *st = ic->streams[i];
4271 AVCodecContext *dec = st->codec;
4272 InputStream *ist = av_mallocz(sizeof(*ist));
4273 char *framerate = NULL;
4278 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4279 input_streams[nb_input_streams - 1] = ist;
4282 ist->file_index = nb_input_files;
4284 st->discard = AVDISCARD_ALL;
4285 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
4287 ist->ts_scale = 1.0;
4288 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4290 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4292 uint32_t tag = strtol(codec_tag, &next, 0);
4294 tag = AV_RL32(codec_tag);
4295 st->codec->codec_tag = tag;
4298 ist->dec = choose_decoder(o, ic, st);
4300 switch (dec->codec_type) {
4301 case AVMEDIA_TYPE_VIDEO:
4303 ist->dec = avcodec_find_decoder(dec->codec_id);
4305 dec->flags |= CODEC_FLAG_EMU_EDGE;
4308 ist->resample_height = dec->height;
4309 ist->resample_width = dec->width;
4310 ist->resample_pix_fmt = dec->pix_fmt;
4312 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4313 if (framerate && av_parse_video_rate(&ist->framerate,
4315 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4320 ist->top_field_first = -1;
4321 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4324 case AVMEDIA_TYPE_AUDIO:
4325 guess_input_channel_layout(ist);
4327 ist->resample_sample_fmt = dec->sample_fmt;
4328 ist->resample_sample_rate = dec->sample_rate;
4329 ist->resample_channels = dec->channels;
4330 ist->resample_channel_layout = dec->channel_layout;
4333 case AVMEDIA_TYPE_DATA:
4334 case AVMEDIA_TYPE_SUBTITLE:
4336 ist->dec = avcodec_find_decoder(dec->codec_id);
4338 case AVMEDIA_TYPE_ATTACHMENT:
4339 case AVMEDIA_TYPE_UNKNOWN:
4347 static void assert_file_overwrite(const char *filename)
4349 if ((!file_overwrite || no_file_overwrite) &&
4350 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4351 av_strstart(filename, "file:", NULL))) {
4352 if (avio_check(filename, 0) == 0) {
4353 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
4354 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4357 signal(SIGINT, SIG_DFL);
4358 if (!read_yesno()) {
4359 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4365 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4372 static void dump_attachment(AVStream *st, const char *filename)
4375 AVIOContext *out = NULL;
4376 AVDictionaryEntry *e;
4378 if (!st->codec->extradata_size) {
4379 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4380 nb_input_files - 1, st->index);
4383 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4384 filename = e->value;
4386 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4387 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4391 assert_file_overwrite(filename);
4393 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4394 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4399 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4404 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4406 AVFormatContext *ic;
4407 AVInputFormat *file_iformat = NULL;
4411 AVDictionary **opts;
4412 int orig_nb_streams; // number of streams before avformat_find_stream_info
4415 if (!(file_iformat = av_find_input_format(o->format))) {
4416 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4421 if (!strcmp(filename, "-"))
4424 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
4425 strcmp(filename, "/dev/stdin");
4427 /* get default parameters from command line */
4428 ic = avformat_alloc_context();
4430 print_error(filename, AVERROR(ENOMEM));
4433 if (o->nb_audio_sample_rate) {
4434 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4435 av_dict_set(&format_opts, "sample_rate", buf, 0);
4437 if (o->nb_audio_channels) {
4438 /* because we set audio_channels based on both the "ac" and
4439 * "channel_layout" options, we need to check that the specified
4440 * demuxer actually has the "channels" option before setting it */
4441 if (file_iformat && file_iformat->priv_class &&
4442 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4443 AV_OPT_SEARCH_FAKE_OBJ)) {
4444 snprintf(buf, sizeof(buf), "%d",
4445 o->audio_channels[o->nb_audio_channels - 1].u.i);
4446 av_dict_set(&format_opts, "channels", buf, 0);
4449 if (o->nb_frame_rates) {
4450 /* set the format-level framerate option;
4451 * this is important for video grabbers, e.g. x11 */
4452 if (file_iformat && file_iformat->priv_class &&
4453 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4454 AV_OPT_SEARCH_FAKE_OBJ)) {
4455 av_dict_set(&format_opts, "framerate",
4456 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4459 if (o->nb_frame_sizes) {
4460 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4462 if (o->nb_frame_pix_fmts)
4463 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4465 ic->video_codec_id = video_codec_name ?
4466 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4467 ic->audio_codec_id = audio_codec_name ?
4468 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4469 ic->subtitle_codec_id= subtitle_codec_name ?
4470 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4471 ic->flags |= AVFMT_FLAG_NONBLOCK;
4472 ic->interrupt_callback = int_cb;
4474 /* open the input file with generic avformat function */
4475 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4477 print_error(filename, err);
4480 assert_avoptions(format_opts);
4482 /* apply forced codec ids */
4483 for (i = 0; i < ic->nb_streams; i++)
4484 choose_decoder(o, ic, ic->streams[i]);
4486 /* Set AVCodecContext options for avformat_find_stream_info */
4487 opts = setup_find_stream_info_opts(ic, codec_opts);
4488 orig_nb_streams = ic->nb_streams;
4490 /* If not enough info to get the stream parameters, we decode the
4491 first frames to get it. (used in mpeg case for example) */
4492 ret = avformat_find_stream_info(ic, opts);
4494 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4495 avformat_close_input(&ic);
4499 timestamp = o->start_time;
4500 /* add the stream start time */
4501 if (ic->start_time != AV_NOPTS_VALUE)
4502 timestamp += ic->start_time;
4504 /* if seeking requested, we execute it */
4505 if (o->start_time != 0) {
4506 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4508 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4509 filename, (double)timestamp / AV_TIME_BASE);
4513 /* update the current parameters so that they match the one of the input stream */
4514 add_input_streams(o, ic);
4516 /* dump the file content */
4517 av_dump_format(ic, nb_input_files, filename, 0);
4519 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4520 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4523 input_files[nb_input_files - 1]->ctx = ic;
4524 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4525 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4526 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4527 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4529 for (i = 0; i < o->nb_dump_attachment; i++) {
4532 for (j = 0; j < ic->nb_streams; j++) {
4533 AVStream *st = ic->streams[j];
4535 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4536 dump_attachment(st, o->dump_attachment[i].u.str);
4540 for (i = 0; i < orig_nb_streams; i++)
4541 av_dict_free(&opts[i]);
4544 reset_options(o, 1);
4548 static uint8_t *get_line(AVIOContext *s)
4554 if (avio_open_dyn_buf(&line) < 0) {
4555 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4559 while ((c = avio_r8(s)) && c != '\n')
4562 avio_close_dyn_buf(line, &buf);
4567 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4570 char filename[1000];
4571 const char *base[3] = { getenv("AVCONV_DATADIR"),
4576 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4580 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4581 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4582 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4585 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4586 i != 1 ? "" : "/.avconv", preset_name);
4587 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4593 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4595 char *codec_name = NULL;
4597 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4599 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4600 NULL, ost->st->codec->codec_type);
4601 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4602 } else if (!strcmp(codec_name, "copy"))
4603 ost->stream_copy = 1;
4605 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4606 ost->st->codec->codec_id = ost->enc->id;
4610 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4613 AVStream *st = avformat_new_stream(oc, NULL);
4614 int idx = oc->nb_streams - 1, ret = 0;
4615 char *bsf = NULL, *next, *codec_tag = NULL;
4616 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4618 char *buf = NULL, *arg = NULL, *preset = NULL;
4619 AVIOContext *s = NULL;
4622 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4626 if (oc->nb_streams - 1 < o->nb_streamid_map)
4627 st->id = o->streamid_map[oc->nb_streams - 1];
4629 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4630 nb_output_streams + 1);
4631 if (!(ost = av_mallocz(sizeof(*ost))))
4633 output_streams[nb_output_streams - 1] = ost;
4635 ost->file_index = nb_output_files;
4638 st->codec->codec_type = type;
4639 choose_encoder(o, oc, ost);
4641 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st, ost->enc);
4644 avcodec_get_context_defaults3(st->codec, ost->enc);
4645 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4647 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4648 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4651 if (!buf[0] || buf[0] == '#') {
4655 if (!(arg = strchr(buf, '='))) {
4656 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4660 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4662 } while (!s->eof_reached);
4666 av_log(NULL, AV_LOG_FATAL,
4667 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4668 preset, ost->file_index, ost->index);
4672 ost->max_frames = INT64_MAX;
4673 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4675 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4677 if (next = strchr(bsf, ','))
4679 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4680 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4684 bsfc_prev->next = bsfc;
4686 ost->bitstream_filters = bsfc;
4692 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4694 uint32_t tag = strtol(codec_tag, &next, 0);
4696 tag = AV_RL32(codec_tag);
4697 st->codec->codec_tag = tag;
4700 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4701 if (qscale >= 0 || same_quant) {
4702 st->codec->flags |= CODEC_FLAG_QSCALE;
4703 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4706 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4707 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4709 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4710 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4711 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4713 ost->source_index = source_index;
4714 if (source_index >= 0) {
4715 ost->sync_ist = input_streams[source_index];
4716 input_streams[source_index]->discard = 0;
4717 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4723 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4726 const char *p = str;
4733 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4740 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4744 AVCodecContext *video_enc;
4745 char *frame_rate = NULL;
4747 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4749 video_enc = st->codec;
4751 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4752 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4753 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4757 if (!ost->stream_copy) {
4758 const char *p = NULL;
4759 char *frame_size = NULL;
4760 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4761 char *intra_matrix = NULL, *inter_matrix = NULL;
4762 const char *filters = "null";
4765 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4766 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4767 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4771 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4772 if (frame_aspect_ratio) {
4774 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4775 q.num <= 0 || q.den <= 0) {
4776 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4779 ost->frame_aspect_ratio = av_q2d(q);
4782 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4783 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4784 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4785 ost->keep_pix_fmt = 1;
4786 if (!*++frame_pix_fmt)
4787 frame_pix_fmt = NULL;
4789 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4790 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4793 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4796 video_enc->gop_size = 0;
4797 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4799 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4800 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4803 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4805 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4807 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4808 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4811 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4814 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4815 for (i = 0; p; i++) {
4817 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4819 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4822 /* FIXME realloc failure */
4823 video_enc->rc_override =
4824 av_realloc(video_enc->rc_override,
4825 sizeof(RcOverride) * (i + 1));
4826 video_enc->rc_override[i].start_frame = start;
4827 video_enc->rc_override[i].end_frame = end;
4829 video_enc->rc_override[i].qscale = q;
4830 video_enc->rc_override[i].quality_factor = 1.0;
4833 video_enc->rc_override[i].qscale = 0;
4834 video_enc->rc_override[i].quality_factor = -q/100.0;
4839 video_enc->rc_override_count = i;
4840 if (!video_enc->rc_initial_buffer_occupancy)
4841 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4842 video_enc->intra_dc_precision = intra_dc_precision - 8;
4845 video_enc->flags|= CODEC_FLAG_PSNR;
4850 video_enc->flags |= CODEC_FLAG_PASS1;
4853 video_enc->flags |= CODEC_FLAG_PASS2;
4857 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
4858 if (ost->forced_keyframes)
4859 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
4861 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4863 ost->top_field_first = -1;
4864 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4866 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4867 ost->avfilter = av_strdup(filters);
4869 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4875 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4880 AVCodecContext *audio_enc;
4882 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4885 audio_enc = st->codec;
4886 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4888 if (!ost->stream_copy) {
4889 char *sample_fmt = NULL;
4890 const char *filters = "anull";
4892 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4894 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4896 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4897 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4901 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4903 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4905 av_assert1(filters);
4906 ost->avfilter = av_strdup(filters);
4908 /* check for channel mapping for this audio stream */
4909 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4910 AudioChannelMap *map = &o->audio_channel_maps[n];
4911 InputStream *ist = input_streams[ost->source_index];
4912 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4913 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4914 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4915 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4916 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4918 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4919 ost->file_index, ost->st->index);
4927 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4931 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4932 if (!ost->stream_copy) {
4933 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4940 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4942 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4943 ost->stream_copy = 1;
4947 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4951 AVCodecContext *subtitle_enc;
4953 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4955 subtitle_enc = st->codec;
4957 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4959 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4964 /* arg format is "output-stream-index:streamid-value". */
4965 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4971 av_strlcpy(idx_str, arg, sizeof(idx_str));
4972 p = strchr(idx_str, ':');
4974 av_log(NULL, AV_LOG_FATAL,
4975 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4980 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4981 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4982 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4986 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4988 AVFormatContext *is = ifile->ctx;
4989 AVFormatContext *os = ofile->ctx;
4992 for (i = 0; i < is->nb_chapters; i++) {
4993 AVChapter *in_ch = is->chapters[i], *out_ch;
4994 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4995 AV_TIME_BASE_Q, in_ch->time_base);
4996 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4997 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
5000 if (in_ch->end < ts_off)
5002 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
5005 out_ch = av_mallocz(sizeof(AVChapter));
5007 return AVERROR(ENOMEM);
5009 out_ch->id = in_ch->id;
5010 out_ch->time_base = in_ch->time_base;
5011 out_ch->start = FFMAX(0, in_ch->start - ts_off);
5012 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
5015 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
5018 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
5020 return AVERROR(ENOMEM);
5021 os->chapters[os->nb_chapters - 1] = out_ch;
5026 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
5029 AVFormatContext *ic = avformat_alloc_context();
5031 ic->interrupt_callback = int_cb;
5032 err = avformat_open_input(&ic, filename, NULL, NULL);
5035 /* copy stream format */
5036 for(i=0;i<ic->nb_streams;i++) {
5040 AVCodecContext *avctx;
5042 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
5043 ost = new_output_stream(o, s, codec->type, -1);
5048 // FIXME: a more elegant solution is needed
5049 memcpy(st, ic->streams[i], sizeof(AVStream));
5051 st->info = av_malloc(sizeof(*st->info));
5052 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
5054 avcodec_copy_context(st->codec, ic->streams[i]->codec);
5056 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
5057 choose_sample_fmt(st, codec);
5058 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
5059 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
5062 avformat_close_input(&ic);
5066 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
5067 AVFormatContext *oc)
5071 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5072 ofilter->out_tmp->pad_idx)) {
5073 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
5074 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
5076 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
5081 ost->source_index = -1;
5082 ost->filter = ofilter;
5086 if (ost->stream_copy) {
5087 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
5088 "which is fed from a complex filtergraph. Filtering and streamcopy "
5089 "cannot be used together.\n", ost->file_index, ost->index);
5092 if (o->recording_time != INT64_MAX)
5093 av_log(NULL, AV_LOG_WARNING,
5094 "-t does not work with -filter_complex (yet).\n");
5096 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
5097 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
5100 avfilter_inout_free(&ofilter->out_tmp);
5103 static void opt_output_file(void *optctx, const char *filename)
5105 OptionsContext *o = optctx;
5106 AVFormatContext *oc;
5108 AVOutputFormat *file_oformat;
5112 if (configure_complex_filters() < 0) {
5113 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
5117 if (!strcmp(filename, "-"))
5120 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
5122 print_error(filename, err);
5125 file_oformat= oc->oformat;
5126 oc->interrupt_callback = int_cb;
5128 /* create streams for all unlabeled output pads */
5129 for (i = 0; i < nb_filtergraphs; i++) {
5130 FilterGraph *fg = filtergraphs[i];
5131 for (j = 0; j < fg->nb_outputs; j++) {
5132 OutputFilter *ofilter = fg->outputs[j];
5134 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5137 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5138 ofilter->out_tmp->pad_idx)) {
5139 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5140 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5141 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5143 init_output_filter(ofilter, o, oc);
5147 if (!strcmp(file_oformat->name, "ffm") &&
5148 av_strstart(filename, "http:", NULL)) {
5150 /* special case for files sent to ffserver: we get the stream
5151 parameters from ffserver */
5152 int err = read_ffserver_streams(o, oc, filename);
5154 print_error(filename, err);
5157 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5158 ost = output_streams[j];
5159 for (i = 0; i < nb_input_streams; i++) {
5160 ist = input_streams[i];
5161 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5163 ost->source_index= i;
5164 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
5165 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
5167 ist->st->discard = AVDISCARD_NONE;
5172 av_log(NULL, AV_LOG_FATAL, "Missing %s stream which is required by this ffm\n", av_get_media_type_string(ost->st->codec->codec_type));
5176 } else if (!o->nb_stream_maps) {
5177 /* pick the "best" stream of each type */
5179 /* video: highest resolution */
5180 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5181 int area = 0, idx = -1;
5182 for (i = 0; i < nb_input_streams; i++) {
5183 ist = input_streams[i];
5184 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5185 ist->st->codec->width * ist->st->codec->height > area) {
5186 area = ist->st->codec->width * ist->st->codec->height;
5191 new_video_stream(o, oc, idx);
5194 /* audio: most channels */
5195 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5196 int channels = 0, idx = -1;
5197 for (i = 0; i < nb_input_streams; i++) {
5198 ist = input_streams[i];
5199 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5200 ist->st->codec->channels > channels) {
5201 channels = ist->st->codec->channels;
5206 new_audio_stream(o, oc, idx);
5209 /* subtitles: pick first */
5210 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5211 for (i = 0; i < nb_input_streams; i++)
5212 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5213 new_subtitle_stream(o, oc, i);
5217 /* do something with data? */
5219 for (i = 0; i < o->nb_stream_maps; i++) {
5220 StreamMap *map = &o->stream_maps[i];
5221 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5226 if (map->linklabel) {
5228 OutputFilter *ofilter = NULL;
5231 for (j = 0; j < nb_filtergraphs; j++) {
5232 fg = filtergraphs[j];
5233 for (k = 0; k < fg->nb_outputs; k++) {
5234 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5235 if (out && !strcmp(out->name, map->linklabel)) {
5236 ofilter = fg->outputs[k];
5243 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5244 "in any defined filter graph.\n", map->linklabel);
5247 init_output_filter(ofilter, o, oc);
5249 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5250 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5252 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5254 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5256 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5259 switch (ist->st->codec->codec_type) {
5260 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5261 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5262 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5263 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5264 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5266 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5267 map->file_index, map->stream_index);
5275 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5276 AVDictionaryEntry *e;
5277 ost = output_streams[i];
5279 if ( ost->stream_copy
5280 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5281 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5282 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5286 /* handle attached files */
5287 for (i = 0; i < o->nb_attachments; i++) {
5289 uint8_t *attachment;
5293 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5294 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5298 if ((len = avio_size(pb)) <= 0) {
5299 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5303 if (!(attachment = av_malloc(len))) {
5304 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5308 avio_read(pb, attachment, len);
5310 ost = new_attachment_stream(o, oc, -1);
5311 ost->stream_copy = 0;
5312 ost->attachment_filename = o->attachments[i];
5313 ost->st->codec->extradata = attachment;
5314 ost->st->codec->extradata_size = len;
5316 p = strrchr(o->attachments[i], '/');
5317 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5321 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5322 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5325 output_files[nb_output_files - 1]->ctx = oc;
5326 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5327 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5328 if (o->recording_time != INT64_MAX)
5329 oc->duration = o->recording_time;
5330 output_files[nb_output_files - 1]->start_time = o->start_time;
5331 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5332 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5334 /* check filename in case of an image number is expected */
5335 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5336 if (!av_filename_number_test(oc->filename)) {
5337 print_error(oc->filename, AVERROR(EINVAL));
5342 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5343 /* test if it already exists to avoid losing precious files */
5344 assert_file_overwrite(filename);
5347 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5348 &oc->interrupt_callback,
5349 &output_files[nb_output_files - 1]->opts)) < 0) {
5350 print_error(filename, err);
5355 if (o->mux_preload) {
5357 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5358 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5360 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5363 for (i = 0; i < o->nb_metadata_map; i++) {
5365 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5367 if (in_file_index >= nb_input_files) {
5368 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5371 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5375 if (o->chapters_input_file >= nb_input_files) {
5376 if (o->chapters_input_file == INT_MAX) {
5377 /* copy chapters from the first input file that has them*/
5378 o->chapters_input_file = -1;
5379 for (i = 0; i < nb_input_files; i++)
5380 if (input_files[i]->ctx->nb_chapters) {
5381 o->chapters_input_file = i;
5385 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5386 o->chapters_input_file);
5390 if (o->chapters_input_file >= 0)
5391 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5392 !o->metadata_chapters_manual);
5394 /* copy global metadata by default */
5395 if (!o->metadata_global_manual && nb_input_files){
5396 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5397 AV_DICT_DONT_OVERWRITE);
5398 if(o->recording_time != INT64_MAX)
5399 av_dict_set(&oc->metadata, "duration", NULL, 0);
5400 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
5402 if (!o->metadata_streams_manual)
5403 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5405 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5407 ist = input_streams[output_streams[i]->source_index];
5408 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5411 /* process manually set metadata */
5412 for (i = 0; i < o->nb_metadata; i++) {
5415 const char *stream_spec;
5416 int index = 0, j, ret = 0;
5418 val = strchr(o->metadata[i].u.str, '=');
5420 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5421 o->metadata[i].u.str);
5426 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5428 for (j = 0; j < oc->nb_streams; j++) {
5429 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5430 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5441 if (index < 0 || index >= oc->nb_chapters) {
5442 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5445 m = &oc->chapters[index]->metadata;
5448 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5451 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5455 reset_options(o, 0);
5458 /* same option as mencoder */
5459 static int opt_pass(const char *opt, const char *arg)
5461 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5465 static int64_t getmaxrss(void)
5467 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5468 struct rusage rusage;
5469 getrusage(RUSAGE_SELF, &rusage);
5470 return (int64_t)rusage.ru_maxrss * 1024;
5471 #elif HAVE_GETPROCESSMEMORYINFO
5473 PROCESS_MEMORY_COUNTERS memcounters;
5474 proc = GetCurrentProcess();
5475 memcounters.cb = sizeof(memcounters);
5476 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5477 return memcounters.PeakPagefileUsage;
5483 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5485 return parse_option(o, "q:a", arg, options);
5488 static void show_usage(void)
5490 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5491 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5492 av_log(NULL, AV_LOG_INFO, "\n");
5495 static int opt_help(const char *opt, const char *arg)
5497 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5498 av_log_set_callback(log_callback_help);
5500 show_help_options(options, "Main options:\n",
5501 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5502 show_help_options(options, "\nAdvanced options:\n",
5503 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5505 show_help_options(options, "\nVideo options:\n",
5506 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5508 show_help_options(options, "\nAdvanced Video options:\n",
5509 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5510 OPT_VIDEO | OPT_EXPERT);
5511 show_help_options(options, "\nAudio options:\n",
5512 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5514 show_help_options(options, "\nAdvanced Audio options:\n",
5515 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5516 OPT_AUDIO | OPT_EXPERT);
5517 show_help_options(options, "\nSubtitle options:\n",
5518 OPT_SUBTITLE | OPT_GRAB,
5520 show_help_options(options, "\nAudio/Video grab options:\n",
5524 show_help_children(avcodec_get_class(), flags);
5525 show_help_children(avformat_get_class(), flags);
5526 show_help_children(sws_get_class(), flags);
5527 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
5532 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5534 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5535 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5537 if (!strncmp(arg, "pal-", 4)) {
5540 } else if (!strncmp(arg, "ntsc-", 5)) {
5543 } else if (!strncmp(arg, "film-", 5)) {
5547 /* Try to determine PAL/NTSC by peeking in the input files */
5548 if (nb_input_files) {
5550 for (j = 0; j < nb_input_files; j++) {
5551 for (i = 0; i < input_files[j]->nb_streams; i++) {
5552 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5553 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5555 fr = c->time_base.den * 1000 / c->time_base.num;
5559 } else if ((fr == 29970) || (fr == 23976)) {
5564 if (norm != UNKNOWN)
5568 if (norm != UNKNOWN)
5569 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5572 if (norm == UNKNOWN) {
5573 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5574 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5575 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5579 if (!strcmp(arg, "vcd")) {
5580 opt_video_codec(o, "c:v", "mpeg1video");
5581 opt_audio_codec(o, "c:a", "mp2");
5582 parse_option(o, "f", "vcd", options);
5584 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5585 parse_option(o, "r", frame_rates[norm], options);
5586 opt_default("g", norm == PAL ? "15" : "18");
5588 opt_default("b:v", "1150000");
5589 opt_default("maxrate", "1150000");
5590 opt_default("minrate", "1150000");
5591 opt_default("bufsize", "327680"); // 40*1024*8;
5593 opt_default("b:a", "224000");
5594 parse_option(o, "ar", "44100", options);
5595 parse_option(o, "ac", "2", options);
5597 opt_default("packetsize", "2324");
5598 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5600 /* We have to offset the PTS, so that it is consistent with the SCR.
5601 SCR starts at 36000, but the first two packs contain only padding
5602 and the first pack from the other stream, respectively, may also have
5603 been written before.
5604 So the real data starts at SCR 36000+3*1200. */
5605 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5606 } else if (!strcmp(arg, "svcd")) {
5608 opt_video_codec(o, "c:v", "mpeg2video");
5609 opt_audio_codec(o, "c:a", "mp2");
5610 parse_option(o, "f", "svcd", options);
5612 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5613 parse_option(o, "r", frame_rates[norm], options);
5614 parse_option(o, "pix_fmt", "yuv420p", options);
5615 opt_default("g", norm == PAL ? "15" : "18");
5617 opt_default("b:v", "2040000");
5618 opt_default("maxrate", "2516000");
5619 opt_default("minrate", "0"); // 1145000;
5620 opt_default("bufsize", "1835008"); // 224*1024*8;
5621 opt_default("scan_offset", "1");
5624 opt_default("b:a", "224000");
5625 parse_option(o, "ar", "44100", options);
5627 opt_default("packetsize", "2324");
5629 } else if (!strcmp(arg, "dvd")) {
5631 opt_video_codec(o, "c:v", "mpeg2video");
5632 opt_audio_codec(o, "c:a", "ac3");
5633 parse_option(o, "f", "dvd", options);
5635 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5636 parse_option(o, "r", frame_rates[norm], options);
5637 parse_option(o, "pix_fmt", "yuv420p", options);
5638 opt_default("g", norm == PAL ? "15" : "18");
5640 opt_default("b:v", "6000000");
5641 opt_default("maxrate", "9000000");
5642 opt_default("minrate", "0"); // 1500000;
5643 opt_default("bufsize", "1835008"); // 224*1024*8;
5645 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5646 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5648 opt_default("b:a", "448000");
5649 parse_option(o, "ar", "48000", options);
5651 } else if (!strncmp(arg, "dv", 2)) {
5653 parse_option(o, "f", "dv", options);
5655 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5656 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5657 norm == PAL ? "yuv420p" : "yuv411p", options);
5658 parse_option(o, "r", frame_rates[norm], options);
5660 parse_option(o, "ar", "48000", options);
5661 parse_option(o, "ac", "2", options);
5664 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5665 return AVERROR(EINVAL);
5670 static int opt_vstats_file(const char *opt, const char *arg)
5672 av_free (vstats_filename);
5673 vstats_filename = av_strdup (arg);
5677 static int opt_vstats(const char *opt, const char *arg)
5680 time_t today2 = time(NULL);
5681 struct tm *today = localtime(&today2);
5683 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5685 return opt_vstats_file(opt, filename);
5688 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5690 return parse_option(o, "frames:v", arg, options);
5693 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5695 return parse_option(o, "frames:a", arg, options);
5698 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5700 return parse_option(o, "frames:d", arg, options);
5703 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5706 char filename[1000], line[1000], tmp_line[1000];
5707 const char *codec_name = *opt == 'v' ? video_codec_name :
5708 *opt == 'a' ? audio_codec_name :
5709 subtitle_codec_name;
5711 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5712 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5713 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5715 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5719 while (fgets(line, sizeof(line), f)) {
5720 char *key = tmp_line, *value, *endptr;
5722 if (strcspn(line, "#\n\r") == 0)
5724 strcpy(tmp_line, line);
5725 if (!av_strtok(key, "=", &value) ||
5726 !av_strtok(value, "\r\n", &endptr)) {
5727 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5730 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5732 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5733 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5734 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5735 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5736 else if (opt_default(key, value) < 0) {
5737 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5738 filename, line, key, value);
5748 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5752 static int opt_passlogfile(const char *opt, const char *arg)
5754 pass_logfilename_prefix = arg;
5755 #if CONFIG_LIBX264_ENCODER
5756 return opt_default(opt, arg);
5762 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5764 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5765 int ret = parse_option(o, s, arg, options);
5770 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5772 if(!strcmp(opt, "b")){
5773 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5774 return parse_option(o, "b:v", arg, options);
5776 return opt_default(opt, arg);
5779 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5783 if(!strcmp(opt, "qscale")){
5784 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5785 return parse_option(o, "q:v", arg, options);
5787 s = av_asprintf("q%s", opt + 6);
5788 ret = parse_option(o, s, arg, options);
5793 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5795 if(!strcmp(opt, "profile")){
5796 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5797 return parse_option(o, "profile:v", arg, options);
5799 return opt_default(opt, arg);
5802 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5804 return parse_option(o, "filter:v", arg, options);
5807 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5809 return parse_option(o, "filter:a", arg, options);
5812 static int opt_vsync(const char *opt, const char *arg)
5814 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5815 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5816 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5817 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5819 if (video_sync_method == VSYNC_AUTO)
5820 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5824 static int opt_deinterlace(const char *opt, const char *arg)
5826 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5831 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5833 char *tcr = av_asprintf("timecode=%s", arg);
5834 int ret = parse_option(o, "metadata:g", tcr, options);
5836 ret = opt_default("gop_timecode", arg);
5841 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5843 int idx = locate_option(argc, argv, options, "cpuflags");
5844 if (idx && argv[idx + 1])
5845 opt_cpuflags("cpuflags", argv[idx + 1]);
5848 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5850 char layout_str[32];
5853 int ret, channels, ac_str_size;
5856 layout = av_get_channel_layout(arg);
5858 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5859 return AVERROR(EINVAL);
5861 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5862 ret = opt_default(opt, layout_str);
5866 /* set 'ac' option based on channel layout */
5867 channels = av_get_channel_layout_nb_channels(layout);
5868 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5869 stream_str = strchr(opt, ':');
5870 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5871 ac_str = av_mallocz(ac_str_size);
5873 return AVERROR(ENOMEM);
5874 av_strlcpy(ac_str, "ac", 3);
5876 av_strlcat(ac_str, stream_str, ac_str_size);
5877 ret = parse_option(o, ac_str, layout_str, options);
5883 static int opt_filter_complex(const char *opt, const char *arg)
5885 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5886 &nb_filtergraphs, nb_filtergraphs + 1);
5887 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5888 return AVERROR(ENOMEM);
5889 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5890 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5894 static int opt_progress(const char *opt, const char *arg)
5896 AVIOContext *avio = NULL;
5899 if (!strcmp(arg, "-"))
5901 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
5903 av_log(0, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
5904 arg, av_err2str(ret));
5907 progress_avio = avio;
5911 #define OFFSET(x) offsetof(OptionsContext, x)
5912 static const OptionDef options[] = {
5914 #include "cmdutils_common_opts.h"
5915 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5916 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5917 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5918 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5919 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5920 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5921 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5922 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5923 { "map_channel", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_channel}, "map an audio channel from one stream to another", "file.stream.channel[:syncfile.syncstream]" },
5924 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5925 "outfile[,metadata]:infile[,metadata]" },
5926 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5927 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5928 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5929 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5930 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5931 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5932 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5933 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5934 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5935 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5936 "add timings for benchmarking" },
5937 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5938 "add timings for each task" },
5939 { "progress", HAS_ARG | OPT_EXPERT, {(void*)opt_progress},
5940 "write program-readable progress information", "url" },
5941 { "stdin", OPT_BOOL | OPT_EXPERT, {(void*)&stdin_interaction},
5942 "enable or disable interaction on standard input" },
5943 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5944 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5945 "dump each input packet" },
5946 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5947 "when dumping packets, also dump the payload" },
5948 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5949 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5950 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5951 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5952 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5953 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5954 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5955 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5956 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5957 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5958 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5959 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5960 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5961 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5962 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5963 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5964 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5965 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5966 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5967 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5968 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5969 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5970 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5973 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5974 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5975 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5976 { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
5977 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5978 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
5979 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5980 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5981 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5982 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5983 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5984 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5985 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5986 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5987 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5988 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5989 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5990 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5991 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5992 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5993 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5994 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5995 "use same quantizer as source (implies VBR)" },
5996 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
5997 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5998 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5999 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
6000 "this option is deprecated, use the yadif filter instead" },
6001 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
6002 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
6003 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
6004 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
6005 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
6006 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
6007 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
6008 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
6009 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
6010 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
6011 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
6012 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
6013 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
6014 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
6017 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
6018 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
6019 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
6020 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
6021 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
6022 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
6023 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
6024 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
6025 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
6026 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
6027 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
6029 /* subtitle options */
6030 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
6031 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
6032 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
6035 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
6036 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
6037 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
6040 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
6041 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
6043 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
6044 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
6045 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
6047 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
6048 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
6049 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
6050 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
6051 /* data codec support */
6052 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
6053 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
6055 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
6059 int main(int argc, char **argv)
6061 OptionsContext o = { 0 };
6064 reset_options(&o, 0);
6066 av_log_set_flags(AV_LOG_SKIP_REPEATED);
6067 parse_loglevel(argc, argv, options);
6069 if(argc>1 && !strcmp(argv[1], "-d")){
6071 av_log_set_callback(log_callback_null);
6076 avcodec_register_all();
6078 avdevice_register_all();
6080 avfilter_register_all();
6082 avformat_network_init();
6084 show_banner(argc, argv, options);
6088 parse_cpuflags(argc, argv, options);
6091 parse_options(&o, argc, argv, options, opt_output_file);
6093 if (nb_output_files <= 0 && nb_input_files == 0) {
6095 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
6099 /* file converter / grab */
6100 if (nb_output_files <= 0) {
6101 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
6105 if (nb_input_files == 0) {
6106 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
6110 current_time = ti = getutime();
6111 if (transcode() < 0)
6113 ti = getutime() - ti;
6115 int maxrss = getmaxrss() / 1024;
6116 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);