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 ist_index; /* index of first stream in input_streams */
267 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
268 from ctx.nb_streams if new streams appear during av_read_frame() */
272 pthread_t thread; /* thread reading from this file */
273 int finished; /* the thread has exited */
274 int joined; /* the thread has been joined */
275 pthread_mutex_t fifo_lock; /* lock for access to fifo */
276 pthread_cond_t fifo_cond; /* the main thread will signal on this cond after reading from fifo */
277 AVFifoBuffer *fifo; /* demuxed packets are stored here; freed by the main thread */
281 typedef struct OutputStream {
282 int file_index; /* file index */
283 int index; /* stream index in the output file */
284 int source_index; /* InputStream index */
285 AVStream *st; /* stream in the output file */
286 int encoding_needed; /* true if encoding needed for this stream */
288 /* input pts and corresponding output pts
290 struct InputStream *sync_ist; /* input stream to sync against */
291 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
292 /* pts of the first frame encoded for this stream, used for limiting
295 AVBitStreamFilterContext *bitstream_filters;
298 AVFrame *filtered_frame;
301 AVRational frame_rate;
305 float frame_aspect_ratio;
308 /* forced key frames */
309 int64_t *forced_kf_pts;
312 char *forced_keyframes;
315 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
316 int audio_channels_mapped; /* number of channels in audio_channels_map */
320 OutputFilter *filter;
324 int64_t swr_dither_method;
325 double swr_dither_scale;
327 int is_past_recording_time;
329 const char *attachment_filename;
330 int copy_initial_nonkeyframes;
338 /* init terminal so that we can grab keys */
339 static struct termios oldtty;
340 static int restore_tty;
343 typedef struct OutputFile {
344 AVFormatContext *ctx;
346 int ost_index; /* index of the first stream in output_streams */
347 int64_t recording_time; /* desired length of the resulting file in microseconds */
348 int64_t start_time; /* start time in microseconds */
349 uint64_t limit_filesize; /* filesize limit expressed in bytes */
352 static InputStream **input_streams = NULL;
353 static int nb_input_streams = 0;
354 static InputFile **input_files = NULL;
355 static int nb_input_files = 0;
357 static OutputStream **output_streams = NULL;
358 static int nb_output_streams = 0;
359 static OutputFile **output_files = NULL;
360 static int nb_output_files = 0;
362 static FilterGraph **filtergraphs;
365 typedef struct OptionsContext {
366 /* input/output options */
370 SpecifierOpt *codec_names;
372 SpecifierOpt *audio_channels;
373 int nb_audio_channels;
374 SpecifierOpt *audio_sample_rate;
375 int nb_audio_sample_rate;
376 SpecifierOpt *frame_rates;
378 SpecifierOpt *frame_sizes;
380 SpecifierOpt *frame_pix_fmts;
381 int nb_frame_pix_fmts;
384 int64_t input_ts_offset;
387 SpecifierOpt *ts_scale;
389 SpecifierOpt *dump_attachment;
390 int nb_dump_attachment;
393 StreamMap *stream_maps;
395 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
396 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
397 int metadata_global_manual;
398 int metadata_streams_manual;
399 int metadata_chapters_manual;
400 const char **attachments;
403 int chapters_input_file;
405 int64_t recording_time;
406 uint64_t limit_filesize;
412 int subtitle_disable;
415 /* indexed by output file stream index */
419 SpecifierOpt *metadata;
421 SpecifierOpt *max_frames;
423 SpecifierOpt *bitstream_filters;
424 int nb_bitstream_filters;
425 SpecifierOpt *codec_tags;
427 SpecifierOpt *sample_fmts;
429 SpecifierOpt *qscale;
431 SpecifierOpt *forced_key_frames;
432 int nb_forced_key_frames;
433 SpecifierOpt *force_fps;
435 SpecifierOpt *frame_aspect_ratios;
436 int nb_frame_aspect_ratios;
437 SpecifierOpt *rc_overrides;
439 SpecifierOpt *intra_matrices;
440 int nb_intra_matrices;
441 SpecifierOpt *inter_matrices;
442 int nb_inter_matrices;
443 SpecifierOpt *top_field_first;
444 int nb_top_field_first;
445 SpecifierOpt *metadata_map;
447 SpecifierOpt *presets;
449 SpecifierOpt *copy_initial_nonkeyframes;
450 int nb_copy_initial_nonkeyframes;
451 SpecifierOpt *filters;
455 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
457 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
460 for (i = 0; i < o->nb_ ## name; i++) {\
461 char *spec = o->name[i].specifier;\
462 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
463 outvar = o->name[i].u.type;\
469 static int64_t getutime(void)
472 struct rusage rusage;
474 getrusage(RUSAGE_SELF, &rusage);
475 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
476 #elif HAVE_GETPROCESSTIMES
479 proc = GetCurrentProcess();
480 GetProcessTimes(proc, &c, &e, &k, &u);
481 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
487 static void update_benchmark(const char *fmt, ...)
489 if (do_benchmark_all) {
490 int64_t t = getutime();
496 vsnprintf(buf, sizeof(buf), fmt, va);
498 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
504 static void reset_options(OptionsContext *o, int is_input)
506 const OptionDef *po = options;
507 OptionsContext bak= *o;
510 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
512 void *dst = (uint8_t*)o + po->u.off;
514 if (po->flags & OPT_SPEC) {
515 SpecifierOpt **so = dst;
516 int i, *count = (int*)(so + 1);
517 for (i = 0; i < *count; i++) {
518 av_freep(&(*so)[i].specifier);
519 if (po->flags & OPT_STRING)
520 av_freep(&(*so)[i].u.str);
524 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
529 for (i = 0; i < o->nb_stream_maps; i++)
530 av_freep(&o->stream_maps[i].linklabel);
531 av_freep(&o->stream_maps);
532 av_freep(&o->audio_channel_maps);
533 av_freep(&o->streamid_map);
535 memset(o, 0, sizeof(*o));
538 o->recording_time = bak.recording_time;
539 if (o->recording_time != INT64_MAX)
540 av_log(NULL, AV_LOG_WARNING,
541 "-t is not an input option, keeping it for the next output;"
542 " consider fixing your command line.\n");
544 o->recording_time = INT64_MAX;
545 o->mux_max_delay = 0.7;
546 o->limit_filesize = UINT64_MAX;
547 o->chapters_input_file = INT_MAX;
553 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
555 if (codec && codec->pix_fmts) {
556 const enum PixelFormat *p = codec->pix_fmts;
557 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
558 enum PixelFormat best= PIX_FMT_NONE;
559 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
560 if (st->codec->codec_id == CODEC_ID_MJPEG) {
561 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
562 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
563 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
564 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
567 for (; *p != PIX_FMT_NONE; p++) {
568 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
572 if (*p == PIX_FMT_NONE) {
573 if (target != PIX_FMT_NONE)
574 av_log(NULL, AV_LOG_WARNING,
575 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
576 av_pix_fmt_descriptors[target].name,
578 av_pix_fmt_descriptors[best].name);
585 static char *choose_pix_fmts(OutputStream *ost)
587 if (ost->keep_pix_fmt) {
589 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
590 AVFILTER_AUTO_CONVERT_NONE);
591 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
593 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
595 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
596 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
597 } else if (ost->enc && ost->enc->pix_fmts) {
598 const enum PixelFormat *p;
599 AVIOContext *s = NULL;
603 if (avio_open_dyn_buf(&s) < 0)
606 p = ost->enc->pix_fmts;
607 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
608 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
609 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
610 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
611 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
612 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
616 for (; *p != PIX_FMT_NONE; p++) {
617 const char *name = av_get_pix_fmt_name(*p);
618 avio_printf(s, "%s:", name);
620 len = avio_close_dyn_buf(s, &ret);
628 * Define a function for building a string containing a list of
631 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
632 static char *choose_ ## var ## s(OutputStream *ost) \
634 if (ost->st->codec->var != none) { \
635 get_name(ost->st->codec->var); \
636 return av_strdup(name); \
637 } else if (ost->enc->supported_list) { \
639 AVIOContext *s = NULL; \
643 if (avio_open_dyn_buf(&s) < 0) \
646 for (p = ost->enc->supported_list; *p != none; p++) { \
648 avio_printf(s, "%s" separator, name); \
650 len = avio_close_dyn_buf(s, &ret); \
657 #define GET_PIX_FMT_NAME(pix_fmt)\
658 const char *name = av_get_pix_fmt_name(pix_fmt);
660 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
661 // GET_PIX_FMT_NAME, ":")
663 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
664 const char *name = av_get_sample_fmt_name(sample_fmt)
666 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
667 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
669 #define GET_SAMPLE_RATE_NAME(rate)\
671 snprintf(name, sizeof(name), "%d", rate);
673 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
674 GET_SAMPLE_RATE_NAME, ",")
676 #define GET_CH_LAYOUT_NAME(ch_layout)\
678 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
680 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
681 GET_CH_LAYOUT_NAME, ",")
683 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
685 FilterGraph *fg = av_mallocz(sizeof(*fg));
689 fg->index = nb_filtergraphs;
691 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
693 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
695 fg->outputs[0]->ost = ost;
696 fg->outputs[0]->graph = fg;
698 ost->filter = fg->outputs[0];
700 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
702 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
704 fg->inputs[0]->ist = ist;
705 fg->inputs[0]->graph = fg;
707 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
708 &ist->nb_filters, ist->nb_filters + 1);
709 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
711 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
712 &nb_filtergraphs, nb_filtergraphs + 1);
713 filtergraphs[nb_filtergraphs - 1] = fg;
718 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
720 InputStream *ist = NULL;
721 enum AVMediaType type = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
724 // TODO: support other filter types
725 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
726 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
735 int file_idx = strtol(in->name, &p, 0);
737 if (file_idx < 0 || file_idx >= nb_input_files) {
738 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
739 file_idx, fg->graph_desc);
742 s = input_files[file_idx]->ctx;
744 for (i = 0; i < s->nb_streams; i++) {
745 if (s->streams[i]->codec->codec_type != type)
747 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
753 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
754 "matches no streams.\n", p, fg->graph_desc);
757 ist = input_streams[input_files[file_idx]->ist_index + st->index];
759 /* find the first unused stream of corresponding type */
760 for (i = 0; i < nb_input_streams; i++) {
761 ist = input_streams[i];
762 if (ist->st->codec->codec_type == type && ist->discard)
765 if (i == nb_input_streams) {
766 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
767 "unlabeled input pad %d on filter %s\n", in->pad_idx,
768 in->filter_ctx->name);
775 ist->decoding_needed = 1;
776 ist->st->discard = AVDISCARD_NONE;
778 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
779 &fg->nb_inputs, fg->nb_inputs + 1);
780 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
782 fg->inputs[fg->nb_inputs - 1]->ist = ist;
783 fg->inputs[fg->nb_inputs - 1]->graph = fg;
785 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
786 &ist->nb_filters, ist->nb_filters + 1);
787 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
790 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
793 OutputStream *ost = ofilter->ost;
794 AVCodecContext *codec = ost->st->codec;
795 AVFilterContext *last_filter = out->filter_ctx;
796 int pad_idx = out->pad_idx;
799 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
801 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
802 ret = avfilter_graph_create_filter(&ofilter->filter,
803 avfilter_get_by_name("buffersink"),
804 name, NULL, NULL/*buffersink_params*/, fg->graph);
805 av_freep(&buffersink_params);
810 if (codec->width || codec->height) {
812 AVFilterContext *filter;
814 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
817 (unsigned)ost->sws_flags);
818 snprintf(name, sizeof(name), "scaler for output stream %d:%d",
819 ost->file_index, ost->index);
820 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
821 name, args, NULL, fg->graph)) < 0)
823 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
826 last_filter = filter;
830 if ((pix_fmts = choose_pix_fmts(ost))) {
831 AVFilterContext *filter;
832 snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
833 ost->file_index, ost->index);
834 if ((ret = avfilter_graph_create_filter(&filter,
835 avfilter_get_by_name("format"),
836 "format", pix_fmts, NULL,
839 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
842 last_filter = filter;
847 if (ost->frame_rate.num && 0) {
848 AVFilterContext *fps;
851 snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
852 ost->frame_rate.den);
853 snprintf(name, sizeof(name), "fps for output stream %d:%d",
854 ost->file_index, ost->index);
855 ret = avfilter_graph_create_filter(&fps, avfilter_get_by_name("fps"),
856 name, args, NULL, fg->graph);
860 ret = avfilter_link(last_filter, pad_idx, fps, 0);
867 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
873 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
875 OutputStream *ost = ofilter->ost;
876 AVCodecContext *codec = ost->st->codec;
877 AVFilterContext *last_filter = out->filter_ctx;
878 int pad_idx = out->pad_idx;
879 char *sample_fmts, *sample_rates, *channel_layouts;
884 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
885 ret = avfilter_graph_create_filter(&ofilter->filter,
886 avfilter_get_by_name("abuffersink"),
887 name, NULL, NULL, fg->graph);
891 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
892 AVFilterContext *filt_ctx; \
894 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
895 "similarly to -af " filter_name "=%s.\n", arg); \
897 ret = avfilter_graph_create_filter(&filt_ctx, \
898 avfilter_get_by_name(filter_name), \
899 filter_name, arg, NULL, fg->graph); \
903 ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
907 last_filter = filt_ctx; \
910 if (ost->audio_channels_mapped) {
913 av_bprint_init(&pan_buf, 256, 8192);
914 av_bprintf(&pan_buf, "0x%"PRIx64,
915 av_get_default_channel_layout(ost->audio_channels_mapped));
916 for (i = 0; i < ost->audio_channels_mapped; i++)
917 if (ost->audio_channels_map[i] != -1)
918 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
920 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
921 av_bprint_finalize(&pan_buf, NULL);
924 if (codec->channels && !codec->channel_layout)
925 codec->channel_layout = av_get_default_channel_layout(codec->channels);
927 sample_fmts = choose_sample_fmts(ost);
928 sample_rates = choose_sample_rates(ost);
929 channel_layouts = choose_channel_layouts(ost);
930 if (sample_fmts || sample_rates || channel_layouts) {
931 AVFilterContext *format;
936 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
939 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
942 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
946 av_freep(&sample_fmts);
947 av_freep(&sample_rates);
948 av_freep(&channel_layouts);
950 snprintf(name, sizeof(name), "audio format for output stream %d:%d",
951 ost->file_index, ost->index);
952 ret = avfilter_graph_create_filter(&format,
953 avfilter_get_by_name("aformat"),
954 name, args, NULL, fg->graph);
958 ret = avfilter_link(last_filter, pad_idx, format, 0);
962 last_filter = format;
966 if (audio_volume != 256 && 0) {
969 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
970 AUTO_INSERT_FILTER("-vol", "volume", args);
973 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
979 #define DESCRIBE_FILTER_LINK(f, inout, in) \
981 AVFilterContext *ctx = inout->filter_ctx; \
982 AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads; \
983 int nb_pads = in ? ctx->input_count : ctx->output_count; \
986 if (avio_open_dyn_buf(&pb) < 0) \
989 avio_printf(pb, "%s", ctx->filter->name); \
991 avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));\
993 avio_close_dyn_buf(pb, &f->name); \
996 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
998 av_freep(&ofilter->name);
999 DESCRIBE_FILTER_LINK(ofilter, out, 0);
1001 switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
1002 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1003 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1004 default: av_assert0(0);
1008 static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
1011 AVFilterContext *first_filter = in->filter_ctx;
1012 AVFilter *filter = avfilter_get_by_name("buffer");
1013 InputStream *ist = ifilter->ist;
1014 AVRational tb = ist->framerate.num ? (AVRational){ist->framerate.den,
1015 ist->framerate.num} :
1017 AVRational fr = ist->framerate.num ? ist->framerate :
1018 ist->st->r_frame_rate;
1022 int pad_idx = in->pad_idx;
1025 sar = ist->st->sample_aspect_ratio.num ?
1026 ist->st->sample_aspect_ratio :
1027 ist->st->codec->sample_aspect_ratio;
1029 sar = (AVRational){0,1};
1030 av_bprint_init(&args, 0, 1);
1032 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
1033 "pixel_aspect=%d/%d:sws_param=flags=%d", ist->st->codec->width,
1034 ist->st->codec->height, ist->st->codec->pix_fmt,
1035 tb.num, tb.den, sar.num, sar.den,
1036 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
1037 if (fr.num && fr.den)
1038 av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
1039 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1040 ist->file_index, ist->st->index);
1042 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter, name,
1043 args.str, NULL, fg->graph)) < 0)
1046 if (ist->framerate.num) {
1047 AVFilterContext *setpts;
1049 snprintf(name, sizeof(name), "force CFR for input from stream %d:%d",
1050 ist->file_index, ist->st->index);
1051 if ((ret = avfilter_graph_create_filter(&setpts,
1052 avfilter_get_by_name("setpts"),
1057 if ((ret = avfilter_link(setpts, 0, first_filter, pad_idx)) < 0)
1060 first_filter = setpts;
1064 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1069 static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
1072 AVFilterContext *first_filter = in->filter_ctx;
1073 AVFilter *filter = avfilter_get_by_name("abuffer");
1074 InputStream *ist = ifilter->ist;
1075 int pad_idx = in->pad_idx;
1076 char args[255], name[255];
1079 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
1080 ":channel_layout=0x%"PRIx64,
1081 1, ist->st->codec->sample_rate,
1082 ist->st->codec->sample_rate,
1083 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1084 ist->st->codec->channel_layout);
1085 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1086 ist->file_index, ist->st->index);
1088 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
1093 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
1094 AVFilterContext *filt_ctx; \
1096 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1097 "similarly to -af " filter_name "=%s.\n", arg); \
1099 snprintf(name, sizeof(name), "graph %d %s for input stream %d:%d", \
1100 fg->index, filter_name, ist->file_index, ist->st->index); \
1101 ret = avfilter_graph_create_filter(&filt_ctx, \
1102 avfilter_get_by_name(filter_name), \
1103 name, arg, NULL, fg->graph); \
1107 ret = avfilter_link(filt_ctx, 0, first_filter, pad_idx); \
1111 first_filter = filt_ctx; \
1114 if (audio_sync_method > 0) {
1115 char args[256] = {0};
1117 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
1118 if (audio_sync_method > 1)
1119 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)ist->st->codec->sample_rate);
1120 AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
1123 // if (ost->audio_channels_mapped) {
1125 // AVBPrint pan_buf;
1126 // av_bprint_init(&pan_buf, 256, 8192);
1127 // av_bprintf(&pan_buf, "0x%"PRIx64,
1128 // av_get_default_channel_layout(ost->audio_channels_mapped));
1129 // for (i = 0; i < ost->audio_channels_mapped; i++)
1130 // if (ost->audio_channels_map[i] != -1)
1131 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
1132 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
1133 // av_bprint_finalize(&pan_buf, NULL);
1136 if (audio_volume != 256) {
1139 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
1140 AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
1142 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1148 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
1151 av_freep(&ifilter->name);
1152 DESCRIBE_FILTER_LINK(ifilter, in, 1);
1154 switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
1155 case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
1156 case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
1157 default: av_assert0(0);
1161 static int configure_filtergraph(FilterGraph *fg)
1163 AVFilterInOut *inputs, *outputs, *cur;
1164 int ret, i, init = !fg->graph, simple = !fg->graph_desc;
1165 const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1168 avfilter_graph_free(&fg->graph);
1169 if (!(fg->graph = avfilter_graph_alloc()))
1170 return AVERROR(ENOMEM);
1173 OutputStream *ost = fg->outputs[0]->ost;
1175 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1176 fg->graph->scale_sws_opts = av_strdup(args);
1179 if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1182 if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1183 av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
1184 "exactly one input and output.\n", graph_desc);
1185 return AVERROR(EINVAL);
1188 for (cur = inputs; !simple && init && cur; cur = cur->next)
1189 init_input_filter(fg, cur);
1191 for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1192 if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
1194 avfilter_inout_free(&inputs);
1196 if (!init || simple) {
1197 /* we already know the mappings between lavfi outputs and output streams,
1198 * so we can finish the setup */
1199 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1200 configure_output_filter(fg, fg->outputs[i], cur);
1201 avfilter_inout_free(&outputs);
1203 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1206 /* wait until output mappings are processed */
1207 for (cur = outputs; cur;) {
1208 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1209 &fg->nb_outputs, fg->nb_outputs + 1);
1210 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1212 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1213 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1215 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1222 static int configure_complex_filters(void)
1226 for (i = 0; i < nb_filtergraphs; i++)
1227 if (!filtergraphs[i]->graph &&
1228 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1233 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1236 for (i = 0; i < fg->nb_inputs; i++)
1237 if (fg->inputs[i]->ist == ist)
1242 static void term_exit(void)
1244 av_log(NULL, AV_LOG_QUIET, "%s", "");
1247 tcsetattr (0, TCSANOW, &oldtty);
1251 static volatile int received_sigterm = 0;
1253 static void sigterm_handler(int sig)
1255 received_sigterm = sig;
1256 received_nb_signals++;
1258 if(received_nb_signals > 3)
1262 static void term_init(void)
1269 istty = isatty(0) && isatty(2);
1271 if (istty && tcgetattr (0, &tty) == 0) {
1276 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1277 |INLCR|IGNCR|ICRNL|IXON);
1278 tty.c_oflag |= OPOST;
1279 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1280 tty.c_cflag &= ~(CSIZE|PARENB);
1283 tty.c_cc[VTIME] = 0;
1285 tcsetattr (0, TCSANOW, &tty);
1287 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1290 avformat_network_deinit();
1292 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1293 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1295 signal(SIGXCPU, sigterm_handler);
1299 /* read a key without blocking */
1300 static int read_key(void)
1312 n = select(1, &rfds, NULL, NULL, &tv);
1314 n = read(0, &ch, 1);
1321 # if HAVE_PEEKNAMEDPIPE
1323 static HANDLE input_handle;
1326 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1327 is_pipe = !GetConsoleMode(input_handle, &dw);
1330 if (stdin->_cnt > 0) {
1335 /* When running under a GUI, you will end here. */
1336 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1353 static int decode_interrupt_cb(void *ctx)
1355 return received_nb_signals > 1;
1358 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1360 void av_noreturn exit_program(int ret)
1364 for (i = 0; i < nb_filtergraphs; i++) {
1365 avfilter_graph_free(&filtergraphs[i]->graph);
1366 for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
1367 av_freep(&filtergraphs[i]->inputs[j]->name);
1368 av_freep(&filtergraphs[i]->inputs[j]);
1370 av_freep(&filtergraphs[i]->inputs);
1371 for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
1372 av_freep(&filtergraphs[i]->outputs[j]->name);
1373 av_freep(&filtergraphs[i]->outputs[j]);
1375 av_freep(&filtergraphs[i]->outputs);
1376 av_freep(&filtergraphs[i]);
1378 av_freep(&filtergraphs);
1380 av_freep(&subtitle_out);
1383 for (i = 0; i < nb_output_files; i++) {
1384 AVFormatContext *s = output_files[i]->ctx;
1385 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1387 avformat_free_context(s);
1388 av_dict_free(&output_files[i]->opts);
1389 av_freep(&output_files[i]);
1391 for (i = 0; i < nb_output_streams; i++) {
1392 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1394 AVBitStreamFilterContext *next = bsfc->next;
1395 av_bitstream_filter_close(bsfc);
1398 output_streams[i]->bitstream_filters = NULL;
1400 av_freep(&output_streams[i]->forced_keyframes);
1401 av_freep(&output_streams[i]->filtered_frame);
1402 av_freep(&output_streams[i]->avfilter);
1403 av_freep(&output_streams[i]);
1405 for (i = 0; i < nb_input_files; i++) {
1406 avformat_close_input(&input_files[i]->ctx);
1407 av_freep(&input_files[i]);
1409 for (i = 0; i < nb_input_streams; i++) {
1410 av_freep(&input_streams[i]->decoded_frame);
1411 av_dict_free(&input_streams[i]->opts);
1412 free_buffer_pool(&input_streams[i]->buffer_pool);
1413 av_freep(&input_streams[i]->filters);
1414 av_freep(&input_streams[i]);
1418 fclose(vstats_file);
1419 av_free(vstats_filename);
1421 av_freep(&input_streams);
1422 av_freep(&input_files);
1423 av_freep(&output_streams);
1424 av_freep(&output_files);
1429 avformat_network_deinit();
1431 if (received_sigterm) {
1432 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1433 (int) received_sigterm);
1440 static void assert_avoptions(AVDictionary *m)
1442 AVDictionaryEntry *t;
1443 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1444 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1449 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1451 const char *codec_string = encoder ? "encoder" : "decoder";
1453 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1454 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1455 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1456 "results.\nAdd '-strict experimental' if you want to use it.\n",
1457 codec_string, c->codec->name);
1458 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1459 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1460 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1461 codec_string, codec->name);
1466 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1468 if (codec && codec->sample_fmts) {
1469 const enum AVSampleFormat *p = codec->sample_fmts;
1470 for (; *p != -1; p++) {
1471 if (*p == st->codec->sample_fmt)
1475 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1476 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1477 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1478 av_log(NULL, AV_LOG_WARNING,
1479 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1480 av_get_sample_fmt_name(st->codec->sample_fmt),
1482 av_get_sample_fmt_name(codec->sample_fmts[0]));
1483 st->codec->sample_fmt = codec->sample_fmts[0];
1488 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1490 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1491 AVCodecContext *avctx = ost->st->codec;
1494 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1495 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1496 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1498 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1499 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1500 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1501 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1502 pkt->pts = pkt->dts = max;
1507 * Audio encoders may split the packets -- #frames in != #packets out.
1508 * But there is no reordering, so we can limit the number of output packets
1509 * by simply dropping them here.
1510 * Counting encoded video frames needs to be done separately because of
1511 * reordering, see do_video_out()
1513 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1514 if (ost->frame_number >= ost->max_frames) {
1515 av_free_packet(pkt);
1518 ost->frame_number++;
1522 AVPacket new_pkt = *pkt;
1523 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1524 &new_pkt.data, &new_pkt.size,
1525 pkt->data, pkt->size,
1526 pkt->flags & AV_PKT_FLAG_KEY);
1528 av_free_packet(pkt);
1529 new_pkt.destruct = av_destruct_packet;
1531 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1532 bsfc->filter->name, pkt->stream_index,
1533 avctx->codec ? avctx->codec->name : "copy");
1543 pkt->stream_index = ost->index;
1544 ret = av_interleaved_write_frame(s, pkt);
1546 print_error("av_interleaved_write_frame()", ret);
1551 static int check_recording_time(OutputStream *ost)
1553 OutputFile *of = output_files[ost->file_index];
1555 if (of->recording_time != INT64_MAX &&
1556 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1557 AV_TIME_BASE_Q) >= 0) {
1558 ost->is_past_recording_time = 1;
1564 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1567 AVCodecContext *enc = ost->st->codec;
1571 av_init_packet(&pkt);
1575 if (!check_recording_time(ost))
1578 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1579 frame->pts = ost->sync_opts;
1580 ost->sync_opts = frame->pts + frame->nb_samples;
1582 av_assert0(pkt.size || !pkt.data);
1583 update_benchmark(NULL);
1584 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1585 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1588 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1591 if (pkt.pts != AV_NOPTS_VALUE)
1592 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1593 if (pkt.dts != AV_NOPTS_VALUE)
1594 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1595 if (pkt.duration > 0)
1596 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1599 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1600 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1601 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1602 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1605 write_frame(s, &pkt, ost);
1607 audio_size += pkt.size;
1608 av_free_packet(&pkt);
1612 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1614 AVCodecContext *dec;
1615 AVPicture *picture2;
1616 AVPicture picture_tmp;
1619 dec = ist->st->codec;
1621 /* deinterlace : must be done before any resize */
1622 if (do_deinterlace) {
1625 /* create temporary picture */
1626 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1627 buf = av_malloc(size);
1631 picture2 = &picture_tmp;
1632 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1634 if (avpicture_deinterlace(picture2, picture,
1635 dec->pix_fmt, dec->width, dec->height) < 0) {
1636 /* if error, do not deinterlace */
1637 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1646 if (picture != picture2)
1647 *picture = *picture2;
1651 static void do_subtitle_out(AVFormatContext *s,
1657 int subtitle_out_max_size = 1024 * 1024;
1658 int subtitle_out_size, nb, i;
1659 AVCodecContext *enc;
1662 if (pts == AV_NOPTS_VALUE) {
1663 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1669 enc = ost->st->codec;
1671 if (!subtitle_out) {
1672 subtitle_out = av_malloc(subtitle_out_max_size);
1675 /* Note: DVB subtitle need one packet to draw them and one other
1676 packet to clear them */
1677 /* XXX: signal it in the codec context ? */
1678 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1683 for (i = 0; i < nb; i++) {
1684 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1685 if (!check_recording_time(ost))
1688 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1689 // start_display_time is required to be 0
1690 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1691 sub->end_display_time -= sub->start_display_time;
1692 sub->start_display_time = 0;
1693 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1694 subtitle_out_max_size, sub);
1695 if (subtitle_out_size < 0) {
1696 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1700 av_init_packet(&pkt);
1701 pkt.data = subtitle_out;
1702 pkt.size = subtitle_out_size;
1703 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1704 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
1705 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1706 /* XXX: the pts correction is handled here. Maybe handling
1707 it in the codec would be better */
1709 pkt.pts += 90 * sub->start_display_time;
1711 pkt.pts += 90 * sub->end_display_time;
1713 write_frame(s, &pkt, ost);
1714 subtitle_size += pkt.size;
1718 static void do_video_out(AVFormatContext *s,
1720 AVFrame *in_picture,
1723 int ret, format_video_sync;
1725 AVCodecContext *enc = ost->st->codec;
1727 double sync_ipts, delta;
1728 double duration = 0;
1730 InputStream *ist = NULL;
1732 if (ost->source_index >= 0)
1733 ist = input_streams[ost->source_index];
1735 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1736 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1738 sync_ipts = in_picture->pts;
1739 delta = sync_ipts - ost->sync_opts + duration;
1741 /* by default, we output a single frame */
1744 format_video_sync = video_sync_method;
1745 if (format_video_sync == VSYNC_AUTO)
1746 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1748 switch (format_video_sync) {
1750 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1753 else if (delta > 1.1)
1754 nb_frames = lrintf(delta);
1759 else if (delta > 0.6)
1760 ost->sync_opts = lrint(sync_ipts);
1763 case VSYNC_PASSTHROUGH:
1764 ost->sync_opts = lrint(sync_ipts);
1770 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1771 if (nb_frames == 0) {
1773 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1775 } else if (nb_frames > 1) {
1776 if (nb_frames > dts_error_threshold * 30) {
1777 av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skiping\n", nb_frames - 1);
1781 nb_frames_dup += nb_frames - 1;
1782 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1785 /* duplicates frame if needed */
1786 for (i = 0; i < nb_frames; i++) {
1787 av_init_packet(&pkt);
1791 in_picture->pts = ost->sync_opts;
1793 if (!check_recording_time(ost))
1796 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1797 enc->codec->id == CODEC_ID_RAWVIDEO) {
1798 /* raw pictures are written as AVPicture structure to
1799 avoid any copies. We support temporarily the older
1801 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1802 enc->coded_frame->top_field_first = in_picture->top_field_first;
1803 pkt.data = (uint8_t *)in_picture;
1804 pkt.size = sizeof(AVPicture);
1805 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1806 pkt.flags |= AV_PKT_FLAG_KEY;
1808 write_frame(s, &pkt, ost);
1809 video_size += pkt.size;
1812 AVFrame big_picture;
1814 big_picture = *in_picture;
1815 /* better than nothing: use input picture interlaced
1817 big_picture.interlaced_frame = in_picture->interlaced_frame;
1818 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1819 if (ost->top_field_first == -1)
1820 big_picture.top_field_first = in_picture->top_field_first;
1822 big_picture.top_field_first = !!ost->top_field_first;
1825 /* handles same_quant here. This is not correct because it may
1826 not be a global option */
1827 big_picture.quality = quality;
1828 if (!enc->me_threshold)
1829 big_picture.pict_type = 0;
1830 if (ost->forced_kf_index < ost->forced_kf_count &&
1831 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1832 big_picture.pict_type = AV_PICTURE_TYPE_I;
1833 ost->forced_kf_index++;
1835 update_benchmark(NULL);
1836 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1837 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1839 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1844 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1845 pkt.pts = ost->sync_opts;
1847 if (pkt.pts != AV_NOPTS_VALUE)
1848 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1849 if (pkt.dts != AV_NOPTS_VALUE)
1850 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1853 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1854 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1855 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1856 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1859 write_frame(s, &pkt, ost);
1860 frame_size = pkt.size;
1861 video_size += pkt.size;
1862 av_free_packet(&pkt);
1864 /* if two pass, output log */
1865 if (ost->logfile && enc->stats_out) {
1866 fprintf(ost->logfile, "%s", enc->stats_out);
1872 * For video, number of frames in == number of packets out.
1873 * But there may be reordering, so we can't throw away frames on encoder
1874 * flush, we need to limit them here, before they go into encoder.
1876 ost->frame_number++;
1879 if (vstats_filename && frame_size)
1880 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1883 static double psnr(double d)
1885 return -10.0 * log(d) / log(10.0);
1888 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1891 AVCodecContext *enc;
1893 double ti1, bitrate, avg_bitrate;
1895 /* this is executed just the first time do_video_stats is called */
1897 vstats_file = fopen(vstats_filename, "w");
1904 enc = ost->st->codec;
1905 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1906 frame_number = ost->frame_number;
1907 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1908 if (enc->flags&CODEC_FLAG_PSNR)
1909 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1911 fprintf(vstats_file,"f_size= %6d ", frame_size);
1912 /* compute pts value */
1913 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1917 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1918 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1919 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1920 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1921 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1925 /* check for new output on any of the filtergraphs */
1926 static int poll_filters(void)
1928 AVFilterBufferRef *picref;
1929 AVFrame *filtered_frame = NULL;
1930 int i, ret, ret_all;
1931 unsigned nb_success = 1, av_uninit(nb_eof);
1935 /* Reap all buffers present in the buffer sinks */
1936 for (i = 0; i < nb_output_streams; i++) {
1937 OutputStream *ost = output_streams[i];
1938 OutputFile *of = output_files[ost->file_index];
1944 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1945 return AVERROR(ENOMEM);
1947 avcodec_get_frame_defaults(ost->filtered_frame);
1948 filtered_frame = ost->filtered_frame;
1951 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1952 AV_BUFFERSINK_FLAG_NO_REQUEST);
1954 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1956 av_strerror(ret, buf, sizeof(buf));
1957 av_log(NULL, AV_LOG_WARNING,
1958 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1962 frame_pts = AV_NOPTS_VALUE;
1963 if (picref->pts != AV_NOPTS_VALUE) {
1964 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1965 ost->filter->filter->inputs[0]->time_base,
1966 ost->st->codec->time_base) -
1967 av_rescale_q(of->start_time,
1969 ost->st->codec->time_base);
1971 if (of->start_time && filtered_frame->pts < 0) {
1972 avfilter_unref_buffer(picref);
1976 //if (ost->source_index >= 0)
1977 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1980 switch (ost->filter->filter->inputs[0]->type) {
1981 case AVMEDIA_TYPE_VIDEO:
1982 avfilter_copy_buf_props(filtered_frame, picref);
1983 filtered_frame->pts = frame_pts;
1984 if (!ost->frame_aspect_ratio)
1985 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1987 do_video_out(of->ctx, ost, filtered_frame,
1988 same_quant ? ost->last_quality :
1989 ost->st->codec->global_quality);
1991 case AVMEDIA_TYPE_AUDIO:
1992 avfilter_copy_buf_props(filtered_frame, picref);
1993 filtered_frame->pts = frame_pts;
1994 do_audio_out(of->ctx, ost, filtered_frame);
1997 // TODO support subtitle filters
2001 avfilter_unref_buffer(picref);
2004 if (!nb_success) /* from last round */
2006 /* Request frames through all the graphs */
2007 ret_all = nb_success = nb_eof = 0;
2008 for (i = 0; i < nb_filtergraphs; i++) {
2009 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2012 } else if (ret == AVERROR_EOF) {
2014 } else if (ret != AVERROR(EAGAIN)) {
2016 av_strerror(ret, buf, sizeof(buf));
2017 av_log(NULL, AV_LOG_WARNING,
2018 "Error in request_frame(): %s\n", buf);
2022 /* Try again if anything succeeded */
2024 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2027 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2030 AVBPrint buf_script;
2032 AVFormatContext *oc;
2034 AVCodecContext *enc;
2035 int frame_number, vid, i;
2037 int64_t pts = INT64_MAX;
2038 static int64_t last_time = -1;
2039 static int qp_histogram[52];
2040 int hours, mins, secs, us;
2042 if (!print_stats && !is_last_report && !progress_avio)
2045 if (!is_last_report) {
2046 if (last_time == -1) {
2047 last_time = cur_time;
2050 if ((cur_time - last_time) < 500000)
2052 last_time = cur_time;
2056 oc = output_files[0]->ctx;
2058 total_size = avio_size(oc->pb);
2059 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2060 total_size = avio_tell(oc->pb);
2067 av_bprint_init(&buf_script, 0, 1);
2068 for (i = 0; i < nb_output_streams; i++) {
2070 ost = output_streams[i];
2071 enc = ost->st->codec;
2072 if (!ost->stream_copy && enc->coded_frame)
2073 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2074 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2075 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2076 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2077 ost->file_index, ost->index, q);
2079 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2080 float fps, t = (cur_time-timer_start) / 1000000.0;
2082 frame_number = ost->frame_number;
2083 fps = t > 1 ? frame_number / t : 0;
2084 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2085 frame_number, fps < 9.95, fps, q);
2086 av_bprintf(&buf_script, "frame=%d\n", frame_number);
2087 av_bprintf(&buf_script, "fps=%.1f\n", fps);
2088 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2089 ost->file_index, ost->index, q);
2091 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2095 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2097 for (j = 0; j < 32; j++)
2098 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2100 if (enc->flags&CODEC_FLAG_PSNR) {
2102 double error, error_sum = 0;
2103 double scale, scale_sum = 0;
2105 char type[3] = { 'Y','U','V' };
2106 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2107 for (j = 0; j < 3; j++) {
2108 if (is_last_report) {
2109 error = enc->error[j];
2110 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2112 error = enc->coded_frame->error[j];
2113 scale = enc->width * enc->height * 255.0 * 255.0;
2119 p = psnr(error / scale);
2120 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p);
2121 av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
2122 ost->file_index, ost->index, type[i] | 32, p);
2124 p = psnr(error_sum / scale_sum);
2125 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2126 av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
2127 ost->file_index, ost->index, p);
2131 /* compute min output value */
2132 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2133 ost->st->time_base, AV_TIME_BASE_Q));
2136 secs = pts / AV_TIME_BASE;
2137 us = pts % AV_TIME_BASE;
2143 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2145 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2146 "size=%8.0fkB time=", total_size / 1024.0);
2147 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2148 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2149 (100 * us) / AV_TIME_BASE);
2150 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2151 "bitrate=%6.1fkbits/s", bitrate);
2152 av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
2153 av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
2154 av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n",
2155 hours, mins, secs, us);
2157 if (nb_frames_dup || nb_frames_drop)
2158 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2159 nb_frames_dup, nb_frames_drop);
2160 av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
2161 av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
2163 if (print_stats || is_last_report) {
2164 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2169 if (progress_avio) {
2170 av_bprintf(&buf_script, "progress=%s\n",
2171 is_last_report ? "end" : "continue");
2172 avio_write(progress_avio, buf_script.str,
2173 FFMIN(buf_script.len, buf_script.size - 1));
2174 avio_flush(progress_avio);
2175 av_bprint_finalize(&buf_script, NULL);
2176 if (is_last_report) {
2177 avio_close(progress_avio);
2178 progress_avio = NULL;
2182 if (is_last_report) {
2183 int64_t raw= audio_size + video_size + subtitle_size + extra_size;
2184 av_log(NULL, AV_LOG_INFO, "\n");
2185 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
2186 video_size / 1024.0,
2187 audio_size / 1024.0,
2188 subtitle_size / 1024.0,
2189 extra_size / 1024.0,
2190 100.0 * (total_size - raw) / raw
2192 if(video_size + audio_size + subtitle_size + extra_size == 0){
2193 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2198 static void flush_encoders(void)
2202 for (i = 0; i < nb_output_streams; i++) {
2203 OutputStream *ost = output_streams[i];
2204 AVCodecContext *enc = ost->st->codec;
2205 AVFormatContext *os = output_files[ost->file_index]->ctx;
2206 int stop_encoding = 0;
2208 if (!ost->encoding_needed)
2211 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2213 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2217 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2221 switch (ost->st->codec->codec_type) {
2222 case AVMEDIA_TYPE_AUDIO:
2223 encode = avcodec_encode_audio2;
2227 case AVMEDIA_TYPE_VIDEO:
2228 encode = avcodec_encode_video2;
2239 av_init_packet(&pkt);
2243 update_benchmark(NULL);
2244 ret = encode(enc, &pkt, NULL, &got_packet);
2245 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2247 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2251 if (ost->logfile && enc->stats_out) {
2252 fprintf(ost->logfile, "%s", enc->stats_out);
2258 if (pkt.pts != AV_NOPTS_VALUE)
2259 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2260 if (pkt.dts != AV_NOPTS_VALUE)
2261 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2262 write_frame(os, &pkt, ost);
2272 * Check whether a packet from ist should be written into ost at this time
2274 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2276 OutputFile *of = output_files[ost->file_index];
2277 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2279 if (ost->source_index != ist_index)
2282 if (of->start_time && ist->pts < of->start_time)
2288 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2290 OutputFile *of = output_files[ost->file_index];
2291 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2295 av_init_packet(&opkt);
2297 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2298 !ost->copy_initial_nonkeyframes)
2301 if (of->recording_time != INT64_MAX &&
2302 ist->pts >= of->recording_time + of->start_time) {
2303 ost->is_past_recording_time = 1;
2307 /* force the input stream PTS */
2308 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2309 audio_size += pkt->size;
2310 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2311 video_size += pkt->size;
2313 } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2314 subtitle_size += pkt->size;
2317 if (pkt->pts != AV_NOPTS_VALUE)
2318 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2320 opkt.pts = AV_NOPTS_VALUE;
2322 if (pkt->dts == AV_NOPTS_VALUE)
2323 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2325 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2326 opkt.dts -= ost_tb_start_time;
2328 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2329 opkt.flags = pkt->flags;
2331 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2332 if ( ost->st->codec->codec_id != CODEC_ID_H264
2333 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2334 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2335 && ost->st->codec->codec_id != CODEC_ID_VC1
2337 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2338 opkt.destruct = av_destruct_packet;
2340 opkt.data = pkt->data;
2341 opkt.size = pkt->size;
2343 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2344 /* store AVPicture in AVPacket, as expected by the output format */
2345 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2346 opkt.data = (uint8_t *)&pict;
2347 opkt.size = sizeof(AVPicture);
2348 opkt.flags |= AV_PKT_FLAG_KEY;
2351 write_frame(of->ctx, &opkt, ost);
2352 ost->st->codec->frame_number++;
2353 av_free_packet(&opkt);
2356 static void rate_emu_sleep(InputStream *ist)
2358 if (input_files[ist->file_index]->rate_emu) {
2359 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2360 int64_t now = av_gettime() - ist->start;
2362 av_usleep(pts - now);
2366 static int guess_input_channel_layout(InputStream *ist)
2368 AVCodecContext *dec = ist->st->codec;
2370 if (!dec->channel_layout) {
2371 char layout_name[256];
2373 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2374 if (!dec->channel_layout)
2376 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2377 dec->channels, dec->channel_layout);
2378 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2379 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2384 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2386 AVFrame *decoded_frame;
2387 AVCodecContext *avctx = ist->st->codec;
2388 int i, ret, resample_changed;
2390 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2391 return AVERROR(ENOMEM);
2393 avcodec_get_frame_defaults(ist->decoded_frame);
2394 decoded_frame = ist->decoded_frame;
2396 update_benchmark(NULL);
2397 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2398 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2402 if (avctx->sample_rate <= 0) {
2403 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2404 return AVERROR_INVALIDDATA;
2408 /* no audio frame */
2410 for (i = 0; i < ist->nb_filters; i++)
2411 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2412 AV_BUFFERSRC_FLAG_NO_COPY);
2416 /* if the decoder provides a pts, use it instead of the last packet pts.
2417 the decoder could be delaying output by a packet or more. */
2418 if (decoded_frame->pts != AV_NOPTS_VALUE)
2419 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2420 else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
2421 decoded_frame->pts = decoded_frame->pkt_pts;
2422 pkt->pts = AV_NOPTS_VALUE;
2423 } else if (pkt->pts != AV_NOPTS_VALUE) {
2424 decoded_frame->pts = pkt->pts;
2425 pkt->pts = AV_NOPTS_VALUE;
2427 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2431 /* increment next_dts to use for the case where the input stream does not
2432 have timestamps or there are multiple frames in the packet */
2433 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2435 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2439 rate_emu_sleep(ist);
2441 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2442 ist->resample_channels != avctx->channels ||
2443 ist->resample_channel_layout != decoded_frame->channel_layout ||
2444 ist->resample_sample_rate != decoded_frame->sample_rate;
2445 if (resample_changed) {
2446 char layout1[64], layout2[64];
2448 if (!guess_input_channel_layout(ist)) {
2449 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2450 "layout for Input Stream #%d.%d\n", ist->file_index,
2454 decoded_frame->channel_layout = avctx->channel_layout;
2456 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2457 ist->resample_channel_layout);
2458 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2459 decoded_frame->channel_layout);
2461 av_log(NULL, AV_LOG_INFO,
2462 "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",
2463 ist->file_index, ist->st->index,
2464 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2465 ist->resample_channels, layout1,
2466 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2467 avctx->channels, layout2);
2469 ist->resample_sample_fmt = decoded_frame->format;
2470 ist->resample_sample_rate = decoded_frame->sample_rate;
2471 ist->resample_channel_layout = decoded_frame->channel_layout;
2472 ist->resample_channels = avctx->channels;
2474 for (i = 0; i < nb_filtergraphs; i++)
2475 if (ist_in_filtergraph(filtergraphs[i], ist)) {
2476 FilterGraph *fg = filtergraphs[i];
2478 if (configure_filtergraph(fg) < 0) {
2479 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2482 for (j = 0; j < fg->nb_outputs; j++) {
2483 OutputStream *ost = fg->outputs[j]->ost;
2484 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2485 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2486 av_buffersink_set_frame_size(ost->filter->filter,
2487 ost->st->codec->frame_size);
2492 if (decoded_frame->pts != AV_NOPTS_VALUE)
2493 decoded_frame->pts = av_rescale_q(decoded_frame->pts,
2495 (AVRational){1, ist->st->codec->sample_rate});
2496 for (i = 0; i < ist->nb_filters; i++)
2497 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2502 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2504 AVFrame *decoded_frame;
2505 void *buffer_to_free = NULL;
2506 int i, ret = 0, resample_changed;
2507 int64_t best_effort_timestamp;
2508 AVRational *frame_sample_aspect;
2511 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2512 return AVERROR(ENOMEM);
2514 avcodec_get_frame_defaults(ist->decoded_frame);
2515 decoded_frame = ist->decoded_frame;
2516 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2518 update_benchmark(NULL);
2519 ret = avcodec_decode_video2(ist->st->codec,
2520 decoded_frame, got_output, pkt);
2521 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2525 quality = same_quant ? decoded_frame->quality : 0;
2527 /* no picture yet */
2529 for (i = 0; i < ist->nb_filters; i++)
2530 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2534 if(ist->top_field_first>=0)
2535 decoded_frame->top_field_first = ist->top_field_first;
2537 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2538 if(best_effort_timestamp != AV_NOPTS_VALUE)
2539 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2542 av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
2543 "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d \n",
2544 ist->st->index, av_ts2str(decoded_frame->pts),
2545 av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
2546 best_effort_timestamp,
2547 av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
2548 decoded_frame->key_frame, decoded_frame->pict_type);
2552 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2554 rate_emu_sleep(ist);
2556 if (ist->st->sample_aspect_ratio.num)
2557 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2559 resample_changed = ist->resample_width != decoded_frame->width ||
2560 ist->resample_height != decoded_frame->height ||
2561 ist->resample_pix_fmt != decoded_frame->format;
2562 if (resample_changed) {
2563 av_log(NULL, AV_LOG_INFO,
2564 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2565 ist->file_index, ist->st->index,
2566 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2567 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2569 ist->resample_width = decoded_frame->width;
2570 ist->resample_height = decoded_frame->height;
2571 ist->resample_pix_fmt = decoded_frame->format;
2573 for (i = 0; i < nb_filtergraphs; i++)
2574 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2575 configure_filtergraph(filtergraphs[i]) < 0) {
2576 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2581 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2582 for (i = 0; i < ist->nb_filters; i++) {
2583 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2584 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2585 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2586 // XXX what an ugly hack
2587 if (ist->filters[i]->graph->nb_outputs == 1)
2588 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2590 if (!frame_sample_aspect->num)
2591 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2592 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2593 FrameBuffer *buf = decoded_frame->opaque;
2594 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2595 decoded_frame->data, decoded_frame->linesize,
2596 AV_PERM_READ | AV_PERM_PRESERVE,
2597 ist->st->codec->width, ist->st->codec->height,
2598 ist->st->codec->pix_fmt);
2600 avfilter_copy_frame_props(fb, decoded_frame);
2601 fb->buf->priv = buf;
2602 fb->buf->free = filter_release_buffer;
2604 av_assert0(buf->refcount>0);
2606 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2607 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2608 AV_BUFFERSRC_FLAG_NO_COPY);
2610 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2611 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2617 av_free(buffer_to_free);
2621 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2623 AVSubtitle subtitle;
2624 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2625 &subtitle, got_output, pkt);
2631 rate_emu_sleep(ist);
2633 for (i = 0; i < nb_output_streams; i++) {
2634 OutputStream *ost = output_streams[i];
2636 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2639 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2642 avsubtitle_free(&subtitle);
2646 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2647 static int output_packet(InputStream *ist, const AVPacket *pkt)
2653 if (!ist->saw_first_ts) {
2654 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;
2656 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2657 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2658 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2660 ist->saw_first_ts = 1;
2663 if (ist->next_dts == AV_NOPTS_VALUE)
2664 ist->next_dts = ist->dts;
2665 if (ist->next_pts == AV_NOPTS_VALUE)
2666 ist->next_pts = ist->pts;
2670 av_init_packet(&avpkt);
2678 if (pkt->dts != AV_NOPTS_VALUE) {
2679 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2680 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2681 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2684 // while we have more to decode or while the decoder did output something on EOF
2685 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2689 ist->pts = ist->next_pts;
2690 ist->dts = ist->next_dts;
2692 if (avpkt.size && avpkt.size != pkt->size) {
2693 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2694 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2695 ist->showed_multi_packet_warning = 1;
2698 switch (ist->st->codec->codec_type) {
2699 case AVMEDIA_TYPE_AUDIO:
2700 ret = decode_audio (ist, &avpkt, &got_output);
2702 case AVMEDIA_TYPE_VIDEO:
2703 ret = decode_video (ist, &avpkt, &got_output);
2704 if (avpkt.duration) {
2705 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2706 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2707 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2708 duration = ((int64_t)AV_TIME_BASE *
2709 ist->st->codec->time_base.num * ticks) /
2710 ist->st->codec->time_base.den;
2714 if(ist->dts != AV_NOPTS_VALUE && duration) {
2715 ist->next_dts += duration;
2717 ist->next_dts = AV_NOPTS_VALUE;
2720 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2722 case AVMEDIA_TYPE_SUBTITLE:
2723 ret = transcode_subtitles(ist, &avpkt, &got_output);
2733 avpkt.pts= AV_NOPTS_VALUE;
2735 // touch data and size only if not EOF
2737 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2747 /* handle stream copy */
2748 if (!ist->decoding_needed) {
2749 rate_emu_sleep(ist);
2750 ist->dts = ist->next_dts;
2751 switch (ist->st->codec->codec_type) {
2752 case AVMEDIA_TYPE_AUDIO:
2753 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2754 ist->st->codec->sample_rate;
2756 case AVMEDIA_TYPE_VIDEO:
2757 if (pkt->duration) {
2758 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2759 } else if(ist->st->codec->time_base.num != 0) {
2760 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2761 ist->next_dts += ((int64_t)AV_TIME_BASE *
2762 ist->st->codec->time_base.num * ticks) /
2763 ist->st->codec->time_base.den;
2767 ist->pts = ist->dts;
2768 ist->next_pts = ist->next_dts;
2770 for (i = 0; pkt && i < nb_output_streams; i++) {
2771 OutputStream *ost = output_streams[i];
2773 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2776 do_streamcopy(ist, ost, pkt);
2782 static void print_sdp(void)
2786 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2790 for (i = 0; i < nb_output_files; i++)
2791 avc[i] = output_files[i]->ctx;
2793 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2794 printf("SDP:\n%s\n", sdp);
2799 static int init_input_stream(int ist_index, char *error, int error_len)
2801 InputStream *ist = input_streams[ist_index];
2803 if (ist->decoding_needed) {
2804 AVCodec *codec = ist->dec;
2806 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2807 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2808 return AVERROR(EINVAL);
2811 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2812 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2813 ist->st->codec->get_buffer = codec_get_buffer;
2814 ist->st->codec->release_buffer = codec_release_buffer;
2815 ist->st->codec->opaque = &ist->buffer_pool;
2818 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2819 av_dict_set(&ist->opts, "threads", "auto", 0);
2820 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2821 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2822 ist->file_index, ist->st->index);
2823 return AVERROR(EINVAL);
2825 assert_codec_experimental(ist->st->codec, 0);
2826 assert_avoptions(ist->opts);
2829 ist->next_pts = AV_NOPTS_VALUE;
2830 ist->next_dts = AV_NOPTS_VALUE;
2836 static InputStream *get_input_stream(OutputStream *ost)
2838 if (ost->source_index >= 0)
2839 return input_streams[ost->source_index];
2843 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2844 AVCodecContext *avctx)
2850 for (p = kf; *p; p++)
2853 ost->forced_kf_count = n;
2854 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2855 if (!ost->forced_kf_pts) {
2856 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2861 for (i = 0; i < n; i++) {
2862 char *next = strchr(p, ',');
2867 t = parse_time_or_die("force_key_frames", p, 1);
2868 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2874 static int transcode_init(void)
2876 int ret = 0, i, j, k;
2877 AVFormatContext *oc;
2878 AVCodecContext *codec, *icodec = NULL;
2884 /* init framerate emulation */
2885 for (i = 0; i < nb_input_files; i++) {
2886 InputFile *ifile = input_files[i];
2887 if (ifile->rate_emu)
2888 for (j = 0; j < ifile->nb_streams; j++)
2889 input_streams[j + ifile->ist_index]->start = av_gettime();
2892 /* output stream init */
2893 for (i = 0; i < nb_output_files; i++) {
2894 oc = output_files[i]->ctx;
2895 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2896 av_dump_format(oc, i, oc->filename, 1);
2897 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2898 return AVERROR(EINVAL);
2902 /* init complex filtergraphs */
2903 for (i = 0; i < nb_filtergraphs; i++)
2904 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2907 /* for each output stream, we compute the right encoding parameters */
2908 for (i = 0; i < nb_output_streams; i++) {
2909 ost = output_streams[i];
2910 oc = output_files[ost->file_index]->ctx;
2911 ist = get_input_stream(ost);
2913 if (ost->attachment_filename)
2916 codec = ost->st->codec;
2919 icodec = ist->st->codec;
2921 ost->st->disposition = ist->st->disposition;
2922 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2923 codec->chroma_sample_location = icodec->chroma_sample_location;
2926 if (ost->stream_copy) {
2927 uint64_t extra_size;
2929 av_assert0(ist && !ost->filter);
2931 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2933 if (extra_size > INT_MAX) {
2934 return AVERROR(EINVAL);
2937 /* if stream_copy is selected, no need to decode or encode */
2938 codec->codec_id = icodec->codec_id;
2939 codec->codec_type = icodec->codec_type;
2941 if (!codec->codec_tag) {
2942 if (!oc->oformat->codec_tag ||
2943 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2944 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2945 codec->codec_tag = icodec->codec_tag;
2948 codec->bit_rate = icodec->bit_rate;
2949 codec->rc_max_rate = icodec->rc_max_rate;
2950 codec->rc_buffer_size = icodec->rc_buffer_size;
2951 codec->field_order = icodec->field_order;
2952 codec->extradata = av_mallocz(extra_size);
2953 if (!codec->extradata) {
2954 return AVERROR(ENOMEM);
2956 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2957 codec->extradata_size= icodec->extradata_size;
2958 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2960 codec->time_base = ist->st->time_base;
2962 * Avi is a special case here because it supports variable fps but
2963 * having the fps and timebase differe significantly adds quite some
2966 if(!strcmp(oc->oformat->name, "avi")) {
2967 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2968 && av_q2d(ist->st->time_base) < 1.0/500
2970 codec->time_base = icodec->time_base;
2971 codec->time_base.num *= icodec->ticks_per_frame;
2972 codec->time_base.den *= 2;
2973 codec->ticks_per_frame = 2;
2975 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2976 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2977 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2979 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2980 && av_q2d(ist->st->time_base) < 1.0/500
2982 codec->time_base = icodec->time_base;
2983 codec->time_base.num *= icodec->ticks_per_frame;
2987 if(ost->frame_rate.num)
2988 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2990 av_reduce(&codec->time_base.num, &codec->time_base.den,
2991 codec->time_base.num, codec->time_base.den, INT_MAX);
2993 switch (codec->codec_type) {
2994 case AVMEDIA_TYPE_AUDIO:
2995 if (audio_volume != 256) {
2996 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2999 codec->channel_layout = icodec->channel_layout;
3000 codec->sample_rate = icodec->sample_rate;
3001 codec->channels = icodec->channels;
3002 codec->frame_size = icodec->frame_size;
3003 codec->audio_service_type = icodec->audio_service_type;
3004 codec->block_align = icodec->block_align;
3005 if((codec->block_align == 1 || codec->block_align == 1152) && codec->codec_id == CODEC_ID_MP3)
3006 codec->block_align= 0;
3007 if(codec->codec_id == CODEC_ID_AC3)
3008 codec->block_align= 0;
3010 case AVMEDIA_TYPE_VIDEO:
3011 codec->pix_fmt = icodec->pix_fmt;
3012 codec->width = icodec->width;
3013 codec->height = icodec->height;
3014 codec->has_b_frames = icodec->has_b_frames;
3015 if (!codec->sample_aspect_ratio.num) {
3016 codec->sample_aspect_ratio =
3017 ost->st->sample_aspect_ratio =
3018 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3019 ist->st->codec->sample_aspect_ratio.num ?
3020 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3022 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3024 case AVMEDIA_TYPE_SUBTITLE:
3025 codec->width = icodec->width;
3026 codec->height = icodec->height;
3028 case AVMEDIA_TYPE_DATA:
3029 case AVMEDIA_TYPE_ATTACHMENT:
3036 ost->enc = avcodec_find_encoder(codec->codec_id);
3038 /* should only happen when a default codec is not present. */
3039 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3040 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3041 ret = AVERROR(EINVAL);
3046 ist->decoding_needed = 1;
3047 ost->encoding_needed = 1;
3049 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3050 if (ost->filter && !ost->frame_rate.num)
3051 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
3052 if (ist && !ost->frame_rate.num)
3053 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3054 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3055 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3056 ost->frame_rate = ost->enc->supported_framerates[idx];
3061 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3062 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3064 fg = init_simple_filtergraph(ist, ost);
3065 if (configure_filtergraph(fg)) {
3066 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3071 switch (codec->codec_type) {
3072 case AVMEDIA_TYPE_AUDIO:
3073 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3074 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3075 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3076 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3077 codec->time_base = (AVRational){ 1, codec->sample_rate };
3079 case AVMEDIA_TYPE_VIDEO:
3080 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3081 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
3082 codec->time_base = ost->filter->filter->inputs[0]->time_base;
3083 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3084 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3085 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3086 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3088 for (j = 0; j < ost->forced_kf_count; j++)
3089 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3093 codec->width = ost->filter->filter->inputs[0]->w;
3094 codec->height = ost->filter->filter->inputs[0]->h;
3095 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3096 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3097 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3098 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3099 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3102 codec->width != icodec->width ||
3103 codec->height != icodec->height ||
3104 codec->pix_fmt != icodec->pix_fmt) {
3105 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3108 if (ost->forced_keyframes)
3109 parse_forced_key_frames(ost->forced_keyframes, ost,
3112 case AVMEDIA_TYPE_SUBTITLE:
3113 codec->time_base = (AVRational){1, 1000};
3120 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3121 char logfilename[1024];
3124 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3125 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3127 if (!strcmp(ost->enc->name, "libx264")) {
3128 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3130 if (codec->flags & CODEC_FLAG_PASS2) {
3132 size_t logbuffer_size;
3133 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3134 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3138 codec->stats_in = logbuffer;
3140 if (codec->flags & CODEC_FLAG_PASS1) {
3141 f = fopen(logfilename, "wb");
3143 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3144 logfilename, strerror(errno));
3154 /* open each encoder */
3155 for (i = 0; i < nb_output_streams; i++) {
3156 ost = output_streams[i];
3157 if (ost->encoding_needed) {
3158 AVCodec *codec = ost->enc;
3159 AVCodecContext *dec = NULL;
3161 if ((ist = get_input_stream(ost)))
3162 dec = ist->st->codec;
3163 if (dec && dec->subtitle_header) {
3164 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3165 if (!ost->st->codec->subtitle_header) {
3166 ret = AVERROR(ENOMEM);
3169 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3170 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3172 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3173 av_dict_set(&ost->opts, "threads", "auto", 0);
3174 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3175 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3176 ost->file_index, ost->index);
3177 ret = AVERROR(EINVAL);
3180 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3181 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
3182 av_buffersink_set_frame_size(ost->filter->filter,
3183 ost->st->codec->frame_size);
3184 assert_codec_experimental(ost->st->codec, 1);
3185 assert_avoptions(ost->opts);
3186 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3187 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3188 " It takes bits/s as argument, not kbits/s\n");
3189 extra_size += ost->st->codec->extradata_size;
3191 if (ost->st->codec->me_threshold)
3192 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3196 /* init input streams */
3197 for (i = 0; i < nb_input_streams; i++)
3198 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3201 /* discard unused programs */
3202 for (i = 0; i < nb_input_files; i++) {
3203 InputFile *ifile = input_files[i];
3204 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3205 AVProgram *p = ifile->ctx->programs[j];
3206 int discard = AVDISCARD_ALL;
3208 for (k = 0; k < p->nb_stream_indexes; k++)
3209 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3210 discard = AVDISCARD_DEFAULT;
3213 p->discard = discard;
3217 /* open files and write file headers */
3218 for (i = 0; i < nb_output_files; i++) {
3219 oc = output_files[i]->ctx;
3220 oc->interrupt_callback = int_cb;
3221 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3223 const char *errbuf_ptr = errbuf;
3224 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3225 errbuf_ptr = strerror(AVUNERROR(ret));
3226 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3227 ret = AVERROR(EINVAL);
3230 // assert_avoptions(output_files[i]->opts);
3231 if (strcmp(oc->oformat->name, "rtp")) {
3237 /* dump the file output parameters - cannot be done before in case
3239 for (i = 0; i < nb_output_files; i++) {
3240 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3243 /* dump the stream mapping */
3244 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3245 for (i = 0; i < nb_input_streams; i++) {
3246 ist = input_streams[i];
3248 for (j = 0; j < ist->nb_filters; j++) {
3249 if (ist->filters[j]->graph->graph_desc) {
3250 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3251 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3252 ist->filters[j]->name);
3253 if (nb_filtergraphs > 1)
3254 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3255 av_log(NULL, AV_LOG_INFO, "\n");
3260 for (i = 0; i < nb_output_streams; i++) {
3261 ost = output_streams[i];
3263 if (ost->attachment_filename) {
3264 /* an attached file */
3265 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3266 ost->attachment_filename, ost->file_index, ost->index);
3270 if (ost->filter && ost->filter->graph->graph_desc) {
3271 /* output from a complex graph */
3272 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3273 if (nb_filtergraphs > 1)
3274 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3276 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3277 ost->index, ost->enc ? ost->enc->name : "?");
3281 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3282 input_streams[ost->source_index]->file_index,
3283 input_streams[ost->source_index]->st->index,
3286 if (ost->sync_ist != input_streams[ost->source_index])
3287 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3288 ost->sync_ist->file_index,
3289 ost->sync_ist->st->index);
3290 if (ost->stream_copy)
3291 av_log(NULL, AV_LOG_INFO, " (copy)");
3293 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3294 input_streams[ost->source_index]->dec->name : "?",
3295 ost->enc ? ost->enc->name : "?");
3296 av_log(NULL, AV_LOG_INFO, "\n");
3300 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3312 * @return 1 if there are still streams where more output is wanted,
3315 static int need_output(void)
3319 for (i = 0; i < nb_output_streams; i++) {
3320 OutputStream *ost = output_streams[i];
3321 OutputFile *of = output_files[ost->file_index];
3322 AVFormatContext *os = output_files[ost->file_index]->ctx;
3324 if (ost->is_past_recording_time ||
3325 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3327 if (ost->frame_number >= ost->max_frames) {
3329 for (j = 0; j < of->ctx->nb_streams; j++)
3330 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3340 static int select_input_file(uint8_t *no_packet)
3342 int64_t ipts_min = INT64_MAX;
3343 int i, file_index = -1;
3345 for (i = 0; i < nb_input_streams; i++) {
3346 InputStream *ist = input_streams[i];
3347 int64_t ipts = ist->pts;
3349 if (ist->discard || no_packet[ist->file_index])
3351 if (!input_files[ist->file_index]->eof_reached) {
3352 if (ipts < ipts_min) {
3354 file_index = ist->file_index;
3362 static int check_keyboard_interaction(int64_t cur_time)
3365 static int64_t last_time;
3366 if (received_nb_signals)
3367 return AVERROR_EXIT;
3368 /* read_key() returns 0 on EOF */
3369 if(cur_time - last_time >= 100000 && !run_as_daemon){
3371 last_time = cur_time;
3375 return AVERROR_EXIT;
3376 if (key == '+') av_log_set_level(av_log_get_level()+10);
3377 if (key == '-') av_log_set_level(av_log_get_level()-10);
3378 if (key == 's') qp_hist ^= 1;
3381 do_hex_dump = do_pkt_dump = 0;
3382 } else if(do_pkt_dump){
3386 av_log_set_level(AV_LOG_DEBUG);
3388 if (key == 'c' || key == 'C'){
3389 char buf[4096], target[64], command[256], arg[256] = {0};
3392 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3394 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3399 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3400 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3401 target, time, command, arg);
3402 for (i = 0; i < nb_filtergraphs; i++) {
3403 FilterGraph *fg = filtergraphs[i];
3406 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3407 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3408 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3410 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3415 av_log(NULL, AV_LOG_ERROR,
3416 "Parse error, at least 3 arguments were expected, "
3417 "only %d given in string '%s'\n", n, buf);
3420 if (key == 'd' || key == 'D'){
3423 debug = input_streams[0]->st->codec->debug<<1;
3424 if(!debug) debug = 1;
3425 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3428 if(scanf("%d", &debug)!=1)
3429 fprintf(stderr,"error parsing debug value\n");
3430 for(i=0;i<nb_input_streams;i++) {
3431 input_streams[i]->st->codec->debug = debug;
3433 for(i=0;i<nb_output_streams;i++) {
3434 OutputStream *ost = output_streams[i];
3435 ost->st->codec->debug = debug;
3437 if(debug) av_log_set_level(AV_LOG_DEBUG);
3438 fprintf(stderr,"debug=%d\n", debug);
3441 fprintf(stderr, "key function\n"
3442 "? show this help\n"
3443 "+ increase verbosity\n"
3444 "- decrease verbosity\n"
3445 "c Send command to filtergraph\n"
3446 "D cycle through available debug modes\n"
3447 "h dump packets/hex press to cycle through the 3 states\n"
3449 "s Show QP histogram\n"
3456 static void *input_thread(void *arg)
3461 while (!transcoding_finished && ret >= 0) {
3463 ret = av_read_frame(f->ctx, &pkt);
3465 if (ret == AVERROR(EAGAIN)) {
3472 pthread_mutex_lock(&f->fifo_lock);
3473 while (!av_fifo_space(f->fifo))
3474 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3476 av_dup_packet(&pkt);
3477 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3479 pthread_mutex_unlock(&f->fifo_lock);
3486 static void free_input_threads(void)
3490 if (nb_input_files == 1)
3493 transcoding_finished = 1;
3495 for (i = 0; i < nb_input_files; i++) {
3496 InputFile *f = input_files[i];
3499 if (!f->fifo || f->joined)
3502 pthread_mutex_lock(&f->fifo_lock);
3503 while (av_fifo_size(f->fifo)) {
3504 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3505 av_free_packet(&pkt);
3507 pthread_cond_signal(&f->fifo_cond);
3508 pthread_mutex_unlock(&f->fifo_lock);
3510 pthread_join(f->thread, NULL);
3513 while (av_fifo_size(f->fifo)) {
3514 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3515 av_free_packet(&pkt);
3517 av_fifo_free(f->fifo);
3521 static int init_input_threads(void)
3525 if (nb_input_files == 1)
3528 for (i = 0; i < nb_input_files; i++) {
3529 InputFile *f = input_files[i];
3531 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3532 return AVERROR(ENOMEM);
3534 pthread_mutex_init(&f->fifo_lock, NULL);
3535 pthread_cond_init (&f->fifo_cond, NULL);
3537 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3538 return AVERROR(ret);
3543 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3547 pthread_mutex_lock(&f->fifo_lock);
3549 if (av_fifo_size(f->fifo)) {
3550 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3551 pthread_cond_signal(&f->fifo_cond);
3556 ret = AVERROR(EAGAIN);
3559 pthread_mutex_unlock(&f->fifo_lock);
3565 static int get_input_packet(InputFile *f, AVPacket *pkt)
3568 if (nb_input_files > 1)
3569 return get_input_packet_mt(f, pkt);
3571 return av_read_frame(f->ctx, pkt);
3575 * The following code is the main loop of the file converter
3577 static int transcode(void)
3580 AVFormatContext *is, *os;
3584 int no_packet_count = 0;
3585 int64_t timer_start;
3587 if (!(no_packet = av_mallocz(nb_input_files)))
3590 ret = transcode_init();
3594 if (stdin_interaction) {
3595 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3598 timer_start = av_gettime();
3601 if ((ret = init_input_threads()) < 0)
3605 for (; received_sigterm == 0;) {
3606 int file_index, ist_index;
3608 int64_t cur_time= av_gettime();
3610 /* if 'q' pressed, exits */
3611 if (stdin_interaction)
3612 if (check_keyboard_interaction(cur_time) < 0)
3615 /* check if there's any stream where output is still needed */
3616 if (!need_output()) {
3617 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3621 /* select the stream that we must read now */
3622 file_index = select_input_file(no_packet);
3623 /* if none, if is finished */
3624 if (file_index < 0) {
3625 if (no_packet_count) {
3626 no_packet_count = 0;
3627 memset(no_packet, 0, nb_input_files);
3631 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3635 is = input_files[file_index]->ctx;
3636 ret = get_input_packet(input_files[file_index], &pkt);
3638 if (ret == AVERROR(EAGAIN)) {
3639 no_packet[file_index] = 1;
3644 if (ret != AVERROR_EOF) {
3645 print_error(is->filename, ret);
3649 input_files[file_index]->eof_reached = 1;
3651 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3652 ist = input_streams[input_files[file_index]->ist_index + i];
3653 if (ist->decoding_needed)
3654 output_packet(ist, NULL);
3663 no_packet_count = 0;
3664 memset(no_packet, 0, nb_input_files);
3667 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3668 is->streams[pkt.stream_index]);
3670 /* the following test is needed in case new streams appear
3671 dynamically in stream : we ignore them */
3672 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3673 goto discard_packet;
3674 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3675 ist = input_streams[ist_index];
3677 goto discard_packet;
3679 if (pkt.dts != AV_NOPTS_VALUE)
3680 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3681 if (pkt.pts != AV_NOPTS_VALUE)
3682 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3684 if (pkt.pts != AV_NOPTS_VALUE)
3685 pkt.pts *= ist->ts_scale;
3686 if (pkt.dts != AV_NOPTS_VALUE)
3687 pkt.dts *= ist->ts_scale;
3690 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3691 "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",
3692 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3693 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3694 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3695 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3696 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3697 input_files[ist->file_index]->ts_offset);
3700 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3701 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3702 int64_t delta = pkt_dts - ist->next_dts;
3703 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3704 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3705 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3706 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3707 pkt_dts+1<ist->pts){
3708 input_files[ist->file_index]->ts_offset -= delta;
3709 av_log(NULL, AV_LOG_DEBUG,
3710 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3711 delta, input_files[ist->file_index]->ts_offset);
3712 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3713 if (pkt.pts != AV_NOPTS_VALUE)
3714 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3717 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3718 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3719 pkt_dts+1<ist->pts){
3720 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3721 pkt.dts = AV_NOPTS_VALUE;
3723 if (pkt.pts != AV_NOPTS_VALUE){
3724 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3725 delta = pkt_pts - ist->next_dts;
3726 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3727 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3728 pkt_pts+1<ist->pts) {
3729 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3730 pkt.pts = AV_NOPTS_VALUE;
3736 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3737 if ((ret = output_packet(ist, &pkt)) < 0 ||
3738 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3740 av_strerror(ret, buf, sizeof(buf));
3741 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3742 ist->file_index, ist->st->index, buf);
3745 av_free_packet(&pkt);
3750 av_free_packet(&pkt);
3752 /* dump report by using the output first video and audio streams */
3753 print_report(0, timer_start, cur_time);
3756 free_input_threads();
3759 /* at the end of stream, we must flush the decoder buffers */
3760 for (i = 0; i < nb_input_streams; i++) {
3761 ist = input_streams[i];
3762 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3763 output_packet(ist, NULL);
3771 /* write the trailer if needed and close file */
3772 for (i = 0; i < nb_output_files; i++) {
3773 os = output_files[i]->ctx;
3774 av_write_trailer(os);
3777 /* dump report by using the first video and audio streams */
3778 print_report(1, timer_start, av_gettime());
3780 /* close each encoder */
3781 for (i = 0; i < nb_output_streams; i++) {
3782 ost = output_streams[i];
3783 if (ost->encoding_needed) {
3784 av_freep(&ost->st->codec->stats_in);
3785 avcodec_close(ost->st->codec);
3789 /* close each decoder */
3790 for (i = 0; i < nb_input_streams; i++) {
3791 ist = input_streams[i];
3792 if (ist->decoding_needed) {
3793 avcodec_close(ist->st->codec);
3801 av_freep(&no_packet);
3803 free_input_threads();
3806 if (output_streams) {
3807 for (i = 0; i < nb_output_streams; i++) {
3808 ost = output_streams[i];
3810 if (ost->stream_copy)
3811 av_freep(&ost->st->codec->extradata);
3813 fclose(ost->logfile);
3814 ost->logfile = NULL;
3816 av_freep(&ost->st->codec->subtitle_header);
3817 av_free(ost->forced_kf_pts);
3818 av_dict_free(&ost->opts);
3825 static int opt_frame_crop(const char *opt, const char *arg)
3827 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3828 return AVERROR(EINVAL);
3831 static int opt_pad(const char *opt, const char *arg)
3833 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3837 static int opt_video_channel(const char *opt, const char *arg)
3839 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3840 return opt_default("channel", arg);
3843 static int opt_video_standard(const char *opt, const char *arg)
3845 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3846 return opt_default("standard", arg);
3849 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3851 audio_codec_name = arg;
3852 return parse_option(o, "codec:a", arg, options);
3855 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3857 video_codec_name = arg;
3858 return parse_option(o, "codec:v", arg, options);
3861 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3863 subtitle_codec_name = arg;
3864 return parse_option(o, "codec:s", arg, options);
3867 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3869 return parse_option(o, "codec:d", arg, options);
3872 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3874 StreamMap *m = NULL;
3875 int i, negative = 0, file_idx;
3876 int sync_file_idx = -1, sync_stream_idx = 0;
3884 map = av_strdup(arg);
3886 /* parse sync stream first, just pick first matching stream */
3887 if (sync = strchr(map, ',')) {
3889 sync_file_idx = strtol(sync + 1, &sync, 0);
3890 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3891 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3896 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3897 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3898 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3899 sync_stream_idx = i;
3902 if (i == input_files[sync_file_idx]->nb_streams) {
3903 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3904 "match any streams.\n", arg);
3910 if (map[0] == '[') {
3911 /* this mapping refers to lavfi output */
3912 const char *c = map + 1;
3913 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3914 &o->nb_stream_maps, o->nb_stream_maps + 1);
3915 m = &o->stream_maps[o->nb_stream_maps - 1];
3916 m->linklabel = av_get_token(&c, "]");
3917 if (!m->linklabel) {
3918 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3922 file_idx = strtol(map, &p, 0);
3923 if (file_idx >= nb_input_files || file_idx < 0) {
3924 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3928 /* disable some already defined maps */
3929 for (i = 0; i < o->nb_stream_maps; i++) {
3930 m = &o->stream_maps[i];
3931 if (file_idx == m->file_index &&
3932 check_stream_specifier(input_files[m->file_index]->ctx,
3933 input_files[m->file_index]->ctx->streams[m->stream_index],
3934 *p == ':' ? p + 1 : p) > 0)
3938 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3939 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3940 *p == ':' ? p + 1 : p) <= 0)
3942 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3943 &o->nb_stream_maps, o->nb_stream_maps + 1);
3944 m = &o->stream_maps[o->nb_stream_maps - 1];
3946 m->file_index = file_idx;
3947 m->stream_index = i;
3949 if (sync_file_idx >= 0) {
3950 m->sync_file_index = sync_file_idx;
3951 m->sync_stream_index = sync_stream_idx;
3953 m->sync_file_index = file_idx;
3954 m->sync_stream_index = i;
3960 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3968 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3970 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3971 &o->nb_attachments, o->nb_attachments + 1);
3972 o->attachments[o->nb_attachments - 1] = arg;
3976 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3982 o->audio_channel_maps =
3983 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3984 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3985 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3987 /* muted channel syntax */
3988 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3989 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3990 m->file_idx = m->stream_idx = -1;
3992 m->ofile_idx = m->ostream_idx = -1;
3997 n = sscanf(arg, "%d.%d.%d:%d.%d",
3998 &m->file_idx, &m->stream_idx, &m->channel_idx,
3999 &m->ofile_idx, &m->ostream_idx);
4001 if (n != 3 && n != 5) {
4002 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
4003 "[file.stream.channel|-1][:syncfile:syncstream]\n");
4007 if (n != 5) // only file.stream.channel specified
4008 m->ofile_idx = m->ostream_idx = -1;
4011 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
4012 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
4016 if (m->stream_idx < 0 ||
4017 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
4018 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
4019 m->file_idx, m->stream_idx);
4022 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
4023 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
4024 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
4025 m->file_idx, m->stream_idx);
4028 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
4029 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
4030 m->file_idx, m->stream_idx, m->channel_idx);
4037 * Parse a metadata specifier in arg.
4038 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
4039 * @param index for type c/p, chapter/program index is written here
4040 * @param stream_spec for type s, the stream specifier is written here
4042 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
4050 if (*(++arg) && *arg != ':') {
4051 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
4054 *stream_spec = *arg == ':' ? arg + 1 : "";
4058 if (*(++arg) == ':')
4059 *index = strtol(++arg, NULL, 0);
4062 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
4069 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4071 AVDictionary **meta_in = NULL;
4072 AVDictionary **meta_out = NULL;
4074 char type_in, type_out;
4075 const char *istream_spec = NULL, *ostream_spec = NULL;
4076 int idx_in = 0, idx_out = 0;
4078 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4079 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4082 if (type_out == 'g' || !*outspec)
4083 o->metadata_global_manual = 1;
4084 if (type_out == 's' || !*outspec)
4085 o->metadata_streams_manual = 1;
4086 if (type_out == 'c' || !*outspec)
4087 o->metadata_chapters_manual = 1;
4091 if (type_in == 'g' || type_out == 'g')
4092 o->metadata_global_manual = 1;
4093 if (type_in == 's' || type_out == 's')
4094 o->metadata_streams_manual = 1;
4095 if (type_in == 'c' || type_out == 'c')
4096 o->metadata_chapters_manual = 1;
4098 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4099 if ((index) < 0 || (index) >= (nb_elems)) {\
4100 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4105 #define SET_DICT(type, meta, context, index)\
4108 meta = &context->metadata;\
4111 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4112 meta = &context->chapters[index]->metadata;\
4115 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4116 meta = &context->programs[index]->metadata;\
4118 default: av_assert0(0);\
4121 SET_DICT(type_in, meta_in, ic, idx_in);
4122 SET_DICT(type_out, meta_out, oc, idx_out);
4124 /* for input streams choose first matching stream */
4125 if (type_in == 's') {
4126 for (i = 0; i < ic->nb_streams; i++) {
4127 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4128 meta_in = &ic->streams[i]->metadata;
4134 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4139 if (type_out == 's') {
4140 for (i = 0; i < oc->nb_streams; i++) {
4141 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4142 meta_out = &oc->streams[i]->metadata;
4143 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4148 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4153 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4156 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4157 struct tm time = *gmtime((time_t*)&recording_timestamp);
4158 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4159 parse_option(o, "metadata", buf, options);
4161 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4162 "tag instead.\n", opt);
4166 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4168 const char *codec_string = encoder ? "encoder" : "decoder";
4172 avcodec_find_encoder_by_name(name) :
4173 avcodec_find_decoder_by_name(name);
4175 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4178 if (codec->type != type) {
4179 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4185 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4187 char *codec_name = NULL;
4189 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4191 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4192 st->codec->codec_id = codec->id;
4195 return avcodec_find_decoder(st->codec->codec_id);
4199 * Add all the streams from the given input file to the global
4200 * list of input streams.
4202 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4205 char *next, *codec_tag = NULL;
4207 for (i = 0; i < ic->nb_streams; i++) {
4208 AVStream *st = ic->streams[i];
4209 AVCodecContext *dec = st->codec;
4210 InputStream *ist = av_mallocz(sizeof(*ist));
4211 char *framerate = NULL;
4216 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4217 input_streams[nb_input_streams - 1] = ist;
4220 ist->file_index = nb_input_files;
4222 st->discard = AVDISCARD_ALL;
4223 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
4225 ist->ts_scale = 1.0;
4226 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4228 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4230 uint32_t tag = strtol(codec_tag, &next, 0);
4232 tag = AV_RL32(codec_tag);
4233 st->codec->codec_tag = tag;
4236 ist->dec = choose_decoder(o, ic, st);
4238 switch (dec->codec_type) {
4239 case AVMEDIA_TYPE_VIDEO:
4241 ist->dec = avcodec_find_decoder(dec->codec_id);
4243 dec->flags |= CODEC_FLAG_EMU_EDGE;
4246 ist->resample_height = dec->height;
4247 ist->resample_width = dec->width;
4248 ist->resample_pix_fmt = dec->pix_fmt;
4250 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4251 if (framerate && av_parse_video_rate(&ist->framerate,
4253 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4258 ist->top_field_first = -1;
4259 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4262 case AVMEDIA_TYPE_AUDIO:
4263 guess_input_channel_layout(ist);
4265 ist->resample_sample_fmt = dec->sample_fmt;
4266 ist->resample_sample_rate = dec->sample_rate;
4267 ist->resample_channels = dec->channels;
4268 ist->resample_channel_layout = dec->channel_layout;
4271 case AVMEDIA_TYPE_DATA:
4272 case AVMEDIA_TYPE_SUBTITLE:
4274 ist->dec = avcodec_find_decoder(dec->codec_id);
4276 case AVMEDIA_TYPE_ATTACHMENT:
4277 case AVMEDIA_TYPE_UNKNOWN:
4285 static void assert_file_overwrite(const char *filename)
4287 if ((!file_overwrite || no_file_overwrite) &&
4288 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4289 av_strstart(filename, "file:", NULL))) {
4290 if (avio_check(filename, 0) == 0) {
4291 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
4292 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4295 signal(SIGINT, SIG_DFL);
4296 if (!read_yesno()) {
4297 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4303 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4310 static void dump_attachment(AVStream *st, const char *filename)
4313 AVIOContext *out = NULL;
4314 AVDictionaryEntry *e;
4316 if (!st->codec->extradata_size) {
4317 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4318 nb_input_files - 1, st->index);
4321 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4322 filename = e->value;
4324 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4325 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4329 assert_file_overwrite(filename);
4331 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4332 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4337 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4342 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4344 AVFormatContext *ic;
4345 AVInputFormat *file_iformat = NULL;
4349 AVDictionary **opts;
4350 int orig_nb_streams; // number of streams before avformat_find_stream_info
4353 if (!(file_iformat = av_find_input_format(o->format))) {
4354 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4359 if (!strcmp(filename, "-"))
4362 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
4363 strcmp(filename, "/dev/stdin");
4365 /* get default parameters from command line */
4366 ic = avformat_alloc_context();
4368 print_error(filename, AVERROR(ENOMEM));
4371 if (o->nb_audio_sample_rate) {
4372 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4373 av_dict_set(&format_opts, "sample_rate", buf, 0);
4375 if (o->nb_audio_channels) {
4376 /* because we set audio_channels based on both the "ac" and
4377 * "channel_layout" options, we need to check that the specified
4378 * demuxer actually has the "channels" option before setting it */
4379 if (file_iformat && file_iformat->priv_class &&
4380 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4381 AV_OPT_SEARCH_FAKE_OBJ)) {
4382 snprintf(buf, sizeof(buf), "%d",
4383 o->audio_channels[o->nb_audio_channels - 1].u.i);
4384 av_dict_set(&format_opts, "channels", buf, 0);
4387 if (o->nb_frame_rates) {
4388 /* set the format-level framerate option;
4389 * this is important for video grabbers, e.g. x11 */
4390 if (file_iformat && file_iformat->priv_class &&
4391 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4392 AV_OPT_SEARCH_FAKE_OBJ)) {
4393 av_dict_set(&format_opts, "framerate",
4394 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4397 if (o->nb_frame_sizes) {
4398 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4400 if (o->nb_frame_pix_fmts)
4401 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4403 ic->video_codec_id = video_codec_name ?
4404 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4405 ic->audio_codec_id = audio_codec_name ?
4406 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4407 ic->subtitle_codec_id= subtitle_codec_name ?
4408 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4409 ic->flags |= AVFMT_FLAG_NONBLOCK;
4410 ic->interrupt_callback = int_cb;
4412 /* open the input file with generic avformat function */
4413 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4415 print_error(filename, err);
4418 assert_avoptions(format_opts);
4420 /* apply forced codec ids */
4421 for (i = 0; i < ic->nb_streams; i++)
4422 choose_decoder(o, ic, ic->streams[i]);
4424 /* Set AVCodecContext options for avformat_find_stream_info */
4425 opts = setup_find_stream_info_opts(ic, codec_opts);
4426 orig_nb_streams = ic->nb_streams;
4428 /* If not enough info to get the stream parameters, we decode the
4429 first frames to get it. (used in mpeg case for example) */
4430 ret = avformat_find_stream_info(ic, opts);
4432 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4433 avformat_close_input(&ic);
4437 timestamp = o->start_time;
4438 /* add the stream start time */
4439 if (ic->start_time != AV_NOPTS_VALUE)
4440 timestamp += ic->start_time;
4442 /* if seeking requested, we execute it */
4443 if (o->start_time != 0) {
4444 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4446 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4447 filename, (double)timestamp / AV_TIME_BASE);
4451 /* update the current parameters so that they match the one of the input stream */
4452 add_input_streams(o, ic);
4454 /* dump the file content */
4455 av_dump_format(ic, nb_input_files, filename, 0);
4457 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4458 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4461 input_files[nb_input_files - 1]->ctx = ic;
4462 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4463 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4464 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4465 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4467 for (i = 0; i < o->nb_dump_attachment; i++) {
4470 for (j = 0; j < ic->nb_streams; j++) {
4471 AVStream *st = ic->streams[j];
4473 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4474 dump_attachment(st, o->dump_attachment[i].u.str);
4478 for (i = 0; i < orig_nb_streams; i++)
4479 av_dict_free(&opts[i]);
4482 reset_options(o, 1);
4486 static uint8_t *get_line(AVIOContext *s)
4492 if (avio_open_dyn_buf(&line) < 0) {
4493 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4497 while ((c = avio_r8(s)) && c != '\n')
4500 avio_close_dyn_buf(line, &buf);
4505 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4508 char filename[1000];
4509 const char *base[3] = { getenv("AVCONV_DATADIR"),
4514 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4518 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4519 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4520 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4523 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4524 i != 1 ? "" : "/.avconv", preset_name);
4525 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4531 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4533 char *codec_name = NULL;
4535 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4537 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4538 NULL, ost->st->codec->codec_type);
4539 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4540 } else if (!strcmp(codec_name, "copy"))
4541 ost->stream_copy = 1;
4543 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4544 ost->st->codec->codec_id = ost->enc->id;
4548 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4551 AVStream *st = avformat_new_stream(oc, NULL);
4552 int idx = oc->nb_streams - 1, ret = 0;
4553 char *bsf = NULL, *next, *codec_tag = NULL;
4554 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4556 char *buf = NULL, *arg = NULL, *preset = NULL;
4557 AVIOContext *s = NULL;
4560 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4564 if (oc->nb_streams - 1 < o->nb_streamid_map)
4565 st->id = o->streamid_map[oc->nb_streams - 1];
4567 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4568 nb_output_streams + 1);
4569 if (!(ost = av_mallocz(sizeof(*ost))))
4571 output_streams[nb_output_streams - 1] = ost;
4573 ost->file_index = nb_output_files;
4576 st->codec->codec_type = type;
4577 choose_encoder(o, oc, ost);
4579 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st, ost->enc);
4582 avcodec_get_context_defaults3(st->codec, ost->enc);
4583 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4585 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4586 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4589 if (!buf[0] || buf[0] == '#') {
4593 if (!(arg = strchr(buf, '='))) {
4594 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4598 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4600 } while (!s->eof_reached);
4604 av_log(NULL, AV_LOG_FATAL,
4605 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4606 preset, ost->file_index, ost->index);
4610 ost->max_frames = INT64_MAX;
4611 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4613 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4615 if (next = strchr(bsf, ','))
4617 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4618 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4622 bsfc_prev->next = bsfc;
4624 ost->bitstream_filters = bsfc;
4630 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4632 uint32_t tag = strtol(codec_tag, &next, 0);
4634 tag = AV_RL32(codec_tag);
4635 st->codec->codec_tag = tag;
4638 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4639 if (qscale >= 0 || same_quant) {
4640 st->codec->flags |= CODEC_FLAG_QSCALE;
4641 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4644 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4645 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4647 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4648 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4649 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4651 ost->source_index = source_index;
4652 if (source_index >= 0) {
4653 ost->sync_ist = input_streams[source_index];
4654 input_streams[source_index]->discard = 0;
4655 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4661 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4664 const char *p = str;
4671 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4678 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4682 AVCodecContext *video_enc;
4683 char *frame_rate = NULL;
4685 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4687 video_enc = st->codec;
4689 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4690 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4691 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4695 if (!ost->stream_copy) {
4696 const char *p = NULL;
4697 char *frame_size = NULL;
4698 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4699 char *intra_matrix = NULL, *inter_matrix = NULL;
4700 const char *filters = "null";
4703 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4704 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4705 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4709 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4710 if (frame_aspect_ratio) {
4712 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4713 q.num <= 0 || q.den <= 0) {
4714 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4717 ost->frame_aspect_ratio = av_q2d(q);
4720 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4721 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4722 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4723 ost->keep_pix_fmt = 1;
4724 if (!*++frame_pix_fmt)
4725 frame_pix_fmt = NULL;
4727 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4728 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4731 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4734 video_enc->gop_size = 0;
4735 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4737 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4738 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4741 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4743 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4745 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4746 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4749 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4752 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4753 for (i = 0; p; i++) {
4755 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4757 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4760 /* FIXME realloc failure */
4761 video_enc->rc_override =
4762 av_realloc(video_enc->rc_override,
4763 sizeof(RcOverride) * (i + 1));
4764 video_enc->rc_override[i].start_frame = start;
4765 video_enc->rc_override[i].end_frame = end;
4767 video_enc->rc_override[i].qscale = q;
4768 video_enc->rc_override[i].quality_factor = 1.0;
4771 video_enc->rc_override[i].qscale = 0;
4772 video_enc->rc_override[i].quality_factor = -q/100.0;
4777 video_enc->rc_override_count = i;
4778 if (!video_enc->rc_initial_buffer_occupancy)
4779 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4780 video_enc->intra_dc_precision = intra_dc_precision - 8;
4783 video_enc->flags|= CODEC_FLAG_PSNR;
4788 video_enc->flags |= CODEC_FLAG_PASS1;
4791 video_enc->flags |= CODEC_FLAG_PASS2;
4795 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
4796 if (ost->forced_keyframes)
4797 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
4799 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4801 ost->top_field_first = -1;
4802 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4804 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4805 ost->avfilter = av_strdup(filters);
4807 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4813 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4818 AVCodecContext *audio_enc;
4820 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4823 audio_enc = st->codec;
4824 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4826 if (!ost->stream_copy) {
4827 char *sample_fmt = NULL;
4828 const char *filters = "anull";
4830 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4832 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4834 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4835 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4839 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4841 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4843 av_assert1(filters);
4844 ost->avfilter = av_strdup(filters);
4846 /* check for channel mapping for this audio stream */
4847 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4848 AudioChannelMap *map = &o->audio_channel_maps[n];
4849 InputStream *ist = input_streams[ost->source_index];
4850 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4851 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4852 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4853 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4854 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4856 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4857 ost->file_index, ost->st->index);
4865 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4869 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4870 if (!ost->stream_copy) {
4871 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4878 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4880 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4881 ost->stream_copy = 1;
4885 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4889 AVCodecContext *subtitle_enc;
4891 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4893 subtitle_enc = st->codec;
4895 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4897 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4902 /* arg format is "output-stream-index:streamid-value". */
4903 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4909 av_strlcpy(idx_str, arg, sizeof(idx_str));
4910 p = strchr(idx_str, ':');
4912 av_log(NULL, AV_LOG_FATAL,
4913 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4918 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4919 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4920 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4924 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4926 AVFormatContext *is = ifile->ctx;
4927 AVFormatContext *os = ofile->ctx;
4930 for (i = 0; i < is->nb_chapters; i++) {
4931 AVChapter *in_ch = is->chapters[i], *out_ch;
4932 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4933 AV_TIME_BASE_Q, in_ch->time_base);
4934 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4935 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4938 if (in_ch->end < ts_off)
4940 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4943 out_ch = av_mallocz(sizeof(AVChapter));
4945 return AVERROR(ENOMEM);
4947 out_ch->id = in_ch->id;
4948 out_ch->time_base = in_ch->time_base;
4949 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4950 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4953 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4956 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4958 return AVERROR(ENOMEM);
4959 os->chapters[os->nb_chapters - 1] = out_ch;
4964 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4967 AVFormatContext *ic = avformat_alloc_context();
4969 ic->interrupt_callback = int_cb;
4970 err = avformat_open_input(&ic, filename, NULL, NULL);
4973 /* copy stream format */
4974 for(i=0;i<ic->nb_streams;i++) {
4978 AVCodecContext *avctx;
4980 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4981 ost = new_output_stream(o, s, codec->type, -1);
4986 // FIXME: a more elegant solution is needed
4987 memcpy(st, ic->streams[i], sizeof(AVStream));
4989 st->info = av_malloc(sizeof(*st->info));
4990 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4992 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4994 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4995 choose_sample_fmt(st, codec);
4996 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4997 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
5000 avformat_close_input(&ic);
5004 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
5005 AVFormatContext *oc)
5009 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5010 ofilter->out_tmp->pad_idx)) {
5011 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
5012 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
5014 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
5019 ost->source_index = -1;
5020 ost->filter = ofilter;
5024 if (ost->stream_copy) {
5025 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
5026 "which is fed from a complex filtergraph. Filtering and streamcopy "
5027 "cannot be used together.\n", ost->file_index, ost->index);
5030 if (o->recording_time != INT64_MAX)
5031 av_log(NULL, AV_LOG_WARNING,
5032 "-t does not work with -filter_complex (yet).\n");
5034 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
5035 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
5038 avfilter_inout_free(&ofilter->out_tmp);
5041 static void opt_output_file(void *optctx, const char *filename)
5043 OptionsContext *o = optctx;
5044 AVFormatContext *oc;
5046 AVOutputFormat *file_oformat;
5050 if (configure_complex_filters() < 0) {
5051 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
5055 if (!strcmp(filename, "-"))
5058 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
5060 print_error(filename, err);
5063 file_oformat= oc->oformat;
5064 oc->interrupt_callback = int_cb;
5066 /* create streams for all unlabeled output pads */
5067 for (i = 0; i < nb_filtergraphs; i++) {
5068 FilterGraph *fg = filtergraphs[i];
5069 for (j = 0; j < fg->nb_outputs; j++) {
5070 OutputFilter *ofilter = fg->outputs[j];
5072 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5075 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5076 ofilter->out_tmp->pad_idx)) {
5077 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5078 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5079 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5081 init_output_filter(ofilter, o, oc);
5085 if (!strcmp(file_oformat->name, "ffm") &&
5086 av_strstart(filename, "http:", NULL)) {
5088 /* special case for files sent to ffserver: we get the stream
5089 parameters from ffserver */
5090 int err = read_ffserver_streams(o, oc, filename);
5092 print_error(filename, err);
5095 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5096 ost = output_streams[j];
5097 for (i = 0; i < nb_input_streams; i++) {
5098 ist = input_streams[i];
5099 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5101 ost->source_index= i;
5102 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
5103 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
5105 ist->st->discard = AVDISCARD_NONE;
5110 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));
5114 } else if (!o->nb_stream_maps) {
5115 /* pick the "best" stream of each type */
5117 /* video: highest resolution */
5118 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5119 int area = 0, idx = -1;
5120 for (i = 0; i < nb_input_streams; i++) {
5121 ist = input_streams[i];
5122 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5123 ist->st->codec->width * ist->st->codec->height > area) {
5124 area = ist->st->codec->width * ist->st->codec->height;
5129 new_video_stream(o, oc, idx);
5132 /* audio: most channels */
5133 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5134 int channels = 0, idx = -1;
5135 for (i = 0; i < nb_input_streams; i++) {
5136 ist = input_streams[i];
5137 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5138 ist->st->codec->channels > channels) {
5139 channels = ist->st->codec->channels;
5144 new_audio_stream(o, oc, idx);
5147 /* subtitles: pick first */
5148 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5149 for (i = 0; i < nb_input_streams; i++)
5150 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5151 new_subtitle_stream(o, oc, i);
5155 /* do something with data? */
5157 for (i = 0; i < o->nb_stream_maps; i++) {
5158 StreamMap *map = &o->stream_maps[i];
5159 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5164 if (map->linklabel) {
5166 OutputFilter *ofilter = NULL;
5169 for (j = 0; j < nb_filtergraphs; j++) {
5170 fg = filtergraphs[j];
5171 for (k = 0; k < fg->nb_outputs; k++) {
5172 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5173 if (out && !strcmp(out->name, map->linklabel)) {
5174 ofilter = fg->outputs[k];
5181 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5182 "in any defined filter graph.\n", map->linklabel);
5185 init_output_filter(ofilter, o, oc);
5187 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5188 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5190 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5192 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5194 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5197 switch (ist->st->codec->codec_type) {
5198 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5199 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5200 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5201 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5202 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5204 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5205 map->file_index, map->stream_index);
5213 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5214 AVDictionaryEntry *e;
5215 ost = output_streams[i];
5217 if ( ost->stream_copy
5218 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5219 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5220 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5224 /* handle attached files */
5225 for (i = 0; i < o->nb_attachments; i++) {
5227 uint8_t *attachment;
5231 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5232 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5236 if ((len = avio_size(pb)) <= 0) {
5237 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5241 if (!(attachment = av_malloc(len))) {
5242 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5246 avio_read(pb, attachment, len);
5248 ost = new_attachment_stream(o, oc, -1);
5249 ost->stream_copy = 0;
5250 ost->attachment_filename = o->attachments[i];
5251 ost->st->codec->extradata = attachment;
5252 ost->st->codec->extradata_size = len;
5254 p = strrchr(o->attachments[i], '/');
5255 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5259 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5260 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5263 output_files[nb_output_files - 1]->ctx = oc;
5264 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5265 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5266 if (o->recording_time != INT64_MAX)
5267 oc->duration = o->recording_time;
5268 output_files[nb_output_files - 1]->start_time = o->start_time;
5269 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5270 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5272 /* check filename in case of an image number is expected */
5273 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5274 if (!av_filename_number_test(oc->filename)) {
5275 print_error(oc->filename, AVERROR(EINVAL));
5280 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5281 /* test if it already exists to avoid losing precious files */
5282 assert_file_overwrite(filename);
5285 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5286 &oc->interrupt_callback,
5287 &output_files[nb_output_files - 1]->opts)) < 0) {
5288 print_error(filename, err);
5293 if (o->mux_preload) {
5295 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5296 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5298 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5301 for (i = 0; i < o->nb_metadata_map; i++) {
5303 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5305 if (in_file_index >= nb_input_files) {
5306 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5309 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5313 if (o->chapters_input_file >= nb_input_files) {
5314 if (o->chapters_input_file == INT_MAX) {
5315 /* copy chapters from the first input file that has them*/
5316 o->chapters_input_file = -1;
5317 for (i = 0; i < nb_input_files; i++)
5318 if (input_files[i]->ctx->nb_chapters) {
5319 o->chapters_input_file = i;
5323 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5324 o->chapters_input_file);
5328 if (o->chapters_input_file >= 0)
5329 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5330 !o->metadata_chapters_manual);
5332 /* copy global metadata by default */
5333 if (!o->metadata_global_manual && nb_input_files){
5334 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5335 AV_DICT_DONT_OVERWRITE);
5336 if(o->recording_time != INT64_MAX)
5337 av_dict_set(&oc->metadata, "duration", NULL, 0);
5338 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
5340 if (!o->metadata_streams_manual)
5341 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5343 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5345 ist = input_streams[output_streams[i]->source_index];
5346 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5349 /* process manually set metadata */
5350 for (i = 0; i < o->nb_metadata; i++) {
5353 const char *stream_spec;
5354 int index = 0, j, ret = 0;
5356 val = strchr(o->metadata[i].u.str, '=');
5358 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5359 o->metadata[i].u.str);
5364 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5366 for (j = 0; j < oc->nb_streams; j++) {
5367 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5368 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5379 if (index < 0 || index >= oc->nb_chapters) {
5380 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5383 m = &oc->chapters[index]->metadata;
5386 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5389 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5393 reset_options(o, 0);
5396 /* same option as mencoder */
5397 static int opt_pass(const char *opt, const char *arg)
5399 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5403 static int64_t getmaxrss(void)
5405 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5406 struct rusage rusage;
5407 getrusage(RUSAGE_SELF, &rusage);
5408 return (int64_t)rusage.ru_maxrss * 1024;
5409 #elif HAVE_GETPROCESSMEMORYINFO
5411 PROCESS_MEMORY_COUNTERS memcounters;
5412 proc = GetCurrentProcess();
5413 memcounters.cb = sizeof(memcounters);
5414 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5415 return memcounters.PeakPagefileUsage;
5421 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5423 return parse_option(o, "q:a", arg, options);
5426 static void show_usage(void)
5428 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5429 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5430 av_log(NULL, AV_LOG_INFO, "\n");
5433 static int opt_help(const char *opt, const char *arg)
5435 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5436 av_log_set_callback(log_callback_help);
5438 show_help_options(options, "Main options:\n",
5439 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5440 show_help_options(options, "\nAdvanced options:\n",
5441 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5443 show_help_options(options, "\nVideo options:\n",
5444 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5446 show_help_options(options, "\nAdvanced Video options:\n",
5447 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5448 OPT_VIDEO | OPT_EXPERT);
5449 show_help_options(options, "\nAudio options:\n",
5450 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5452 show_help_options(options, "\nAdvanced Audio options:\n",
5453 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5454 OPT_AUDIO | OPT_EXPERT);
5455 show_help_options(options, "\nSubtitle options:\n",
5456 OPT_SUBTITLE | OPT_GRAB,
5458 show_help_options(options, "\nAudio/Video grab options:\n",
5462 show_help_children(avcodec_get_class(), flags);
5463 show_help_children(avformat_get_class(), flags);
5464 show_help_children(sws_get_class(), flags);
5465 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
5470 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5472 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5473 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5475 if (!strncmp(arg, "pal-", 4)) {
5478 } else if (!strncmp(arg, "ntsc-", 5)) {
5481 } else if (!strncmp(arg, "film-", 5)) {
5485 /* Try to determine PAL/NTSC by peeking in the input files */
5486 if (nb_input_files) {
5488 for (j = 0; j < nb_input_files; j++) {
5489 for (i = 0; i < input_files[j]->nb_streams; i++) {
5490 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5491 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5493 fr = c->time_base.den * 1000 / c->time_base.num;
5497 } else if ((fr == 29970) || (fr == 23976)) {
5502 if (norm != UNKNOWN)
5506 if (norm != UNKNOWN)
5507 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5510 if (norm == UNKNOWN) {
5511 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5512 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5513 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5517 if (!strcmp(arg, "vcd")) {
5518 opt_video_codec(o, "c:v", "mpeg1video");
5519 opt_audio_codec(o, "c:a", "mp2");
5520 parse_option(o, "f", "vcd", options);
5522 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5523 parse_option(o, "r", frame_rates[norm], options);
5524 opt_default("g", norm == PAL ? "15" : "18");
5526 opt_default("b:v", "1150000");
5527 opt_default("maxrate", "1150000");
5528 opt_default("minrate", "1150000");
5529 opt_default("bufsize", "327680"); // 40*1024*8;
5531 opt_default("b:a", "224000");
5532 parse_option(o, "ar", "44100", options);
5533 parse_option(o, "ac", "2", options);
5535 opt_default("packetsize", "2324");
5536 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5538 /* We have to offset the PTS, so that it is consistent with the SCR.
5539 SCR starts at 36000, but the first two packs contain only padding
5540 and the first pack from the other stream, respectively, may also have
5541 been written before.
5542 So the real data starts at SCR 36000+3*1200. */
5543 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5544 } else if (!strcmp(arg, "svcd")) {
5546 opt_video_codec(o, "c:v", "mpeg2video");
5547 opt_audio_codec(o, "c:a", "mp2");
5548 parse_option(o, "f", "svcd", options);
5550 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5551 parse_option(o, "r", frame_rates[norm], options);
5552 parse_option(o, "pix_fmt", "yuv420p", options);
5553 opt_default("g", norm == PAL ? "15" : "18");
5555 opt_default("b:v", "2040000");
5556 opt_default("maxrate", "2516000");
5557 opt_default("minrate", "0"); // 1145000;
5558 opt_default("bufsize", "1835008"); // 224*1024*8;
5559 opt_default("scan_offset", "1");
5562 opt_default("b:a", "224000");
5563 parse_option(o, "ar", "44100", options);
5565 opt_default("packetsize", "2324");
5567 } else if (!strcmp(arg, "dvd")) {
5569 opt_video_codec(o, "c:v", "mpeg2video");
5570 opt_audio_codec(o, "c:a", "ac3");
5571 parse_option(o, "f", "dvd", options);
5573 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5574 parse_option(o, "r", frame_rates[norm], options);
5575 parse_option(o, "pix_fmt", "yuv420p", options);
5576 opt_default("g", norm == PAL ? "15" : "18");
5578 opt_default("b:v", "6000000");
5579 opt_default("maxrate", "9000000");
5580 opt_default("minrate", "0"); // 1500000;
5581 opt_default("bufsize", "1835008"); // 224*1024*8;
5583 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5584 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5586 opt_default("b:a", "448000");
5587 parse_option(o, "ar", "48000", options);
5589 } else if (!strncmp(arg, "dv", 2)) {
5591 parse_option(o, "f", "dv", options);
5593 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5594 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5595 norm == PAL ? "yuv420p" : "yuv411p", options);
5596 parse_option(o, "r", frame_rates[norm], options);
5598 parse_option(o, "ar", "48000", options);
5599 parse_option(o, "ac", "2", options);
5602 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5603 return AVERROR(EINVAL);
5608 static int opt_vstats_file(const char *opt, const char *arg)
5610 av_free (vstats_filename);
5611 vstats_filename = av_strdup (arg);
5615 static int opt_vstats(const char *opt, const char *arg)
5618 time_t today2 = time(NULL);
5619 struct tm *today = localtime(&today2);
5621 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5623 return opt_vstats_file(opt, filename);
5626 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5628 return parse_option(o, "frames:v", arg, options);
5631 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5633 return parse_option(o, "frames:a", arg, options);
5636 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5638 return parse_option(o, "frames:d", arg, options);
5641 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5644 char filename[1000], line[1000], tmp_line[1000];
5645 const char *codec_name = *opt == 'v' ? video_codec_name :
5646 *opt == 'a' ? audio_codec_name :
5647 subtitle_codec_name;
5649 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5650 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5651 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5653 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5657 while (fgets(line, sizeof(line), f)) {
5658 char *key = tmp_line, *value, *endptr;
5660 if (strcspn(line, "#\n\r") == 0)
5662 strcpy(tmp_line, line);
5663 if (!av_strtok(key, "=", &value) ||
5664 !av_strtok(value, "\r\n", &endptr)) {
5665 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5668 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5670 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5671 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5672 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5673 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5674 else if (opt_default(key, value) < 0) {
5675 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5676 filename, line, key, value);
5686 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5690 static int opt_passlogfile(const char *opt, const char *arg)
5692 pass_logfilename_prefix = arg;
5693 #if CONFIG_LIBX264_ENCODER
5694 return opt_default(opt, arg);
5700 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5702 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5703 int ret = parse_option(o, s, arg, options);
5708 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5710 if(!strcmp(opt, "b")){
5711 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5712 return parse_option(o, "b:v", arg, options);
5714 return opt_default(opt, arg);
5717 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5721 if(!strcmp(opt, "qscale")){
5722 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5723 return parse_option(o, "q:v", arg, options);
5725 s = av_asprintf("q%s", opt + 6);
5726 ret = parse_option(o, s, arg, options);
5731 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5733 if(!strcmp(opt, "profile")){
5734 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5735 return parse_option(o, "profile:v", arg, options);
5737 return opt_default(opt, arg);
5740 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5742 return parse_option(o, "filter:v", arg, options);
5745 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5747 return parse_option(o, "filter:a", arg, options);
5750 static int opt_vsync(const char *opt, const char *arg)
5752 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5753 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5754 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5755 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5757 if (video_sync_method == VSYNC_AUTO)
5758 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5762 static int opt_deinterlace(const char *opt, const char *arg)
5764 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5769 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5771 char *tcr = av_asprintf("timecode=%s", arg);
5772 int ret = parse_option(o, "metadata:g", tcr, options);
5774 ret = opt_default("gop_timecode", arg);
5779 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5781 int idx = locate_option(argc, argv, options, "cpuflags");
5782 if (idx && argv[idx + 1])
5783 opt_cpuflags("cpuflags", argv[idx + 1]);
5786 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5788 char layout_str[32];
5791 int ret, channels, ac_str_size;
5794 layout = av_get_channel_layout(arg);
5796 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5797 return AVERROR(EINVAL);
5799 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5800 ret = opt_default(opt, layout_str);
5804 /* set 'ac' option based on channel layout */
5805 channels = av_get_channel_layout_nb_channels(layout);
5806 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5807 stream_str = strchr(opt, ':');
5808 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5809 ac_str = av_mallocz(ac_str_size);
5811 return AVERROR(ENOMEM);
5812 av_strlcpy(ac_str, "ac", 3);
5814 av_strlcat(ac_str, stream_str, ac_str_size);
5815 ret = parse_option(o, ac_str, layout_str, options);
5821 static int opt_filter_complex(const char *opt, const char *arg)
5823 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5824 &nb_filtergraphs, nb_filtergraphs + 1);
5825 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5826 return AVERROR(ENOMEM);
5827 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5828 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5832 static int opt_progress(const char *opt, const char *arg)
5834 AVIOContext *avio = NULL;
5837 if (!strcmp(arg, "-"))
5839 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
5841 av_log(0, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
5842 arg, av_err2str(ret));
5845 progress_avio = avio;
5849 #define OFFSET(x) offsetof(OptionsContext, x)
5850 static const OptionDef options[] = {
5852 #include "cmdutils_common_opts.h"
5853 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5854 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5855 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5856 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5857 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5858 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5859 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5860 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5861 { "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]" },
5862 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5863 "outfile[,metadata]:infile[,metadata]" },
5864 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5865 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5866 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5867 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5868 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5869 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5870 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5871 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5872 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5873 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5874 "add timings for benchmarking" },
5875 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5876 "add timings for each task" },
5877 { "progress", HAS_ARG | OPT_EXPERT, {(void*)opt_progress},
5878 "write program-readable progress information", "url" },
5879 { "stdin", OPT_BOOL | OPT_EXPERT, {(void*)&stdin_interaction},
5880 "enable or disable interaction on standard input" },
5881 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5882 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5883 "dump each input packet" },
5884 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5885 "when dumping packets, also dump the payload" },
5886 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5887 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5888 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5889 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5890 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5891 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5892 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5893 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5894 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5895 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5896 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5897 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5898 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5899 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5900 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5901 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5902 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5903 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5904 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5905 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5906 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5907 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5908 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5911 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5912 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5913 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5914 { "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" },
5915 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5916 { "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" },
5917 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5918 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5919 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5920 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5921 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5922 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5923 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5924 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5925 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5926 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5927 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5928 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5929 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5930 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5931 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5932 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5933 "use same quantizer as source (implies VBR)" },
5934 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
5935 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5936 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5937 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5938 "this option is deprecated, use the yadif filter instead" },
5939 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5940 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5941 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5942 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5943 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5944 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5945 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5946 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5947 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5948 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5949 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5950 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5951 { "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" },
5952 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5955 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5956 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5957 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5958 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5959 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5960 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5961 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5962 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5963 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5964 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5965 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
5967 /* subtitle options */
5968 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5969 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5970 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5973 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5974 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5975 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5978 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5979 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5981 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5982 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5983 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5985 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5986 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5987 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5988 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5989 /* data codec support */
5990 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5991 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5993 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5997 int main(int argc, char **argv)
5999 OptionsContext o = { 0 };
6002 reset_options(&o, 0);
6004 av_log_set_flags(AV_LOG_SKIP_REPEATED);
6005 parse_loglevel(argc, argv, options);
6007 if(argc>1 && !strcmp(argv[1], "-d")){
6009 av_log_set_callback(log_callback_null);
6014 avcodec_register_all();
6016 avdevice_register_all();
6018 avfilter_register_all();
6020 avformat_network_init();
6022 show_banner(argc, argv, options);
6026 parse_cpuflags(argc, argv, options);
6029 parse_options(&o, argc, argv, options, opt_output_file);
6031 if (nb_output_files <= 0 && nb_input_files == 0) {
6033 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
6037 /* file converter / grab */
6038 if (nb_output_files <= 0) {
6039 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
6043 if (nb_input_files == 0) {
6044 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
6048 current_time = ti = getutime();
6049 if (transcode() < 0)
6051 ti = getutime() - ti;
6053 int maxrss = getmaxrss() / 1024;
6054 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);