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 (in AV_TIME_BASE units) */
230 int64_t dts; ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
232 int64_t next_pts; ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
233 int64_t pts; ///< current pts of the decoded frame (in AV_TIME_BASE units)
234 int wrap_correction_done;
236 int is_start; /* is 1 at the start and after a discontinuity */
238 int showed_multi_packet_warning;
240 AVRational framerate; /* framerate forced with -r */
245 int resample_pix_fmt;
247 int resample_sample_fmt;
248 int resample_sample_rate;
249 int resample_channels;
250 uint64_t resample_channel_layout;
252 /* a pool of free buffers for decoded data */
253 FrameBuffer *buffer_pool;
256 /* decoded data from this stream goes into all those filters
257 * currently video and audio only */
258 InputFilter **filters;
262 typedef struct InputFile {
263 AVFormatContext *ctx;
264 int eof_reached; /* true if eof reached */
265 int unavailable; /* true if the file is unavailable (possibly temporarily) */
266 int ist_index; /* index of first stream in input_streams */
268 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
269 from ctx.nb_streams if new streams appear during av_read_frame() */
270 int nb_streams_warn; /* number of streams that the user was warned of */
274 pthread_t thread; /* thread reading from this file */
275 int finished; /* the thread has exited */
276 int joined; /* the thread has been joined */
277 pthread_mutex_t fifo_lock; /* lock for access to fifo */
278 pthread_cond_t fifo_cond; /* the main thread will signal on this cond after reading from fifo */
279 AVFifoBuffer *fifo; /* demuxed packets are stored here; freed by the main thread */
283 typedef struct OutputStream {
284 int file_index; /* file index */
285 int index; /* stream index in the output file */
286 int source_index; /* InputStream index */
287 AVStream *st; /* stream in the output file */
288 int encoding_needed; /* true if encoding needed for this stream */
290 /* input pts and corresponding output pts
292 struct InputStream *sync_ist; /* input stream to sync against */
293 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
294 /* pts of the first frame encoded for this stream, used for limiting
297 AVBitStreamFilterContext *bitstream_filters;
300 AVFrame *filtered_frame;
303 AVRational frame_rate;
307 float frame_aspect_ratio;
310 /* forced key frames */
311 int64_t *forced_kf_pts;
314 char *forced_keyframes;
317 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
318 int audio_channels_mapped; /* number of channels in audio_channels_map */
322 OutputFilter *filter;
326 int64_t swr_dither_method;
327 double swr_dither_scale;
329 int is_past_recording_time;
330 int unavailable; /* true if the steram is unavailable (possibly temporarily) */
332 const char *attachment_filename;
333 int copy_initial_nonkeyframes;
341 /* init terminal so that we can grab keys */
342 static struct termios oldtty;
343 static int restore_tty;
346 typedef struct OutputFile {
347 AVFormatContext *ctx;
349 int ost_index; /* index of the first stream in output_streams */
350 int64_t recording_time; ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
351 int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
352 uint64_t limit_filesize; /* filesize limit expressed in bytes */
355 static InputStream **input_streams = NULL;
356 static int nb_input_streams = 0;
357 static InputFile **input_files = NULL;
358 static int nb_input_files = 0;
360 static OutputStream **output_streams = NULL;
361 static int nb_output_streams = 0;
362 static OutputFile **output_files = NULL;
363 static int nb_output_files = 0;
365 static FilterGraph **filtergraphs;
368 typedef struct OptionsContext {
369 /* input/output options */
373 SpecifierOpt *codec_names;
375 SpecifierOpt *audio_channels;
376 int nb_audio_channels;
377 SpecifierOpt *audio_sample_rate;
378 int nb_audio_sample_rate;
379 SpecifierOpt *frame_rates;
381 SpecifierOpt *frame_sizes;
383 SpecifierOpt *frame_pix_fmts;
384 int nb_frame_pix_fmts;
387 int64_t input_ts_offset;
390 SpecifierOpt *ts_scale;
392 SpecifierOpt *dump_attachment;
393 int nb_dump_attachment;
396 StreamMap *stream_maps;
398 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
399 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
400 int metadata_global_manual;
401 int metadata_streams_manual;
402 int metadata_chapters_manual;
403 const char **attachments;
406 int chapters_input_file;
408 int64_t recording_time;
409 uint64_t limit_filesize;
415 int subtitle_disable;
418 /* indexed by output file stream index */
422 SpecifierOpt *metadata;
424 SpecifierOpt *max_frames;
426 SpecifierOpt *bitstream_filters;
427 int nb_bitstream_filters;
428 SpecifierOpt *codec_tags;
430 SpecifierOpt *sample_fmts;
432 SpecifierOpt *qscale;
434 SpecifierOpt *forced_key_frames;
435 int nb_forced_key_frames;
436 SpecifierOpt *force_fps;
438 SpecifierOpt *frame_aspect_ratios;
439 int nb_frame_aspect_ratios;
440 SpecifierOpt *rc_overrides;
442 SpecifierOpt *intra_matrices;
443 int nb_intra_matrices;
444 SpecifierOpt *inter_matrices;
445 int nb_inter_matrices;
446 SpecifierOpt *top_field_first;
447 int nb_top_field_first;
448 SpecifierOpt *metadata_map;
450 SpecifierOpt *presets;
452 SpecifierOpt *copy_initial_nonkeyframes;
453 int nb_copy_initial_nonkeyframes;
454 SpecifierOpt *filters;
458 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
460 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
463 for (i = 0; i < o->nb_ ## name; i++) {\
464 char *spec = o->name[i].specifier;\
465 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
466 outvar = o->name[i].u.type;\
472 static int64_t getutime(void)
475 struct rusage rusage;
477 getrusage(RUSAGE_SELF, &rusage);
478 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
479 #elif HAVE_GETPROCESSTIMES
482 proc = GetCurrentProcess();
483 GetProcessTimes(proc, &c, &e, &k, &u);
484 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
490 static void update_benchmark(const char *fmt, ...)
492 if (do_benchmark_all) {
493 int64_t t = getutime();
499 vsnprintf(buf, sizeof(buf), fmt, va);
501 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
507 static void reset_options(OptionsContext *o, int is_input)
509 const OptionDef *po = options;
510 OptionsContext bak= *o;
513 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
515 void *dst = (uint8_t*)o + po->u.off;
517 if (po->flags & OPT_SPEC) {
518 SpecifierOpt **so = dst;
519 int i, *count = (int*)(so + 1);
520 for (i = 0; i < *count; i++) {
521 av_freep(&(*so)[i].specifier);
522 if (po->flags & OPT_STRING)
523 av_freep(&(*so)[i].u.str);
527 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
532 for (i = 0; i < o->nb_stream_maps; i++)
533 av_freep(&o->stream_maps[i].linklabel);
534 av_freep(&o->stream_maps);
535 av_freep(&o->audio_channel_maps);
536 av_freep(&o->streamid_map);
538 memset(o, 0, sizeof(*o));
541 o->recording_time = bak.recording_time;
542 if (o->recording_time != INT64_MAX)
543 av_log(NULL, AV_LOG_WARNING,
544 "-t is not an input option, keeping it for the next output;"
545 " consider fixing your command line.\n");
547 o->recording_time = INT64_MAX;
548 o->mux_max_delay = 0.7;
549 o->limit_filesize = UINT64_MAX;
550 o->chapters_input_file = INT_MAX;
556 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
558 if (codec && codec->pix_fmts) {
559 const enum PixelFormat *p = codec->pix_fmts;
560 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
561 enum PixelFormat best= PIX_FMT_NONE;
562 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
563 if (st->codec->codec_id == CODEC_ID_MJPEG) {
564 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
565 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
566 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
567 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
570 for (; *p != PIX_FMT_NONE; p++) {
571 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
575 if (*p == PIX_FMT_NONE) {
576 if (target != PIX_FMT_NONE)
577 av_log(NULL, AV_LOG_WARNING,
578 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
579 av_pix_fmt_descriptors[target].name,
581 av_pix_fmt_descriptors[best].name);
588 static char *choose_pix_fmts(OutputStream *ost)
590 if (ost->keep_pix_fmt) {
592 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
593 AVFILTER_AUTO_CONVERT_NONE);
594 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
596 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
598 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
599 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
600 } else if (ost->enc && ost->enc->pix_fmts) {
601 const enum PixelFormat *p;
602 AVIOContext *s = NULL;
606 if (avio_open_dyn_buf(&s) < 0)
609 p = ost->enc->pix_fmts;
610 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
611 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
612 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
613 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
614 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
615 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
619 for (; *p != PIX_FMT_NONE; p++) {
620 const char *name = av_get_pix_fmt_name(*p);
621 avio_printf(s, "%s:", name);
623 len = avio_close_dyn_buf(s, &ret);
631 * Define a function for building a string containing a list of
634 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
635 static char *choose_ ## var ## s(OutputStream *ost) \
637 if (ost->st->codec->var != none) { \
638 get_name(ost->st->codec->var); \
639 return av_strdup(name); \
640 } else if (ost->enc->supported_list) { \
642 AVIOContext *s = NULL; \
646 if (avio_open_dyn_buf(&s) < 0) \
649 for (p = ost->enc->supported_list; *p != none; p++) { \
651 avio_printf(s, "%s" separator, name); \
653 len = avio_close_dyn_buf(s, &ret); \
660 #define GET_PIX_FMT_NAME(pix_fmt)\
661 const char *name = av_get_pix_fmt_name(pix_fmt);
663 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
664 // GET_PIX_FMT_NAME, ":")
666 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
667 const char *name = av_get_sample_fmt_name(sample_fmt)
669 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
670 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
672 #define GET_SAMPLE_RATE_NAME(rate)\
674 snprintf(name, sizeof(name), "%d", rate);
676 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
677 GET_SAMPLE_RATE_NAME, ",")
679 #define GET_CH_LAYOUT_NAME(ch_layout)\
681 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
683 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
684 GET_CH_LAYOUT_NAME, ",")
686 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
688 FilterGraph *fg = av_mallocz(sizeof(*fg));
692 fg->index = nb_filtergraphs;
694 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
696 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
698 fg->outputs[0]->ost = ost;
699 fg->outputs[0]->graph = fg;
701 ost->filter = fg->outputs[0];
703 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
705 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
707 fg->inputs[0]->ist = ist;
708 fg->inputs[0]->graph = fg;
710 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
711 &ist->nb_filters, ist->nb_filters + 1);
712 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
714 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
715 &nb_filtergraphs, nb_filtergraphs + 1);
716 filtergraphs[nb_filtergraphs - 1] = fg;
721 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
723 InputStream *ist = NULL;
724 enum AVMediaType type = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
727 // TODO: support other filter types
728 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
729 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
738 int file_idx = strtol(in->name, &p, 0);
740 if (file_idx < 0 || file_idx >= nb_input_files) {
741 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
742 file_idx, fg->graph_desc);
745 s = input_files[file_idx]->ctx;
747 for (i = 0; i < s->nb_streams; i++) {
748 if (s->streams[i]->codec->codec_type != type)
750 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
756 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
757 "matches no streams.\n", p, fg->graph_desc);
760 ist = input_streams[input_files[file_idx]->ist_index + st->index];
762 /* find the first unused stream of corresponding type */
763 for (i = 0; i < nb_input_streams; i++) {
764 ist = input_streams[i];
765 if (ist->st->codec->codec_type == type && ist->discard)
768 if (i == nb_input_streams) {
769 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
770 "unlabeled input pad %d on filter %s\n", in->pad_idx,
771 in->filter_ctx->name);
778 ist->decoding_needed = 1;
779 ist->st->discard = AVDISCARD_NONE;
781 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
782 &fg->nb_inputs, fg->nb_inputs + 1);
783 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
785 fg->inputs[fg->nb_inputs - 1]->ist = ist;
786 fg->inputs[fg->nb_inputs - 1]->graph = fg;
788 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
789 &ist->nb_filters, ist->nb_filters + 1);
790 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
793 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
796 OutputStream *ost = ofilter->ost;
797 AVCodecContext *codec = ost->st->codec;
798 AVFilterContext *last_filter = out->filter_ctx;
799 int pad_idx = out->pad_idx;
802 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
804 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
805 ret = avfilter_graph_create_filter(&ofilter->filter,
806 avfilter_get_by_name("buffersink"),
807 name, NULL, NULL/*buffersink_params*/, fg->graph);
808 av_freep(&buffersink_params);
813 if (codec->width || codec->height) {
815 AVFilterContext *filter;
817 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
820 (unsigned)ost->sws_flags);
821 snprintf(name, sizeof(name), "scaler for output stream %d:%d",
822 ost->file_index, ost->index);
823 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
824 name, args, NULL, fg->graph)) < 0)
826 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
829 last_filter = filter;
833 if ((pix_fmts = choose_pix_fmts(ost))) {
834 AVFilterContext *filter;
835 snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
836 ost->file_index, ost->index);
837 if ((ret = avfilter_graph_create_filter(&filter,
838 avfilter_get_by_name("format"),
839 "format", pix_fmts, NULL,
842 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
845 last_filter = filter;
850 if (ost->frame_rate.num && 0) {
851 AVFilterContext *fps;
854 snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
855 ost->frame_rate.den);
856 snprintf(name, sizeof(name), "fps for output stream %d:%d",
857 ost->file_index, ost->index);
858 ret = avfilter_graph_create_filter(&fps, avfilter_get_by_name("fps"),
859 name, args, NULL, fg->graph);
863 ret = avfilter_link(last_filter, pad_idx, fps, 0);
870 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
876 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
878 OutputStream *ost = ofilter->ost;
879 AVCodecContext *codec = ost->st->codec;
880 AVFilterContext *last_filter = out->filter_ctx;
881 int pad_idx = out->pad_idx;
882 char *sample_fmts, *sample_rates, *channel_layouts;
887 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
888 ret = avfilter_graph_create_filter(&ofilter->filter,
889 avfilter_get_by_name("abuffersink"),
890 name, NULL, NULL, fg->graph);
894 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
895 AVFilterContext *filt_ctx; \
897 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
898 "similarly to -af " filter_name "=%s.\n", arg); \
900 ret = avfilter_graph_create_filter(&filt_ctx, \
901 avfilter_get_by_name(filter_name), \
902 filter_name, arg, NULL, fg->graph); \
906 ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
910 last_filter = filt_ctx; \
913 if (ost->audio_channels_mapped) {
916 av_bprint_init(&pan_buf, 256, 8192);
917 av_bprintf(&pan_buf, "0x%"PRIx64,
918 av_get_default_channel_layout(ost->audio_channels_mapped));
919 for (i = 0; i < ost->audio_channels_mapped; i++)
920 if (ost->audio_channels_map[i] != -1)
921 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
923 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
924 av_bprint_finalize(&pan_buf, NULL);
927 if (codec->channels && !codec->channel_layout)
928 codec->channel_layout = av_get_default_channel_layout(codec->channels);
930 sample_fmts = choose_sample_fmts(ost);
931 sample_rates = choose_sample_rates(ost);
932 channel_layouts = choose_channel_layouts(ost);
933 if (sample_fmts || sample_rates || channel_layouts) {
934 AVFilterContext *format;
939 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
942 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
945 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
949 av_freep(&sample_fmts);
950 av_freep(&sample_rates);
951 av_freep(&channel_layouts);
953 snprintf(name, sizeof(name), "audio format for output stream %d:%d",
954 ost->file_index, ost->index);
955 ret = avfilter_graph_create_filter(&format,
956 avfilter_get_by_name("aformat"),
957 name, args, NULL, fg->graph);
961 ret = avfilter_link(last_filter, pad_idx, format, 0);
965 last_filter = format;
969 if (audio_volume != 256 && 0) {
972 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
973 AUTO_INSERT_FILTER("-vol", "volume", args);
976 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
982 #define DESCRIBE_FILTER_LINK(f, inout, in) \
984 AVFilterContext *ctx = inout->filter_ctx; \
985 AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads; \
986 int nb_pads = in ? ctx->input_count : ctx->output_count; \
989 if (avio_open_dyn_buf(&pb) < 0) \
992 avio_printf(pb, "%s", ctx->filter->name); \
994 avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));\
996 avio_close_dyn_buf(pb, &f->name); \
999 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1001 av_freep(&ofilter->name);
1002 DESCRIBE_FILTER_LINK(ofilter, out, 0);
1004 switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
1005 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1006 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1007 default: av_assert0(0);
1011 static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
1014 AVFilterContext *first_filter = in->filter_ctx;
1015 AVFilter *filter = avfilter_get_by_name("buffer");
1016 InputStream *ist = ifilter->ist;
1017 AVRational tb = ist->framerate.num ? (AVRational){ist->framerate.den,
1018 ist->framerate.num} :
1020 AVRational fr = ist->framerate.num ? ist->framerate :
1021 ist->st->r_frame_rate;
1025 int pad_idx = in->pad_idx;
1028 sar = ist->st->sample_aspect_ratio.num ?
1029 ist->st->sample_aspect_ratio :
1030 ist->st->codec->sample_aspect_ratio;
1032 sar = (AVRational){0,1};
1033 av_bprint_init(&args, 0, 1);
1035 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
1036 "pixel_aspect=%d/%d:sws_param=flags=%d", ist->st->codec->width,
1037 ist->st->codec->height, ist->st->codec->pix_fmt,
1038 tb.num, tb.den, sar.num, sar.den,
1039 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
1040 if (fr.num && fr.den)
1041 av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
1042 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1043 ist->file_index, ist->st->index);
1045 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter, name,
1046 args.str, NULL, fg->graph)) < 0)
1049 if (ist->framerate.num) {
1050 AVFilterContext *setpts;
1052 snprintf(name, sizeof(name), "force CFR for input from stream %d:%d",
1053 ist->file_index, ist->st->index);
1054 if ((ret = avfilter_graph_create_filter(&setpts,
1055 avfilter_get_by_name("setpts"),
1060 if ((ret = avfilter_link(setpts, 0, first_filter, pad_idx)) < 0)
1063 first_filter = setpts;
1067 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1072 static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
1075 AVFilterContext *first_filter = in->filter_ctx;
1076 AVFilter *filter = avfilter_get_by_name("abuffer");
1077 InputStream *ist = ifilter->ist;
1078 int pad_idx = in->pad_idx;
1079 char args[255], name[255];
1082 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
1083 ":channel_layout=0x%"PRIx64,
1084 1, ist->st->codec->sample_rate,
1085 ist->st->codec->sample_rate,
1086 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1087 ist->st->codec->channel_layout);
1088 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1089 ist->file_index, ist->st->index);
1091 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
1096 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
1097 AVFilterContext *filt_ctx; \
1099 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1100 "similarly to -af " filter_name "=%s.\n", arg); \
1102 snprintf(name, sizeof(name), "graph %d %s for input stream %d:%d", \
1103 fg->index, filter_name, ist->file_index, ist->st->index); \
1104 ret = avfilter_graph_create_filter(&filt_ctx, \
1105 avfilter_get_by_name(filter_name), \
1106 name, arg, NULL, fg->graph); \
1110 ret = avfilter_link(filt_ctx, 0, first_filter, pad_idx); \
1114 first_filter = filt_ctx; \
1117 if (audio_sync_method > 0) {
1118 char args[256] = {0};
1120 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
1121 if (audio_sync_method > 1)
1122 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)ist->st->codec->sample_rate);
1123 AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
1126 // if (ost->audio_channels_mapped) {
1128 // AVBPrint pan_buf;
1129 // av_bprint_init(&pan_buf, 256, 8192);
1130 // av_bprintf(&pan_buf, "0x%"PRIx64,
1131 // av_get_default_channel_layout(ost->audio_channels_mapped));
1132 // for (i = 0; i < ost->audio_channels_mapped; i++)
1133 // if (ost->audio_channels_map[i] != -1)
1134 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
1135 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
1136 // av_bprint_finalize(&pan_buf, NULL);
1139 if (audio_volume != 256) {
1142 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
1143 AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
1145 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1151 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
1154 av_freep(&ifilter->name);
1155 DESCRIBE_FILTER_LINK(ifilter, in, 1);
1157 switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
1158 case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
1159 case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
1160 default: av_assert0(0);
1164 static int configure_filtergraph(FilterGraph *fg)
1166 AVFilterInOut *inputs, *outputs, *cur;
1167 int ret, i, init = !fg->graph, simple = !fg->graph_desc;
1168 const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1171 avfilter_graph_free(&fg->graph);
1172 if (!(fg->graph = avfilter_graph_alloc()))
1173 return AVERROR(ENOMEM);
1176 OutputStream *ost = fg->outputs[0]->ost;
1178 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1179 fg->graph->scale_sws_opts = av_strdup(args);
1182 if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1185 if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1186 av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
1187 "exactly one input and output.\n", graph_desc);
1188 return AVERROR(EINVAL);
1191 for (cur = inputs; !simple && init && cur; cur = cur->next)
1192 init_input_filter(fg, cur);
1194 for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1195 if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
1197 avfilter_inout_free(&inputs);
1199 if (!init || simple) {
1200 /* we already know the mappings between lavfi outputs and output streams,
1201 * so we can finish the setup */
1202 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1203 configure_output_filter(fg, fg->outputs[i], cur);
1204 avfilter_inout_free(&outputs);
1206 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1209 /* wait until output mappings are processed */
1210 for (cur = outputs; cur;) {
1211 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1212 &fg->nb_outputs, fg->nb_outputs + 1);
1213 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1215 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1216 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1218 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1225 static int configure_complex_filters(void)
1229 for (i = 0; i < nb_filtergraphs; i++)
1230 if (!filtergraphs[i]->graph &&
1231 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1236 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1239 for (i = 0; i < fg->nb_inputs; i++)
1240 if (fg->inputs[i]->ist == ist)
1245 static void term_exit(void)
1247 av_log(NULL, AV_LOG_QUIET, "%s", "");
1250 tcsetattr (0, TCSANOW, &oldtty);
1254 static volatile int received_sigterm = 0;
1256 static void sigterm_handler(int sig)
1258 received_sigterm = sig;
1259 received_nb_signals++;
1261 if(received_nb_signals > 3)
1265 static void term_init(void)
1272 istty = isatty(0) && isatty(2);
1274 if (istty && tcgetattr (0, &tty) == 0) {
1279 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1280 |INLCR|IGNCR|ICRNL|IXON);
1281 tty.c_oflag |= OPOST;
1282 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1283 tty.c_cflag &= ~(CSIZE|PARENB);
1286 tty.c_cc[VTIME] = 0;
1288 tcsetattr (0, TCSANOW, &tty);
1290 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1293 avformat_network_deinit();
1295 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1296 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1298 signal(SIGXCPU, sigterm_handler);
1302 /* read a key without blocking */
1303 static int read_key(void)
1315 n = select(1, &rfds, NULL, NULL, &tv);
1317 n = read(0, &ch, 1);
1324 # if HAVE_PEEKNAMEDPIPE
1326 static HANDLE input_handle;
1329 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1330 is_pipe = !GetConsoleMode(input_handle, &dw);
1333 if (stdin->_cnt > 0) {
1338 /* When running under a GUI, you will end here. */
1339 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1356 static int decode_interrupt_cb(void *ctx)
1358 return received_nb_signals > 1;
1361 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1363 void av_noreturn exit_program(int ret)
1367 for (i = 0; i < nb_filtergraphs; i++) {
1368 avfilter_graph_free(&filtergraphs[i]->graph);
1369 for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
1370 av_freep(&filtergraphs[i]->inputs[j]->name);
1371 av_freep(&filtergraphs[i]->inputs[j]);
1373 av_freep(&filtergraphs[i]->inputs);
1374 for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
1375 av_freep(&filtergraphs[i]->outputs[j]->name);
1376 av_freep(&filtergraphs[i]->outputs[j]);
1378 av_freep(&filtergraphs[i]->outputs);
1379 av_freep(&filtergraphs[i]);
1381 av_freep(&filtergraphs);
1383 av_freep(&subtitle_out);
1386 for (i = 0; i < nb_output_files; i++) {
1387 AVFormatContext *s = output_files[i]->ctx;
1388 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1390 avformat_free_context(s);
1391 av_dict_free(&output_files[i]->opts);
1392 av_freep(&output_files[i]);
1394 for (i = 0; i < nb_output_streams; i++) {
1395 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1397 AVBitStreamFilterContext *next = bsfc->next;
1398 av_bitstream_filter_close(bsfc);
1401 output_streams[i]->bitstream_filters = NULL;
1403 av_freep(&output_streams[i]->forced_keyframes);
1404 av_freep(&output_streams[i]->filtered_frame);
1405 av_freep(&output_streams[i]->avfilter);
1406 av_freep(&output_streams[i]);
1408 for (i = 0; i < nb_input_files; i++) {
1409 avformat_close_input(&input_files[i]->ctx);
1410 av_freep(&input_files[i]);
1412 for (i = 0; i < nb_input_streams; i++) {
1413 av_freep(&input_streams[i]->decoded_frame);
1414 av_dict_free(&input_streams[i]->opts);
1415 free_buffer_pool(&input_streams[i]->buffer_pool);
1416 av_freep(&input_streams[i]->filters);
1417 av_freep(&input_streams[i]);
1421 fclose(vstats_file);
1422 av_free(vstats_filename);
1424 av_freep(&input_streams);
1425 av_freep(&input_files);
1426 av_freep(&output_streams);
1427 av_freep(&output_files);
1432 avformat_network_deinit();
1434 if (received_sigterm) {
1435 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1436 (int) received_sigterm);
1443 static void assert_avoptions(AVDictionary *m)
1445 AVDictionaryEntry *t;
1446 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1447 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1452 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1454 const char *codec_string = encoder ? "encoder" : "decoder";
1456 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1457 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1458 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1459 "results.\nAdd '-strict experimental' if you want to use it.\n",
1460 codec_string, c->codec->name);
1461 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1462 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1463 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1464 codec_string, codec->name);
1469 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1471 if (codec && codec->sample_fmts) {
1472 const enum AVSampleFormat *p = codec->sample_fmts;
1473 for (; *p != -1; p++) {
1474 if (*p == st->codec->sample_fmt)
1478 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1479 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1480 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1481 av_log(NULL, AV_LOG_WARNING,
1482 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1483 av_get_sample_fmt_name(st->codec->sample_fmt),
1485 av_get_sample_fmt_name(codec->sample_fmts[0]));
1486 st->codec->sample_fmt = codec->sample_fmts[0];
1491 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1493 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1494 AVCodecContext *avctx = ost->st->codec;
1497 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1498 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1499 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1501 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1502 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1503 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1504 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1505 pkt->pts = pkt->dts = max;
1510 * Audio encoders may split the packets -- #frames in != #packets out.
1511 * But there is no reordering, so we can limit the number of output packets
1512 * by simply dropping them here.
1513 * Counting encoded video frames needs to be done separately because of
1514 * reordering, see do_video_out()
1516 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1517 if (ost->frame_number >= ost->max_frames) {
1518 av_free_packet(pkt);
1521 ost->frame_number++;
1525 AVPacket new_pkt = *pkt;
1526 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1527 &new_pkt.data, &new_pkt.size,
1528 pkt->data, pkt->size,
1529 pkt->flags & AV_PKT_FLAG_KEY);
1531 av_free_packet(pkt);
1532 new_pkt.destruct = av_destruct_packet;
1534 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1535 bsfc->filter->name, pkt->stream_index,
1536 avctx->codec ? avctx->codec->name : "copy");
1546 pkt->stream_index = ost->index;
1547 ret = av_interleaved_write_frame(s, pkt);
1549 print_error("av_interleaved_write_frame()", ret);
1554 static int check_recording_time(OutputStream *ost)
1556 OutputFile *of = output_files[ost->file_index];
1558 if (of->recording_time != INT64_MAX &&
1559 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1560 AV_TIME_BASE_Q) >= 0) {
1561 ost->is_past_recording_time = 1;
1567 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1570 AVCodecContext *enc = ost->st->codec;
1574 av_init_packet(&pkt);
1578 if (!check_recording_time(ost))
1581 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1582 frame->pts = ost->sync_opts;
1583 ost->sync_opts = frame->pts + frame->nb_samples;
1585 av_assert0(pkt.size || !pkt.data);
1586 update_benchmark(NULL);
1587 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1588 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1591 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1594 if (pkt.pts != AV_NOPTS_VALUE)
1595 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1596 if (pkt.dts != AV_NOPTS_VALUE)
1597 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1598 if (pkt.duration > 0)
1599 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1602 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1603 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1604 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1605 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1608 write_frame(s, &pkt, ost);
1610 audio_size += pkt.size;
1611 av_free_packet(&pkt);
1615 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1617 AVCodecContext *dec;
1618 AVPicture *picture2;
1619 AVPicture picture_tmp;
1622 dec = ist->st->codec;
1624 /* deinterlace : must be done before any resize */
1625 if (do_deinterlace) {
1628 /* create temporary picture */
1629 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1630 buf = av_malloc(size);
1634 picture2 = &picture_tmp;
1635 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1637 if (avpicture_deinterlace(picture2, picture,
1638 dec->pix_fmt, dec->width, dec->height) < 0) {
1639 /* if error, do not deinterlace */
1640 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1649 if (picture != picture2)
1650 *picture = *picture2;
1654 static void do_subtitle_out(AVFormatContext *s,
1660 int subtitle_out_max_size = 1024 * 1024;
1661 int subtitle_out_size, nb, i;
1662 AVCodecContext *enc;
1665 if (pts == AV_NOPTS_VALUE) {
1666 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1672 enc = ost->st->codec;
1674 if (!subtitle_out) {
1675 subtitle_out = av_malloc(subtitle_out_max_size);
1678 /* Note: DVB subtitle need one packet to draw them and one other
1679 packet to clear them */
1680 /* XXX: signal it in the codec context ? */
1681 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1686 /* shift timestamp to honor -ss and make check_recording_time() work with -t */
1687 pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q)
1688 - output_files[ost->file_index]->start_time;
1689 for (i = 0; i < nb; i++) {
1690 ost->sync_opts = av_rescale_q(pts, AV_TIME_BASE_Q, enc->time_base);
1691 if (!check_recording_time(ost))
1695 // start_display_time is required to be 0
1696 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1697 sub->end_display_time -= sub->start_display_time;
1698 sub->start_display_time = 0;
1699 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1700 subtitle_out_max_size, sub);
1701 if (subtitle_out_size < 0) {
1702 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1706 av_init_packet(&pkt);
1707 pkt.data = subtitle_out;
1708 pkt.size = subtitle_out_size;
1709 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1710 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
1711 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1712 /* XXX: the pts correction is handled here. Maybe handling
1713 it in the codec would be better */
1715 pkt.pts += 90 * sub->start_display_time;
1717 pkt.pts += 90 * sub->end_display_time;
1719 write_frame(s, &pkt, ost);
1720 subtitle_size += pkt.size;
1724 static void do_video_out(AVFormatContext *s,
1726 AVFrame *in_picture,
1729 int ret, format_video_sync;
1731 AVCodecContext *enc = ost->st->codec;
1733 double sync_ipts, delta;
1734 double duration = 0;
1736 InputStream *ist = NULL;
1738 if (ost->source_index >= 0)
1739 ist = input_streams[ost->source_index];
1741 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1742 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1744 sync_ipts = in_picture->pts;
1745 delta = sync_ipts - ost->sync_opts + duration;
1747 /* by default, we output a single frame */
1750 format_video_sync = video_sync_method;
1751 if (format_video_sync == VSYNC_AUTO)
1752 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1754 switch (format_video_sync) {
1756 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1759 else if (delta > 1.1)
1760 nb_frames = lrintf(delta);
1765 else if (delta > 0.6)
1766 ost->sync_opts = lrint(sync_ipts);
1769 case VSYNC_PASSTHROUGH:
1770 ost->sync_opts = lrint(sync_ipts);
1776 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1777 if (nb_frames == 0) {
1779 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1781 } else if (nb_frames > 1) {
1782 if (nb_frames > dts_error_threshold * 30) {
1783 av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skiping\n", nb_frames - 1);
1787 nb_frames_dup += nb_frames - 1;
1788 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1791 /* duplicates frame if needed */
1792 for (i = 0; i < nb_frames; i++) {
1793 av_init_packet(&pkt);
1797 in_picture->pts = ost->sync_opts;
1799 if (!check_recording_time(ost))
1802 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1803 enc->codec->id == CODEC_ID_RAWVIDEO) {
1804 /* raw pictures are written as AVPicture structure to
1805 avoid any copies. We support temporarily the older
1807 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1808 enc->coded_frame->top_field_first = in_picture->top_field_first;
1809 pkt.data = (uint8_t *)in_picture;
1810 pkt.size = sizeof(AVPicture);
1811 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1812 pkt.flags |= AV_PKT_FLAG_KEY;
1814 write_frame(s, &pkt, ost);
1815 video_size += pkt.size;
1818 AVFrame big_picture;
1820 big_picture = *in_picture;
1821 /* better than nothing: use input picture interlaced
1823 big_picture.interlaced_frame = in_picture->interlaced_frame;
1824 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1825 if (ost->top_field_first == -1)
1826 big_picture.top_field_first = in_picture->top_field_first;
1828 big_picture.top_field_first = !!ost->top_field_first;
1831 /* handles same_quant here. This is not correct because it may
1832 not be a global option */
1833 big_picture.quality = quality;
1834 if (!enc->me_threshold)
1835 big_picture.pict_type = 0;
1836 if (ost->forced_kf_index < ost->forced_kf_count &&
1837 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1838 big_picture.pict_type = AV_PICTURE_TYPE_I;
1839 ost->forced_kf_index++;
1841 update_benchmark(NULL);
1842 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1843 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1845 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1850 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1851 pkt.pts = ost->sync_opts;
1853 if (pkt.pts != AV_NOPTS_VALUE)
1854 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1855 if (pkt.dts != AV_NOPTS_VALUE)
1856 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1859 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1860 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1861 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1862 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1865 write_frame(s, &pkt, ost);
1866 frame_size = pkt.size;
1867 video_size += pkt.size;
1868 av_free_packet(&pkt);
1870 /* if two pass, output log */
1871 if (ost->logfile && enc->stats_out) {
1872 fprintf(ost->logfile, "%s", enc->stats_out);
1878 * For video, number of frames in == number of packets out.
1879 * But there may be reordering, so we can't throw away frames on encoder
1880 * flush, we need to limit them here, before they go into encoder.
1882 ost->frame_number++;
1885 if (vstats_filename && frame_size)
1886 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1889 static double psnr(double d)
1891 return -10.0 * log(d) / log(10.0);
1894 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1897 AVCodecContext *enc;
1899 double ti1, bitrate, avg_bitrate;
1901 /* this is executed just the first time do_video_stats is called */
1903 vstats_file = fopen(vstats_filename, "w");
1910 enc = ost->st->codec;
1911 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1912 frame_number = ost->frame_number;
1913 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1914 if (enc->flags&CODEC_FLAG_PSNR)
1915 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1917 fprintf(vstats_file,"f_size= %6d ", frame_size);
1918 /* compute pts value */
1919 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1923 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1924 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1925 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1926 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1927 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1931 /* check for new output on any of the filtergraphs */
1932 static int poll_filters(void)
1934 AVFilterBufferRef *picref;
1935 AVFrame *filtered_frame = NULL;
1936 int i, ret, ret_all;
1937 unsigned nb_success = 1, av_uninit(nb_eof);
1941 /* Reap all buffers present in the buffer sinks */
1942 for (i = 0; i < nb_output_streams; i++) {
1943 OutputStream *ost = output_streams[i];
1944 OutputFile *of = output_files[ost->file_index];
1950 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1951 return AVERROR(ENOMEM);
1953 avcodec_get_frame_defaults(ost->filtered_frame);
1954 filtered_frame = ost->filtered_frame;
1957 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1958 AV_BUFFERSINK_FLAG_NO_REQUEST);
1960 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1962 av_strerror(ret, buf, sizeof(buf));
1963 av_log(NULL, AV_LOG_WARNING,
1964 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1968 frame_pts = AV_NOPTS_VALUE;
1969 if (picref->pts != AV_NOPTS_VALUE) {
1970 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1971 ost->filter->filter->inputs[0]->time_base,
1972 ost->st->codec->time_base) -
1973 av_rescale_q(of->start_time,
1975 ost->st->codec->time_base);
1977 if (of->start_time && filtered_frame->pts < 0) {
1978 avfilter_unref_buffer(picref);
1982 //if (ost->source_index >= 0)
1983 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1986 switch (ost->filter->filter->inputs[0]->type) {
1987 case AVMEDIA_TYPE_VIDEO:
1988 avfilter_copy_buf_props(filtered_frame, picref);
1989 filtered_frame->pts = frame_pts;
1990 if (!ost->frame_aspect_ratio)
1991 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1993 do_video_out(of->ctx, ost, filtered_frame,
1994 same_quant ? ost->last_quality :
1995 ost->st->codec->global_quality);
1997 case AVMEDIA_TYPE_AUDIO:
1998 avfilter_copy_buf_props(filtered_frame, picref);
1999 filtered_frame->pts = frame_pts;
2000 do_audio_out(of->ctx, ost, filtered_frame);
2003 // TODO support subtitle filters
2007 avfilter_unref_buffer(picref);
2010 if (!nb_success) /* from last round */
2012 /* Request frames through all the graphs */
2013 ret_all = nb_success = nb_eof = 0;
2014 for (i = 0; i < nb_filtergraphs; i++) {
2015 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2018 } else if (ret == AVERROR_EOF) {
2020 } else if (ret != AVERROR(EAGAIN)) {
2022 av_strerror(ret, buf, sizeof(buf));
2023 av_log(NULL, AV_LOG_WARNING,
2024 "Error in request_frame(): %s\n", buf);
2028 /* Try again if anything succeeded */
2030 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2033 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2036 AVBPrint buf_script;
2038 AVFormatContext *oc;
2040 AVCodecContext *enc;
2041 int frame_number, vid, i;
2043 int64_t pts = INT64_MAX;
2044 static int64_t last_time = -1;
2045 static int qp_histogram[52];
2046 int hours, mins, secs, us;
2048 if (!print_stats && !is_last_report && !progress_avio)
2051 if (!is_last_report) {
2052 if (last_time == -1) {
2053 last_time = cur_time;
2056 if ((cur_time - last_time) < 500000)
2058 last_time = cur_time;
2062 oc = output_files[0]->ctx;
2064 total_size = avio_size(oc->pb);
2065 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2066 total_size = avio_tell(oc->pb);
2073 av_bprint_init(&buf_script, 0, 1);
2074 for (i = 0; i < nb_output_streams; i++) {
2076 ost = output_streams[i];
2077 enc = ost->st->codec;
2078 if (!ost->stream_copy && enc->coded_frame)
2079 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2080 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2081 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2082 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2083 ost->file_index, ost->index, q);
2085 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2086 float fps, t = (cur_time-timer_start) / 1000000.0;
2088 frame_number = ost->frame_number;
2089 fps = t > 1 ? frame_number / t : 0;
2090 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2091 frame_number, fps < 9.95, fps, q);
2092 av_bprintf(&buf_script, "frame=%d\n", frame_number);
2093 av_bprintf(&buf_script, "fps=%.1f\n", fps);
2094 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2095 ost->file_index, ost->index, q);
2097 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2101 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2103 for (j = 0; j < 32; j++)
2104 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2106 if (enc->flags&CODEC_FLAG_PSNR) {
2108 double error, error_sum = 0;
2109 double scale, scale_sum = 0;
2111 char type[3] = { 'Y','U','V' };
2112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2113 for (j = 0; j < 3; j++) {
2114 if (is_last_report) {
2115 error = enc->error[j];
2116 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2118 error = enc->coded_frame->error[j];
2119 scale = enc->width * enc->height * 255.0 * 255.0;
2125 p = psnr(error / scale);
2126 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p);
2127 av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
2128 ost->file_index, ost->index, type[i] | 32, p);
2130 p = psnr(error_sum / scale_sum);
2131 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2132 av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
2133 ost->file_index, ost->index, p);
2137 /* compute min output value */
2138 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2139 ost->st->time_base, AV_TIME_BASE_Q));
2142 secs = pts / AV_TIME_BASE;
2143 us = pts % AV_TIME_BASE;
2149 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2151 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2152 "size=%8.0fkB time=", total_size / 1024.0);
2153 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2154 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2155 (100 * us) / AV_TIME_BASE);
2156 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2157 "bitrate=%6.1fkbits/s", bitrate);
2158 av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
2159 av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
2160 av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n",
2161 hours, mins, secs, us);
2163 if (nb_frames_dup || nb_frames_drop)
2164 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2165 nb_frames_dup, nb_frames_drop);
2166 av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
2167 av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
2169 if (print_stats || is_last_report) {
2170 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2175 if (progress_avio) {
2176 av_bprintf(&buf_script, "progress=%s\n",
2177 is_last_report ? "end" : "continue");
2178 avio_write(progress_avio, buf_script.str,
2179 FFMIN(buf_script.len, buf_script.size - 1));
2180 avio_flush(progress_avio);
2181 av_bprint_finalize(&buf_script, NULL);
2182 if (is_last_report) {
2183 avio_close(progress_avio);
2184 progress_avio = NULL;
2188 if (is_last_report) {
2189 int64_t raw= audio_size + video_size + subtitle_size + extra_size;
2190 av_log(NULL, AV_LOG_INFO, "\n");
2191 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
2192 video_size / 1024.0,
2193 audio_size / 1024.0,
2194 subtitle_size / 1024.0,
2195 extra_size / 1024.0,
2196 100.0 * (total_size - raw) / raw
2198 if(video_size + audio_size + subtitle_size + extra_size == 0){
2199 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2204 static void flush_encoders(void)
2208 for (i = 0; i < nb_output_streams; i++) {
2209 OutputStream *ost = output_streams[i];
2210 AVCodecContext *enc = ost->st->codec;
2211 AVFormatContext *os = output_files[ost->file_index]->ctx;
2212 int stop_encoding = 0;
2214 if (!ost->encoding_needed)
2217 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2219 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2223 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2227 switch (ost->st->codec->codec_type) {
2228 case AVMEDIA_TYPE_AUDIO:
2229 encode = avcodec_encode_audio2;
2233 case AVMEDIA_TYPE_VIDEO:
2234 encode = avcodec_encode_video2;
2245 av_init_packet(&pkt);
2249 update_benchmark(NULL);
2250 ret = encode(enc, &pkt, NULL, &got_packet);
2251 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2253 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2257 if (ost->logfile && enc->stats_out) {
2258 fprintf(ost->logfile, "%s", enc->stats_out);
2264 if (pkt.pts != AV_NOPTS_VALUE)
2265 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2266 if (pkt.dts != AV_NOPTS_VALUE)
2267 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2268 write_frame(os, &pkt, ost);
2278 * Check whether a packet from ist should be written into ost at this time
2280 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2282 OutputFile *of = output_files[ost->file_index];
2283 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2285 if (ost->source_index != ist_index)
2288 if (of->start_time && ist->pts < of->start_time)
2294 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2296 OutputFile *of = output_files[ost->file_index];
2297 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2301 av_init_packet(&opkt);
2303 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2304 !ost->copy_initial_nonkeyframes)
2307 if (of->recording_time != INT64_MAX &&
2308 ist->pts >= of->recording_time + of->start_time) {
2309 ost->is_past_recording_time = 1;
2313 /* force the input stream PTS */
2314 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2315 audio_size += pkt->size;
2316 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2317 video_size += pkt->size;
2319 } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2320 subtitle_size += pkt->size;
2323 if (pkt->pts != AV_NOPTS_VALUE)
2324 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2326 opkt.pts = AV_NOPTS_VALUE;
2328 if (pkt->dts == AV_NOPTS_VALUE)
2329 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2331 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2332 opkt.dts -= ost_tb_start_time;
2334 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2335 opkt.flags = pkt->flags;
2337 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2338 if ( ost->st->codec->codec_id != CODEC_ID_H264
2339 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2340 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2341 && ost->st->codec->codec_id != CODEC_ID_VC1
2343 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2344 opkt.destruct = av_destruct_packet;
2346 opkt.data = pkt->data;
2347 opkt.size = pkt->size;
2350 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (of->ctx->oformat->flags & AVFMT_RAWPICTURE)) {
2351 /* store AVPicture in AVPacket, as expected by the output format */
2352 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2353 opkt.data = (uint8_t *)&pict;
2354 opkt.size = sizeof(AVPicture);
2355 opkt.flags |= AV_PKT_FLAG_KEY;
2358 write_frame(of->ctx, &opkt, ost);
2359 ost->st->codec->frame_number++;
2360 av_free_packet(&opkt);
2363 static void rate_emu_sleep(InputStream *ist)
2365 if (input_files[ist->file_index]->rate_emu) {
2366 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2367 int64_t now = av_gettime() - ist->start;
2369 av_usleep(pts - now);
2373 static int guess_input_channel_layout(InputStream *ist)
2375 AVCodecContext *dec = ist->st->codec;
2377 if (!dec->channel_layout) {
2378 char layout_name[256];
2380 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2381 if (!dec->channel_layout)
2383 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2384 dec->channels, dec->channel_layout);
2385 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2386 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2391 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2393 AVFrame *decoded_frame;
2394 AVCodecContext *avctx = ist->st->codec;
2395 int i, ret, resample_changed;
2396 AVRational decoded_frame_tb;
2398 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2399 return AVERROR(ENOMEM);
2401 avcodec_get_frame_defaults(ist->decoded_frame);
2402 decoded_frame = ist->decoded_frame;
2404 update_benchmark(NULL);
2405 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2406 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2410 if (avctx->sample_rate <= 0) {
2411 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2412 return AVERROR_INVALIDDATA;
2416 /* no audio frame */
2418 for (i = 0; i < ist->nb_filters; i++)
2419 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2420 AV_BUFFERSRC_FLAG_NO_COPY);
2425 /* increment next_dts to use for the case where the input stream does not
2426 have timestamps or there are multiple frames in the packet */
2427 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2429 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2433 rate_emu_sleep(ist);
2435 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2436 ist->resample_channels != avctx->channels ||
2437 ist->resample_channel_layout != decoded_frame->channel_layout ||
2438 ist->resample_sample_rate != decoded_frame->sample_rate;
2439 if (resample_changed) {
2440 char layout1[64], layout2[64];
2442 if (!guess_input_channel_layout(ist)) {
2443 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2444 "layout for Input Stream #%d.%d\n", ist->file_index,
2448 decoded_frame->channel_layout = avctx->channel_layout;
2450 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2451 ist->resample_channel_layout);
2452 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2453 decoded_frame->channel_layout);
2455 av_log(NULL, AV_LOG_INFO,
2456 "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",
2457 ist->file_index, ist->st->index,
2458 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2459 ist->resample_channels, layout1,
2460 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2461 avctx->channels, layout2);
2463 ist->resample_sample_fmt = decoded_frame->format;
2464 ist->resample_sample_rate = decoded_frame->sample_rate;
2465 ist->resample_channel_layout = decoded_frame->channel_layout;
2466 ist->resample_channels = avctx->channels;
2468 for (i = 0; i < nb_filtergraphs; i++)
2469 if (ist_in_filtergraph(filtergraphs[i], ist)) {
2470 FilterGraph *fg = filtergraphs[i];
2472 if (configure_filtergraph(fg) < 0) {
2473 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2476 for (j = 0; j < fg->nb_outputs; j++) {
2477 OutputStream *ost = fg->outputs[j]->ost;
2478 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2479 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2480 av_buffersink_set_frame_size(ost->filter->filter,
2481 ost->st->codec->frame_size);
2486 /* if the decoder provides a pts, use it instead of the last packet pts.
2487 the decoder could be delaying output by a packet or more. */
2488 if (decoded_frame->pts != AV_NOPTS_VALUE) {
2489 ist->dts = ist->next_dts = ist->pts = ist->next_pts = av_rescale_q(decoded_frame->pts, avctx->time_base, AV_TIME_BASE_Q);
2490 decoded_frame_tb = avctx->time_base;
2491 } else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
2492 decoded_frame->pts = decoded_frame->pkt_pts;
2493 pkt->pts = AV_NOPTS_VALUE;
2494 decoded_frame_tb = ist->st->time_base;
2495 } else if (pkt->pts != AV_NOPTS_VALUE) {
2496 decoded_frame->pts = pkt->pts;
2497 pkt->pts = AV_NOPTS_VALUE;
2498 decoded_frame_tb = ist->st->time_base;
2500 decoded_frame->pts = ist->dts;
2501 decoded_frame_tb = AV_TIME_BASE_Q;
2503 if (decoded_frame->pts != AV_NOPTS_VALUE)
2504 decoded_frame->pts = av_rescale_q(decoded_frame->pts,
2506 (AVRational){1, ist->st->codec->sample_rate});
2507 for (i = 0; i < ist->nb_filters; i++)
2508 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2510 decoded_frame->pts = AV_NOPTS_VALUE;
2515 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2517 AVFrame *decoded_frame;
2518 void *buffer_to_free = NULL;
2519 int i, ret = 0, resample_changed;
2520 int64_t best_effort_timestamp;
2521 AVRational *frame_sample_aspect;
2524 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2525 return AVERROR(ENOMEM);
2527 avcodec_get_frame_defaults(ist->decoded_frame);
2528 decoded_frame = ist->decoded_frame;
2529 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2531 update_benchmark(NULL);
2532 ret = avcodec_decode_video2(ist->st->codec,
2533 decoded_frame, got_output, pkt);
2534 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2538 quality = same_quant ? decoded_frame->quality : 0;
2540 /* no picture yet */
2542 for (i = 0; i < ist->nb_filters; i++)
2543 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2547 if(ist->top_field_first>=0)
2548 decoded_frame->top_field_first = ist->top_field_first;
2550 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2551 if(best_effort_timestamp != AV_NOPTS_VALUE)
2552 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2555 av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
2556 "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d \n",
2557 ist->st->index, av_ts2str(decoded_frame->pts),
2558 av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
2559 best_effort_timestamp,
2560 av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
2561 decoded_frame->key_frame, decoded_frame->pict_type);
2565 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2567 rate_emu_sleep(ist);
2569 if (ist->st->sample_aspect_ratio.num)
2570 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2572 resample_changed = ist->resample_width != decoded_frame->width ||
2573 ist->resample_height != decoded_frame->height ||
2574 ist->resample_pix_fmt != decoded_frame->format;
2575 if (resample_changed) {
2576 av_log(NULL, AV_LOG_INFO,
2577 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2578 ist->file_index, ist->st->index,
2579 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2580 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2582 ist->resample_width = decoded_frame->width;
2583 ist->resample_height = decoded_frame->height;
2584 ist->resample_pix_fmt = decoded_frame->format;
2586 for (i = 0; i < nb_filtergraphs; i++)
2587 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2588 configure_filtergraph(filtergraphs[i]) < 0) {
2589 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2594 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2595 for (i = 0; i < ist->nb_filters; i++) {
2596 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2597 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2598 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2599 // XXX what an ugly hack
2600 if (ist->filters[i]->graph->nb_outputs == 1)
2601 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2603 if (!frame_sample_aspect->num)
2604 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2605 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2606 FrameBuffer *buf = decoded_frame->opaque;
2607 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2608 decoded_frame->data, decoded_frame->linesize,
2609 AV_PERM_READ | AV_PERM_PRESERVE,
2610 ist->st->codec->width, ist->st->codec->height,
2611 ist->st->codec->pix_fmt);
2613 avfilter_copy_frame_props(fb, decoded_frame);
2614 fb->buf->priv = buf;
2615 fb->buf->free = filter_release_buffer;
2617 av_assert0(buf->refcount>0);
2619 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2620 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2621 AV_BUFFERSRC_FLAG_NO_COPY);
2623 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2624 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2630 av_free(buffer_to_free);
2634 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2636 AVSubtitle subtitle;
2637 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2638 &subtitle, got_output, pkt);
2644 rate_emu_sleep(ist);
2646 for (i = 0; i < nb_output_streams; i++) {
2647 OutputStream *ost = output_streams[i];
2649 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2652 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2655 avsubtitle_free(&subtitle);
2659 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2660 static int output_packet(InputStream *ist, const AVPacket *pkt)
2666 if (!ist->saw_first_ts) {
2667 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;
2669 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2670 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2671 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2673 ist->saw_first_ts = 1;
2676 if (ist->next_dts == AV_NOPTS_VALUE)
2677 ist->next_dts = ist->dts;
2678 if (ist->next_pts == AV_NOPTS_VALUE)
2679 ist->next_pts = ist->pts;
2683 av_init_packet(&avpkt);
2691 if (pkt->dts != AV_NOPTS_VALUE) {
2692 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2693 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2694 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2697 // while we have more to decode or while the decoder did output something on EOF
2698 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2702 ist->pts = ist->next_pts;
2703 ist->dts = ist->next_dts;
2705 if (avpkt.size && avpkt.size != pkt->size) {
2706 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2707 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2708 ist->showed_multi_packet_warning = 1;
2711 switch (ist->st->codec->codec_type) {
2712 case AVMEDIA_TYPE_AUDIO:
2713 ret = decode_audio (ist, &avpkt, &got_output);
2715 case AVMEDIA_TYPE_VIDEO:
2716 ret = decode_video (ist, &avpkt, &got_output);
2717 if (avpkt.duration) {
2718 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2719 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2720 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2721 duration = ((int64_t)AV_TIME_BASE *
2722 ist->st->codec->time_base.num * ticks) /
2723 ist->st->codec->time_base.den;
2727 if(ist->dts != AV_NOPTS_VALUE && duration) {
2728 ist->next_dts += duration;
2730 ist->next_dts = AV_NOPTS_VALUE;
2733 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2735 case AVMEDIA_TYPE_SUBTITLE:
2736 ret = transcode_subtitles(ist, &avpkt, &got_output);
2746 avpkt.pts= AV_NOPTS_VALUE;
2748 // touch data and size only if not EOF
2750 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2760 /* handle stream copy */
2761 if (!ist->decoding_needed) {
2762 rate_emu_sleep(ist);
2763 ist->dts = ist->next_dts;
2764 switch (ist->st->codec->codec_type) {
2765 case AVMEDIA_TYPE_AUDIO:
2766 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2767 ist->st->codec->sample_rate;
2769 case AVMEDIA_TYPE_VIDEO:
2770 if (pkt->duration) {
2771 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2772 } else if(ist->st->codec->time_base.num != 0) {
2773 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2774 ist->next_dts += ((int64_t)AV_TIME_BASE *
2775 ist->st->codec->time_base.num * ticks) /
2776 ist->st->codec->time_base.den;
2780 ist->pts = ist->dts;
2781 ist->next_pts = ist->next_dts;
2783 for (i = 0; pkt && i < nb_output_streams; i++) {
2784 OutputStream *ost = output_streams[i];
2786 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2789 do_streamcopy(ist, ost, pkt);
2795 static void print_sdp(void)
2799 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2803 for (i = 0; i < nb_output_files; i++)
2804 avc[i] = output_files[i]->ctx;
2806 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2807 printf("SDP:\n%s\n", sdp);
2812 static int init_input_stream(int ist_index, char *error, int error_len)
2814 InputStream *ist = input_streams[ist_index];
2816 if (ist->decoding_needed) {
2817 AVCodec *codec = ist->dec;
2819 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2820 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2821 return AVERROR(EINVAL);
2824 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2825 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2826 ist->st->codec->get_buffer = codec_get_buffer;
2827 ist->st->codec->release_buffer = codec_release_buffer;
2828 ist->st->codec->opaque = &ist->buffer_pool;
2831 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2832 av_dict_set(&ist->opts, "threads", "auto", 0);
2833 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2834 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2835 ist->file_index, ist->st->index);
2836 return AVERROR(EINVAL);
2838 assert_codec_experimental(ist->st->codec, 0);
2839 assert_avoptions(ist->opts);
2842 ist->next_pts = AV_NOPTS_VALUE;
2843 ist->next_dts = AV_NOPTS_VALUE;
2849 static InputStream *get_input_stream(OutputStream *ost)
2851 if (ost->source_index >= 0)
2852 return input_streams[ost->source_index];
2856 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2857 AVCodecContext *avctx)
2863 for (p = kf; *p; p++)
2866 ost->forced_kf_count = n;
2867 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2868 if (!ost->forced_kf_pts) {
2869 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2874 for (i = 0; i < n; i++) {
2875 char *next = strchr(p, ',');
2880 t = parse_time_or_die("force_key_frames", p, 1);
2881 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2887 static void report_new_stream(int input_index, AVPacket *pkt)
2889 InputFile *file = input_files[input_index];
2890 AVStream *st = file->ctx->streams[pkt->stream_index];
2892 if (pkt->stream_index < file->nb_streams_warn)
2894 av_log(file->ctx, AV_LOG_WARNING,
2895 "New %s stream %d:%d at pos:%"PRId64" and DTS:%ss\n",
2896 av_get_media_type_string(st->codec->codec_type),
2897 input_index, pkt->stream_index,
2898 pkt->pos, av_ts2timestr(pkt->dts, &st->time_base));
2899 file->nb_streams_warn = pkt->stream_index + 1;
2902 static int transcode_init(void)
2904 int ret = 0, i, j, k;
2905 AVFormatContext *oc;
2906 AVCodecContext *codec, *icodec = NULL;
2912 /* init framerate emulation */
2913 for (i = 0; i < nb_input_files; i++) {
2914 InputFile *ifile = input_files[i];
2915 if (ifile->rate_emu)
2916 for (j = 0; j < ifile->nb_streams; j++)
2917 input_streams[j + ifile->ist_index]->start = av_gettime();
2920 /* output stream init */
2921 for (i = 0; i < nb_output_files; i++) {
2922 oc = output_files[i]->ctx;
2923 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2924 av_dump_format(oc, i, oc->filename, 1);
2925 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2926 return AVERROR(EINVAL);
2930 /* init complex filtergraphs */
2931 for (i = 0; i < nb_filtergraphs; i++)
2932 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2935 /* for each output stream, we compute the right encoding parameters */
2936 for (i = 0; i < nb_output_streams; i++) {
2937 ost = output_streams[i];
2938 oc = output_files[ost->file_index]->ctx;
2939 ist = get_input_stream(ost);
2941 if (ost->attachment_filename)
2944 codec = ost->st->codec;
2947 icodec = ist->st->codec;
2949 ost->st->disposition = ist->st->disposition;
2950 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2951 codec->chroma_sample_location = icodec->chroma_sample_location;
2954 if (ost->stream_copy) {
2955 uint64_t extra_size;
2957 av_assert0(ist && !ost->filter);
2959 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2961 if (extra_size > INT_MAX) {
2962 return AVERROR(EINVAL);
2965 /* if stream_copy is selected, no need to decode or encode */
2966 codec->codec_id = icodec->codec_id;
2967 codec->codec_type = icodec->codec_type;
2969 if (!codec->codec_tag) {
2970 if (!oc->oformat->codec_tag ||
2971 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2972 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2973 codec->codec_tag = icodec->codec_tag;
2976 codec->bit_rate = icodec->bit_rate;
2977 codec->rc_max_rate = icodec->rc_max_rate;
2978 codec->rc_buffer_size = icodec->rc_buffer_size;
2979 codec->field_order = icodec->field_order;
2980 codec->extradata = av_mallocz(extra_size);
2981 if (!codec->extradata) {
2982 return AVERROR(ENOMEM);
2984 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2985 codec->extradata_size= icodec->extradata_size;
2986 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2988 codec->time_base = ist->st->time_base;
2990 * Avi is a special case here because it supports variable fps but
2991 * having the fps and timebase differe significantly adds quite some
2994 if(!strcmp(oc->oformat->name, "avi")) {
2995 if ( copy_tb<0 && av_q2d(ist->st->r_frame_rate) >= av_q2d(ist->st->avg_frame_rate)
2996 && 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(ist->st->time_base)
2997 && 0.5/av_q2d(ist->st->r_frame_rate) > av_q2d(icodec->time_base)
2998 && av_q2d(ist->st->time_base) < 1.0/500 && av_q2d(icodec->time_base) < 1.0/500
3000 codec->time_base.num = ist->st->r_frame_rate.den;
3001 codec->time_base.den = 2*ist->st->r_frame_rate.num;
3002 codec->ticks_per_frame = 2;
3003 } else if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
3004 && av_q2d(ist->st->time_base) < 1.0/500
3006 codec->time_base = icodec->time_base;
3007 codec->time_base.num *= icodec->ticks_per_frame;
3008 codec->time_base.den *= 2;
3009 codec->ticks_per_frame = 2;
3011 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
3012 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
3013 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
3015 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
3016 && av_q2d(ist->st->time_base) < 1.0/500
3018 codec->time_base = icodec->time_base;
3019 codec->time_base.num *= icodec->ticks_per_frame;
3023 if(ost->frame_rate.num)
3024 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3026 av_reduce(&codec->time_base.num, &codec->time_base.den,
3027 codec->time_base.num, codec->time_base.den, INT_MAX);
3029 switch (codec->codec_type) {
3030 case AVMEDIA_TYPE_AUDIO:
3031 if (audio_volume != 256) {
3032 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3035 codec->channel_layout = icodec->channel_layout;
3036 codec->sample_rate = icodec->sample_rate;
3037 codec->channels = icodec->channels;
3038 codec->frame_size = icodec->frame_size;
3039 codec->audio_service_type = icodec->audio_service_type;
3040 codec->block_align = icodec->block_align;
3041 if((codec->block_align == 1 || codec->block_align == 1152) && codec->codec_id == CODEC_ID_MP3)
3042 codec->block_align= 0;
3043 if(codec->codec_id == CODEC_ID_AC3)
3044 codec->block_align= 0;
3046 case AVMEDIA_TYPE_VIDEO:
3047 codec->pix_fmt = icodec->pix_fmt;
3048 codec->width = icodec->width;
3049 codec->height = icodec->height;
3050 codec->has_b_frames = icodec->has_b_frames;
3051 if (!codec->sample_aspect_ratio.num) {
3052 codec->sample_aspect_ratio =
3053 ost->st->sample_aspect_ratio =
3054 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3055 ist->st->codec->sample_aspect_ratio.num ?
3056 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3058 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3060 case AVMEDIA_TYPE_SUBTITLE:
3061 codec->width = icodec->width;
3062 codec->height = icodec->height;
3064 case AVMEDIA_TYPE_DATA:
3065 case AVMEDIA_TYPE_ATTACHMENT:
3072 ost->enc = avcodec_find_encoder(codec->codec_id);
3074 /* should only happen when a default codec is not present. */
3075 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3076 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3077 ret = AVERROR(EINVAL);
3082 ist->decoding_needed = 1;
3083 ost->encoding_needed = 1;
3086 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3087 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3089 fg = init_simple_filtergraph(ist, ost);
3090 if (configure_filtergraph(fg)) {
3091 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3096 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3097 if (ost->filter && !ost->frame_rate.num)
3098 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
3099 if (ist && !ost->frame_rate.num)
3100 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3101 // ost->frame_rate = ist->st->avg_frame_rate.num ? ist->st->avg_frame_rate : (AVRational){25, 1};
3102 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3103 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3104 ost->frame_rate = ost->enc->supported_framerates[idx];
3108 switch (codec->codec_type) {
3109 case AVMEDIA_TYPE_AUDIO:
3110 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3111 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3112 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3113 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3114 codec->time_base = (AVRational){ 1, codec->sample_rate };
3116 case AVMEDIA_TYPE_VIDEO:
3117 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3118 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
3119 codec->time_base = ost->filter->filter->inputs[0]->time_base;
3120 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3121 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3122 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3123 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3125 for (j = 0; j < ost->forced_kf_count; j++)
3126 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3130 codec->width = ost->filter->filter->inputs[0]->w;
3131 codec->height = ost->filter->filter->inputs[0]->h;
3132 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3133 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3134 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3135 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3136 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3139 codec->width != icodec->width ||
3140 codec->height != icodec->height ||
3141 codec->pix_fmt != icodec->pix_fmt) {
3142 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3145 if (ost->forced_keyframes)
3146 parse_forced_key_frames(ost->forced_keyframes, ost,
3149 case AVMEDIA_TYPE_SUBTITLE:
3150 codec->time_base = (AVRational){1, 1000};
3157 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3158 char logfilename[1024];
3161 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3162 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3164 if (!strcmp(ost->enc->name, "libx264")) {
3165 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3167 if (codec->flags & CODEC_FLAG_PASS2) {
3169 size_t logbuffer_size;
3170 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3171 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3175 codec->stats_in = logbuffer;
3177 if (codec->flags & CODEC_FLAG_PASS1) {
3178 f = fopen(logfilename, "wb");
3180 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3181 logfilename, strerror(errno));
3191 /* open each encoder */
3192 for (i = 0; i < nb_output_streams; i++) {
3193 ost = output_streams[i];
3194 if (ost->encoding_needed) {
3195 AVCodec *codec = ost->enc;
3196 AVCodecContext *dec = NULL;
3198 if ((ist = get_input_stream(ost)))
3199 dec = ist->st->codec;
3200 if (dec && dec->subtitle_header) {
3201 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3202 if (!ost->st->codec->subtitle_header) {
3203 ret = AVERROR(ENOMEM);
3206 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3207 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3209 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3210 av_dict_set(&ost->opts, "threads", "auto", 0);
3211 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3212 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3213 ost->file_index, ost->index);
3214 ret = AVERROR(EINVAL);
3217 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3218 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
3219 av_buffersink_set_frame_size(ost->filter->filter,
3220 ost->st->codec->frame_size);
3221 assert_codec_experimental(ost->st->codec, 1);
3222 assert_avoptions(ost->opts);
3223 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3224 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3225 " It takes bits/s as argument, not kbits/s\n");
3226 extra_size += ost->st->codec->extradata_size;
3228 if (ost->st->codec->me_threshold)
3229 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3233 /* init input streams */
3234 for (i = 0; i < nb_input_streams; i++)
3235 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3238 /* discard unused programs */
3239 for (i = 0; i < nb_input_files; i++) {
3240 InputFile *ifile = input_files[i];
3241 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3242 AVProgram *p = ifile->ctx->programs[j];
3243 int discard = AVDISCARD_ALL;
3245 for (k = 0; k < p->nb_stream_indexes; k++)
3246 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3247 discard = AVDISCARD_DEFAULT;
3250 p->discard = discard;
3254 /* open files and write file headers */
3255 for (i = 0; i < nb_output_files; i++) {
3256 oc = output_files[i]->ctx;
3257 oc->interrupt_callback = int_cb;
3258 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3260 const char *errbuf_ptr = errbuf;
3261 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3262 errbuf_ptr = strerror(AVUNERROR(ret));
3263 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3264 ret = AVERROR(EINVAL);
3267 // assert_avoptions(output_files[i]->opts);
3268 if (strcmp(oc->oformat->name, "rtp")) {
3274 /* dump the file output parameters - cannot be done before in case
3276 for (i = 0; i < nb_output_files; i++) {
3277 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3280 /* dump the stream mapping */
3281 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3282 for (i = 0; i < nb_input_streams; i++) {
3283 ist = input_streams[i];
3285 for (j = 0; j < ist->nb_filters; j++) {
3286 if (ist->filters[j]->graph->graph_desc) {
3287 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3288 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3289 ist->filters[j]->name);
3290 if (nb_filtergraphs > 1)
3291 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3292 av_log(NULL, AV_LOG_INFO, "\n");
3297 for (i = 0; i < nb_output_streams; i++) {
3298 ost = output_streams[i];
3300 if (ost->attachment_filename) {
3301 /* an attached file */
3302 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3303 ost->attachment_filename, ost->file_index, ost->index);
3307 if (ost->filter && ost->filter->graph->graph_desc) {
3308 /* output from a complex graph */
3309 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3310 if (nb_filtergraphs > 1)
3311 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3313 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3314 ost->index, ost->enc ? ost->enc->name : "?");
3318 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3319 input_streams[ost->source_index]->file_index,
3320 input_streams[ost->source_index]->st->index,
3323 if (ost->sync_ist != input_streams[ost->source_index])
3324 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3325 ost->sync_ist->file_index,
3326 ost->sync_ist->st->index);
3327 if (ost->stream_copy)
3328 av_log(NULL, AV_LOG_INFO, " (copy)");
3330 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3331 input_streams[ost->source_index]->dec->name : "?",
3332 ost->enc ? ost->enc->name : "?");
3333 av_log(NULL, AV_LOG_INFO, "\n");
3337 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3349 * @return 1 if there are still streams where more output is wanted,
3352 static int need_output(void)
3356 for (i = 0; i < nb_output_streams; i++) {
3357 OutputStream *ost = output_streams[i];
3358 OutputFile *of = output_files[ost->file_index];
3359 AVFormatContext *os = output_files[ost->file_index]->ctx;
3361 if (ost->is_past_recording_time ||
3362 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3364 if (ost->frame_number >= ost->max_frames) {
3366 for (j = 0; j < of->ctx->nb_streams; j++)
3367 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3377 static int input_acceptable(InputStream *ist)
3379 av_assert1(!ist->discard);
3380 return !input_files[ist->file_index]->unavailable &&
3381 !input_files[ist->file_index]->eof_reached;
3384 static int find_graph_input(FilterGraph *graph)
3386 int i, nb_req_max = 0, file_index = -1;
3388 for (i = 0; i < graph->nb_inputs; i++) {
3389 int nb_req = av_buffersrc_get_nb_failed_requests(graph->inputs[i]->filter);
3390 if (nb_req > nb_req_max) {
3391 InputStream *ist = graph->inputs[i]->ist;
3392 if (input_acceptable(ist)) {
3393 nb_req_max = nb_req;
3394 file_index = ist->file_index;
3403 * Select the input file to read from.
3405 * @return >=0 index of the input file to use;
3406 * -1 if no file is acceptable;
3407 * -2 to read from filters without reading from a file
3409 static int select_input_file(void)
3411 int i, ret, nb_active_out = nb_output_streams, ost_index = -1;
3414 AVFilterBufferRef *dummy;
3416 for (i = 0; i < nb_output_streams; i++)
3417 nb_active_out -= output_streams[i]->unavailable =
3418 output_streams[i]->is_past_recording_time;
3419 while (nb_active_out) {
3420 opts_min = INT64_MAX;
3422 for (i = 0; i < nb_output_streams; i++) {
3423 OutputStream *ost = output_streams[i];
3424 int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
3426 if (!ost->unavailable && opts < opts_min) {
3434 ost = output_streams[ost_index];
3435 if (ost->source_index >= 0) {
3436 /* ost is directly connected to an input */
3437 InputStream *ist = input_streams[ost->source_index];
3438 if (input_acceptable(ist))
3439 return ist->file_index;
3441 /* ost is connected to a complex filtergraph */
3442 av_assert1(ost->filter);
3443 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &dummy,
3444 AV_BUFFERSINK_FLAG_PEEK);
3447 ret = find_graph_input(ost->filter->graph);
3451 ost->unavailable = 1;
3457 static int check_keyboard_interaction(int64_t cur_time)
3460 static int64_t last_time;
3461 if (received_nb_signals)
3462 return AVERROR_EXIT;
3463 /* read_key() returns 0 on EOF */
3464 if(cur_time - last_time >= 100000 && !run_as_daemon){
3466 last_time = cur_time;
3470 return AVERROR_EXIT;
3471 if (key == '+') av_log_set_level(av_log_get_level()+10);
3472 if (key == '-') av_log_set_level(av_log_get_level()-10);
3473 if (key == 's') qp_hist ^= 1;
3476 do_hex_dump = do_pkt_dump = 0;
3477 } else if(do_pkt_dump){
3481 av_log_set_level(AV_LOG_DEBUG);
3483 if (key == 'c' || key == 'C'){
3484 char buf[4096], target[64], command[256], arg[256] = {0};
3487 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3489 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3494 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3495 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3496 target, time, command, arg);
3497 for (i = 0; i < nb_filtergraphs; i++) {
3498 FilterGraph *fg = filtergraphs[i];
3501 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3502 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3503 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3505 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3510 av_log(NULL, AV_LOG_ERROR,
3511 "Parse error, at least 3 arguments were expected, "
3512 "only %d given in string '%s'\n", n, buf);
3515 if (key == 'd' || key == 'D'){
3518 debug = input_streams[0]->st->codec->debug<<1;
3519 if(!debug) debug = 1;
3520 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3523 if(scanf("%d", &debug)!=1)
3524 fprintf(stderr,"error parsing debug value\n");
3525 for(i=0;i<nb_input_streams;i++) {
3526 input_streams[i]->st->codec->debug = debug;
3528 for(i=0;i<nb_output_streams;i++) {
3529 OutputStream *ost = output_streams[i];
3530 ost->st->codec->debug = debug;
3532 if(debug) av_log_set_level(AV_LOG_DEBUG);
3533 fprintf(stderr,"debug=%d\n", debug);
3536 fprintf(stderr, "key function\n"
3537 "? show this help\n"
3538 "+ increase verbosity\n"
3539 "- decrease verbosity\n"
3540 "c Send command to filtergraph\n"
3541 "D cycle through available debug modes\n"
3542 "h dump packets/hex press to cycle through the 3 states\n"
3544 "s Show QP histogram\n"
3551 static void *input_thread(void *arg)
3556 while (!transcoding_finished && ret >= 0) {
3558 ret = av_read_frame(f->ctx, &pkt);
3560 if (ret == AVERROR(EAGAIN)) {
3567 pthread_mutex_lock(&f->fifo_lock);
3568 while (!av_fifo_space(f->fifo))
3569 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3571 av_dup_packet(&pkt);
3572 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3574 pthread_mutex_unlock(&f->fifo_lock);
3581 static void free_input_threads(void)
3585 if (nb_input_files == 1)
3588 transcoding_finished = 1;
3590 for (i = 0; i < nb_input_files; i++) {
3591 InputFile *f = input_files[i];
3594 if (!f->fifo || f->joined)
3597 pthread_mutex_lock(&f->fifo_lock);
3598 while (av_fifo_size(f->fifo)) {
3599 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3600 av_free_packet(&pkt);
3602 pthread_cond_signal(&f->fifo_cond);
3603 pthread_mutex_unlock(&f->fifo_lock);
3605 pthread_join(f->thread, NULL);
3608 while (av_fifo_size(f->fifo)) {
3609 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3610 av_free_packet(&pkt);
3612 av_fifo_free(f->fifo);
3616 static int init_input_threads(void)
3620 if (nb_input_files == 1)
3623 for (i = 0; i < nb_input_files; i++) {
3624 InputFile *f = input_files[i];
3626 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3627 return AVERROR(ENOMEM);
3629 pthread_mutex_init(&f->fifo_lock, NULL);
3630 pthread_cond_init (&f->fifo_cond, NULL);
3632 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3633 return AVERROR(ret);
3638 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3642 pthread_mutex_lock(&f->fifo_lock);
3644 if (av_fifo_size(f->fifo)) {
3645 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3646 pthread_cond_signal(&f->fifo_cond);
3651 ret = AVERROR(EAGAIN);
3654 pthread_mutex_unlock(&f->fifo_lock);
3660 static int get_input_packet(InputFile *f, AVPacket *pkt)
3663 if (nb_input_files > 1)
3664 return get_input_packet_mt(f, pkt);
3666 return av_read_frame(f->ctx, pkt);
3670 * The following code is the main loop of the file converter
3672 static int transcode(void)
3675 AVFormatContext *is, *os;
3678 int no_packet_count = 0;
3679 int64_t timer_start;
3681 ret = transcode_init();
3685 if (stdin_interaction) {
3686 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3689 timer_start = av_gettime();
3692 if ((ret = init_input_threads()) < 0)
3696 for (; received_sigterm == 0;) {
3697 int file_index, ist_index;
3699 int64_t cur_time= av_gettime();
3701 /* if 'q' pressed, exits */
3702 if (stdin_interaction)
3703 if (check_keyboard_interaction(cur_time) < 0)
3706 /* check if there's any stream where output is still needed */
3707 if (!need_output()) {
3708 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3712 /* select the stream that we must read now */
3713 file_index = select_input_file();
3714 /* if none, if is finished */
3715 if (file_index == -2) {
3719 if (file_index < 0) {
3720 if (no_packet_count) {
3721 no_packet_count = 0;
3722 for (i = 0; i < nb_input_files; i++)
3723 input_files[i]->unavailable = 0;
3727 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3731 is = input_files[file_index]->ctx;
3732 ret = get_input_packet(input_files[file_index], &pkt);
3734 if (ret == AVERROR(EAGAIN)) {
3735 input_files[file_index]->unavailable = 1;
3740 if (ret != AVERROR_EOF) {
3741 print_error(is->filename, ret);
3745 input_files[file_index]->eof_reached = 1;
3747 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3748 ist = input_streams[input_files[file_index]->ist_index + i];
3749 if (ist->decoding_needed)
3750 output_packet(ist, NULL);
3760 no_packet_count = 0;
3761 for (i = 0; i < nb_input_files; i++)
3762 input_files[i]->unavailable = 0;
3765 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3766 is->streams[pkt.stream_index]);
3768 /* the following test is needed in case new streams appear
3769 dynamically in stream : we ignore them */
3770 if (pkt.stream_index >= input_files[file_index]->nb_streams) {
3771 report_new_stream(file_index, &pkt);
3772 goto discard_packet;
3774 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3775 ist = input_streams[ist_index];
3777 goto discard_packet;
3779 if(!ist->wrap_correction_done && input_files[file_index]->ctx->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){
3780 uint64_t stime = av_rescale_q(input_files[file_index]->ctx->start_time, AV_TIME_BASE_Q, ist->st->time_base);
3781 uint64_t stime2= stime + (1LL<<ist->st->pts_wrap_bits);
3782 ist->wrap_correction_done = 1;
3783 if(pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime && pkt.dts - stime > stime2 - pkt.dts) {
3784 pkt.dts -= 1LL<<ist->st->pts_wrap_bits;
3785 ist->wrap_correction_done = 0;
3787 if(pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime && pkt.pts - stime > stime2 - pkt.pts) {
3788 pkt.pts -= 1LL<<ist->st->pts_wrap_bits;
3789 ist->wrap_correction_done = 0;
3793 if (pkt.dts != AV_NOPTS_VALUE)
3794 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3795 if (pkt.pts != AV_NOPTS_VALUE)
3796 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3798 if (pkt.pts != AV_NOPTS_VALUE)
3799 pkt.pts *= ist->ts_scale;
3800 if (pkt.dts != AV_NOPTS_VALUE)
3801 pkt.dts *= ist->ts_scale;
3804 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3805 "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",
3806 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3807 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q),
3808 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q),
3809 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3810 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3811 input_files[ist->file_index]->ts_offset);
3814 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3815 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3816 int64_t delta = pkt_dts - ist->next_dts;
3817 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3818 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3819 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3820 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3821 pkt_dts+1<ist->pts){
3822 input_files[ist->file_index]->ts_offset -= delta;
3823 av_log(NULL, AV_LOG_DEBUG,
3824 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3825 delta, input_files[ist->file_index]->ts_offset);
3826 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3827 if (pkt.pts != AV_NOPTS_VALUE)
3828 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3831 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3832 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3833 pkt_dts+1<ist->pts){
3834 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3835 pkt.dts = AV_NOPTS_VALUE;
3837 if (pkt.pts != AV_NOPTS_VALUE){
3838 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3839 delta = pkt_pts - ist->next_dts;
3840 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3841 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3842 pkt_pts+1<ist->pts) {
3843 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3844 pkt.pts = AV_NOPTS_VALUE;
3850 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3851 if ((ret = output_packet(ist, &pkt)) < 0 ||
3852 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3854 av_strerror(ret, buf, sizeof(buf));
3855 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3856 ist->file_index, ist->st->index, buf);
3859 av_free_packet(&pkt);
3864 av_free_packet(&pkt);
3866 /* dump report by using the output first video and audio streams */
3867 print_report(0, timer_start, cur_time);
3870 free_input_threads();
3873 /* at the end of stream, we must flush the decoder buffers */
3874 for (i = 0; i < nb_input_streams; i++) {
3875 ist = input_streams[i];
3876 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3877 output_packet(ist, NULL);
3885 /* write the trailer if needed and close file */
3886 for (i = 0; i < nb_output_files; i++) {
3887 os = output_files[i]->ctx;
3888 av_write_trailer(os);
3891 /* dump report by using the first video and audio streams */
3892 print_report(1, timer_start, av_gettime());
3894 /* close each encoder */
3895 for (i = 0; i < nb_output_streams; i++) {
3896 ost = output_streams[i];
3897 if (ost->encoding_needed) {
3898 av_freep(&ost->st->codec->stats_in);
3899 avcodec_close(ost->st->codec);
3903 /* close each decoder */
3904 for (i = 0; i < nb_input_streams; i++) {
3905 ist = input_streams[i];
3906 if (ist->decoding_needed) {
3907 avcodec_close(ist->st->codec);
3916 free_input_threads();
3919 if (output_streams) {
3920 for (i = 0; i < nb_output_streams; i++) {
3921 ost = output_streams[i];
3923 if (ost->stream_copy)
3924 av_freep(&ost->st->codec->extradata);
3926 fclose(ost->logfile);
3927 ost->logfile = NULL;
3929 av_freep(&ost->st->codec->subtitle_header);
3930 av_free(ost->forced_kf_pts);
3931 av_dict_free(&ost->opts);
3938 static int opt_frame_crop(const char *opt, const char *arg)
3940 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3941 return AVERROR(EINVAL);
3944 static int opt_pad(const char *opt, const char *arg)
3946 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3950 static int opt_video_channel(const char *opt, const char *arg)
3952 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3953 return opt_default("channel", arg);
3956 static int opt_video_standard(const char *opt, const char *arg)
3958 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3959 return opt_default("standard", arg);
3962 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3964 audio_codec_name = arg;
3965 return parse_option(o, "codec:a", arg, options);
3968 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3970 video_codec_name = arg;
3971 return parse_option(o, "codec:v", arg, options);
3974 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3976 subtitle_codec_name = arg;
3977 return parse_option(o, "codec:s", arg, options);
3980 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3982 return parse_option(o, "codec:d", arg, options);
3985 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3987 StreamMap *m = NULL;
3988 int i, negative = 0, file_idx;
3989 int sync_file_idx = -1, sync_stream_idx = 0;
3997 map = av_strdup(arg);
3999 /* parse sync stream first, just pick first matching stream */
4000 if (sync = strchr(map, ',')) {
4002 sync_file_idx = strtol(sync + 1, &sync, 0);
4003 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
4004 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
4009 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
4010 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
4011 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
4012 sync_stream_idx = i;
4015 if (i == input_files[sync_file_idx]->nb_streams) {
4016 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
4017 "match any streams.\n", arg);
4023 if (map[0] == '[') {
4024 /* this mapping refers to lavfi output */
4025 const char *c = map + 1;
4026 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
4027 &o->nb_stream_maps, o->nb_stream_maps + 1);
4028 m = &o->stream_maps[o->nb_stream_maps - 1];
4029 m->linklabel = av_get_token(&c, "]");
4030 if (!m->linklabel) {
4031 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
4035 file_idx = strtol(map, &p, 0);
4036 if (file_idx >= nb_input_files || file_idx < 0) {
4037 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
4041 /* disable some already defined maps */
4042 for (i = 0; i < o->nb_stream_maps; i++) {
4043 m = &o->stream_maps[i];
4044 if (file_idx == m->file_index &&
4045 check_stream_specifier(input_files[m->file_index]->ctx,
4046 input_files[m->file_index]->ctx->streams[m->stream_index],
4047 *p == ':' ? p + 1 : p) > 0)
4051 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
4052 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
4053 *p == ':' ? p + 1 : p) <= 0)
4055 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
4056 &o->nb_stream_maps, o->nb_stream_maps + 1);
4057 m = &o->stream_maps[o->nb_stream_maps - 1];
4059 m->file_index = file_idx;
4060 m->stream_index = i;
4062 if (sync_file_idx >= 0) {
4063 m->sync_file_index = sync_file_idx;
4064 m->sync_stream_index = sync_stream_idx;
4066 m->sync_file_index = file_idx;
4067 m->sync_stream_index = i;
4073 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
4081 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
4083 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
4084 &o->nb_attachments, o->nb_attachments + 1);
4085 o->attachments[o->nb_attachments - 1] = arg;
4089 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
4095 o->audio_channel_maps =
4096 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
4097 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
4098 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
4100 /* muted channel syntax */
4101 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
4102 if ((n == 1 || n == 3) && m->channel_idx == -1) {
4103 m->file_idx = m->stream_idx = -1;
4105 m->ofile_idx = m->ostream_idx = -1;
4110 n = sscanf(arg, "%d.%d.%d:%d.%d",
4111 &m->file_idx, &m->stream_idx, &m->channel_idx,
4112 &m->ofile_idx, &m->ostream_idx);
4114 if (n != 3 && n != 5) {
4115 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
4116 "[file.stream.channel|-1][:syncfile:syncstream]\n");
4120 if (n != 5) // only file.stream.channel specified
4121 m->ofile_idx = m->ostream_idx = -1;
4124 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
4125 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
4129 if (m->stream_idx < 0 ||
4130 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
4131 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
4132 m->file_idx, m->stream_idx);
4135 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
4136 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
4137 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
4138 m->file_idx, m->stream_idx);
4141 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
4142 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
4143 m->file_idx, m->stream_idx, m->channel_idx);
4150 * Parse a metadata specifier in arg.
4151 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
4152 * @param index for type c/p, chapter/program index is written here
4153 * @param stream_spec for type s, the stream specifier is written here
4155 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
4163 if (*(++arg) && *arg != ':') {
4164 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
4167 *stream_spec = *arg == ':' ? arg + 1 : "";
4171 if (*(++arg) == ':')
4172 *index = strtol(++arg, NULL, 0);
4175 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
4182 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4184 AVDictionary **meta_in = NULL;
4185 AVDictionary **meta_out = NULL;
4187 char type_in, type_out;
4188 const char *istream_spec = NULL, *ostream_spec = NULL;
4189 int idx_in = 0, idx_out = 0;
4191 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4192 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4195 if (type_out == 'g' || !*outspec)
4196 o->metadata_global_manual = 1;
4197 if (type_out == 's' || !*outspec)
4198 o->metadata_streams_manual = 1;
4199 if (type_out == 'c' || !*outspec)
4200 o->metadata_chapters_manual = 1;
4204 if (type_in == 'g' || type_out == 'g')
4205 o->metadata_global_manual = 1;
4206 if (type_in == 's' || type_out == 's')
4207 o->metadata_streams_manual = 1;
4208 if (type_in == 'c' || type_out == 'c')
4209 o->metadata_chapters_manual = 1;
4211 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4212 if ((index) < 0 || (index) >= (nb_elems)) {\
4213 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4218 #define SET_DICT(type, meta, context, index)\
4221 meta = &context->metadata;\
4224 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4225 meta = &context->chapters[index]->metadata;\
4228 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4229 meta = &context->programs[index]->metadata;\
4231 default: av_assert0(0);\
4234 SET_DICT(type_in, meta_in, ic, idx_in);
4235 SET_DICT(type_out, meta_out, oc, idx_out);
4237 /* for input streams choose first matching stream */
4238 if (type_in == 's') {
4239 for (i = 0; i < ic->nb_streams; i++) {
4240 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4241 meta_in = &ic->streams[i]->metadata;
4247 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4252 if (type_out == 's') {
4253 for (i = 0; i < oc->nb_streams; i++) {
4254 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4255 meta_out = &oc->streams[i]->metadata;
4256 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4261 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4266 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4269 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4270 struct tm time = *gmtime((time_t*)&recording_timestamp);
4271 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4272 parse_option(o, "metadata", buf, options);
4274 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4275 "tag instead.\n", opt);
4279 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4281 const char *codec_string = encoder ? "encoder" : "decoder";
4285 avcodec_find_encoder_by_name(name) :
4286 avcodec_find_decoder_by_name(name);
4288 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4291 if (codec->type != type) {
4292 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4298 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4300 char *codec_name = NULL;
4302 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4304 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4305 st->codec->codec_id = codec->id;
4308 return avcodec_find_decoder(st->codec->codec_id);
4312 * Add all the streams from the given input file to the global
4313 * list of input streams.
4315 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4318 char *next, *codec_tag = NULL;
4320 for (i = 0; i < ic->nb_streams; i++) {
4321 AVStream *st = ic->streams[i];
4322 AVCodecContext *dec = st->codec;
4323 InputStream *ist = av_mallocz(sizeof(*ist));
4324 char *framerate = NULL;
4329 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4330 input_streams[nb_input_streams - 1] = ist;
4333 ist->file_index = nb_input_files;
4335 st->discard = AVDISCARD_ALL;
4336 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
4338 ist->ts_scale = 1.0;
4339 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4341 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4343 uint32_t tag = strtol(codec_tag, &next, 0);
4345 tag = AV_RL32(codec_tag);
4346 st->codec->codec_tag = tag;
4349 ist->dec = choose_decoder(o, ic, st);
4351 switch (dec->codec_type) {
4352 case AVMEDIA_TYPE_VIDEO:
4354 ist->dec = avcodec_find_decoder(dec->codec_id);
4356 dec->flags |= CODEC_FLAG_EMU_EDGE;
4359 ist->resample_height = dec->height;
4360 ist->resample_width = dec->width;
4361 ist->resample_pix_fmt = dec->pix_fmt;
4363 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4364 if (framerate && av_parse_video_rate(&ist->framerate,
4366 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4371 ist->top_field_first = -1;
4372 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4375 case AVMEDIA_TYPE_AUDIO:
4376 guess_input_channel_layout(ist);
4378 ist->resample_sample_fmt = dec->sample_fmt;
4379 ist->resample_sample_rate = dec->sample_rate;
4380 ist->resample_channels = dec->channels;
4381 ist->resample_channel_layout = dec->channel_layout;
4384 case AVMEDIA_TYPE_DATA:
4385 case AVMEDIA_TYPE_SUBTITLE:
4387 ist->dec = avcodec_find_decoder(dec->codec_id);
4389 case AVMEDIA_TYPE_ATTACHMENT:
4390 case AVMEDIA_TYPE_UNKNOWN:
4398 static void assert_file_overwrite(const char *filename)
4400 if ((!file_overwrite || no_file_overwrite) &&
4401 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4402 av_strstart(filename, "file:", NULL))) {
4403 if (avio_check(filename, 0) == 0) {
4404 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
4405 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4408 signal(SIGINT, SIG_DFL);
4409 if (!read_yesno()) {
4410 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4416 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4423 static void dump_attachment(AVStream *st, const char *filename)
4426 AVIOContext *out = NULL;
4427 AVDictionaryEntry *e;
4429 if (!st->codec->extradata_size) {
4430 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4431 nb_input_files - 1, st->index);
4434 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4435 filename = e->value;
4437 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4438 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4442 assert_file_overwrite(filename);
4444 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4445 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4450 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4455 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4457 AVFormatContext *ic;
4458 AVInputFormat *file_iformat = NULL;
4462 AVDictionary **opts;
4463 int orig_nb_streams; // number of streams before avformat_find_stream_info
4466 if (!(file_iformat = av_find_input_format(o->format))) {
4467 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4472 if (!strcmp(filename, "-"))
4475 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
4476 strcmp(filename, "/dev/stdin");
4478 /* get default parameters from command line */
4479 ic = avformat_alloc_context();
4481 print_error(filename, AVERROR(ENOMEM));
4484 if (o->nb_audio_sample_rate) {
4485 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4486 av_dict_set(&format_opts, "sample_rate", buf, 0);
4488 if (o->nb_audio_channels) {
4489 /* because we set audio_channels based on both the "ac" and
4490 * "channel_layout" options, we need to check that the specified
4491 * demuxer actually has the "channels" option before setting it */
4492 if (file_iformat && file_iformat->priv_class &&
4493 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4494 AV_OPT_SEARCH_FAKE_OBJ)) {
4495 snprintf(buf, sizeof(buf), "%d",
4496 o->audio_channels[o->nb_audio_channels - 1].u.i);
4497 av_dict_set(&format_opts, "channels", buf, 0);
4500 if (o->nb_frame_rates) {
4501 /* set the format-level framerate option;
4502 * this is important for video grabbers, e.g. x11 */
4503 if (file_iformat && file_iformat->priv_class &&
4504 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4505 AV_OPT_SEARCH_FAKE_OBJ)) {
4506 av_dict_set(&format_opts, "framerate",
4507 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4510 if (o->nb_frame_sizes) {
4511 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4513 if (o->nb_frame_pix_fmts)
4514 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4516 ic->video_codec_id = video_codec_name ?
4517 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4518 ic->audio_codec_id = audio_codec_name ?
4519 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4520 ic->subtitle_codec_id= subtitle_codec_name ?
4521 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4522 ic->flags |= AVFMT_FLAG_NONBLOCK;
4523 ic->interrupt_callback = int_cb;
4525 /* open the input file with generic avformat function */
4526 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4528 print_error(filename, err);
4531 assert_avoptions(format_opts);
4533 /* apply forced codec ids */
4534 for (i = 0; i < ic->nb_streams; i++)
4535 choose_decoder(o, ic, ic->streams[i]);
4537 /* Set AVCodecContext options for avformat_find_stream_info */
4538 opts = setup_find_stream_info_opts(ic, codec_opts);
4539 orig_nb_streams = ic->nb_streams;
4541 /* If not enough info to get the stream parameters, we decode the
4542 first frames to get it. (used in mpeg case for example) */
4543 ret = avformat_find_stream_info(ic, opts);
4545 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4546 avformat_close_input(&ic);
4550 timestamp = o->start_time;
4551 /* add the stream start time */
4552 if (ic->start_time != AV_NOPTS_VALUE)
4553 timestamp += ic->start_time;
4555 /* if seeking requested, we execute it */
4556 if (o->start_time != 0) {
4557 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4559 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4560 filename, (double)timestamp / AV_TIME_BASE);
4564 /* update the current parameters so that they match the one of the input stream */
4565 add_input_streams(o, ic);
4567 /* dump the file content */
4568 av_dump_format(ic, nb_input_files, filename, 0);
4570 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4571 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4574 input_files[nb_input_files - 1]->ctx = ic;
4575 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4576 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4577 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4578 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4580 for (i = 0; i < o->nb_dump_attachment; i++) {
4583 for (j = 0; j < ic->nb_streams; j++) {
4584 AVStream *st = ic->streams[j];
4586 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4587 dump_attachment(st, o->dump_attachment[i].u.str);
4591 for (i = 0; i < orig_nb_streams; i++)
4592 av_dict_free(&opts[i]);
4595 reset_options(o, 1);
4599 static uint8_t *get_line(AVIOContext *s)
4605 if (avio_open_dyn_buf(&line) < 0) {
4606 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4610 while ((c = avio_r8(s)) && c != '\n')
4613 avio_close_dyn_buf(line, &buf);
4618 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4621 char filename[1000];
4622 const char *base[3] = { getenv("AVCONV_DATADIR"),
4627 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4631 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4632 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4633 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4636 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4637 i != 1 ? "" : "/.avconv", preset_name);
4638 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4644 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4646 char *codec_name = NULL;
4648 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4650 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4651 NULL, ost->st->codec->codec_type);
4652 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4653 } else if (!strcmp(codec_name, "copy"))
4654 ost->stream_copy = 1;
4656 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4657 ost->st->codec->codec_id = ost->enc->id;
4661 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4664 AVStream *st = avformat_new_stream(oc, NULL);
4665 int idx = oc->nb_streams - 1, ret = 0;
4666 char *bsf = NULL, *next, *codec_tag = NULL;
4667 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4669 char *buf = NULL, *arg = NULL, *preset = NULL;
4670 AVIOContext *s = NULL;
4673 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4677 if (oc->nb_streams - 1 < o->nb_streamid_map)
4678 st->id = o->streamid_map[oc->nb_streams - 1];
4680 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4681 nb_output_streams + 1);
4682 if (!(ost = av_mallocz(sizeof(*ost))))
4684 output_streams[nb_output_streams - 1] = ost;
4686 ost->file_index = nb_output_files;
4689 st->codec->codec_type = type;
4690 choose_encoder(o, oc, ost);
4692 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st, ost->enc);
4695 avcodec_get_context_defaults3(st->codec, ost->enc);
4696 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4698 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4699 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4702 if (!buf[0] || buf[0] == '#') {
4706 if (!(arg = strchr(buf, '='))) {
4707 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4711 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4713 } while (!s->eof_reached);
4717 av_log(NULL, AV_LOG_FATAL,
4718 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4719 preset, ost->file_index, ost->index);
4723 ost->max_frames = INT64_MAX;
4724 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4726 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4728 if (next = strchr(bsf, ','))
4730 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4731 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4735 bsfc_prev->next = bsfc;
4737 ost->bitstream_filters = bsfc;
4743 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4745 uint32_t tag = strtol(codec_tag, &next, 0);
4747 tag = AV_RL32(codec_tag);
4748 st->codec->codec_tag = tag;
4751 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4752 if (qscale >= 0 || same_quant) {
4753 st->codec->flags |= CODEC_FLAG_QSCALE;
4754 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4757 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4758 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4760 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4761 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4762 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4764 ost->source_index = source_index;
4765 if (source_index >= 0) {
4766 ost->sync_ist = input_streams[source_index];
4767 input_streams[source_index]->discard = 0;
4768 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4774 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4777 const char *p = str;
4784 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4791 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4795 AVCodecContext *video_enc;
4796 char *frame_rate = NULL;
4798 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4800 video_enc = st->codec;
4802 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4803 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4804 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4808 if (!ost->stream_copy) {
4809 const char *p = NULL;
4810 char *frame_size = NULL;
4811 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4812 char *intra_matrix = NULL, *inter_matrix = NULL;
4813 const char *filters = "null";
4816 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4817 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4818 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4822 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4823 if (frame_aspect_ratio) {
4825 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4826 q.num <= 0 || q.den <= 0) {
4827 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4830 ost->frame_aspect_ratio = av_q2d(q);
4833 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4834 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4835 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4836 ost->keep_pix_fmt = 1;
4837 if (!*++frame_pix_fmt)
4838 frame_pix_fmt = NULL;
4840 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4841 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4844 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4847 video_enc->gop_size = 0;
4848 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4850 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4851 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4854 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4856 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4858 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4859 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4862 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4865 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4866 for (i = 0; p; i++) {
4868 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4870 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4873 /* FIXME realloc failure */
4874 video_enc->rc_override =
4875 av_realloc(video_enc->rc_override,
4876 sizeof(RcOverride) * (i + 1));
4877 video_enc->rc_override[i].start_frame = start;
4878 video_enc->rc_override[i].end_frame = end;
4880 video_enc->rc_override[i].qscale = q;
4881 video_enc->rc_override[i].quality_factor = 1.0;
4884 video_enc->rc_override[i].qscale = 0;
4885 video_enc->rc_override[i].quality_factor = -q/100.0;
4890 video_enc->rc_override_count = i;
4891 if (!video_enc->rc_initial_buffer_occupancy)
4892 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4893 video_enc->intra_dc_precision = intra_dc_precision - 8;
4896 video_enc->flags|= CODEC_FLAG_PSNR;
4901 video_enc->flags |= CODEC_FLAG_PASS1;
4904 video_enc->flags |= CODEC_FLAG_PASS2;
4908 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
4909 if (ost->forced_keyframes)
4910 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
4912 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4914 ost->top_field_first = -1;
4915 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4917 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4918 ost->avfilter = av_strdup(filters);
4920 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4926 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4931 AVCodecContext *audio_enc;
4933 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4936 audio_enc = st->codec;
4937 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4939 if (!ost->stream_copy) {
4940 char *sample_fmt = NULL;
4941 const char *filters = "anull";
4943 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4945 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4947 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4948 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4952 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4954 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4956 av_assert1(filters);
4957 ost->avfilter = av_strdup(filters);
4959 /* check for channel mapping for this audio stream */
4960 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4961 AudioChannelMap *map = &o->audio_channel_maps[n];
4962 InputStream *ist = input_streams[ost->source_index];
4963 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4964 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4965 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4966 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4967 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4969 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4970 ost->file_index, ost->st->index);
4978 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4982 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4983 if (!ost->stream_copy) {
4984 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4991 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4993 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4994 ost->stream_copy = 1;
4998 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
5002 AVCodecContext *subtitle_enc;
5004 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
5006 subtitle_enc = st->codec;
5008 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
5010 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
5015 /* arg format is "output-stream-index:streamid-value". */
5016 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
5022 av_strlcpy(idx_str, arg, sizeof(idx_str));
5023 p = strchr(idx_str, ':');
5025 av_log(NULL, AV_LOG_FATAL,
5026 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
5031 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
5032 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
5033 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
5037 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
5039 AVFormatContext *is = ifile->ctx;
5040 AVFormatContext *os = ofile->ctx;
5043 for (i = 0; i < is->nb_chapters; i++) {
5044 AVChapter *in_ch = is->chapters[i], *out_ch;
5045 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
5046 AV_TIME_BASE_Q, in_ch->time_base);
5047 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
5048 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
5051 if (in_ch->end < ts_off)
5053 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
5056 out_ch = av_mallocz(sizeof(AVChapter));
5058 return AVERROR(ENOMEM);
5060 out_ch->id = in_ch->id;
5061 out_ch->time_base = in_ch->time_base;
5062 out_ch->start = FFMAX(0, in_ch->start - ts_off);
5063 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
5066 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
5069 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
5071 return AVERROR(ENOMEM);
5072 os->chapters[os->nb_chapters - 1] = out_ch;
5077 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
5080 AVFormatContext *ic = avformat_alloc_context();
5082 ic->interrupt_callback = int_cb;
5083 err = avformat_open_input(&ic, filename, NULL, NULL);
5086 /* copy stream format */
5087 for(i=0;i<ic->nb_streams;i++) {
5091 AVCodecContext *avctx;
5093 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
5094 ost = new_output_stream(o, s, codec->type, -1);
5099 // FIXME: a more elegant solution is needed
5100 memcpy(st, ic->streams[i], sizeof(AVStream));
5102 st->info = av_malloc(sizeof(*st->info));
5103 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
5105 avcodec_copy_context(st->codec, ic->streams[i]->codec);
5107 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
5108 choose_sample_fmt(st, codec);
5109 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
5110 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
5113 avformat_close_input(&ic);
5117 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
5118 AVFormatContext *oc)
5122 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5123 ofilter->out_tmp->pad_idx)) {
5124 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
5125 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
5127 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
5132 ost->source_index = -1;
5133 ost->filter = ofilter;
5137 if (ost->stream_copy) {
5138 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
5139 "which is fed from a complex filtergraph. Filtering and streamcopy "
5140 "cannot be used together.\n", ost->file_index, ost->index);
5143 if (o->recording_time != INT64_MAX)
5144 av_log(NULL, AV_LOG_WARNING,
5145 "-t does not work with -filter_complex (yet).\n");
5147 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
5148 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
5151 avfilter_inout_free(&ofilter->out_tmp);
5154 static void opt_output_file(void *optctx, const char *filename)
5156 OptionsContext *o = optctx;
5157 AVFormatContext *oc;
5159 AVOutputFormat *file_oformat;
5163 if (configure_complex_filters() < 0) {
5164 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
5168 if (!strcmp(filename, "-"))
5171 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
5173 print_error(filename, err);
5176 file_oformat= oc->oformat;
5177 oc->interrupt_callback = int_cb;
5179 /* create streams for all unlabeled output pads */
5180 for (i = 0; i < nb_filtergraphs; i++) {
5181 FilterGraph *fg = filtergraphs[i];
5182 for (j = 0; j < fg->nb_outputs; j++) {
5183 OutputFilter *ofilter = fg->outputs[j];
5185 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5188 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5189 ofilter->out_tmp->pad_idx)) {
5190 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5191 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5192 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5194 init_output_filter(ofilter, o, oc);
5198 if (!strcmp(file_oformat->name, "ffm") &&
5199 av_strstart(filename, "http:", NULL)) {
5201 /* special case for files sent to ffserver: we get the stream
5202 parameters from ffserver */
5203 int err = read_ffserver_streams(o, oc, filename);
5205 print_error(filename, err);
5208 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5209 ost = output_streams[j];
5210 for (i = 0; i < nb_input_streams; i++) {
5211 ist = input_streams[i];
5212 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5214 ost->source_index= i;
5215 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
5216 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
5218 ist->st->discard = AVDISCARD_NONE;
5223 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));
5227 } else if (!o->nb_stream_maps) {
5228 /* pick the "best" stream of each type */
5230 /* video: highest resolution */
5231 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5232 int area = 0, idx = -1;
5233 for (i = 0; i < nb_input_streams; i++) {
5234 ist = input_streams[i];
5235 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5236 ist->st->codec->width * ist->st->codec->height > area) {
5237 area = ist->st->codec->width * ist->st->codec->height;
5242 new_video_stream(o, oc, idx);
5245 /* audio: most channels */
5246 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5247 int channels = 0, idx = -1;
5248 for (i = 0; i < nb_input_streams; i++) {
5249 ist = input_streams[i];
5250 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5251 ist->st->codec->channels > channels) {
5252 channels = ist->st->codec->channels;
5257 new_audio_stream(o, oc, idx);
5260 /* subtitles: pick first */
5261 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5262 for (i = 0; i < nb_input_streams; i++)
5263 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5264 new_subtitle_stream(o, oc, i);
5268 /* do something with data? */
5270 for (i = 0; i < o->nb_stream_maps; i++) {
5271 StreamMap *map = &o->stream_maps[i];
5272 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5277 if (map->linklabel) {
5279 OutputFilter *ofilter = NULL;
5282 for (j = 0; j < nb_filtergraphs; j++) {
5283 fg = filtergraphs[j];
5284 for (k = 0; k < fg->nb_outputs; k++) {
5285 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5286 if (out && !strcmp(out->name, map->linklabel)) {
5287 ofilter = fg->outputs[k];
5294 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5295 "in any defined filter graph.\n", map->linklabel);
5298 init_output_filter(ofilter, o, oc);
5300 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5301 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5303 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5305 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5307 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5310 switch (ist->st->codec->codec_type) {
5311 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5312 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5313 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5314 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5315 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5317 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5318 map->file_index, map->stream_index);
5326 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5327 AVDictionaryEntry *e;
5328 ost = output_streams[i];
5330 if ( ost->stream_copy
5331 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5332 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5333 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5337 /* handle attached files */
5338 for (i = 0; i < o->nb_attachments; i++) {
5340 uint8_t *attachment;
5344 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5345 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5349 if ((len = avio_size(pb)) <= 0) {
5350 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5354 if (!(attachment = av_malloc(len))) {
5355 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5359 avio_read(pb, attachment, len);
5361 ost = new_attachment_stream(o, oc, -1);
5362 ost->stream_copy = 0;
5363 ost->attachment_filename = o->attachments[i];
5364 ost->st->codec->extradata = attachment;
5365 ost->st->codec->extradata_size = len;
5367 p = strrchr(o->attachments[i], '/');
5368 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5372 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5373 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5376 output_files[nb_output_files - 1]->ctx = oc;
5377 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5378 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5379 if (o->recording_time != INT64_MAX)
5380 oc->duration = o->recording_time;
5381 output_files[nb_output_files - 1]->start_time = o->start_time;
5382 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5383 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5385 /* check filename in case of an image number is expected */
5386 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5387 if (!av_filename_number_test(oc->filename)) {
5388 print_error(oc->filename, AVERROR(EINVAL));
5393 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5394 /* test if it already exists to avoid losing precious files */
5395 assert_file_overwrite(filename);
5398 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5399 &oc->interrupt_callback,
5400 &output_files[nb_output_files - 1]->opts)) < 0) {
5401 print_error(filename, err);
5406 if (o->mux_preload) {
5408 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5409 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5411 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5414 for (i = 0; i < o->nb_metadata_map; i++) {
5416 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5418 if (in_file_index >= nb_input_files) {
5419 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5422 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5426 if (o->chapters_input_file >= nb_input_files) {
5427 if (o->chapters_input_file == INT_MAX) {
5428 /* copy chapters from the first input file that has them*/
5429 o->chapters_input_file = -1;
5430 for (i = 0; i < nb_input_files; i++)
5431 if (input_files[i]->ctx->nb_chapters) {
5432 o->chapters_input_file = i;
5436 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5437 o->chapters_input_file);
5441 if (o->chapters_input_file >= 0)
5442 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5443 !o->metadata_chapters_manual);
5445 /* copy global metadata by default */
5446 if (!o->metadata_global_manual && nb_input_files){
5447 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5448 AV_DICT_DONT_OVERWRITE);
5449 if(o->recording_time != INT64_MAX)
5450 av_dict_set(&oc->metadata, "duration", NULL, 0);
5451 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
5453 if (!o->metadata_streams_manual)
5454 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5456 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5458 ist = input_streams[output_streams[i]->source_index];
5459 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5462 /* process manually set metadata */
5463 for (i = 0; i < o->nb_metadata; i++) {
5466 const char *stream_spec;
5467 int index = 0, j, ret = 0;
5469 val = strchr(o->metadata[i].u.str, '=');
5471 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5472 o->metadata[i].u.str);
5477 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5479 for (j = 0; j < oc->nb_streams; j++) {
5480 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5481 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5492 if (index < 0 || index >= oc->nb_chapters) {
5493 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5496 m = &oc->chapters[index]->metadata;
5499 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5502 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5506 reset_options(o, 0);
5509 /* same option as mencoder */
5510 static int opt_pass(const char *opt, const char *arg)
5512 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5516 static int64_t getmaxrss(void)
5518 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5519 struct rusage rusage;
5520 getrusage(RUSAGE_SELF, &rusage);
5521 return (int64_t)rusage.ru_maxrss * 1024;
5522 #elif HAVE_GETPROCESSMEMORYINFO
5524 PROCESS_MEMORY_COUNTERS memcounters;
5525 proc = GetCurrentProcess();
5526 memcounters.cb = sizeof(memcounters);
5527 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5528 return memcounters.PeakPagefileUsage;
5534 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5536 return parse_option(o, "q:a", arg, options);
5539 static void show_usage(void)
5541 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5542 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5543 av_log(NULL, AV_LOG_INFO, "\n");
5546 static int opt_help(const char *opt, const char *arg)
5548 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5549 av_log_set_callback(log_callback_help);
5551 show_help_options(options, "Main options:\n",
5552 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5553 show_help_options(options, "\nAdvanced options:\n",
5554 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5556 show_help_options(options, "\nVideo options:\n",
5557 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5559 show_help_options(options, "\nAdvanced Video options:\n",
5560 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5561 OPT_VIDEO | OPT_EXPERT);
5562 show_help_options(options, "\nAudio options:\n",
5563 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5565 show_help_options(options, "\nAdvanced Audio options:\n",
5566 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5567 OPT_AUDIO | OPT_EXPERT);
5568 show_help_options(options, "\nSubtitle options:\n",
5569 OPT_SUBTITLE | OPT_GRAB,
5571 show_help_options(options, "\nAudio/Video grab options:\n",
5575 show_help_children(avcodec_get_class(), flags);
5576 show_help_children(avformat_get_class(), flags);
5577 show_help_children(sws_get_class(), flags);
5578 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
5583 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5585 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5586 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5588 if (!strncmp(arg, "pal-", 4)) {
5591 } else if (!strncmp(arg, "ntsc-", 5)) {
5594 } else if (!strncmp(arg, "film-", 5)) {
5598 /* Try to determine PAL/NTSC by peeking in the input files */
5599 if (nb_input_files) {
5601 for (j = 0; j < nb_input_files; j++) {
5602 for (i = 0; i < input_files[j]->nb_streams; i++) {
5603 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5604 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5606 fr = c->time_base.den * 1000 / c->time_base.num;
5610 } else if ((fr == 29970) || (fr == 23976)) {
5615 if (norm != UNKNOWN)
5619 if (norm != UNKNOWN)
5620 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5623 if (norm == UNKNOWN) {
5624 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5625 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5626 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5630 if (!strcmp(arg, "vcd")) {
5631 opt_video_codec(o, "c:v", "mpeg1video");
5632 opt_audio_codec(o, "c:a", "mp2");
5633 parse_option(o, "f", "vcd", options);
5635 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5636 parse_option(o, "r", frame_rates[norm], options);
5637 opt_default("g", norm == PAL ? "15" : "18");
5639 opt_default("b:v", "1150000");
5640 opt_default("maxrate", "1150000");
5641 opt_default("minrate", "1150000");
5642 opt_default("bufsize", "327680"); // 40*1024*8;
5644 opt_default("b:a", "224000");
5645 parse_option(o, "ar", "44100", options);
5646 parse_option(o, "ac", "2", options);
5648 opt_default("packetsize", "2324");
5649 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5651 /* We have to offset the PTS, so that it is consistent with the SCR.
5652 SCR starts at 36000, but the first two packs contain only padding
5653 and the first pack from the other stream, respectively, may also have
5654 been written before.
5655 So the real data starts at SCR 36000+3*1200. */
5656 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5657 } else if (!strcmp(arg, "svcd")) {
5659 opt_video_codec(o, "c:v", "mpeg2video");
5660 opt_audio_codec(o, "c:a", "mp2");
5661 parse_option(o, "f", "svcd", options);
5663 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5664 parse_option(o, "r", frame_rates[norm], options);
5665 parse_option(o, "pix_fmt", "yuv420p", options);
5666 opt_default("g", norm == PAL ? "15" : "18");
5668 opt_default("b:v", "2040000");
5669 opt_default("maxrate", "2516000");
5670 opt_default("minrate", "0"); // 1145000;
5671 opt_default("bufsize", "1835008"); // 224*1024*8;
5672 opt_default("scan_offset", "1");
5675 opt_default("b:a", "224000");
5676 parse_option(o, "ar", "44100", options);
5678 opt_default("packetsize", "2324");
5680 } else if (!strcmp(arg, "dvd")) {
5682 opt_video_codec(o, "c:v", "mpeg2video");
5683 opt_audio_codec(o, "c:a", "ac3");
5684 parse_option(o, "f", "dvd", options);
5686 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5687 parse_option(o, "r", frame_rates[norm], options);
5688 parse_option(o, "pix_fmt", "yuv420p", options);
5689 opt_default("g", norm == PAL ? "15" : "18");
5691 opt_default("b:v", "6000000");
5692 opt_default("maxrate", "9000000");
5693 opt_default("minrate", "0"); // 1500000;
5694 opt_default("bufsize", "1835008"); // 224*1024*8;
5696 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5697 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5699 opt_default("b:a", "448000");
5700 parse_option(o, "ar", "48000", options);
5702 } else if (!strncmp(arg, "dv", 2)) {
5704 parse_option(o, "f", "dv", options);
5706 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5707 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5708 norm == PAL ? "yuv420p" : "yuv411p", options);
5709 parse_option(o, "r", frame_rates[norm], options);
5711 parse_option(o, "ar", "48000", options);
5712 parse_option(o, "ac", "2", options);
5715 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5716 return AVERROR(EINVAL);
5721 static int opt_vstats_file(const char *opt, const char *arg)
5723 av_free (vstats_filename);
5724 vstats_filename = av_strdup (arg);
5728 static int opt_vstats(const char *opt, const char *arg)
5731 time_t today2 = time(NULL);
5732 struct tm *today = localtime(&today2);
5734 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5736 return opt_vstats_file(opt, filename);
5739 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5741 return parse_option(o, "frames:v", arg, options);
5744 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5746 return parse_option(o, "frames:a", arg, options);
5749 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5751 return parse_option(o, "frames:d", arg, options);
5754 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5757 char filename[1000], line[1000], tmp_line[1000];
5758 const char *codec_name = *opt == 'v' ? video_codec_name :
5759 *opt == 'a' ? audio_codec_name :
5760 subtitle_codec_name;
5762 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5763 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5764 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5766 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5770 while (fgets(line, sizeof(line), f)) {
5771 char *key = tmp_line, *value, *endptr;
5773 if (strcspn(line, "#\n\r") == 0)
5775 strcpy(tmp_line, line);
5776 if (!av_strtok(key, "=", &value) ||
5777 !av_strtok(value, "\r\n", &endptr)) {
5778 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5781 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5783 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5784 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5785 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5786 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5787 else if (opt_default(key, value) < 0) {
5788 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5789 filename, line, key, value);
5799 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5803 static int opt_passlogfile(const char *opt, const char *arg)
5805 pass_logfilename_prefix = arg;
5806 #if CONFIG_LIBX264_ENCODER
5807 return opt_default(opt, arg);
5813 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5815 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5816 int ret = parse_option(o, s, arg, options);
5821 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5823 if(!strcmp(opt, "b")){
5824 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5825 return parse_option(o, "b:v", arg, options);
5827 return opt_default(opt, arg);
5830 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5834 if(!strcmp(opt, "qscale")){
5835 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5836 return parse_option(o, "q:v", arg, options);
5838 s = av_asprintf("q%s", opt + 6);
5839 ret = parse_option(o, s, arg, options);
5844 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5846 if(!strcmp(opt, "profile")){
5847 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5848 return parse_option(o, "profile:v", arg, options);
5850 return opt_default(opt, arg);
5853 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5855 return parse_option(o, "filter:v", arg, options);
5858 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5860 return parse_option(o, "filter:a", arg, options);
5863 static int opt_vsync(const char *opt, const char *arg)
5865 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5866 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5867 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5868 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5870 if (video_sync_method == VSYNC_AUTO)
5871 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5875 static int opt_deinterlace(const char *opt, const char *arg)
5877 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5882 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5884 char *tcr = av_asprintf("timecode=%s", arg);
5885 int ret = parse_option(o, "metadata:g", tcr, options);
5887 ret = opt_default("gop_timecode", arg);
5892 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5894 int idx = locate_option(argc, argv, options, "cpuflags");
5895 if (idx && argv[idx + 1])
5896 opt_cpuflags("cpuflags", argv[idx + 1]);
5899 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5901 char layout_str[32];
5904 int ret, channels, ac_str_size;
5907 layout = av_get_channel_layout(arg);
5909 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5910 return AVERROR(EINVAL);
5912 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5913 ret = opt_default(opt, layout_str);
5917 /* set 'ac' option based on channel layout */
5918 channels = av_get_channel_layout_nb_channels(layout);
5919 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5920 stream_str = strchr(opt, ':');
5921 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5922 ac_str = av_mallocz(ac_str_size);
5924 return AVERROR(ENOMEM);
5925 av_strlcpy(ac_str, "ac", 3);
5927 av_strlcat(ac_str, stream_str, ac_str_size);
5928 ret = parse_option(o, ac_str, layout_str, options);
5934 static int opt_filter_complex(const char *opt, const char *arg)
5936 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5937 &nb_filtergraphs, nb_filtergraphs + 1);
5938 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5939 return AVERROR(ENOMEM);
5940 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5941 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5945 static int opt_progress(const char *opt, const char *arg)
5947 AVIOContext *avio = NULL;
5950 if (!strcmp(arg, "-"))
5952 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
5954 av_log(0, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
5955 arg, av_err2str(ret));
5958 progress_avio = avio;
5962 #define OFFSET(x) offsetof(OptionsContext, x)
5963 static const OptionDef real_options[] = {
5965 #include "cmdutils_common_opts.h"
5966 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5967 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5968 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5969 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5970 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5971 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5972 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5973 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5974 { "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]" },
5975 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5976 "outfile[,metadata]:infile[,metadata]" },
5977 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5978 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5979 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5980 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5981 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5982 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5983 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5984 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5985 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5986 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5987 "add timings for benchmarking" },
5988 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5989 "add timings for each task" },
5990 { "progress", HAS_ARG | OPT_EXPERT, {(void*)opt_progress},
5991 "write program-readable progress information", "url" },
5992 { "stdin", OPT_BOOL | OPT_EXPERT, {(void*)&stdin_interaction},
5993 "enable or disable interaction on standard input" },
5994 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5995 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5996 "dump each input packet" },
5997 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5998 "when dumping packets, also dump the payload" },
5999 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
6000 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
6001 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
6002 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
6003 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
6004 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
6005 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
6006 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
6007 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
6008 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
6009 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
6010 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
6011 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
6012 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
6013 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
6014 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
6015 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
6016 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
6017 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
6018 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
6019 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
6020 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
6021 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
6024 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
6025 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
6026 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
6027 { "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" },
6028 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
6029 { "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" },
6030 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6031 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6032 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6033 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6034 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6035 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6036 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6037 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6038 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
6039 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
6040 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
6041 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
6042 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
6043 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
6044 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
6045 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
6046 "use same quantizer as source (implies VBR)" },
6047 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
6048 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
6049 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
6050 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
6051 "this option is deprecated, use the yadif filter instead" },
6052 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
6053 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
6054 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
6055 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
6056 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
6057 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
6058 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
6059 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
6060 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
6061 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
6062 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
6063 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
6064 { "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" },
6065 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
6068 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
6069 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
6070 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
6071 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
6072 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
6073 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
6074 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
6075 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
6076 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
6077 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
6078 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
6080 /* subtitle options */
6081 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
6082 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
6083 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
6086 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
6087 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
6088 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
6091 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
6092 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
6094 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
6095 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
6096 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
6098 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
6099 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
6100 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
6101 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
6102 /* data codec support */
6103 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
6104 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
6106 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
6110 int main(int argc, char **argv)
6112 OptionsContext o = { 0 };
6115 options = real_options;
6116 reset_options(&o, 0);
6118 av_log_set_flags(AV_LOG_SKIP_REPEATED);
6119 parse_loglevel(argc, argv, options);
6121 if(argc>1 && !strcmp(argv[1], "-d")){
6123 av_log_set_callback(log_callback_null);
6128 avcodec_register_all();
6130 avdevice_register_all();
6132 avfilter_register_all();
6134 avformat_network_init();
6136 show_banner(argc, argv, options);
6140 parse_cpuflags(argc, argv, options);
6143 parse_options(&o, argc, argv, options, opt_output_file);
6145 if (nb_output_files <= 0 && nb_input_files == 0) {
6147 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
6151 /* file converter / grab */
6152 if (nb_output_files <= 0) {
6153 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
6157 if (nb_input_files == 0) {
6158 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
6162 current_time = ti = getutime();
6163 if (transcode() < 0)
6165 ti = getutime() - ti;
6167 int maxrss = getmaxrss() / 1024;
6168 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);