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
35 #include "libavformat/avformat.h"
36 #include "libavdevice/avdevice.h"
37 #include "libswscale/swscale.h"
38 #include "libswresample/swresample.h"
39 #include "libavutil/opt.h"
40 #include "libavutil/audioconvert.h"
41 #include "libavutil/parseutils.h"
42 #include "libavutil/samplefmt.h"
43 #include "libavutil/colorspace.h"
44 #include "libavutil/fifo.h"
45 #include "libavutil/intreadwrite.h"
46 #include "libavutil/dict.h"
47 #include "libavutil/mathematics.h"
48 #include "libavutil/pixdesc.h"
49 #include "libavutil/avstring.h"
50 #include "libavutil/libm.h"
51 #include "libavutil/imgutils.h"
52 #include "libavutil/timestamp.h"
53 #include "libavutil/bprint.h"
54 #include "libavformat/os_support.h"
56 #include "libavformat/ffm.h" // not public API
58 # include "libavfilter/avcodec.h"
59 # include "libavfilter/avfilter.h"
60 # include "libavfilter/avfiltergraph.h"
61 # include "libavfilter/buffersrc.h"
62 # include "libavfilter/buffersink.h"
64 #if HAVE_SYS_RESOURCE_H
65 #include <sys/types.h>
67 #include <sys/resource.h>
68 #elif HAVE_GETPROCESSTIMES
71 #if HAVE_GETPROCESSMEMORYINFO
77 #include <sys/select.h>
82 #include <sys/ioctl.h>
92 #include "libavutil/avassert.h"
95 #define VSYNC_PASSTHROUGH 0
98 #define VSYNC_DROP 0xff
102 const char program_name[] = "ffmpeg";
103 const int program_birth_year = 2000;
105 /* select an input stream for an output stream */
106 typedef struct StreamMap {
107 int disabled; /** 1 is this mapping is disabled by a negative map */
111 int sync_stream_index;
112 char *linklabel; /** name of an output link, for mapping lavfi outputs */
116 int file_idx, stream_idx, channel_idx; // input
117 int ofile_idx, ostream_idx; // output
120 static const OptionDef options[];
122 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
124 static int frame_bits_per_raw_sample = 0;
125 static int video_discard = 0;
126 static int same_quant = 0;
127 static int do_deinterlace = 0;
128 static int intra_dc_precision = 8;
129 static int qp_hist = 0;
130 static int intra_only = 0;
131 static const char *video_codec_name = NULL;
132 static const char *audio_codec_name = NULL;
133 static const char *subtitle_codec_name = NULL;
135 static int file_overwrite = 0;
136 static int no_file_overwrite = 0;
137 static int do_benchmark = 0;
138 static int do_benchmark_all = 0;
139 static int do_hex_dump = 0;
140 static int do_pkt_dump = 0;
141 static int do_psnr = 0;
142 static int do_pass = 0;
143 static const char *pass_logfilename_prefix;
144 static int video_sync_method = VSYNC_AUTO;
145 static int audio_sync_method = 0;
146 static float audio_drift_threshold = 0.1;
147 static int copy_ts = 0;
148 static int copy_tb = -1;
149 static int opt_shortest = 0;
150 static char *vstats_filename;
151 static FILE *vstats_file;
153 static int audio_volume = 256;
155 static int exit_on_error = 0;
156 static int using_stdin = 0;
157 static int run_as_daemon = 0;
158 static volatile int received_nb_signals = 0;
159 static int64_t video_size = 0;
160 static int64_t audio_size = 0;
161 static int64_t extra_size = 0;
162 static int nb_frames_dup = 0;
163 static int nb_frames_drop = 0;
164 static int input_sync;
166 static float dts_delta_threshold = 10;
167 static float dts_error_threshold = 3600*30;
169 static int print_stats = 1;
170 static int debug_ts = 0;
171 static int current_time;
173 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
175 typedef struct InputFilter {
176 AVFilterContext *filter;
177 struct InputStream *ist;
178 struct FilterGraph *graph;
181 typedef struct OutputFilter {
182 AVFilterContext *filter;
183 struct OutputStream *ost;
184 struct FilterGraph *graph;
186 /* temporary storage until stream maps are processed */
187 AVFilterInOut *out_tmp;
190 typedef struct FilterGraph {
192 const char *graph_desc;
194 AVFilterGraph *graph;
196 InputFilter **inputs;
198 OutputFilter **outputs;
202 typedef struct FrameBuffer {
208 enum PixelFormat pix_fmt;
211 struct InputStream *ist;
212 struct FrameBuffer *next;
215 typedef struct InputStream {
218 int discard; /* true if stream data should be discarded */
219 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
221 AVFrame *decoded_frame;
223 int64_t start; /* time when read started */
224 /* predicted dts of the next packet read for this stream or (when there are
225 * several frames in a packet) of the next frame in current packet */
227 /* dts of the last packet read for this stream */
230 int64_t next_pts; /* synthetic pts for the next decode frame */
231 int64_t pts; /* current pts of the decoded frame */
233 int is_start; /* is 1 at the start and after a discontinuity */
235 int showed_multi_packet_warning;
240 int resample_pix_fmt;
242 int resample_sample_fmt;
243 int resample_sample_rate;
244 int resample_channels;
245 uint64_t resample_channel_layout;
247 /* a pool of free buffers for decoded data */
248 FrameBuffer *buffer_pool;
251 /* decoded data from this stream goes into all those filters
252 * currently video and audio only */
253 InputFilter **filters;
257 typedef struct InputFile {
258 AVFormatContext *ctx;
259 int eof_reached; /* true if eof reached */
260 int ist_index; /* index of first stream in input_streams */
261 int buffer_size; /* current total buffer size */
263 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
264 from ctx.nb_streams if new streams appear during av_read_frame() */
268 typedef struct OutputStream {
269 int file_index; /* file index */
270 int index; /* stream index in the output file */
271 int source_index; /* InputStream index */
272 AVStream *st; /* stream in the output file */
273 int encoding_needed; /* true if encoding needed for this stream */
275 /* input pts and corresponding output pts
277 struct InputStream *sync_ist; /* input stream to sync against */
278 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
279 /* pts of the first frame encoded for this stream, used for limiting
282 AVBitStreamFilterContext *bitstream_filters;
285 AVFrame *filtered_frame;
288 AVRational frame_rate;
292 float frame_aspect_ratio;
295 /* forced key frames */
296 int64_t *forced_kf_pts;
301 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
302 int audio_channels_mapped; /* number of channels in audio_channels_map */
306 OutputFilter *filter;
310 int64_t swr_dither_method;
311 double swr_dither_scale;
313 int is_past_recording_time;
315 const char *attachment_filename;
316 int copy_initial_nonkeyframes;
324 /* init terminal so that we can grab keys */
325 static struct termios oldtty;
326 static int restore_tty;
329 typedef struct OutputFile {
330 AVFormatContext *ctx;
332 int ost_index; /* index of the first stream in output_streams */
333 int64_t recording_time; /* desired length of the resulting file in microseconds */
334 int64_t start_time; /* start time in microseconds */
335 uint64_t limit_filesize; /* filesize limit expressed in bytes */
338 static InputStream **input_streams = NULL;
339 static int nb_input_streams = 0;
340 static InputFile **input_files = NULL;
341 static int nb_input_files = 0;
343 static OutputStream **output_streams = NULL;
344 static int nb_output_streams = 0;
345 static OutputFile **output_files = NULL;
346 static int nb_output_files = 0;
348 static FilterGraph **filtergraphs;
351 typedef struct OptionsContext {
352 /* input/output options */
356 SpecifierOpt *codec_names;
358 SpecifierOpt *audio_channels;
359 int nb_audio_channels;
360 SpecifierOpt *audio_sample_rate;
361 int nb_audio_sample_rate;
362 SpecifierOpt *frame_rates;
364 SpecifierOpt *frame_sizes;
366 SpecifierOpt *frame_pix_fmts;
367 int nb_frame_pix_fmts;
370 int64_t input_ts_offset;
373 SpecifierOpt *ts_scale;
375 SpecifierOpt *dump_attachment;
376 int nb_dump_attachment;
379 StreamMap *stream_maps;
381 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
382 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
383 int metadata_global_manual;
384 int metadata_streams_manual;
385 int metadata_chapters_manual;
386 const char **attachments;
389 int chapters_input_file;
391 int64_t recording_time;
392 uint64_t limit_filesize;
398 int subtitle_disable;
401 /* indexed by output file stream index */
405 SpecifierOpt *metadata;
407 SpecifierOpt *max_frames;
409 SpecifierOpt *bitstream_filters;
410 int nb_bitstream_filters;
411 SpecifierOpt *codec_tags;
413 SpecifierOpt *sample_fmts;
415 SpecifierOpt *qscale;
417 SpecifierOpt *forced_key_frames;
418 int nb_forced_key_frames;
419 SpecifierOpt *force_fps;
421 SpecifierOpt *frame_aspect_ratios;
422 int nb_frame_aspect_ratios;
423 SpecifierOpt *rc_overrides;
425 SpecifierOpt *intra_matrices;
426 int nb_intra_matrices;
427 SpecifierOpt *inter_matrices;
428 int nb_inter_matrices;
429 SpecifierOpt *top_field_first;
430 int nb_top_field_first;
431 SpecifierOpt *metadata_map;
433 SpecifierOpt *presets;
435 SpecifierOpt *copy_initial_nonkeyframes;
436 int nb_copy_initial_nonkeyframes;
437 SpecifierOpt *filters;
441 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
443 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
446 for (i = 0; i < o->nb_ ## name; i++) {\
447 char *spec = o->name[i].specifier;\
448 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
449 outvar = o->name[i].u.type;\
455 static int64_t getutime(void)
458 struct rusage rusage;
460 getrusage(RUSAGE_SELF, &rusage);
461 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
462 #elif HAVE_GETPROCESSTIMES
465 proc = GetCurrentProcess();
466 GetProcessTimes(proc, &c, &e, &k, &u);
467 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
473 static void update_benchmark(const char *fmt, ...)
475 if (do_benchmark_all) {
476 int64_t t = getutime();
482 vsnprintf(buf, sizeof(buf), fmt, va);
484 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
490 static void reset_options(OptionsContext *o, int is_input)
492 const OptionDef *po = options;
493 OptionsContext bak= *o;
496 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
498 void *dst = (uint8_t*)o + po->u.off;
500 if (po->flags & OPT_SPEC) {
501 SpecifierOpt **so = dst;
502 int i, *count = (int*)(so + 1);
503 for (i = 0; i < *count; i++) {
504 av_freep(&(*so)[i].specifier);
505 if (po->flags & OPT_STRING)
506 av_freep(&(*so)[i].u.str);
510 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
515 for (i = 0; i < o->nb_stream_maps; i++)
516 av_freep(&o->stream_maps[i].linklabel);
517 av_freep(&o->stream_maps);
518 av_freep(&o->audio_channel_maps);
519 av_freep(&o->streamid_map);
521 memset(o, 0, sizeof(*o));
523 if(is_input) o->recording_time = bak.recording_time;
524 else o->recording_time = INT64_MAX;
525 o->mux_max_delay = 0.7;
526 o->limit_filesize = UINT64_MAX;
527 o->chapters_input_file = INT_MAX;
533 static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer **pbuf)
535 FrameBuffer *buf = av_mallocz(sizeof(*buf));
537 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
538 int h_chroma_shift, v_chroma_shift;
539 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
540 int w = s->width, h = s->height;
543 return AVERROR(ENOMEM);
545 avcodec_align_dimensions(s, &w, &h);
547 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
552 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
553 s->pix_fmt, 32)) < 0) {
557 /* XXX this shouldn't be needed, but some tests break without this line
558 * those decoders are buggy and need to be fixed.
559 * the following tests fail:
560 * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
562 memset(buf->base[0], 128, ret);
564 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
565 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
566 const int h_shift = i==0 ? 0 : h_chroma_shift;
567 const int v_shift = i==0 ? 0 : v_chroma_shift;
568 if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[1] || !buf->base[i])
569 buf->data[i] = buf->base[i];
571 buf->data[i] = buf->base[i] +
572 FFALIGN((buf->linesize[i]*edge >> v_shift) +
573 (pixel_size*edge >> h_shift), 32);
577 buf->pix_fmt = s->pix_fmt;
584 static void free_buffer_pool(InputStream *ist)
586 FrameBuffer *buf = ist->buffer_pool;
588 ist->buffer_pool = buf->next;
589 av_freep(&buf->base[0]);
591 buf = ist->buffer_pool;
595 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
597 av_assert0(buf->refcount > 0);
599 if (!buf->refcount) {
601 for(tmp= ist->buffer_pool; tmp; tmp= tmp->next)
602 av_assert1(tmp != buf);
603 buf->next = ist->buffer_pool;
604 ist->buffer_pool = buf;
608 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
610 InputStream *ist = s->opaque;
614 if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0)
617 if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
620 buf = ist->buffer_pool;
621 ist->buffer_pool = buf->next;
623 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
624 av_freep(&buf->base[0]);
626 if ((ret = alloc_buffer(ist, s, &buf)) < 0)
629 av_assert0(!buf->refcount);
633 frame->type = FF_BUFFER_TYPE_USER;
634 frame->extended_data = frame->data;
635 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
636 frame->width = buf->w;
637 frame->height = buf->h;
638 frame->format = buf->pix_fmt;
639 frame->sample_aspect_ratio = s->sample_aspect_ratio;
641 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
642 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
643 frame->data[i] = buf->data[i];
644 frame->linesize[i] = buf->linesize[i];
650 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
652 InputStream *ist = s->opaque;
653 FrameBuffer *buf = frame->opaque;
656 if(frame->type!=FF_BUFFER_TYPE_USER)
657 return avcodec_default_release_buffer(s, frame);
659 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
660 frame->data[i] = NULL;
662 unref_buffer(ist, buf);
665 static void filter_release_buffer(AVFilterBuffer *fb)
667 FrameBuffer *buf = fb->priv;
669 unref_buffer(buf->ist, buf);
672 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
674 if (codec && codec->pix_fmts) {
675 const enum PixelFormat *p = codec->pix_fmts;
676 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
677 enum PixelFormat best= PIX_FMT_NONE;
678 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
679 if (st->codec->codec_id == CODEC_ID_MJPEG) {
680 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
681 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
682 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
683 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
686 for (; *p != PIX_FMT_NONE; p++) {
687 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
691 if (*p == PIX_FMT_NONE) {
692 if (target != PIX_FMT_NONE)
693 av_log(NULL, AV_LOG_WARNING,
694 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
695 av_pix_fmt_descriptors[target].name,
697 av_pix_fmt_descriptors[best].name);
704 static char *choose_pix_fmts(OutputStream *ost)
706 if (ost->keep_pix_fmt) {
708 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
709 AVFILTER_AUTO_CONVERT_NONE);
710 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
712 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
714 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
715 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
716 } else if (ost->enc->pix_fmts) {
717 const enum PixelFormat *p;
718 AVIOContext *s = NULL;
722 if (avio_open_dyn_buf(&s) < 0)
725 p = ost->enc->pix_fmts;
726 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
727 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
728 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
729 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
730 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
731 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
735 for (; *p != PIX_FMT_NONE; p++) {
736 const char *name = av_get_pix_fmt_name(*p);
737 avio_printf(s, "%s:", name);
739 len = avio_close_dyn_buf(s, &ret);
747 * Define a function for building a string containing a list of
750 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
751 static char *choose_ ## var ## s(OutputStream *ost) \
753 if (ost->st->codec->var != none) { \
754 get_name(ost->st->codec->var); \
755 return av_strdup(name); \
756 } else if (ost->enc->supported_list) { \
758 AVIOContext *s = NULL; \
762 if (avio_open_dyn_buf(&s) < 0) \
765 for (p = ost->enc->supported_list; *p != none; p++) { \
767 avio_printf(s, "%s" separator, name); \
769 len = avio_close_dyn_buf(s, &ret); \
776 #define GET_PIX_FMT_NAME(pix_fmt)\
777 const char *name = av_get_pix_fmt_name(pix_fmt);
779 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
780 // GET_PIX_FMT_NAME, ":")
782 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
783 const char *name = av_get_sample_fmt_name(sample_fmt)
785 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
786 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
788 #define GET_SAMPLE_RATE_NAME(rate)\
790 snprintf(name, sizeof(name), "%d", rate);
792 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
793 GET_SAMPLE_RATE_NAME, ",")
795 #define GET_CH_LAYOUT_NAME(ch_layout)\
797 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
799 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
800 GET_CH_LAYOUT_NAME, ",")
802 static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
803 AVFilterContext **out_filter)
805 InputStream *ist = fg->inputs[0]->ist;
806 OutputStream *ost = fg->outputs[0]->ost;
807 AVCodecContext *codec = ost->st->codec;
808 AVCodecContext *icodec = ist->st->codec;
809 char *sample_fmts, *sample_rates, *channel_layouts;
813 avfilter_graph_free(&fg->graph);
814 if (!(fg->graph = avfilter_graph_alloc()))
815 return AVERROR(ENOMEM);
817 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:"
818 "channel_layout=0x%"PRIx64, ist->st->time_base.num,
819 ist->st->time_base.den, icodec->sample_rate,
820 av_get_sample_fmt_name(icodec->sample_fmt), icodec->channel_layout);
821 ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
822 avfilter_get_by_name("abuffer"),
823 "src", args, NULL, fg->graph);
827 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
828 avfilter_get_by_name("abuffersink_old"),
829 "out", NULL, NULL, fg->graph);
833 *in_filter = fg->inputs[0]->filter;
834 *out_filter = fg->outputs[0]->filter;
836 if (codec->channels && !codec->channel_layout)
837 codec->channel_layout = av_get_default_channel_layout(codec->channels);
839 sample_fmts = choose_sample_fmts(ost);
840 sample_rates = choose_sample_rates(ost);
841 channel_layouts = choose_channel_layouts(ost);
842 if (sample_fmts || sample_rates || channel_layouts) {
843 AVFilterContext *format;
848 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
851 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
854 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
858 av_freep(&sample_fmts);
859 av_freep(&sample_rates);
860 av_freep(&channel_layouts);
862 ret = avfilter_graph_create_filter(&format,
863 avfilter_get_by_name("aformat"),
864 "aformat", args, NULL, fg->graph);
868 ret = avfilter_link(format, 0, fg->outputs[0]->filter, 0);
872 *out_filter = format;
875 if (audio_sync_method > 0) {
876 AVFilterContext *aswr;
877 char args[256] = {0};
879 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
881 if (audio_sync_method > 1)
882 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)icodec->sample_rate);
884 av_log(NULL, AV_LOG_INFO, "-async %d is forwarded to lavfi similarly to -af aresample=%s\n", audio_sync_method, args);
886 ret = avfilter_graph_create_filter(&aswr, avfilter_get_by_name("aresample"),
887 "aresample", args, NULL, fg->graph);
891 ret = avfilter_link(*in_filter, 0, aswr, 0);
898 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
899 AVFilterContext *filt_ctx; \
901 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
902 "similarly to -af " filter_name "=%s.\n", arg); \
904 ret = avfilter_graph_create_filter(&filt_ctx, \
905 avfilter_get_by_name(filter_name), \
906 filter_name, arg, NULL, fg->graph); \
910 ret = avfilter_link(*in_filter, 0, filt_ctx, 0); \
914 *in_filter = filt_ctx; \
917 if (ost->audio_channels_mapped) {
921 av_bprint_init(&pan_buf, 256, 8192);
922 av_bprintf(&pan_buf, "0x%"PRIx64,
923 av_get_default_channel_layout(ost->audio_channels_mapped));
924 for (i = 0; i < ost->audio_channels_mapped; i++)
925 if (ost->audio_channels_map[i] != -1)
926 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
928 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
929 av_bprint_finalize(&pan_buf, NULL);
932 if (audio_volume != 256) {
935 snprintf(args, sizeof(args), "%lf", audio_volume / 256.);
936 AUTO_INSERT_FILTER("-vol", "volume", args);
942 static int configure_video_filters(FilterGraph *fg, AVFilterContext **in_filter,
943 AVFilterContext **out_filter)
945 InputStream *ist = fg->inputs[0]->ist;
946 OutputStream *ost = fg->outputs[0]->ost;
947 AVFilterContext *filter;
948 AVCodecContext *codec = ost->st->codec;
949 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
951 AVRational sample_aspect_ratio;
955 if (ist->st->sample_aspect_ratio.num) {
956 sample_aspect_ratio = ist->st->sample_aspect_ratio;
958 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
960 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d:flags=%d", ist->st->codec->width,
961 ist->st->codec->height, ist->st->codec->pix_fmt,
962 ist->st->time_base.num, ist->st->time_base.den,
963 sample_aspect_ratio.num, sample_aspect_ratio.den,
964 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
966 ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
967 avfilter_get_by_name("buffer"),
968 "src", args, NULL, fg->graph);
972 #if FF_API_OLD_VSINK_API
973 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
974 avfilter_get_by_name("buffersink"),
975 "out", NULL, NULL, fg->graph);
977 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
978 avfilter_get_by_name("buffersink"),
979 "out", NULL, buffersink_params, fg->graph);
981 av_freep(&buffersink_params);
985 *in_filter = fg->inputs[0]->filter;
986 *out_filter = fg->outputs[0]->filter;
988 if (codec->width || codec->height) {
989 snprintf(args, 255, "%d:%d:flags=0x%X",
992 (unsigned)ost->sws_flags);
993 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
994 NULL, args, NULL, fg->graph)) < 0)
996 if ((ret = avfilter_link(*in_filter, 0, filter, 0)) < 0)
1001 if ((pix_fmts = choose_pix_fmts(ost))) {
1002 if ((ret = avfilter_graph_create_filter(&filter,
1003 avfilter_get_by_name("format"),
1004 "format", pix_fmts, NULL,
1007 if ((ret = avfilter_link(filter, 0, *out_filter, 0)) < 0)
1010 *out_filter = filter;
1011 av_freep(&pix_fmts);
1014 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1015 fg->graph->scale_sws_opts = av_strdup(args);
1020 static int configure_simple_filtergraph(FilterGraph *fg)
1022 OutputStream *ost = fg->outputs[0]->ost;
1023 AVFilterContext *in_filter, *out_filter;
1026 avfilter_graph_free(&fg->graph);
1027 fg->graph = avfilter_graph_alloc();
1029 return AVERROR(ENOMEM);
1031 switch (ost->st->codec->codec_type) {
1032 case AVMEDIA_TYPE_VIDEO:
1033 ret = configure_video_filters(fg, &in_filter, &out_filter);
1035 case AVMEDIA_TYPE_AUDIO:
1036 ret = configure_audio_filters(fg, &in_filter, &out_filter);
1038 default: av_assert0(0);
1043 if (ost->avfilter) {
1044 AVFilterInOut *outputs = avfilter_inout_alloc();
1045 AVFilterInOut *inputs = avfilter_inout_alloc();
1047 outputs->name = av_strdup("in");
1048 outputs->filter_ctx = in_filter;
1049 outputs->pad_idx = 0;
1050 outputs->next = NULL;
1052 inputs->name = av_strdup("out");
1053 inputs->filter_ctx = out_filter;
1054 inputs->pad_idx = 0;
1055 inputs->next = NULL;
1057 if ((ret = avfilter_graph_parse(fg->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
1059 av_freep(&ost->avfilter);
1061 if ((ret = avfilter_link(in_filter, 0, out_filter, 0)) < 0)
1065 if (ost->keep_pix_fmt)
1066 avfilter_graph_set_auto_convert(fg->graph,
1067 AVFILTER_AUTO_CONVERT_NONE);
1069 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1072 ost->filter = fg->outputs[0];
1077 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
1079 FilterGraph *fg = av_mallocz(sizeof(*fg));
1083 fg->index = nb_filtergraphs;
1085 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
1086 fg->nb_outputs + 1);
1087 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
1089 fg->outputs[0]->ost = ost;
1090 fg->outputs[0]->graph = fg;
1092 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
1094 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
1096 fg->inputs[0]->ist = ist;
1097 fg->inputs[0]->graph = fg;
1099 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
1100 &ist->nb_filters, ist->nb_filters + 1);
1101 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
1103 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
1104 &nb_filtergraphs, nb_filtergraphs + 1);
1105 filtergraphs[nb_filtergraphs - 1] = fg;
1110 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
1112 InputStream *ist = NULL;
1113 enum AVMediaType type = in->filter_ctx->input_pads[in->pad_idx].type;
1116 // TODO: support other filter types
1117 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
1118 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
1125 AVStream *st = NULL;
1127 int file_idx = strtol(in->name, &p, 0);
1129 if (file_idx < 0 || file_idx >= nb_input_files) {
1130 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
1131 file_idx, fg->graph_desc);
1134 s = input_files[file_idx]->ctx;
1136 for (i = 0; i < s->nb_streams; i++) {
1137 if (s->streams[i]->codec->codec_type != type)
1139 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
1145 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
1146 "matches no streams.\n", p, fg->graph_desc);
1149 ist = input_streams[input_files[file_idx]->ist_index + st->index];
1151 /* find the first unused stream of corresponding type */
1152 for (i = 0; i < nb_input_streams; i++) {
1153 ist = input_streams[i];
1154 if (ist->st->codec->codec_type == type && ist->discard)
1157 if (i == nb_input_streams) {
1158 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
1159 "unlabeled input pad %d on filter %s", in->pad_idx,
1160 in->filter_ctx->name);
1165 ist->decoding_needed = 1;
1166 ist->st->discard = AVDISCARD_NONE;
1168 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
1169 &fg->nb_inputs, fg->nb_inputs + 1);
1170 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
1172 fg->inputs[fg->nb_inputs - 1]->ist = ist;
1173 fg->inputs[fg->nb_inputs - 1]->graph = fg;
1175 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
1176 &ist->nb_filters, ist->nb_filters + 1);
1177 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
1180 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1183 AVCodecContext *codec = ofilter->ost->st->codec;
1184 AVFilterContext *last_filter = out->filter_ctx;
1185 int pad_idx = out->pad_idx;
1187 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
1189 #if FF_API_OLD_VSINK_API
1190 ret = avfilter_graph_create_filter(&ofilter->filter,
1191 avfilter_get_by_name("buffersink"),
1192 "out", NULL, NULL, fg->graph);
1194 ret = avfilter_graph_create_filter(&ofilter->filter,
1195 avfilter_get_by_name("buffersink"),
1196 "out", NULL, buffersink_params, fg->graph);
1198 av_freep(&buffersink_params);
1203 if (codec->width || codec->height) {
1205 AVFilterContext *filter;
1207 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
1210 (unsigned)ofilter->ost->sws_flags);
1211 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
1212 NULL, args, NULL, fg->graph)) < 0)
1214 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1217 last_filter = filter;
1221 if ((pix_fmts = choose_pix_fmts(ofilter->ost))) {
1222 AVFilterContext *filter;
1223 if ((ret = avfilter_graph_create_filter(&filter,
1224 avfilter_get_by_name("format"),
1225 "format", pix_fmts, NULL,
1228 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1231 last_filter = filter;
1233 av_freep(&pix_fmts);
1236 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1242 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1244 OutputStream *ost = ofilter->ost;
1245 AVCodecContext *codec = ost->st->codec;
1246 AVFilterContext *last_filter = out->filter_ctx;
1247 int pad_idx = out->pad_idx;
1248 char *sample_fmts, *sample_rates, *channel_layouts;
1251 ret = avfilter_graph_create_filter(&ofilter->filter,
1252 avfilter_get_by_name("abuffersink"),
1253 "out", NULL, NULL, fg->graph);
1257 if (codec->channels && !codec->channel_layout)
1258 codec->channel_layout = av_get_default_channel_layout(codec->channels);
1260 sample_fmts = choose_sample_fmts(ost);
1261 sample_rates = choose_sample_rates(ost);
1262 channel_layouts = choose_channel_layouts(ost);
1263 if (sample_fmts || sample_rates || channel_layouts) {
1264 AVFilterContext *format;
1269 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
1272 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
1274 if (channel_layouts)
1275 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
1279 av_freep(&sample_fmts);
1280 av_freep(&sample_rates);
1281 av_freep(&channel_layouts);
1283 ret = avfilter_graph_create_filter(&format,
1284 avfilter_get_by_name("aformat"),
1285 "aformat", args, NULL, fg->graph);
1289 ret = avfilter_link(last_filter, pad_idx, format, 0);
1293 last_filter = format;
1297 if (audio_sync_method > 0) {
1298 AVFilterContext *async;
1302 av_log(NULL, AV_LOG_WARNING, "-async has been deprecated. Used the "
1303 "asyncts audio filter instead.\n");
1305 if (audio_sync_method > 1)
1306 len += snprintf(args + len, sizeof(args) - len, "compensate=1:"
1307 "max_comp=%d:", audio_sync_method);
1308 snprintf(args + len, sizeof(args) - len, "min_delta=%f",
1309 audio_drift_threshold);
1311 ret = avfilter_graph_create_filter(&async,
1312 avfilter_get_by_name("asyncts"),
1313 "async", args, NULL, fg->graph);
1317 ret = avfilter_link(last_filter, pad_idx, async, 0);
1321 last_filter = async;
1325 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1331 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1333 switch (out->filter_ctx->output_pads[out->pad_idx].type) {
1334 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1335 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1336 default: av_assert0(0);
1340 static int configure_complex_filter(FilterGraph *fg)
1342 AVFilterInOut *inputs, *outputs, *cur;
1343 int ret, i, init = !fg->graph;
1345 avfilter_graph_free(&fg->graph);
1346 if (!(fg->graph = avfilter_graph_alloc()))
1347 return AVERROR(ENOMEM);
1349 if ((ret = avfilter_graph_parse2(fg->graph, fg->graph_desc, &inputs, &outputs)) < 0)
1352 for (cur = inputs; init && cur; cur = cur->next)
1353 init_input_filter(fg, cur);
1355 for (cur = inputs, i = 0; cur; cur = cur->next, i++) {
1356 InputFilter *ifilter = fg->inputs[i];
1357 InputStream *ist = ifilter->ist;
1362 switch (cur->filter_ctx->input_pads[cur->pad_idx].type) {
1363 case AVMEDIA_TYPE_VIDEO:
1364 sar = ist->st->sample_aspect_ratio.num ?
1365 ist->st->sample_aspect_ratio :
1366 ist->st->codec->sample_aspect_ratio;
1367 snprintf(args, sizeof(args), "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
1368 ist->st->codec->height, ist->st->codec->pix_fmt,
1369 ist->st->time_base.num, ist->st->time_base.den,
1371 filter = avfilter_get_by_name("buffer");
1373 case AVMEDIA_TYPE_AUDIO:
1374 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:"
1375 "sample_fmt=%s:channel_layout=0x%"PRIx64,
1376 ist->st->time_base.num, ist->st->time_base.den,
1377 ist->st->codec->sample_rate,
1378 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1379 ist->st->codec->channel_layout);
1380 filter = avfilter_get_by_name("abuffer");
1386 if ((ret = avfilter_graph_create_filter(&ifilter->filter,
1388 args, NULL, fg->graph)) < 0)
1390 if ((ret = avfilter_link(ifilter->filter, 0,
1391 cur->filter_ctx, cur->pad_idx)) < 0)
1394 avfilter_inout_free(&inputs);
1397 /* we already know the mappings between lavfi outputs and output streams,
1398 * so we can finish the setup */
1399 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1400 configure_output_filter(fg, fg->outputs[i], cur);
1401 avfilter_inout_free(&outputs);
1403 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1406 /* wait until output mappings are processed */
1407 for (cur = outputs; cur;) {
1408 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1409 &fg->nb_outputs, fg->nb_outputs + 1);
1410 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1412 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1413 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1415 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1422 static int configure_complex_filters(void)
1426 for (i = 0; i < nb_filtergraphs; i++)
1427 if (!filtergraphs[i]->graph &&
1428 (ret = configure_complex_filter(filtergraphs[i])) < 0)
1433 static int configure_filtergraph(FilterGraph *fg)
1435 return fg->graph_desc ? configure_complex_filter(fg) :
1436 configure_simple_filtergraph(fg);
1439 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1442 for (i = 0; i < fg->nb_inputs; i++)
1443 if (fg->inputs[i]->ist == ist)
1448 static void term_exit(void)
1450 av_log(NULL, AV_LOG_QUIET, "%s", "");
1453 tcsetattr (0, TCSANOW, &oldtty);
1457 static volatile int received_sigterm = 0;
1459 static void sigterm_handler(int sig)
1461 received_sigterm = sig;
1462 received_nb_signals++;
1464 if(received_nb_signals > 3)
1468 static void term_init(void)
1474 if (tcgetattr (0, &tty) == 0) {
1479 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1480 |INLCR|IGNCR|ICRNL|IXON);
1481 tty.c_oflag |= OPOST;
1482 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1483 tty.c_cflag &= ~(CSIZE|PARENB);
1486 tty.c_cc[VTIME] = 0;
1488 tcsetattr (0, TCSANOW, &tty);
1490 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1493 avformat_network_deinit();
1495 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1496 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1498 signal(SIGXCPU, sigterm_handler);
1502 /* read a key without blocking */
1503 static int read_key(void)
1515 n = select(1, &rfds, NULL, NULL, &tv);
1517 n = read(0, &ch, 1);
1524 # if HAVE_PEEKNAMEDPIPE
1526 static HANDLE input_handle;
1529 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1530 is_pipe = !GetConsoleMode(input_handle, &dw);
1533 if (stdin->_cnt > 0) {
1538 /* When running under a GUI, you will end here. */
1539 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1556 static int decode_interrupt_cb(void *ctx)
1558 return received_nb_signals > 1;
1561 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1563 void av_noreturn exit_program(int ret)
1567 for (i = 0; i < nb_filtergraphs; i++) {
1568 avfilter_graph_free(&filtergraphs[i]->graph);
1569 for (j = 0; j < filtergraphs[i]->nb_inputs; j++)
1570 av_freep(&filtergraphs[i]->inputs[j]);
1571 av_freep(&filtergraphs[i]->inputs);
1572 for (j = 0; j < filtergraphs[i]->nb_outputs; j++)
1573 av_freep(&filtergraphs[i]->outputs[j]);
1574 av_freep(&filtergraphs[i]->outputs);
1575 av_freep(&filtergraphs[i]);
1577 av_freep(&filtergraphs);
1580 for (i = 0; i < nb_output_files; i++) {
1581 AVFormatContext *s = output_files[i]->ctx;
1582 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1584 avformat_free_context(s);
1585 av_dict_free(&output_files[i]->opts);
1586 av_freep(&output_files[i]);
1588 for (i = 0; i < nb_output_streams; i++) {
1589 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1591 AVBitStreamFilterContext *next = bsfc->next;
1592 av_bitstream_filter_close(bsfc);
1595 output_streams[i]->bitstream_filters = NULL;
1597 av_freep(&output_streams[i]->filtered_frame);
1598 av_freep(&output_streams[i]);
1600 for (i = 0; i < nb_input_files; i++) {
1601 avformat_close_input(&input_files[i]->ctx);
1602 av_freep(&input_files[i]);
1604 for (i = 0; i < nb_input_streams; i++) {
1605 av_freep(&input_streams[i]->decoded_frame);
1606 av_dict_free(&input_streams[i]->opts);
1607 free_buffer_pool(input_streams[i]);
1608 av_freep(&input_streams[i]->filters);
1609 av_freep(&input_streams[i]);
1613 fclose(vstats_file);
1614 av_free(vstats_filename);
1616 av_freep(&input_streams);
1617 av_freep(&input_files);
1618 av_freep(&output_streams);
1619 av_freep(&output_files);
1624 avformat_network_deinit();
1626 if (received_sigterm) {
1627 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1628 (int) received_sigterm);
1635 static void assert_avoptions(AVDictionary *m)
1637 AVDictionaryEntry *t;
1638 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1639 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1644 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1646 const char *codec_string = encoder ? "encoder" : "decoder";
1648 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1649 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1650 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1651 "results.\nAdd '-strict experimental' if you want to use it.\n",
1652 codec_string, c->codec->name);
1653 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1654 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1655 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1656 codec_string, codec->name);
1661 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1663 if (codec && codec->sample_fmts) {
1664 const enum AVSampleFormat *p = codec->sample_fmts;
1665 for (; *p != -1; p++) {
1666 if (*p == st->codec->sample_fmt)
1670 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1671 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1672 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1673 av_log(NULL, AV_LOG_WARNING,
1674 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1675 av_get_sample_fmt_name(st->codec->sample_fmt),
1677 av_get_sample_fmt_name(codec->sample_fmts[0]));
1678 st->codec->sample_fmt = codec->sample_fmts[0];
1684 get_sync_ipts(const OutputStream *ost, int64_t pts)
1686 OutputFile *of = output_files[ost->file_index];
1687 return (double)(pts - of->start_time) / AV_TIME_BASE;
1690 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1692 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1693 AVCodecContext *avctx = ost->st->codec;
1696 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1697 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1698 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1700 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1701 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1702 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1703 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1704 pkt->pts = pkt->dts = max;
1709 * Audio encoders may split the packets -- #frames in != #packets out.
1710 * But there is no reordering, so we can limit the number of output packets
1711 * by simply dropping them here.
1712 * Counting encoded video frames needs to be done separately because of
1713 * reordering, see do_video_out()
1715 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1716 if (ost->frame_number >= ost->max_frames) {
1717 av_free_packet(pkt);
1720 ost->frame_number++;
1724 AVPacket new_pkt = *pkt;
1725 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1726 &new_pkt.data, &new_pkt.size,
1727 pkt->data, pkt->size,
1728 pkt->flags & AV_PKT_FLAG_KEY);
1730 av_free_packet(pkt);
1731 new_pkt.destruct = av_destruct_packet;
1733 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1734 bsfc->filter->name, pkt->stream_index,
1735 avctx->codec ? avctx->codec->name : "copy");
1745 pkt->stream_index = ost->index;
1746 ret = av_interleaved_write_frame(s, pkt);
1748 print_error("av_interleaved_write_frame()", ret);
1753 static int check_recording_time(OutputStream *ost)
1755 OutputFile *of = output_files[ost->file_index];
1757 if (of->recording_time != INT64_MAX &&
1758 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1759 AV_TIME_BASE_Q) >= 0) {
1760 ost->is_past_recording_time = 1;
1766 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1769 AVCodecContext *enc = ost->st->codec;
1773 av_init_packet(&pkt);
1777 if (!check_recording_time(ost))
1780 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1781 frame->pts = ost->sync_opts;
1782 ost->sync_opts = frame->pts + frame->nb_samples;
1784 av_assert0(pkt.size || !pkt.data);
1785 update_benchmark(NULL);
1786 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1787 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1790 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1793 if (pkt.pts != AV_NOPTS_VALUE)
1794 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1795 if (pkt.dts != AV_NOPTS_VALUE)
1796 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1797 if (pkt.duration > 0)
1798 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1801 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1802 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1803 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1804 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1807 write_frame(s, &pkt, ost);
1809 audio_size += pkt.size;
1810 av_free_packet(&pkt);
1814 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1816 AVCodecContext *dec;
1817 AVPicture *picture2;
1818 AVPicture picture_tmp;
1821 dec = ist->st->codec;
1823 /* deinterlace : must be done before any resize */
1824 if (do_deinterlace) {
1827 /* create temporary picture */
1828 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1829 buf = av_malloc(size);
1833 picture2 = &picture_tmp;
1834 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1836 if (avpicture_deinterlace(picture2, picture,
1837 dec->pix_fmt, dec->width, dec->height) < 0) {
1838 /* if error, do not deinterlace */
1839 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1848 if (picture != picture2)
1849 *picture = *picture2;
1853 static void do_subtitle_out(AVFormatContext *s,
1859 static uint8_t *subtitle_out = NULL;
1860 int subtitle_out_max_size = 1024 * 1024;
1861 int subtitle_out_size, nb, i;
1862 AVCodecContext *enc;
1865 if (pts == AV_NOPTS_VALUE) {
1866 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1872 enc = ost->st->codec;
1874 if (!subtitle_out) {
1875 subtitle_out = av_malloc(subtitle_out_max_size);
1878 /* Note: DVB subtitle need one packet to draw them and one other
1879 packet to clear them */
1880 /* XXX: signal it in the codec context ? */
1881 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1886 for (i = 0; i < nb; i++) {
1887 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1889 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1890 // start_display_time is required to be 0
1891 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1892 sub->end_display_time -= sub->start_display_time;
1893 sub->start_display_time = 0;
1894 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1895 subtitle_out_max_size, sub);
1896 if (subtitle_out_size < 0) {
1897 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1901 av_init_packet(&pkt);
1902 pkt.data = subtitle_out;
1903 pkt.size = subtitle_out_size;
1904 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1905 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1906 /* XXX: the pts correction is handled here. Maybe handling
1907 it in the codec would be better */
1909 pkt.pts += 90 * sub->start_display_time;
1911 pkt.pts += 90 * sub->end_display_time;
1913 write_frame(s, &pkt, ost);
1917 static void do_video_out(AVFormatContext *s, OutputStream *ost,
1918 AVFrame *in_picture, float quality)
1920 int nb_frames, i, ret, format_video_sync;
1922 AVCodecContext *enc;
1923 double sync_ipts, delta;
1924 double duration = 0;
1926 InputStream *ist = NULL;
1928 if (ost->source_index >= 0)
1929 ist = input_streams[ost->source_index];
1931 enc = ost->st->codec;
1933 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1934 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1936 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1937 delta = sync_ipts - ost->sync_opts + duration;
1939 /* by default, we output a single frame */
1942 format_video_sync = video_sync_method;
1943 if (format_video_sync == VSYNC_AUTO)
1944 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1946 switch (format_video_sync) {
1948 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1951 else if (delta > 1.1)
1952 nb_frames = lrintf(delta);
1957 else if (delta > 0.6)
1958 ost->sync_opts = lrint(sync_ipts);
1961 case VSYNC_PASSTHROUGH:
1962 ost->sync_opts = lrint(sync_ipts);
1968 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1969 if (nb_frames == 0) {
1971 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1973 } else if (nb_frames > 1) {
1974 nb_frames_dup += nb_frames - 1;
1975 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1980 av_init_packet(&pkt);
1984 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1985 enc->codec->id == CODEC_ID_RAWVIDEO) {
1986 /* raw pictures are written as AVPicture structure to
1987 avoid any copies. We support temporarily the older
1989 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1990 enc->coded_frame->top_field_first = in_picture->top_field_first;
1991 pkt.data = (uint8_t *)in_picture;
1992 pkt.size = sizeof(AVPicture);
1993 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1994 pkt.flags |= AV_PKT_FLAG_KEY;
1996 write_frame(s, &pkt, ost);
1999 AVFrame big_picture;
2001 big_picture = *in_picture;
2002 /* better than nothing: use input picture interlaced
2004 big_picture.interlaced_frame = in_picture->interlaced_frame;
2005 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
2006 if (ost->top_field_first == -1)
2007 big_picture.top_field_first = in_picture->top_field_first;
2009 big_picture.top_field_first = !!ost->top_field_first;
2012 /* handles same_quant here. This is not correct because it may
2013 not be a global option */
2014 big_picture.quality = quality;
2015 if (!enc->me_threshold)
2016 big_picture.pict_type = 0;
2017 big_picture.pts = ost->sync_opts;
2018 if (ost->forced_kf_index < ost->forced_kf_count &&
2019 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
2020 big_picture.pict_type = AV_PICTURE_TYPE_I;
2021 ost->forced_kf_index++;
2023 update_benchmark(NULL);
2024 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
2025 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
2027 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
2032 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
2033 pkt.pts = ost->sync_opts;
2035 if (pkt.pts != AV_NOPTS_VALUE)
2036 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2037 if (pkt.dts != AV_NOPTS_VALUE)
2038 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2041 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
2042 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
2043 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
2044 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
2047 write_frame(s, &pkt, ost);
2048 frame_size = pkt.size;
2049 video_size += pkt.size;
2050 av_free_packet(&pkt);
2052 /* if two pass, output log */
2053 if (ost->logfile && enc->stats_out) {
2054 fprintf(ost->logfile, "%s", enc->stats_out);
2060 * For video, number of frames in == number of packets out.
2061 * But there may be reordering, so we can't throw away frames on encoder
2062 * flush, we need to limit them here, before they go into encoder.
2064 ost->frame_number++;
2067 goto duplicate_frame;
2069 if (vstats_filename && frame_size)
2070 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
2073 static double psnr(double d)
2075 return -10.0 * log(d) / log(10.0);
2078 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
2081 AVCodecContext *enc;
2083 double ti1, bitrate, avg_bitrate;
2085 /* this is executed just the first time do_video_stats is called */
2087 vstats_file = fopen(vstats_filename, "w");
2094 enc = ost->st->codec;
2095 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2096 frame_number = ost->frame_number;
2097 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
2098 if (enc->flags&CODEC_FLAG_PSNR)
2099 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
2101 fprintf(vstats_file,"f_size= %6d ", frame_size);
2102 /* compute pts value */
2103 ti1 = ost->sync_opts * av_q2d(enc->time_base);
2107 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
2108 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
2109 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
2110 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
2111 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
2115 /* check for new output on any of the filtergraphs */
2116 static int poll_filters(void)
2118 AVFilterBufferRef *picref;
2119 AVFrame *filtered_frame = NULL;
2120 int i, ret, ret_all;
2121 unsigned nb_success, nb_eof;
2125 /* Reap all buffers present in the buffer sinks */
2126 for (i = 0; i < nb_output_streams; i++) {
2127 OutputStream *ost = output_streams[i];
2128 OutputFile *of = output_files[ost->file_index];
2131 if (!ost->filter || ost->is_past_recording_time)
2134 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
2135 return AVERROR(ENOMEM);
2137 avcodec_get_frame_defaults(ost->filtered_frame);
2138 filtered_frame = ost->filtered_frame;
2141 AVRational ist_pts_tb = ost->filter->filter->inputs[0]->time_base;
2142 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2143 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2144 ret = av_buffersink_read_samples(ost->filter->filter, &picref,
2145 ost->st->codec->frame_size);
2148 ret = av_buffersink_read(ost->filter->filter, &picref);
2150 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
2151 AV_BUFFERSINK_FLAG_NO_REQUEST);
2154 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
2156 av_strerror(ret, buf, sizeof(buf));
2157 av_log(NULL, AV_LOG_WARNING,
2158 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
2162 frame_pts = AV_NOPTS_VALUE;
2163 if (ost->enc->type == AVMEDIA_TYPE_VIDEO)
2164 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2165 else if (picref->pts != AV_NOPTS_VALUE)
2166 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
2167 ost->filter->filter->inputs[0]->time_base,
2168 ost->st->codec->time_base) -
2169 av_rescale_q(of->start_time,
2171 ost->st->codec->time_base);
2172 //if (ost->source_index >= 0)
2173 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
2175 if (of->start_time && filtered_frame->pts < of->start_time) {
2176 avfilter_unref_buffer(picref);
2180 switch (ost->filter->filter->inputs[0]->type) {
2181 case AVMEDIA_TYPE_VIDEO:
2182 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
2183 filtered_frame->pts = frame_pts;
2184 if (!ost->frame_aspect_ratio)
2185 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
2187 do_video_out(of->ctx, ost, filtered_frame,
2188 same_quant ? ost->last_quality :
2189 ost->st->codec->global_quality);
2191 case AVMEDIA_TYPE_AUDIO:
2192 avfilter_copy_buf_props(filtered_frame, picref);
2193 filtered_frame->pts = frame_pts;
2194 do_audio_out(of->ctx, ost, filtered_frame);
2197 // TODO support subtitle filters
2201 avfilter_unref_buffer(picref);
2204 /* Request frames through all the graphs */
2205 ret_all = nb_success = nb_eof = 0;
2206 for (i = 0; i < nb_filtergraphs; i++) {
2207 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2210 } else if (ret == AVERROR_EOF) {
2212 } else if (ret != AVERROR(EAGAIN)) {
2214 av_strerror(ret, buf, sizeof(buf));
2215 av_log(NULL, AV_LOG_WARNING,
2216 "Error in request_frame(): %s\n", buf);
2222 /* Try again if anything succeeded */
2224 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2227 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2231 AVFormatContext *oc;
2233 AVCodecContext *enc;
2234 int frame_number, vid, i;
2236 int64_t pts = INT64_MAX;
2237 static int64_t last_time = -1;
2238 static int qp_histogram[52];
2239 int hours, mins, secs, us;
2241 if (!print_stats && !is_last_report)
2244 if (!is_last_report) {
2245 if (last_time == -1) {
2246 last_time = cur_time;
2249 if ((cur_time - last_time) < 500000)
2251 last_time = cur_time;
2255 oc = output_files[0]->ctx;
2257 total_size = avio_size(oc->pb);
2258 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2259 total_size = avio_tell(oc->pb);
2266 for (i = 0; i < nb_output_streams; i++) {
2268 ost = output_streams[i];
2269 enc = ost->st->codec;
2270 if (!ost->stream_copy && enc->coded_frame)
2271 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2272 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2273 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2275 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2276 float fps, t = (cur_time-timer_start) / 1000000.0;
2278 frame_number = ost->frame_number;
2279 fps = t > 1 ? frame_number / t : 0;
2280 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2281 frame_number, fps < 9.95, fps, q);
2283 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2287 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2289 for (j = 0; j < 32; j++)
2290 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2292 if (enc->flags&CODEC_FLAG_PSNR) {
2294 double error, error_sum = 0;
2295 double scale, scale_sum = 0;
2296 char type[3] = { 'Y','U','V' };
2297 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2298 for (j = 0; j < 3; j++) {
2299 if (is_last_report) {
2300 error = enc->error[j];
2301 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2303 error = enc->coded_frame->error[j];
2304 scale = enc->width * enc->height * 255.0 * 255.0;
2310 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
2312 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2316 /* compute min output value */
2317 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2318 ost->st->time_base, AV_TIME_BASE_Q));
2321 secs = pts / AV_TIME_BASE;
2322 us = pts % AV_TIME_BASE;
2328 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2330 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2331 "size=%8.0fkB time=", total_size / 1024.0);
2332 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2333 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2334 (100 * us) / AV_TIME_BASE);
2335 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2336 "bitrate=%6.1fkbits/s", bitrate);
2338 if (nb_frames_dup || nb_frames_drop)
2339 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2340 nb_frames_dup, nb_frames_drop);
2342 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2346 if (is_last_report) {
2347 int64_t raw= audio_size + video_size + extra_size;
2348 av_log(NULL, AV_LOG_INFO, "\n");
2349 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
2350 video_size / 1024.0,
2351 audio_size / 1024.0,
2352 extra_size / 1024.0,
2353 100.0 * (total_size - raw) / raw
2355 if(video_size + audio_size + extra_size == 0){
2356 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2361 static void flush_encoders(void)
2365 for (i = 0; i < nb_output_streams; i++) {
2366 OutputStream *ost = output_streams[i];
2367 AVCodecContext *enc = ost->st->codec;
2368 AVFormatContext *os = output_files[ost->file_index]->ctx;
2369 int stop_encoding = 0;
2371 if (!ost->encoding_needed)
2374 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2376 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2380 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2384 switch (ost->st->codec->codec_type) {
2385 case AVMEDIA_TYPE_AUDIO:
2386 encode = avcodec_encode_audio2;
2390 case AVMEDIA_TYPE_VIDEO:
2391 encode = avcodec_encode_video2;
2402 av_init_packet(&pkt);
2406 update_benchmark(NULL);
2407 ret = encode(enc, &pkt, NULL, &got_packet);
2408 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2410 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2414 if (ost->logfile && enc->stats_out) {
2415 fprintf(ost->logfile, "%s", enc->stats_out);
2421 if (pkt.pts != AV_NOPTS_VALUE)
2422 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2423 if (pkt.dts != AV_NOPTS_VALUE)
2424 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2425 write_frame(os, &pkt, ost);
2435 * Check whether a packet from ist should be written into ost at this time
2437 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2439 OutputFile *of = output_files[ost->file_index];
2440 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2442 if (ost->source_index != ist_index)
2445 if (of->start_time && ist->pts < of->start_time)
2448 if (of->recording_time != INT64_MAX &&
2449 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
2450 (AVRational){ 1, 1000000 }) >= 0) {
2451 ost->is_past_recording_time = 1;
2458 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2460 OutputFile *of = output_files[ost->file_index];
2461 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2465 av_init_packet(&opkt);
2467 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2468 !ost->copy_initial_nonkeyframes)
2471 /* force the input stream PTS */
2472 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2473 audio_size += pkt->size;
2474 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2475 video_size += pkt->size;
2479 if (pkt->pts != AV_NOPTS_VALUE)
2480 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2482 opkt.pts = AV_NOPTS_VALUE;
2484 if (pkt->dts == AV_NOPTS_VALUE)
2485 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2487 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2488 opkt.dts -= ost_tb_start_time;
2490 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2491 opkt.flags = pkt->flags;
2493 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2494 if ( ost->st->codec->codec_id != CODEC_ID_H264
2495 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2496 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2497 && ost->st->codec->codec_id != CODEC_ID_VC1
2499 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2500 opkt.destruct = av_destruct_packet;
2502 opkt.data = pkt->data;
2503 opkt.size = pkt->size;
2505 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2506 /* store AVPicture in AVPacket, as expected by the output format */
2507 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2508 opkt.data = (uint8_t *)&pict;
2509 opkt.size = sizeof(AVPicture);
2510 opkt.flags |= AV_PKT_FLAG_KEY;
2513 write_frame(of->ctx, &opkt, ost);
2514 ost->st->codec->frame_number++;
2515 av_free_packet(&opkt);
2518 static void rate_emu_sleep(InputStream *ist)
2520 if (input_files[ist->file_index]->rate_emu) {
2521 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2522 int64_t now = av_gettime() - ist->start;
2528 static int guess_input_channel_layout(InputStream *ist)
2530 AVCodecContext *dec = ist->st->codec;
2532 if (!dec->channel_layout) {
2533 char layout_name[256];
2535 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2536 if (!dec->channel_layout)
2538 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2539 dec->channels, dec->channel_layout);
2540 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2541 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2546 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2548 AVFrame *decoded_frame;
2549 AVCodecContext *avctx = ist->st->codec;
2550 int i, ret, resample_changed;
2552 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2553 return AVERROR(ENOMEM);
2555 avcodec_get_frame_defaults(ist->decoded_frame);
2556 decoded_frame = ist->decoded_frame;
2558 update_benchmark(NULL);
2559 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2560 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2564 if (avctx->sample_rate <= 0) {
2565 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2566 return AVERROR_INVALIDDATA;
2570 /* no audio frame */
2572 for (i = 0; i < ist->nb_filters; i++)
2573 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2574 AV_BUFFERSRC_FLAG_NO_COPY);
2578 /* if the decoder provides a pts, use it instead of the last packet pts.
2579 the decoder could be delaying output by a packet or more. */
2580 if (decoded_frame->pts != AV_NOPTS_VALUE)
2581 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2582 else if (pkt->pts != AV_NOPTS_VALUE) {
2583 decoded_frame->pts = pkt->pts;
2584 pkt->pts = AV_NOPTS_VALUE;
2586 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2590 /* increment next_dts to use for the case where the input stream does not
2591 have timestamps or there are multiple frames in the packet */
2592 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2594 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2598 rate_emu_sleep(ist);
2600 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2601 ist->resample_channels != avctx->channels ||
2602 ist->resample_channel_layout != decoded_frame->channel_layout ||
2603 ist->resample_sample_rate != decoded_frame->sample_rate;
2604 if (resample_changed) {
2605 char layout1[64], layout2[64];
2607 if (!guess_input_channel_layout(ist)) {
2608 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2609 "layout for Input Stream #%d.%d\n", ist->file_index,
2613 decoded_frame->channel_layout = avctx->channel_layout;
2615 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2616 ist->resample_channel_layout);
2617 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2618 decoded_frame->channel_layout);
2620 av_log(NULL, AV_LOG_INFO,
2621 "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",
2622 ist->file_index, ist->st->index,
2623 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2624 ist->resample_channels, layout1,
2625 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2626 avctx->channels, layout2);
2628 ist->resample_sample_fmt = decoded_frame->format;
2629 ist->resample_sample_rate = decoded_frame->sample_rate;
2630 ist->resample_channel_layout = decoded_frame->channel_layout;
2631 ist->resample_channels = avctx->channels;
2633 for (i = 0; i < nb_filtergraphs; i++)
2634 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2635 configure_filtergraph(filtergraphs[i]) < 0) {
2636 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2641 for (i = 0; i < ist->nb_filters; i++)
2642 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2647 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2649 AVFrame *decoded_frame;
2650 void *buffer_to_free = NULL;
2651 int i, ret = 0, resample_changed;
2652 int64_t best_effort_timestamp;
2653 AVRational *frame_sample_aspect;
2656 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2657 return AVERROR(ENOMEM);
2659 avcodec_get_frame_defaults(ist->decoded_frame);
2660 decoded_frame = ist->decoded_frame;
2661 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2663 update_benchmark(NULL);
2664 ret = avcodec_decode_video2(ist->st->codec,
2665 decoded_frame, got_output, pkt);
2666 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2670 quality = same_quant ? decoded_frame->quality : 0;
2672 /* no picture yet */
2674 for (i = 0; i < ist->nb_filters; i++)
2675 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2679 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2680 if(best_effort_timestamp != AV_NOPTS_VALUE)
2681 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2684 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2686 rate_emu_sleep(ist);
2688 if (ist->st->sample_aspect_ratio.num)
2689 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2691 resample_changed = ist->resample_width != decoded_frame->width ||
2692 ist->resample_height != decoded_frame->height ||
2693 ist->resample_pix_fmt != decoded_frame->format;
2694 if (resample_changed) {
2695 av_log(NULL, AV_LOG_INFO,
2696 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2697 ist->file_index, ist->st->index,
2698 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2699 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2701 ist->resample_width = decoded_frame->width;
2702 ist->resample_height = decoded_frame->height;
2703 ist->resample_pix_fmt = decoded_frame->format;
2705 for (i = 0; i < nb_filtergraphs; i++)
2706 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2707 configure_filtergraph(filtergraphs[i]) < 0) {
2708 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2713 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2714 for (i = 0; i < ist->nb_filters; i++) {
2715 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2716 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2717 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2718 // XXX what an ugly hack
2719 if (ist->filters[i]->graph->nb_outputs == 1)
2720 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2722 if (!frame_sample_aspect->num)
2723 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2724 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2725 FrameBuffer *buf = decoded_frame->opaque;
2726 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2727 decoded_frame->data, decoded_frame->linesize,
2728 AV_PERM_READ | AV_PERM_PRESERVE,
2729 ist->st->codec->width, ist->st->codec->height,
2730 ist->st->codec->pix_fmt);
2732 avfilter_copy_frame_props(fb, decoded_frame);
2733 fb->buf->priv = buf;
2734 fb->buf->free = filter_release_buffer;
2736 av_assert0(buf->refcount>0);
2738 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2739 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2740 AV_BUFFERSRC_FLAG_NO_COPY);
2742 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2743 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2749 av_free(buffer_to_free);
2753 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2755 AVSubtitle subtitle;
2756 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2757 &subtitle, got_output, pkt);
2763 rate_emu_sleep(ist);
2765 for (i = 0; i < nb_output_streams; i++) {
2766 OutputStream *ost = output_streams[i];
2768 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2771 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2774 avsubtitle_free(&subtitle);
2778 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2779 static int output_packet(InputStream *ist, const AVPacket *pkt)
2785 if (!ist->saw_first_ts) {
2786 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;
2788 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2789 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2790 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2792 ist->saw_first_ts = 1;
2795 if (ist->next_dts == AV_NOPTS_VALUE)
2796 ist->next_dts = ist->dts;
2797 if (ist->next_pts == AV_NOPTS_VALUE)
2798 ist->next_pts = ist->pts;
2802 av_init_packet(&avpkt);
2810 if (pkt->dts != AV_NOPTS_VALUE) {
2811 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2812 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2813 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2816 // while we have more to decode or while the decoder did output something on EOF
2817 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2821 ist->pts = ist->next_pts;
2822 ist->dts = ist->next_dts;
2824 if (avpkt.size && avpkt.size != pkt->size) {
2825 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2826 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2827 ist->showed_multi_packet_warning = 1;
2830 switch (ist->st->codec->codec_type) {
2831 case AVMEDIA_TYPE_AUDIO:
2832 ret = transcode_audio (ist, &avpkt, &got_output);
2834 case AVMEDIA_TYPE_VIDEO:
2835 ret = transcode_video (ist, &avpkt, &got_output);
2836 if (avpkt.duration) {
2837 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2838 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2839 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2840 duration = ((int64_t)AV_TIME_BASE *
2841 ist->st->codec->time_base.num * ticks) /
2842 ist->st->codec->time_base.den;
2846 if(ist->dts != AV_NOPTS_VALUE && duration) {
2847 ist->next_dts += duration;
2849 ist->next_dts = AV_NOPTS_VALUE;
2852 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2854 case AVMEDIA_TYPE_SUBTITLE:
2855 ret = transcode_subtitles(ist, &avpkt, &got_output);
2865 avpkt.pts= AV_NOPTS_VALUE;
2867 // touch data and size only if not EOF
2869 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2879 /* handle stream copy */
2880 if (!ist->decoding_needed) {
2881 rate_emu_sleep(ist);
2882 ist->dts = ist->next_dts;
2883 switch (ist->st->codec->codec_type) {
2884 case AVMEDIA_TYPE_AUDIO:
2885 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2886 ist->st->codec->sample_rate;
2888 case AVMEDIA_TYPE_VIDEO:
2889 if (pkt->duration) {
2890 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2891 } else if(ist->st->codec->time_base.num != 0) {
2892 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2893 ist->next_dts += ((int64_t)AV_TIME_BASE *
2894 ist->st->codec->time_base.num * ticks) /
2895 ist->st->codec->time_base.den;
2899 ist->pts = ist->dts;
2900 ist->next_pts = ist->next_dts;
2902 for (i = 0; pkt && i < nb_output_streams; i++) {
2903 OutputStream *ost = output_streams[i];
2905 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2908 do_streamcopy(ist, ost, pkt);
2914 static void print_sdp(void)
2918 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2922 for (i = 0; i < nb_output_files; i++)
2923 avc[i] = output_files[i]->ctx;
2925 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2926 printf("SDP:\n%s\n", sdp);
2931 static int init_input_stream(int ist_index, char *error, int error_len)
2933 InputStream *ist = input_streams[ist_index];
2935 if (ist->decoding_needed) {
2936 AVCodec *codec = ist->dec;
2938 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2939 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2940 return AVERROR(EINVAL);
2943 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2944 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2945 ist->st->codec->get_buffer = codec_get_buffer;
2946 ist->st->codec->release_buffer = codec_release_buffer;
2947 ist->st->codec->opaque = ist;
2950 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2951 av_dict_set(&ist->opts, "threads", "auto", 0);
2952 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2953 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2954 ist->file_index, ist->st->index);
2955 return AVERROR(EINVAL);
2957 assert_codec_experimental(ist->st->codec, 0);
2958 assert_avoptions(ist->opts);
2961 ist->next_pts = AV_NOPTS_VALUE;
2962 ist->next_dts = AV_NOPTS_VALUE;
2968 static InputStream *get_input_stream(OutputStream *ost)
2970 if (ost->source_index >= 0)
2971 return input_streams[ost->source_index];
2974 FilterGraph *fg = ost->filter->graph;
2977 for (i = 0; i < fg->nb_inputs; i++)
2978 if (fg->inputs[i]->ist->st->codec->codec_type == ost->st->codec->codec_type)
2979 return fg->inputs[i]->ist;
2985 static int transcode_init(void)
2987 int ret = 0, i, j, k;
2988 AVFormatContext *oc;
2989 AVCodecContext *codec, *icodec;
2995 /* init framerate emulation */
2996 for (i = 0; i < nb_input_files; i++) {
2997 InputFile *ifile = input_files[i];
2998 if (ifile->rate_emu)
2999 for (j = 0; j < ifile->nb_streams; j++)
3000 input_streams[j + ifile->ist_index]->start = av_gettime();
3003 /* output stream init */
3004 for (i = 0; i < nb_output_files; i++) {
3005 oc = output_files[i]->ctx;
3006 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
3007 av_dump_format(oc, i, oc->filename, 1);
3008 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
3009 return AVERROR(EINVAL);
3013 /* init complex filtergraphs */
3014 for (i = 0; i < nb_filtergraphs; i++)
3015 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
3018 /* for each output stream, we compute the right encoding parameters */
3019 for (i = 0; i < nb_output_streams; i++) {
3020 ost = output_streams[i];
3021 oc = output_files[ost->file_index]->ctx;
3022 ist = get_input_stream(ost);
3024 if (ost->attachment_filename)
3027 codec = ost->st->codec;
3030 icodec = ist->st->codec;
3032 ost->st->disposition = ist->st->disposition;
3033 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
3034 codec->chroma_sample_location = icodec->chroma_sample_location;
3037 if (ost->stream_copy) {
3038 uint64_t extra_size;
3040 av_assert0(ist && !ost->filter);
3042 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
3044 if (extra_size > INT_MAX) {
3045 return AVERROR(EINVAL);
3048 /* if stream_copy is selected, no need to decode or encode */
3049 codec->codec_id = icodec->codec_id;
3050 codec->codec_type = icodec->codec_type;
3052 if (!codec->codec_tag) {
3053 if (!oc->oformat->codec_tag ||
3054 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
3055 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
3056 codec->codec_tag = icodec->codec_tag;
3059 codec->bit_rate = icodec->bit_rate;
3060 codec->rc_max_rate = icodec->rc_max_rate;
3061 codec->rc_buffer_size = icodec->rc_buffer_size;
3062 codec->field_order = icodec->field_order;
3063 codec->extradata = av_mallocz(extra_size);
3064 if (!codec->extradata) {
3065 return AVERROR(ENOMEM);
3067 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
3068 codec->extradata_size= icodec->extradata_size;
3069 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
3071 codec->time_base = ist->st->time_base;
3073 * Avi is a special case here because it supports variable fps but
3074 * having the fps and timebase differe significantly adds quite some
3077 if(!strcmp(oc->oformat->name, "avi")) {
3078 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
3079 && av_q2d(ist->st->time_base) < 1.0/500
3081 codec->time_base = icodec->time_base;
3082 codec->time_base.num *= icodec->ticks_per_frame;
3083 codec->time_base.den *= 2;
3084 codec->ticks_per_frame = 2;
3086 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
3087 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
3088 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
3090 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
3091 && av_q2d(ist->st->time_base) < 1.0/500
3093 codec->time_base = icodec->time_base;
3094 codec->time_base.num *= icodec->ticks_per_frame;
3097 av_reduce(&codec->time_base.num, &codec->time_base.den,
3098 codec->time_base.num, codec->time_base.den, INT_MAX);
3100 switch (codec->codec_type) {
3101 case AVMEDIA_TYPE_AUDIO:
3102 if (audio_volume != 256) {
3103 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3106 codec->channel_layout = icodec->channel_layout;
3107 codec->sample_rate = icodec->sample_rate;
3108 codec->channels = icodec->channels;
3109 codec->frame_size = icodec->frame_size;
3110 codec->audio_service_type = icodec->audio_service_type;
3111 codec->block_align = icodec->block_align;
3112 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
3113 codec->block_align= 0;
3114 if(codec->codec_id == CODEC_ID_AC3)
3115 codec->block_align= 0;
3117 case AVMEDIA_TYPE_VIDEO:
3118 codec->pix_fmt = icodec->pix_fmt;
3119 codec->width = icodec->width;
3120 codec->height = icodec->height;
3121 codec->has_b_frames = icodec->has_b_frames;
3122 if (!codec->sample_aspect_ratio.num) {
3123 codec->sample_aspect_ratio =
3124 ost->st->sample_aspect_ratio =
3125 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3126 ist->st->codec->sample_aspect_ratio.num ?
3127 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3129 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3131 case AVMEDIA_TYPE_SUBTITLE:
3132 codec->width = icodec->width;
3133 codec->height = icodec->height;
3135 case AVMEDIA_TYPE_DATA:
3136 case AVMEDIA_TYPE_ATTACHMENT:
3143 ost->enc = avcodec_find_encoder(codec->codec_id);
3145 /* should only happen when a default codec is not present. */
3146 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3147 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3148 ret = AVERROR(EINVAL);
3153 ist->decoding_needed = 1;
3154 ost->encoding_needed = 1;
3156 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3157 if (ist && !ost->frame_rate.num)
3158 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3159 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3160 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3161 ost->frame_rate = ost->enc->supported_framerates[idx];
3166 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3167 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3169 fg = init_simple_filtergraph(ist, ost);
3170 if (configure_simple_filtergraph(fg)) {
3171 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3176 switch (codec->codec_type) {
3177 case AVMEDIA_TYPE_AUDIO:
3178 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3179 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3180 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3181 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3182 codec->time_base = (AVRational){ 1, codec->sample_rate };
3184 case AVMEDIA_TYPE_VIDEO:
3185 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3186 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3187 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3188 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3189 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3191 for (j = 0; j < ost->forced_kf_count; j++)
3192 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3196 codec->width = ost->filter->filter->inputs[0]->w;
3197 codec->height = ost->filter->filter->inputs[0]->h;
3198 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3199 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3200 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3201 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3202 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3204 if (codec->width != icodec->width ||
3205 codec->height != icodec->height ||
3206 codec->pix_fmt != icodec->pix_fmt) {
3207 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3211 case AVMEDIA_TYPE_SUBTITLE:
3212 codec->time_base = (AVRational){1, 1000};
3219 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3220 char logfilename[1024];
3223 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3224 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3226 if (!strcmp(ost->enc->name, "libx264")) {
3227 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3229 if (codec->flags & CODEC_FLAG_PASS2) {
3231 size_t logbuffer_size;
3232 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3233 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3237 codec->stats_in = logbuffer;
3239 if (codec->flags & CODEC_FLAG_PASS1) {
3240 f = fopen(logfilename, "wb");
3242 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3243 logfilename, strerror(errno));
3253 /* open each encoder */
3254 for (i = 0; i < nb_output_streams; i++) {
3255 ost = output_streams[i];
3256 if (ost->encoding_needed) {
3257 AVCodec *codec = ost->enc;
3258 AVCodecContext *dec = NULL;
3260 if ((ist = get_input_stream(ost)))
3261 dec = ist->st->codec;
3262 if (dec && dec->subtitle_header) {
3263 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3264 if (!ost->st->codec->subtitle_header) {
3265 ret = AVERROR(ENOMEM);
3268 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3269 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3271 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3272 av_dict_set(&ost->opts, "threads", "auto", 0);
3273 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3274 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3275 ost->file_index, ost->index);
3276 ret = AVERROR(EINVAL);
3279 assert_codec_experimental(ost->st->codec, 1);
3280 assert_avoptions(ost->opts);
3281 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3282 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3283 " It takes bits/s as argument, not kbits/s\n");
3284 extra_size += ost->st->codec->extradata_size;
3286 if (ost->st->codec->me_threshold)
3287 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3291 /* init input streams */
3292 for (i = 0; i < nb_input_streams; i++)
3293 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3296 /* discard unused programs */
3297 for (i = 0; i < nb_input_files; i++) {
3298 InputFile *ifile = input_files[i];
3299 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3300 AVProgram *p = ifile->ctx->programs[j];
3301 int discard = AVDISCARD_ALL;
3303 for (k = 0; k < p->nb_stream_indexes; k++)
3304 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3305 discard = AVDISCARD_DEFAULT;
3308 p->discard = discard;
3312 /* open files and write file headers */
3313 for (i = 0; i < nb_output_files; i++) {
3314 oc = output_files[i]->ctx;
3315 oc->interrupt_callback = int_cb;
3316 if (avformat_write_header(oc, &output_files[i]->opts) < 0) {
3317 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
3318 ret = AVERROR(EINVAL);
3321 // assert_avoptions(output_files[i]->opts);
3322 if (strcmp(oc->oformat->name, "rtp")) {
3328 /* dump the file output parameters - cannot be done before in case
3330 for (i = 0; i < nb_output_files; i++) {
3331 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3334 /* dump the stream mapping */
3335 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3336 for (i = 0; i < nb_input_streams; i++) {
3337 ist = input_streams[i];
3339 for (j = 0; j < ist->nb_filters; j++) {
3340 AVFilterLink *link = ist->filters[j]->filter->outputs[0];
3341 if (ist->filters[j]->graph->graph_desc) {
3342 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3343 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3344 link->dst->filter->name);
3345 if (link->dst->input_count > 1)
3346 av_log(NULL, AV_LOG_INFO, ":%s", link->dstpad->name);
3347 if (nb_filtergraphs > 1)
3348 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3349 av_log(NULL, AV_LOG_INFO, "\n");
3354 for (i = 0; i < nb_output_streams; i++) {
3355 ost = output_streams[i];
3357 if (ost->attachment_filename) {
3358 /* an attached file */
3359 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3360 ost->attachment_filename, ost->file_index, ost->index);
3364 if (ost->filter && ost->filter->graph->graph_desc) {
3365 /* output from a complex graph */
3366 AVFilterLink *link = ost->filter->filter->inputs[0];
3367 av_log(NULL, AV_LOG_INFO, " %s", link->src->filter->name);
3368 if (link->src->output_count > 1)
3369 av_log(NULL, AV_LOG_INFO, ":%s", link->srcpad->name);
3370 if (nb_filtergraphs > 1)
3371 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3373 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3374 ost->index, ost->enc ? ost->enc->name : "?");
3378 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3379 input_streams[ost->source_index]->file_index,
3380 input_streams[ost->source_index]->st->index,
3383 if (ost->sync_ist != input_streams[ost->source_index])
3384 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3385 ost->sync_ist->file_index,
3386 ost->sync_ist->st->index);
3387 if (ost->stream_copy)
3388 av_log(NULL, AV_LOG_INFO, " (copy)");
3390 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3391 input_streams[ost->source_index]->dec->name : "?",
3392 ost->enc ? ost->enc->name : "?");
3393 av_log(NULL, AV_LOG_INFO, "\n");
3397 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3409 * The following code is the main loop of the file converter
3411 static int transcode(void)
3414 AVFormatContext *is, *os;
3418 int no_packet_count = 0;
3419 int64_t timer_start;
3422 if (!(no_packet = av_mallocz(nb_input_files)))
3425 ret = transcode_init();
3430 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3433 timer_start = av_gettime();
3435 for (; received_sigterm == 0;) {
3436 int file_index, ist_index, past_recording_time = 1;
3439 int64_t cur_time= av_gettime();
3441 ipts_min = INT64_MAX;
3442 /* if 'q' pressed, exits */
3444 static int64_t last_time;
3445 if (received_nb_signals)
3447 /* read_key() returns 0 on EOF */
3448 if(cur_time - last_time >= 100000 && !run_as_daemon){
3450 last_time = cur_time;
3455 if (key == '+') av_log_set_level(av_log_get_level()+10);
3456 if (key == '-') av_log_set_level(av_log_get_level()-10);
3457 if (key == 's') qp_hist ^= 1;
3460 do_hex_dump = do_pkt_dump = 0;
3461 } else if(do_pkt_dump){
3465 av_log_set_level(AV_LOG_DEBUG);
3467 if (key == 'c' || key == 'C'){
3468 char buf[4096], target[64], command[256], arg[256] = {0};
3471 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3473 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3478 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3479 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3480 target, time, command, arg);
3481 for (i = 0; i < nb_filtergraphs; i++) {
3482 FilterGraph *fg = filtergraphs[i];
3485 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3486 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3487 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3489 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3494 av_log(NULL, AV_LOG_ERROR,
3495 "Parse error, at least 3 arguments were expected, "
3496 "only %d given in string '%s'\n", n, buf);
3499 if (key == 'd' || key == 'D'){
3502 debug = input_streams[0]->st->codec->debug<<1;
3503 if(!debug) debug = 1;
3504 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3507 if(scanf("%d", &debug)!=1)
3508 fprintf(stderr,"error parsing debug value\n");
3509 for(i=0;i<nb_input_streams;i++) {
3510 input_streams[i]->st->codec->debug = debug;
3512 for(i=0;i<nb_output_streams;i++) {
3513 ost = output_streams[i];
3514 ost->st->codec->debug = debug;
3516 if(debug) av_log_set_level(AV_LOG_DEBUG);
3517 fprintf(stderr,"debug=%d\n", debug);
3520 fprintf(stderr, "key function\n"
3521 "? show this help\n"
3522 "+ increase verbosity\n"
3523 "- decrease verbosity\n"
3524 "c Send command to filtergraph\n"
3525 "D cycle through available debug modes\n"
3526 "h dump packets/hex press to cycle through the 3 states\n"
3528 "s Show QP histogram\n"
3533 /* check if there's any stream where output is still needed */
3534 for (i = 0; i < nb_output_streams; i++) {
3536 ost = output_streams[i];
3537 of = output_files[ost->file_index];
3538 os = output_files[ost->file_index]->ctx;
3539 if (ost->is_past_recording_time ||
3540 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3542 if (ost->frame_number >= ost->max_frames) {
3544 for (j = 0; j < of->ctx->nb_streams; j++)
3545 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3548 past_recording_time = 0;
3550 if (past_recording_time)
3553 /* select the stream that we must read now by looking at the
3554 smallest output pts */
3556 for (i = 0; i < nb_input_streams; i++) {
3558 ist = input_streams[i];
3560 if (ist->discard || no_packet[ist->file_index])
3562 if (!input_files[ist->file_index]->eof_reached) {
3563 if (ipts < ipts_min) {
3565 file_index = ist->file_index;
3569 /* if none, if is finished */
3570 if (file_index < 0) {
3571 if (no_packet_count) {
3572 no_packet_count = 0;
3573 memset(no_packet, 0, nb_input_files);
3580 /* read a frame from it and output it in the fifo */
3581 is = input_files[file_index]->ctx;
3582 ret = av_read_frame(is, &pkt);
3583 if (ret == AVERROR(EAGAIN)) {
3584 no_packet[file_index] = 1;
3589 input_files[file_index]->eof_reached = 1;
3591 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3592 ist = input_streams[input_files[file_index]->ist_index + i];
3593 if (ist->decoding_needed)
3594 output_packet(ist, NULL);
3603 no_packet_count = 0;
3604 memset(no_packet, 0, nb_input_files);
3607 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3608 is->streams[pkt.stream_index]);
3610 /* the following test is needed in case new streams appear
3611 dynamically in stream : we ignore them */
3612 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3613 goto discard_packet;
3614 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3615 ist = input_streams[ist_index];
3617 goto discard_packet;
3619 if (pkt.dts != AV_NOPTS_VALUE)
3620 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3621 if (pkt.pts != AV_NOPTS_VALUE)
3622 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3624 if (pkt.pts != AV_NOPTS_VALUE)
3625 pkt.pts *= ist->ts_scale;
3626 if (pkt.dts != AV_NOPTS_VALUE)
3627 pkt.dts *= ist->ts_scale;
3630 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3631 "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",
3632 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3633 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3634 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3635 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3636 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3637 input_files[ist->file_index]->ts_offset);
3640 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3641 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3642 int64_t delta = pkt_dts - ist->next_dts;
3643 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3644 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3645 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3646 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3647 pkt_dts+1<ist->pts){
3648 input_files[ist->file_index]->ts_offset -= delta;
3649 av_log(NULL, AV_LOG_DEBUG,
3650 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3651 delta, input_files[ist->file_index]->ts_offset);
3652 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3653 if (pkt.pts != AV_NOPTS_VALUE)
3654 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3657 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3658 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3659 pkt_dts+1<ist->pts){
3660 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3661 pkt.dts = AV_NOPTS_VALUE;
3663 if (pkt.pts != AV_NOPTS_VALUE){
3664 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3665 delta = pkt_pts - ist->next_dts;
3666 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3667 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3668 pkt_pts+1<ist->pts) {
3669 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3670 pkt.pts = AV_NOPTS_VALUE;
3676 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3677 if (output_packet(ist, &pkt) < 0 ||
3678 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3679 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3680 ist->file_index, ist->st->index);
3683 av_free_packet(&pkt);
3688 av_free_packet(&pkt);
3690 /* dump report by using the output first video and audio streams */
3691 print_report(0, timer_start, cur_time);
3694 /* at the end of stream, we must flush the decoder buffers */
3695 for (i = 0; i < nb_input_streams; i++) {
3696 ist = input_streams[i];
3697 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3698 output_packet(ist, NULL);
3706 /* write the trailer if needed and close file */
3707 for (i = 0; i < nb_output_files; i++) {
3708 os = output_files[i]->ctx;
3709 av_write_trailer(os);
3712 /* dump report by using the first video and audio streams */
3713 print_report(1, timer_start, av_gettime());
3715 /* close each encoder */
3716 for (i = 0; i < nb_output_streams; i++) {
3717 ost = output_streams[i];
3718 if (ost->encoding_needed) {
3719 av_freep(&ost->st->codec->stats_in);
3720 avcodec_close(ost->st->codec);
3724 /* close each decoder */
3725 for (i = 0; i < nb_input_streams; i++) {
3726 ist = input_streams[i];
3727 if (ist->decoding_needed) {
3728 avcodec_close(ist->st->codec);
3736 av_freep(&no_packet);
3738 if (output_streams) {
3739 for (i = 0; i < nb_output_streams; i++) {
3740 ost = output_streams[i];
3742 if (ost->stream_copy)
3743 av_freep(&ost->st->codec->extradata);
3745 fclose(ost->logfile);
3746 ost->logfile = NULL;
3748 av_freep(&ost->st->codec->subtitle_header);
3749 av_free(ost->forced_kf_pts);
3750 av_dict_free(&ost->opts);
3757 static int opt_frame_crop(const char *opt, const char *arg)
3759 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3760 return AVERROR(EINVAL);
3763 static int opt_pad(const char *opt, const char *arg)
3765 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3769 static int opt_video_channel(const char *opt, const char *arg)
3771 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3772 return opt_default("channel", arg);
3775 static int opt_video_standard(const char *opt, const char *arg)
3777 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3778 return opt_default("standard", arg);
3781 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3783 audio_codec_name = arg;
3784 return parse_option(o, "codec:a", arg, options);
3787 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3789 video_codec_name = arg;
3790 return parse_option(o, "codec:v", arg, options);
3793 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3795 subtitle_codec_name = arg;
3796 return parse_option(o, "codec:s", arg, options);
3799 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3801 return parse_option(o, "codec:d", arg, options);
3804 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3806 StreamMap *m = NULL;
3807 int i, negative = 0, file_idx;
3808 int sync_file_idx = -1, sync_stream_idx = 0;
3816 map = av_strdup(arg);
3818 /* parse sync stream first, just pick first matching stream */
3819 if (sync = strchr(map, ',')) {
3821 sync_file_idx = strtol(sync + 1, &sync, 0);
3822 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3823 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3828 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3829 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3830 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3831 sync_stream_idx = i;
3834 if (i == input_files[sync_file_idx]->nb_streams) {
3835 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3836 "match any streams.\n", arg);
3842 if (map[0] == '[') {
3843 /* this mapping refers to lavfi output */
3844 const char *c = map + 1;
3845 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3846 &o->nb_stream_maps, o->nb_stream_maps + 1);
3847 m = &o->stream_maps[o->nb_stream_maps - 1];
3848 m->linklabel = av_get_token(&c, "]");
3849 if (!m->linklabel) {
3850 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3854 file_idx = strtol(map, &p, 0);
3855 if (file_idx >= nb_input_files || file_idx < 0) {
3856 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3860 /* disable some already defined maps */
3861 for (i = 0; i < o->nb_stream_maps; i++) {
3862 m = &o->stream_maps[i];
3863 if (file_idx == m->file_index &&
3864 check_stream_specifier(input_files[m->file_index]->ctx,
3865 input_files[m->file_index]->ctx->streams[m->stream_index],
3866 *p == ':' ? p + 1 : p) > 0)
3870 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3871 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3872 *p == ':' ? p + 1 : p) <= 0)
3874 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3875 &o->nb_stream_maps, o->nb_stream_maps + 1);
3876 m = &o->stream_maps[o->nb_stream_maps - 1];
3878 m->file_index = file_idx;
3879 m->stream_index = i;
3881 if (sync_file_idx >= 0) {
3882 m->sync_file_index = sync_file_idx;
3883 m->sync_stream_index = sync_stream_idx;
3885 m->sync_file_index = file_idx;
3886 m->sync_stream_index = i;
3892 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3900 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3902 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3903 &o->nb_attachments, o->nb_attachments + 1);
3904 o->attachments[o->nb_attachments - 1] = arg;
3908 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3914 o->audio_channel_maps =
3915 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3916 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3917 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3919 /* muted channel syntax */
3920 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3921 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3922 m->file_idx = m->stream_idx = -1;
3924 m->ofile_idx = m->ostream_idx = -1;
3929 n = sscanf(arg, "%d.%d.%d:%d.%d",
3930 &m->file_idx, &m->stream_idx, &m->channel_idx,
3931 &m->ofile_idx, &m->ostream_idx);
3933 if (n != 3 && n != 5) {
3934 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3935 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3939 if (n != 5) // only file.stream.channel specified
3940 m->ofile_idx = m->ostream_idx = -1;
3943 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3944 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3948 if (m->stream_idx < 0 ||
3949 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
3950 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3951 m->file_idx, m->stream_idx);
3954 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
3955 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3956 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3957 m->file_idx, m->stream_idx);
3960 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3961 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3962 m->file_idx, m->stream_idx, m->channel_idx);
3969 * Parse a metadata specifier in arg.
3970 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3971 * @param index for type c/p, chapter/program index is written here
3972 * @param stream_spec for type s, the stream specifier is written here
3974 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3982 if (*(++arg) && *arg != ':') {
3983 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3986 *stream_spec = *arg == ':' ? arg + 1 : "";
3990 if (*(++arg) == ':')
3991 *index = strtol(++arg, NULL, 0);
3994 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
4001 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4003 AVDictionary **meta_in = NULL;
4004 AVDictionary **meta_out = NULL;
4006 char type_in, type_out;
4007 const char *istream_spec = NULL, *ostream_spec = NULL;
4008 int idx_in = 0, idx_out = 0;
4010 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4011 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4014 if (type_out == 'g' || !*outspec)
4015 o->metadata_global_manual = 1;
4016 if (type_out == 's' || !*outspec)
4017 o->metadata_streams_manual = 1;
4018 if (type_out == 'c' || !*outspec)
4019 o->metadata_chapters_manual = 1;
4023 if (type_in == 'g' || type_out == 'g')
4024 o->metadata_global_manual = 1;
4025 if (type_in == 's' || type_out == 's')
4026 o->metadata_streams_manual = 1;
4027 if (type_in == 'c' || type_out == 'c')
4028 o->metadata_chapters_manual = 1;
4030 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4031 if ((index) < 0 || (index) >= (nb_elems)) {\
4032 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4037 #define SET_DICT(type, meta, context, index)\
4040 meta = &context->metadata;\
4043 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4044 meta = &context->chapters[index]->metadata;\
4047 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4048 meta = &context->programs[index]->metadata;\
4052 SET_DICT(type_in, meta_in, ic, idx_in);
4053 SET_DICT(type_out, meta_out, oc, idx_out);
4055 /* for input streams choose first matching stream */
4056 if (type_in == 's') {
4057 for (i = 0; i < ic->nb_streams; i++) {
4058 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4059 meta_in = &ic->streams[i]->metadata;
4065 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4070 if (type_out == 's') {
4071 for (i = 0; i < oc->nb_streams; i++) {
4072 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4073 meta_out = &oc->streams[i]->metadata;
4074 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4079 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4084 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4087 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4088 struct tm time = *gmtime((time_t*)&recording_timestamp);
4089 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4090 parse_option(o, "metadata", buf, options);
4092 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4093 "tag instead.\n", opt);
4097 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4099 const char *codec_string = encoder ? "encoder" : "decoder";
4103 avcodec_find_encoder_by_name(name) :
4104 avcodec_find_decoder_by_name(name);
4106 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4109 if (codec->type != type) {
4110 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4116 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4118 char *codec_name = NULL;
4120 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4122 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4123 st->codec->codec_id = codec->id;
4126 return avcodec_find_decoder(st->codec->codec_id);
4130 * Add all the streams from the given input file to the global
4131 * list of input streams.
4133 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4136 char *next, *codec_tag = NULL;
4138 for (i = 0; i < ic->nb_streams; i++) {
4139 AVStream *st = ic->streams[i];
4140 AVCodecContext *dec = st->codec;
4141 InputStream *ist = av_mallocz(sizeof(*ist));
4146 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4147 input_streams[nb_input_streams - 1] = ist;
4150 ist->file_index = nb_input_files;
4152 st->discard = AVDISCARD_ALL;
4153 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
4155 ist->ts_scale = 1.0;
4156 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4158 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4160 uint32_t tag = strtol(codec_tag, &next, 0);
4162 tag = AV_RL32(codec_tag);
4163 st->codec->codec_tag = tag;
4166 ist->dec = choose_decoder(o, ic, st);
4168 switch (dec->codec_type) {
4169 case AVMEDIA_TYPE_VIDEO:
4171 ist->dec = avcodec_find_decoder(dec->codec_id);
4173 dec->flags |= CODEC_FLAG_EMU_EDGE;
4176 ist->resample_height = dec->height;
4177 ist->resample_width = dec->width;
4178 ist->resample_pix_fmt = dec->pix_fmt;
4181 case AVMEDIA_TYPE_AUDIO:
4182 guess_input_channel_layout(ist);
4184 ist->resample_sample_fmt = dec->sample_fmt;
4185 ist->resample_sample_rate = dec->sample_rate;
4186 ist->resample_channels = dec->channels;
4187 ist->resample_channel_layout = dec->channel_layout;
4190 case AVMEDIA_TYPE_DATA:
4191 case AVMEDIA_TYPE_SUBTITLE:
4193 ist->dec = avcodec_find_decoder(dec->codec_id);
4195 case AVMEDIA_TYPE_ATTACHMENT:
4196 case AVMEDIA_TYPE_UNKNOWN:
4204 static void assert_file_overwrite(const char *filename)
4206 if ((!file_overwrite || no_file_overwrite) &&
4207 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4208 av_strstart(filename, "file:", NULL))) {
4209 if (avio_check(filename, 0) == 0) {
4210 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
4211 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4214 signal(SIGINT, SIG_DFL);
4215 if (!read_yesno()) {
4216 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4222 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4229 static void dump_attachment(AVStream *st, const char *filename)
4232 AVIOContext *out = NULL;
4233 AVDictionaryEntry *e;
4235 if (!st->codec->extradata_size) {
4236 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4237 nb_input_files - 1, st->index);
4240 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4241 filename = e->value;
4243 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4244 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4248 assert_file_overwrite(filename);
4250 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4251 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4256 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4261 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4263 AVFormatContext *ic;
4264 AVInputFormat *file_iformat = NULL;
4268 AVDictionary **opts;
4269 int orig_nb_streams; // number of streams before avformat_find_stream_info
4272 if (!(file_iformat = av_find_input_format(o->format))) {
4273 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4278 if (!strcmp(filename, "-"))
4281 using_stdin |= !strncmp(filename, "pipe:", 5) ||
4282 !strcmp(filename, "/dev/stdin");
4284 /* get default parameters from command line */
4285 ic = avformat_alloc_context();
4287 print_error(filename, AVERROR(ENOMEM));
4290 if (o->nb_audio_sample_rate) {
4291 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4292 av_dict_set(&format_opts, "sample_rate", buf, 0);
4294 if (o->nb_audio_channels) {
4295 /* because we set audio_channels based on both the "ac" and
4296 * "channel_layout" options, we need to check that the specified
4297 * demuxer actually has the "channels" option before setting it */
4298 if (file_iformat && file_iformat->priv_class &&
4299 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4300 AV_OPT_SEARCH_FAKE_OBJ)) {
4301 snprintf(buf, sizeof(buf), "%d",
4302 o->audio_channels[o->nb_audio_channels - 1].u.i);
4303 av_dict_set(&format_opts, "channels", buf, 0);
4306 if (o->nb_frame_rates) {
4307 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4309 if (o->nb_frame_sizes) {
4310 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4312 if (o->nb_frame_pix_fmts)
4313 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4315 ic->video_codec_id = video_codec_name ?
4316 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4317 ic->audio_codec_id = audio_codec_name ?
4318 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4319 ic->subtitle_codec_id= subtitle_codec_name ?
4320 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4321 ic->flags |= AVFMT_FLAG_NONBLOCK;
4322 ic->interrupt_callback = int_cb;
4324 /* open the input file with generic avformat function */
4325 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4327 print_error(filename, err);
4330 assert_avoptions(format_opts);
4332 /* apply forced codec ids */
4333 for (i = 0; i < ic->nb_streams; i++)
4334 choose_decoder(o, ic, ic->streams[i]);
4336 /* Set AVCodecContext options for avformat_find_stream_info */
4337 opts = setup_find_stream_info_opts(ic, codec_opts);
4338 orig_nb_streams = ic->nb_streams;
4340 /* If not enough info to get the stream parameters, we decode the
4341 first frames to get it. (used in mpeg case for example) */
4342 ret = avformat_find_stream_info(ic, opts);
4344 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4345 avformat_close_input(&ic);
4349 timestamp = o->start_time;
4350 /* add the stream start time */
4351 if (ic->start_time != AV_NOPTS_VALUE)
4352 timestamp += ic->start_time;
4354 /* if seeking requested, we execute it */
4355 if (o->start_time != 0) {
4356 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4358 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4359 filename, (double)timestamp / AV_TIME_BASE);
4363 /* update the current parameters so that they match the one of the input stream */
4364 add_input_streams(o, ic);
4366 /* dump the file content */
4367 av_dump_format(ic, nb_input_files, filename, 0);
4369 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4370 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4373 input_files[nb_input_files - 1]->ctx = ic;
4374 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4375 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4376 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4377 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4379 for (i = 0; i < o->nb_dump_attachment; i++) {
4382 for (j = 0; j < ic->nb_streams; j++) {
4383 AVStream *st = ic->streams[j];
4385 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4386 dump_attachment(st, o->dump_attachment[i].u.str);
4390 for (i = 0; i < orig_nb_streams; i++)
4391 av_dict_free(&opts[i]);
4394 reset_options(o, 1);
4398 static void parse_forced_key_frames(char *kf, OutputStream *ost)
4403 for (p = kf; *p; p++)
4406 ost->forced_kf_count = n;
4407 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
4408 if (!ost->forced_kf_pts) {
4409 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
4413 for (i = 0; i < n; i++) {
4414 char *next = strchr(p, ',');
4415 if (next) *next++ = 0;
4416 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
4421 static uint8_t *get_line(AVIOContext *s)
4427 if (avio_open_dyn_buf(&line) < 0) {
4428 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4432 while ((c = avio_r8(s)) && c != '\n')
4435 avio_close_dyn_buf(line, &buf);
4440 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4443 char filename[1000];
4444 const char *base[3] = { getenv("AVCONV_DATADIR"),
4449 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4453 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4454 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4455 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4458 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4459 i != 1 ? "" : "/.avconv", preset_name);
4460 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4466 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4468 char *codec_name = NULL;
4470 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4472 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4473 NULL, ost->st->codec->codec_type);
4474 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4475 } else if (!strcmp(codec_name, "copy"))
4476 ost->stream_copy = 1;
4478 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4479 ost->st->codec->codec_id = ost->enc->id;
4483 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4486 AVStream *st = avformat_new_stream(oc, NULL);
4487 int idx = oc->nb_streams - 1, ret = 0;
4488 char *bsf = NULL, *next, *codec_tag = NULL;
4489 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4491 char *buf = NULL, *arg = NULL, *preset = NULL;
4492 AVIOContext *s = NULL;
4495 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4499 if (oc->nb_streams - 1 < o->nb_streamid_map)
4500 st->id = o->streamid_map[oc->nb_streams - 1];
4502 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4503 nb_output_streams + 1);
4504 if (!(ost = av_mallocz(sizeof(*ost))))
4506 output_streams[nb_output_streams - 1] = ost;
4508 ost->file_index = nb_output_files;
4511 st->codec->codec_type = type;
4512 choose_encoder(o, oc, ost);
4514 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
4517 avcodec_get_context_defaults3(st->codec, ost->enc);
4518 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4520 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4521 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4524 if (!buf[0] || buf[0] == '#') {
4528 if (!(arg = strchr(buf, '='))) {
4529 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4533 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4535 } while (!s->eof_reached);
4539 av_log(NULL, AV_LOG_FATAL,
4540 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4541 preset, ost->file_index, ost->index);
4545 ost->max_frames = INT64_MAX;
4546 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4548 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4550 if (next = strchr(bsf, ','))
4552 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4553 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4557 bsfc_prev->next = bsfc;
4559 ost->bitstream_filters = bsfc;
4565 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4567 uint32_t tag = strtol(codec_tag, &next, 0);
4569 tag = AV_RL32(codec_tag);
4570 st->codec->codec_tag = tag;
4573 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4574 if (qscale >= 0 || same_quant) {
4575 st->codec->flags |= CODEC_FLAG_QSCALE;
4576 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4579 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4580 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4582 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4583 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4584 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4586 ost->source_index = source_index;
4587 if (source_index >= 0) {
4588 ost->sync_ist = input_streams[source_index];
4589 input_streams[source_index]->discard = 0;
4590 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4596 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4599 const char *p = str;
4606 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4613 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4617 AVCodecContext *video_enc;
4619 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4621 video_enc = st->codec;
4623 if (!ost->stream_copy) {
4624 const char *p = NULL;
4625 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
4626 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4627 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
4630 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4631 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4632 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4636 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4637 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4638 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4642 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4643 if (frame_aspect_ratio) {
4645 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4646 q.num <= 0 || q.den <= 0) {
4647 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4650 ost->frame_aspect_ratio = av_q2d(q);
4653 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4654 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4655 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4656 ost->keep_pix_fmt = 1;
4657 if (!*++frame_pix_fmt)
4658 frame_pix_fmt = NULL;
4660 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4661 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4664 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4667 video_enc->gop_size = 0;
4668 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4670 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4671 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4674 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4676 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4678 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4679 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4682 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4685 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4686 for (i = 0; p; i++) {
4688 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4690 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4693 /* FIXME realloc failure */
4694 video_enc->rc_override =
4695 av_realloc(video_enc->rc_override,
4696 sizeof(RcOverride) * (i + 1));
4697 video_enc->rc_override[i].start_frame = start;
4698 video_enc->rc_override[i].end_frame = end;
4700 video_enc->rc_override[i].qscale = q;
4701 video_enc->rc_override[i].quality_factor = 1.0;
4704 video_enc->rc_override[i].qscale = 0;
4705 video_enc->rc_override[i].quality_factor = -q/100.0;
4710 video_enc->rc_override_count = i;
4711 if (!video_enc->rc_initial_buffer_occupancy)
4712 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4713 video_enc->intra_dc_precision = intra_dc_precision - 8;
4716 video_enc->flags|= CODEC_FLAG_PSNR;
4721 video_enc->flags |= CODEC_FLAG_PASS1;
4724 video_enc->flags |= CODEC_FLAG_PASS2;
4728 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4729 if (forced_key_frames)
4730 parse_forced_key_frames(forced_key_frames, ost);
4732 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4734 ost->top_field_first = -1;
4735 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4737 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4739 ost->avfilter = av_strdup(filters);
4741 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4747 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4752 AVCodecContext *audio_enc;
4754 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4757 audio_enc = st->codec;
4758 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4760 if (!ost->stream_copy) {
4761 char *sample_fmt = NULL, *filters = NULL;
4763 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4765 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4767 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4768 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4772 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4774 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4776 ost->avfilter = av_strdup(filters);
4778 /* check for channel mapping for this audio stream */
4779 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4780 AudioChannelMap *map = &o->audio_channel_maps[n];
4781 InputStream *ist = input_streams[ost->source_index];
4782 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4783 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4784 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4785 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4786 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4788 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4789 ost->file_index, ost->st->index);
4797 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4801 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4802 if (!ost->stream_copy) {
4803 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4810 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4812 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4813 ost->stream_copy = 1;
4817 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4821 AVCodecContext *subtitle_enc;
4823 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4825 subtitle_enc = st->codec;
4827 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4829 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4834 /* arg format is "output-stream-index:streamid-value". */
4835 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4841 av_strlcpy(idx_str, arg, sizeof(idx_str));
4842 p = strchr(idx_str, ':');
4844 av_log(NULL, AV_LOG_FATAL,
4845 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4850 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4851 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4852 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4856 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4858 AVFormatContext *is = ifile->ctx;
4859 AVFormatContext *os = ofile->ctx;
4862 for (i = 0; i < is->nb_chapters; i++) {
4863 AVChapter *in_ch = is->chapters[i], *out_ch;
4864 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4865 AV_TIME_BASE_Q, in_ch->time_base);
4866 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4867 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4870 if (in_ch->end < ts_off)
4872 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4875 out_ch = av_mallocz(sizeof(AVChapter));
4877 return AVERROR(ENOMEM);
4879 out_ch->id = in_ch->id;
4880 out_ch->time_base = in_ch->time_base;
4881 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4882 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4885 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4888 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4890 return AVERROR(ENOMEM);
4891 os->chapters[os->nb_chapters - 1] = out_ch;
4896 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4899 AVFormatContext *ic = avformat_alloc_context();
4901 ic->interrupt_callback = int_cb;
4902 err = avformat_open_input(&ic, filename, NULL, NULL);
4905 /* copy stream format */
4906 for(i=0;i<ic->nb_streams;i++) {
4910 AVCodecContext *avctx;
4912 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4913 ost = new_output_stream(o, s, codec->type, -1);
4918 // FIXME: a more elegant solution is needed
4919 memcpy(st, ic->streams[i], sizeof(AVStream));
4921 st->info = av_malloc(sizeof(*st->info));
4922 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4924 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4926 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4927 choose_sample_fmt(st, codec);
4928 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4929 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
4932 avformat_close_input(&ic);
4936 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
4937 AVFormatContext *oc)
4941 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
4942 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
4943 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
4945 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
4950 ost->source_index = -1;
4951 ost->filter = ofilter;
4955 if (ost->stream_copy) {
4956 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
4957 "which is fed from a complex filtergraph. Filtering and streamcopy "
4958 "cannot be used together.\n", ost->file_index, ost->index);
4962 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
4963 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
4966 avfilter_inout_free(&ofilter->out_tmp);
4969 static void opt_output_file(void *optctx, const char *filename)
4971 OptionsContext *o = optctx;
4972 AVFormatContext *oc;
4974 AVOutputFormat *file_oformat;
4978 if (configure_complex_filters() < 0) {
4979 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
4983 if (!strcmp(filename, "-"))
4986 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4988 print_error(filename, err);
4991 file_oformat= oc->oformat;
4992 oc->interrupt_callback = int_cb;
4994 /* create streams for all unlabeled output pads */
4995 for (i = 0; i < nb_filtergraphs; i++) {
4996 FilterGraph *fg = filtergraphs[i];
4997 for (j = 0; j < fg->nb_outputs; j++) {
4998 OutputFilter *ofilter = fg->outputs[j];
5000 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5003 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
5004 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5005 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5006 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5008 init_output_filter(ofilter, o, oc);
5012 if (!strcmp(file_oformat->name, "ffm") &&
5013 av_strstart(filename, "http:", NULL)) {
5015 /* special case for files sent to ffserver: we get the stream
5016 parameters from ffserver */
5017 int err = read_ffserver_streams(o, oc, filename);
5019 print_error(filename, err);
5022 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5023 ost = output_streams[j];
5024 for (i = 0; i < nb_input_streams; i++) {
5025 ist = input_streams[i];
5026 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5028 ost->source_index= i;
5030 ist->st->discard = AVDISCARD_NONE;
5035 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));
5039 } else if (!o->nb_stream_maps) {
5040 /* pick the "best" stream of each type */
5042 /* video: highest resolution */
5043 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5044 int area = 0, idx = -1;
5045 for (i = 0; i < nb_input_streams; i++) {
5046 ist = input_streams[i];
5047 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5048 ist->st->codec->width * ist->st->codec->height > area) {
5049 area = ist->st->codec->width * ist->st->codec->height;
5054 new_video_stream(o, oc, idx);
5057 /* audio: most channels */
5058 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5059 int channels = 0, idx = -1;
5060 for (i = 0; i < nb_input_streams; i++) {
5061 ist = input_streams[i];
5062 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5063 ist->st->codec->channels > channels) {
5064 channels = ist->st->codec->channels;
5069 new_audio_stream(o, oc, idx);
5072 /* subtitles: pick first */
5073 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5074 for (i = 0; i < nb_input_streams; i++)
5075 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5076 new_subtitle_stream(o, oc, i);
5080 /* do something with data? */
5082 for (i = 0; i < o->nb_stream_maps; i++) {
5083 StreamMap *map = &o->stream_maps[i];
5084 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5089 if (map->linklabel) {
5091 OutputFilter *ofilter = NULL;
5094 for (j = 0; j < nb_filtergraphs; j++) {
5095 fg = filtergraphs[j];
5096 for (k = 0; k < fg->nb_outputs; k++) {
5097 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5098 if (out && !strcmp(out->name, map->linklabel)) {
5099 ofilter = fg->outputs[k];
5106 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5107 "in any defined filter graph.\n", map->linklabel);
5110 init_output_filter(ofilter, o, oc);
5112 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5113 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5115 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5117 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5119 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5122 switch (ist->st->codec->codec_type) {
5123 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5124 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5125 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5126 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5127 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5129 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5130 map->file_index, map->stream_index);
5138 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5139 AVDictionaryEntry *e;
5140 ost = output_streams[i];
5142 if ( ost->stream_copy
5143 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5144 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5145 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5149 /* handle attached files */
5150 for (i = 0; i < o->nb_attachments; i++) {
5152 uint8_t *attachment;
5156 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5157 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5161 if ((len = avio_size(pb)) <= 0) {
5162 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5166 if (!(attachment = av_malloc(len))) {
5167 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5171 avio_read(pb, attachment, len);
5173 ost = new_attachment_stream(o, oc, -1);
5174 ost->stream_copy = 0;
5175 ost->attachment_filename = o->attachments[i];
5176 ost->st->codec->extradata = attachment;
5177 ost->st->codec->extradata_size = len;
5179 p = strrchr(o->attachments[i], '/');
5180 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5184 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5185 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5188 output_files[nb_output_files - 1]->ctx = oc;
5189 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5190 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5191 if (o->recording_time != INT64_MAX)
5192 oc->duration = o->recording_time;
5193 output_files[nb_output_files - 1]->start_time = o->start_time;
5194 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5195 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5197 /* check filename in case of an image number is expected */
5198 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5199 if (!av_filename_number_test(oc->filename)) {
5200 print_error(oc->filename, AVERROR(EINVAL));
5205 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5206 /* test if it already exists to avoid losing precious files */
5207 assert_file_overwrite(filename);
5210 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5211 &oc->interrupt_callback,
5212 &output_files[nb_output_files - 1]->opts)) < 0) {
5213 print_error(filename, err);
5218 if (o->mux_preload) {
5220 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5221 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5223 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5226 for (i = 0; i < o->nb_metadata_map; i++) {
5228 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5230 if (in_file_index >= nb_input_files) {
5231 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5234 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5238 if (o->chapters_input_file >= nb_input_files) {
5239 if (o->chapters_input_file == INT_MAX) {
5240 /* copy chapters from the first input file that has them*/
5241 o->chapters_input_file = -1;
5242 for (i = 0; i < nb_input_files; i++)
5243 if (input_files[i]->ctx->nb_chapters) {
5244 o->chapters_input_file = i;
5248 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5249 o->chapters_input_file);
5253 if (o->chapters_input_file >= 0)
5254 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5255 !o->metadata_chapters_manual);
5257 /* copy global metadata by default */
5258 if (!o->metadata_global_manual && nb_input_files){
5259 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5260 AV_DICT_DONT_OVERWRITE);
5261 if(o->recording_time != INT64_MAX)
5262 av_dict_set(&oc->metadata, "duration", NULL, 0);
5264 if (!o->metadata_streams_manual)
5265 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5267 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5269 ist = input_streams[output_streams[i]->source_index];
5270 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5273 /* process manually set metadata */
5274 for (i = 0; i < o->nb_metadata; i++) {
5277 const char *stream_spec;
5278 int index = 0, j, ret = 0;
5280 val = strchr(o->metadata[i].u.str, '=');
5282 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5283 o->metadata[i].u.str);
5288 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5290 for (j = 0; j < oc->nb_streams; j++) {
5291 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5292 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5296 printf("ret %d, stream_spec %s\n", ret, stream_spec);
5304 if (index < 0 || index >= oc->nb_chapters) {
5305 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5308 m = &oc->chapters[index]->metadata;
5311 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5314 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5318 reset_options(o, 0);
5321 /* same option as mencoder */
5322 static int opt_pass(const char *opt, const char *arg)
5324 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5328 static int64_t getmaxrss(void)
5330 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5331 struct rusage rusage;
5332 getrusage(RUSAGE_SELF, &rusage);
5333 return (int64_t)rusage.ru_maxrss * 1024;
5334 #elif HAVE_GETPROCESSMEMORYINFO
5336 PROCESS_MEMORY_COUNTERS memcounters;
5337 proc = GetCurrentProcess();
5338 memcounters.cb = sizeof(memcounters);
5339 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5340 return memcounters.PeakPagefileUsage;
5346 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5348 return parse_option(o, "q:a", arg, options);
5351 static void show_usage(void)
5353 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5354 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5355 av_log(NULL, AV_LOG_INFO, "\n");
5358 static int opt_help(const char *opt, const char *arg)
5360 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5361 av_log_set_callback(log_callback_help);
5363 show_help_options(options, "Main options:\n",
5364 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5365 show_help_options(options, "\nAdvanced options:\n",
5366 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5368 show_help_options(options, "\nVideo options:\n",
5369 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5371 show_help_options(options, "\nAdvanced Video options:\n",
5372 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5373 OPT_VIDEO | OPT_EXPERT);
5374 show_help_options(options, "\nAudio options:\n",
5375 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5377 show_help_options(options, "\nAdvanced Audio options:\n",
5378 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5379 OPT_AUDIO | OPT_EXPERT);
5380 show_help_options(options, "\nSubtitle options:\n",
5381 OPT_SUBTITLE | OPT_GRAB,
5383 show_help_options(options, "\nAudio/Video grab options:\n",
5387 show_help_children(avcodec_get_class(), flags);
5388 show_help_children(avformat_get_class(), flags);
5389 show_help_children(sws_get_class(), flags);
5394 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5396 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5397 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5399 if (!strncmp(arg, "pal-", 4)) {
5402 } else if (!strncmp(arg, "ntsc-", 5)) {
5405 } else if (!strncmp(arg, "film-", 5)) {
5409 /* Try to determine PAL/NTSC by peeking in the input files */
5410 if (nb_input_files) {
5412 for (j = 0; j < nb_input_files; j++) {
5413 for (i = 0; i < input_files[j]->nb_streams; i++) {
5414 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5415 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5417 fr = c->time_base.den * 1000 / c->time_base.num;
5421 } else if ((fr == 29970) || (fr == 23976)) {
5426 if (norm != UNKNOWN)
5430 if (norm != UNKNOWN)
5431 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5434 if (norm == UNKNOWN) {
5435 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5436 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5437 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5441 if (!strcmp(arg, "vcd")) {
5442 opt_video_codec(o, "c:v", "mpeg1video");
5443 opt_audio_codec(o, "c:a", "mp2");
5444 parse_option(o, "f", "vcd", options);
5446 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5447 parse_option(o, "r", frame_rates[norm], options);
5448 opt_default("g", norm == PAL ? "15" : "18");
5450 opt_default("b:v", "1150000");
5451 opt_default("maxrate", "1150000");
5452 opt_default("minrate", "1150000");
5453 opt_default("bufsize", "327680"); // 40*1024*8;
5455 opt_default("b:a", "224000");
5456 parse_option(o, "ar", "44100", options);
5457 parse_option(o, "ac", "2", options);
5459 opt_default("packetsize", "2324");
5460 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5462 /* We have to offset the PTS, so that it is consistent with the SCR.
5463 SCR starts at 36000, but the first two packs contain only padding
5464 and the first pack from the other stream, respectively, may also have
5465 been written before.
5466 So the real data starts at SCR 36000+3*1200. */
5467 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5468 } else if (!strcmp(arg, "svcd")) {
5470 opt_video_codec(o, "c:v", "mpeg2video");
5471 opt_audio_codec(o, "c:a", "mp2");
5472 parse_option(o, "f", "svcd", options);
5474 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5475 parse_option(o, "r", frame_rates[norm], options);
5476 parse_option(o, "pix_fmt", "yuv420p", options);
5477 opt_default("g", norm == PAL ? "15" : "18");
5479 opt_default("b:v", "2040000");
5480 opt_default("maxrate", "2516000");
5481 opt_default("minrate", "0"); // 1145000;
5482 opt_default("bufsize", "1835008"); // 224*1024*8;
5483 opt_default("scan_offset", "1");
5486 opt_default("b:a", "224000");
5487 parse_option(o, "ar", "44100", options);
5489 opt_default("packetsize", "2324");
5491 } else if (!strcmp(arg, "dvd")) {
5493 opt_video_codec(o, "c:v", "mpeg2video");
5494 opt_audio_codec(o, "c:a", "ac3");
5495 parse_option(o, "f", "dvd", options);
5497 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5498 parse_option(o, "r", frame_rates[norm], options);
5499 parse_option(o, "pix_fmt", "yuv420p", options);
5500 opt_default("g", norm == PAL ? "15" : "18");
5502 opt_default("b:v", "6000000");
5503 opt_default("maxrate", "9000000");
5504 opt_default("minrate", "0"); // 1500000;
5505 opt_default("bufsize", "1835008"); // 224*1024*8;
5507 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5508 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5510 opt_default("b:a", "448000");
5511 parse_option(o, "ar", "48000", options);
5513 } else if (!strncmp(arg, "dv", 2)) {
5515 parse_option(o, "f", "dv", options);
5517 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5518 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5519 norm == PAL ? "yuv420p" : "yuv411p", options);
5520 parse_option(o, "r", frame_rates[norm], options);
5522 parse_option(o, "ar", "48000", options);
5523 parse_option(o, "ac", "2", options);
5526 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5527 return AVERROR(EINVAL);
5532 static int opt_vstats_file(const char *opt, const char *arg)
5534 av_free (vstats_filename);
5535 vstats_filename = av_strdup (arg);
5539 static int opt_vstats(const char *opt, const char *arg)
5542 time_t today2 = time(NULL);
5543 struct tm *today = localtime(&today2);
5545 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5547 return opt_vstats_file(opt, filename);
5550 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5552 return parse_option(o, "frames:v", arg, options);
5555 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5557 return parse_option(o, "frames:a", arg, options);
5560 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5562 return parse_option(o, "frames:d", arg, options);
5565 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5568 char filename[1000], line[1000], tmp_line[1000];
5569 const char *codec_name = *opt == 'v' ? video_codec_name :
5570 *opt == 'a' ? audio_codec_name :
5571 subtitle_codec_name;
5573 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5574 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5575 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5577 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5581 while (fgets(line, sizeof(line), f)) {
5582 char *key = tmp_line, *value, *endptr;
5584 if (strcspn(line, "#\n\r") == 0)
5586 strcpy(tmp_line, line);
5587 if (!av_strtok(key, "=", &value) ||
5588 !av_strtok(value, "\r\n", &endptr)) {
5589 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5592 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5594 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5595 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5596 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5597 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5598 else if (opt_default(key, value) < 0) {
5599 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5600 filename, line, key, value);
5610 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5614 static int opt_passlogfile(const char *opt, const char *arg)
5616 pass_logfilename_prefix = arg;
5617 #if CONFIG_LIBX264_ENCODER
5618 return opt_default(opt, arg);
5624 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5626 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5627 int ret = parse_option(o, s, arg, options);
5632 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5634 if(!strcmp(opt, "b")){
5635 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5636 return parse_option(o, "b:v", arg, options);
5638 return opt_default(opt, arg);
5641 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5645 if(!strcmp(opt, "qscale")){
5646 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5647 return parse_option(o, "q:v", arg, options);
5649 s = av_asprintf("q%s", opt + 6);
5650 ret = parse_option(o, s, arg, options);
5655 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5657 if(!strcmp(opt, "profile")){
5658 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5659 return parse_option(o, "profile:v", arg, options);
5661 return opt_default(opt, arg);
5664 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5666 return parse_option(o, "filter:v", arg, options);
5669 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5671 return parse_option(o, "filter:a", arg, options);
5674 static int opt_vsync(const char *opt, const char *arg)
5676 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5677 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5678 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5679 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5681 if (video_sync_method == VSYNC_AUTO)
5682 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5686 static int opt_deinterlace(const char *opt, const char *arg)
5688 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5693 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5695 int idx = locate_option(argc, argv, options, "cpuflags");
5696 if (idx && argv[idx + 1])
5697 opt_cpuflags("cpuflags", argv[idx + 1]);
5700 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5702 char layout_str[32];
5705 int ret, channels, ac_str_size;
5708 layout = av_get_channel_layout(arg);
5710 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5711 return AVERROR(EINVAL);
5713 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5714 ret = opt_default(opt, layout_str);
5718 /* set 'ac' option based on channel layout */
5719 channels = av_get_channel_layout_nb_channels(layout);
5720 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5721 stream_str = strchr(opt, ':');
5722 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5723 ac_str = av_mallocz(ac_str_size);
5725 return AVERROR(ENOMEM);
5726 av_strlcpy(ac_str, "ac", 3);
5728 av_strlcat(ac_str, stream_str, ac_str_size);
5729 ret = parse_option(o, ac_str, layout_str, options);
5735 static int opt_filter_complex(const char *opt, const char *arg)
5737 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5738 &nb_filtergraphs, nb_filtergraphs + 1);
5739 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5740 return AVERROR(ENOMEM);
5741 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5742 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5746 #define OFFSET(x) offsetof(OptionsContext, x)
5747 static const OptionDef options[] = {
5749 #include "cmdutils_common_opts.h"
5750 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5751 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5752 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5753 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5754 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5755 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5756 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5757 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5758 { "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]" },
5759 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5760 "outfile[,metadata]:infile[,metadata]" },
5761 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5762 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5763 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5764 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5765 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5766 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5767 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5768 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5769 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5770 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5771 "add timings for benchmarking" },
5772 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5773 "add timings for each task" },
5774 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5775 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5776 "dump each input packet" },
5777 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5778 "when dumping packets, also dump the payload" },
5779 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5780 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5781 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5782 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5783 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5784 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5785 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5786 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5787 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5788 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5789 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5790 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5791 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5792 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5793 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5794 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5795 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5796 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5797 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5798 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5799 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5800 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5801 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5804 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5805 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5806 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5807 { "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" },
5808 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5809 { "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" },
5810 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5811 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5812 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5813 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5814 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5815 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5816 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5817 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5818 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5819 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5820 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5821 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5822 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5823 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5824 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5825 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5826 "use same quantizer as source (implies VBR)" },
5827 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5828 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5829 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5830 "this option is deprecated, use the yadif filter instead" },
5831 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5832 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5833 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5834 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5835 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5836 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5837 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5838 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5839 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5840 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5841 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5842 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5843 { "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" },
5844 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5847 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5848 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5849 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5850 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5851 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5852 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5853 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5854 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5855 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5856 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5857 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
5859 /* subtitle options */
5860 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5861 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5862 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5865 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5866 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5867 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5870 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5871 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5873 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5874 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5875 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5877 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5878 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5879 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5880 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5881 /* data codec support */
5882 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5883 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5885 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5889 int main(int argc, char **argv)
5891 OptionsContext o = { 0 };
5894 reset_options(&o, 0);
5896 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5897 parse_loglevel(argc, argv, options);
5899 if(argc>1 && !strcmp(argv[1], "-d")){
5901 av_log_set_callback(log_callback_null);
5906 avcodec_register_all();
5908 avdevice_register_all();
5910 avfilter_register_all();
5912 avformat_network_init();
5914 show_banner(argc, argv, options);
5918 parse_cpuflags(argc, argv, options);
5921 parse_options(&o, argc, argv, options, opt_output_file);
5923 if (nb_output_files <= 0 && nb_input_files == 0) {
5925 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5929 /* file converter / grab */
5930 if (nb_output_files <= 0) {
5931 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5935 if (nb_input_files == 0) {
5936 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5940 current_time = ti = getutime();
5941 if (transcode() < 0)
5943 ti = getutime() - ti;
5945 int maxrss = getmaxrss() / 1024;
5946 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);