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 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
444 for (i = 0; i < o->nb_ ## name; i++) {\
445 char *spec = o->name[i].specifier;\
446 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
447 outvar = o->name[i].u.type;\
453 static int64_t getutime(void)
456 struct rusage rusage;
458 getrusage(RUSAGE_SELF, &rusage);
459 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
460 #elif HAVE_GETPROCESSTIMES
463 proc = GetCurrentProcess();
464 GetProcessTimes(proc, &c, &e, &k, &u);
465 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
471 static void update_benchmark(const char *fmt, ...)
473 if (do_benchmark_all) {
474 int64_t t = getutime();
480 vsnprintf(buf, sizeof(buf), fmt, va);
482 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
488 static void reset_options(OptionsContext *o, int is_input)
490 const OptionDef *po = options;
491 OptionsContext bak= *o;
494 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
496 void *dst = (uint8_t*)o + po->u.off;
498 if (po->flags & OPT_SPEC) {
499 SpecifierOpt **so = dst;
500 int i, *count = (int*)(so + 1);
501 for (i = 0; i < *count; i++) {
502 av_freep(&(*so)[i].specifier);
503 if (po->flags & OPT_STRING)
504 av_freep(&(*so)[i].u.str);
508 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
513 for (i = 0; i < o->nb_stream_maps; i++)
514 av_freep(&o->stream_maps[i].linklabel);
515 av_freep(&o->stream_maps);
516 av_freep(&o->audio_channel_maps);
517 av_freep(&o->streamid_map);
519 memset(o, 0, sizeof(*o));
521 if(is_input) o->recording_time = bak.recording_time;
522 else o->recording_time = INT64_MAX;
523 o->mux_max_delay = 0.7;
524 o->limit_filesize = UINT64_MAX;
525 o->chapters_input_file = INT_MAX;
531 static int alloc_buffer(InputStream *ist, AVCodecContext *s, FrameBuffer **pbuf)
533 FrameBuffer *buf = av_mallocz(sizeof(*buf));
535 const int pixel_size = av_pix_fmt_descriptors[s->pix_fmt].comp[0].step_minus1+1;
536 int h_chroma_shift, v_chroma_shift;
537 int edge = 32; // XXX should be avcodec_get_edge_width(), but that fails on svq1
538 int w = s->width, h = s->height;
541 return AVERROR(ENOMEM);
543 avcodec_align_dimensions(s, &w, &h);
545 if (!(s->flags & CODEC_FLAG_EMU_EDGE)) {
550 if ((ret = av_image_alloc(buf->base, buf->linesize, w, h,
551 s->pix_fmt, 32)) < 0) {
555 /* XXX this shouldn't be needed, but some tests break without this line
556 * those decoders are buggy and need to be fixed.
557 * the following tests fail:
558 * cdgraphics, ansi, aasc, fraps-v1, qtrle-1bit
560 memset(buf->base[0], 128, ret);
562 avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
563 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
564 const int h_shift = i==0 ? 0 : h_chroma_shift;
565 const int v_shift = i==0 ? 0 : v_chroma_shift;
566 if ((s->flags & CODEC_FLAG_EMU_EDGE) || !buf->linesize[1] || !buf->base[i])
567 buf->data[i] = buf->base[i];
569 buf->data[i] = buf->base[i] +
570 FFALIGN((buf->linesize[i]*edge >> v_shift) +
571 (pixel_size*edge >> h_shift), 32);
575 buf->pix_fmt = s->pix_fmt;
582 static void free_buffer_pool(InputStream *ist)
584 FrameBuffer *buf = ist->buffer_pool;
586 ist->buffer_pool = buf->next;
587 av_freep(&buf->base[0]);
589 buf = ist->buffer_pool;
593 static void unref_buffer(InputStream *ist, FrameBuffer *buf)
595 av_assert0(buf->refcount > 0);
597 if (!buf->refcount) {
599 for(tmp= ist->buffer_pool; tmp; tmp= tmp->next)
600 av_assert1(tmp != buf);
601 buf->next = ist->buffer_pool;
602 ist->buffer_pool = buf;
606 static int codec_get_buffer(AVCodecContext *s, AVFrame *frame)
608 InputStream *ist = s->opaque;
612 if(av_image_check_size(s->width, s->height, 0, s) || s->pix_fmt<0)
615 if (!ist->buffer_pool && (ret = alloc_buffer(ist, s, &ist->buffer_pool)) < 0)
618 buf = ist->buffer_pool;
619 ist->buffer_pool = buf->next;
621 if (buf->w != s->width || buf->h != s->height || buf->pix_fmt != s->pix_fmt) {
622 av_freep(&buf->base[0]);
624 if ((ret = alloc_buffer(ist, s, &buf)) < 0)
627 av_assert0(!buf->refcount);
631 frame->type = FF_BUFFER_TYPE_USER;
632 frame->extended_data = frame->data;
633 frame->pkt_pts = s->pkt ? s->pkt->pts : AV_NOPTS_VALUE;
634 frame->width = buf->w;
635 frame->height = buf->h;
636 frame->format = buf->pix_fmt;
637 frame->sample_aspect_ratio = s->sample_aspect_ratio;
639 for (i = 0; i < FF_ARRAY_ELEMS(buf->data); i++) {
640 frame->base[i] = buf->base[i]; // XXX h264.c uses base though it shouldn't
641 frame->data[i] = buf->data[i];
642 frame->linesize[i] = buf->linesize[i];
648 static void codec_release_buffer(AVCodecContext *s, AVFrame *frame)
650 InputStream *ist = s->opaque;
651 FrameBuffer *buf = frame->opaque;
654 if(frame->type!=FF_BUFFER_TYPE_USER)
655 return avcodec_default_release_buffer(s, frame);
657 for (i = 0; i < FF_ARRAY_ELEMS(frame->data); i++)
658 frame->data[i] = NULL;
660 unref_buffer(ist, buf);
663 static void filter_release_buffer(AVFilterBuffer *fb)
665 FrameBuffer *buf = fb->priv;
667 unref_buffer(buf->ist, buf);
670 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
672 if (codec && codec->pix_fmts) {
673 const enum PixelFormat *p = codec->pix_fmts;
674 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
675 enum PixelFormat best= PIX_FMT_NONE;
676 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
677 if (st->codec->codec_id == CODEC_ID_MJPEG) {
678 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
679 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
680 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
681 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
684 for (; *p != PIX_FMT_NONE; p++) {
685 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
689 if (*p == PIX_FMT_NONE) {
690 if (target != PIX_FMT_NONE)
691 av_log(NULL, AV_LOG_WARNING,
692 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
693 av_pix_fmt_descriptors[target].name,
695 av_pix_fmt_descriptors[best].name);
702 static char *choose_pix_fmts(OutputStream *ost)
704 if (ost->keep_pix_fmt) {
706 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
707 AVFILTER_AUTO_CONVERT_NONE);
708 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
710 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
712 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
713 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
714 } else if (ost->enc->pix_fmts) {
715 const enum PixelFormat *p;
716 AVIOContext *s = NULL;
720 if (avio_open_dyn_buf(&s) < 0)
723 p = ost->enc->pix_fmts;
724 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
725 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
726 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
727 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
728 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
729 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
733 for (; *p != PIX_FMT_NONE; p++) {
734 const char *name = av_get_pix_fmt_name(*p);
735 avio_printf(s, "%s:", name);
737 len = avio_close_dyn_buf(s, &ret);
745 * Define a function for building a string containing a list of
748 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
749 static char *choose_ ## var ## s(OutputStream *ost) \
751 if (ost->st->codec->var != none) { \
752 get_name(ost->st->codec->var); \
753 return av_strdup(name); \
754 } else if (ost->enc->supported_list) { \
756 AVIOContext *s = NULL; \
760 if (avio_open_dyn_buf(&s) < 0) \
763 for (p = ost->enc->supported_list; *p != none; p++) { \
765 avio_printf(s, "%s" separator, name); \
767 len = avio_close_dyn_buf(s, &ret); \
774 #define GET_PIX_FMT_NAME(pix_fmt)\
775 const char *name = av_get_pix_fmt_name(pix_fmt);
777 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
778 // GET_PIX_FMT_NAME, ":")
780 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
781 const char *name = av_get_sample_fmt_name(sample_fmt)
783 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
784 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
786 #define GET_SAMPLE_RATE_NAME(rate)\
788 snprintf(name, sizeof(name), "%d", rate);
790 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
791 GET_SAMPLE_RATE_NAME, ",")
793 #define GET_CH_LAYOUT_NAME(ch_layout)\
795 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
797 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
798 GET_CH_LAYOUT_NAME, ",")
800 static int configure_audio_filters(FilterGraph *fg, AVFilterContext **in_filter,
801 AVFilterContext **out_filter)
803 InputStream *ist = fg->inputs[0]->ist;
804 OutputStream *ost = fg->outputs[0]->ost;
805 AVCodecContext *codec = ost->st->codec;
806 AVCodecContext *icodec = ist->st->codec;
807 char *sample_fmts, *sample_rates, *channel_layouts;
811 avfilter_graph_free(&fg->graph);
812 if (!(fg->graph = avfilter_graph_alloc()))
813 return AVERROR(ENOMEM);
815 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s:"
816 "channel_layout=0x%"PRIx64, ist->st->time_base.num,
817 ist->st->time_base.den, icodec->sample_rate,
818 av_get_sample_fmt_name(icodec->sample_fmt), icodec->channel_layout);
819 ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
820 avfilter_get_by_name("abuffer"),
821 "src", args, NULL, fg->graph);
825 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
826 avfilter_get_by_name("abuffersink_old"),
827 "out", NULL, NULL, fg->graph);
831 *in_filter = fg->inputs[0]->filter;
832 *out_filter = fg->outputs[0]->filter;
834 if (codec->channels && !codec->channel_layout)
835 codec->channel_layout = av_get_default_channel_layout(codec->channels);
837 sample_fmts = choose_sample_fmts(ost);
838 sample_rates = choose_sample_rates(ost);
839 channel_layouts = choose_channel_layouts(ost);
840 if (sample_fmts || sample_rates || channel_layouts) {
841 AVFilterContext *format;
846 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
849 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
852 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
856 av_freep(&sample_fmts);
857 av_freep(&sample_rates);
858 av_freep(&channel_layouts);
860 ret = avfilter_graph_create_filter(&format,
861 avfilter_get_by_name("aformat"),
862 "aformat", args, NULL, fg->graph);
866 ret = avfilter_link(format, 0, fg->outputs[0]->filter, 0);
870 *out_filter = format;
873 if (audio_sync_method > 0) {
874 AVFilterContext *aswr;
875 char args[256] = {0};
877 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
879 if (audio_sync_method > 1)
880 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)icodec->sample_rate);
882 av_log(NULL, AV_LOG_INFO, "-async %d is forwarded to lavfi similarly to -af aresample=%s\n", audio_sync_method, args);
884 ret = avfilter_graph_create_filter(&aswr, avfilter_get_by_name("aresample"),
885 "aresample", args, NULL, fg->graph);
889 ret = avfilter_link(*in_filter, 0, aswr, 0);
896 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
897 AVFilterContext *filt_ctx; \
899 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
900 "similarly to -af " filter_name "=%s.\n", arg); \
902 ret = avfilter_graph_create_filter(&filt_ctx, \
903 avfilter_get_by_name(filter_name), \
904 filter_name, arg, NULL, fg->graph); \
908 ret = avfilter_link(*in_filter, 0, filt_ctx, 0); \
912 *in_filter = filt_ctx; \
915 if (ost->audio_channels_mapped) {
919 av_bprint_init(&pan_buf, 256, 8192);
920 av_bprintf(&pan_buf, "0x%"PRIx64,
921 av_get_default_channel_layout(ost->audio_channels_mapped));
922 for (i = 0; i < ost->audio_channels_mapped; i++)
923 if (ost->audio_channels_map[i] != -1)
924 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
926 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
927 av_bprint_finalize(&pan_buf, NULL);
930 if (audio_volume != 256) {
933 snprintf(args, sizeof(args), "%lf", audio_volume / 256.);
934 AUTO_INSERT_FILTER("-vol", "volume", args);
940 static int configure_video_filters(FilterGraph *fg, AVFilterContext **in_filter,
941 AVFilterContext **out_filter)
943 InputStream *ist = fg->inputs[0]->ist;
944 OutputStream *ost = fg->outputs[0]->ost;
945 AVFilterContext *filter;
946 AVCodecContext *codec = ost->st->codec;
947 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
949 AVRational sample_aspect_ratio;
953 if (ist->st->sample_aspect_ratio.num) {
954 sample_aspect_ratio = ist->st->sample_aspect_ratio;
956 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
958 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d:flags=%d", ist->st->codec->width,
959 ist->st->codec->height, ist->st->codec->pix_fmt,
961 sample_aspect_ratio.num, sample_aspect_ratio.den,
962 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
964 ret = avfilter_graph_create_filter(&fg->inputs[0]->filter,
965 avfilter_get_by_name("buffer"),
966 "src", args, NULL, fg->graph);
970 #if FF_API_OLD_VSINK_API
971 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
972 avfilter_get_by_name("buffersink"),
973 "out", NULL, NULL, fg->graph);
975 ret = avfilter_graph_create_filter(&fg->outputs[0]->filter,
976 avfilter_get_by_name("buffersink"),
977 "out", NULL, buffersink_params, fg->graph);
979 av_freep(&buffersink_params);
983 *in_filter = fg->inputs[0]->filter;
984 *out_filter = fg->outputs[0]->filter;
986 if (codec->width || codec->height) {
987 snprintf(args, 255, "%d:%d:flags=0x%X",
990 (unsigned)ost->sws_flags);
991 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
992 NULL, args, NULL, fg->graph)) < 0)
994 if ((ret = avfilter_link(*in_filter, 0, filter, 0)) < 0)
999 if ((pix_fmts = choose_pix_fmts(ost))) {
1000 if ((ret = avfilter_graph_create_filter(&filter,
1001 avfilter_get_by_name("format"),
1002 "format", pix_fmts, NULL,
1005 if ((ret = avfilter_link(filter, 0, *out_filter, 0)) < 0)
1008 *out_filter = filter;
1009 av_freep(&pix_fmts);
1012 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1013 fg->graph->scale_sws_opts = av_strdup(args);
1018 static int configure_simple_filtergraph(FilterGraph *fg)
1020 OutputStream *ost = fg->outputs[0]->ost;
1021 AVFilterContext *in_filter, *out_filter;
1024 avfilter_graph_free(&fg->graph);
1025 fg->graph = avfilter_graph_alloc();
1027 return AVERROR(ENOMEM);
1029 switch (ost->st->codec->codec_type) {
1030 case AVMEDIA_TYPE_VIDEO:
1031 ret = configure_video_filters(fg, &in_filter, &out_filter);
1033 case AVMEDIA_TYPE_AUDIO:
1034 ret = configure_audio_filters(fg, &in_filter, &out_filter);
1036 default: av_assert0(0);
1041 if (ost->avfilter) {
1042 AVFilterInOut *outputs = avfilter_inout_alloc();
1043 AVFilterInOut *inputs = avfilter_inout_alloc();
1045 outputs->name = av_strdup("in");
1046 outputs->filter_ctx = in_filter;
1047 outputs->pad_idx = 0;
1048 outputs->next = NULL;
1050 inputs->name = av_strdup("out");
1051 inputs->filter_ctx = out_filter;
1052 inputs->pad_idx = 0;
1053 inputs->next = NULL;
1055 if ((ret = avfilter_graph_parse(fg->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
1057 av_freep(&ost->avfilter);
1059 if ((ret = avfilter_link(in_filter, 0, out_filter, 0)) < 0)
1063 if (ost->keep_pix_fmt)
1064 avfilter_graph_set_auto_convert(fg->graph,
1065 AVFILTER_AUTO_CONVERT_NONE);
1067 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1070 ost->filter = fg->outputs[0];
1075 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
1077 FilterGraph *fg = av_mallocz(sizeof(*fg));
1081 fg->index = nb_filtergraphs;
1083 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
1084 fg->nb_outputs + 1);
1085 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
1087 fg->outputs[0]->ost = ost;
1088 fg->outputs[0]->graph = fg;
1090 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
1092 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
1094 fg->inputs[0]->ist = ist;
1095 fg->inputs[0]->graph = fg;
1097 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
1098 &ist->nb_filters, ist->nb_filters + 1);
1099 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
1101 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
1102 &nb_filtergraphs, nb_filtergraphs + 1);
1103 filtergraphs[nb_filtergraphs - 1] = fg;
1108 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
1110 InputStream *ist = NULL;
1111 enum AVMediaType type = in->filter_ctx->input_pads[in->pad_idx].type;
1114 // TODO: support other filter types
1115 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
1116 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
1123 AVStream *st = NULL;
1125 int file_idx = strtol(in->name, &p, 0);
1127 if (file_idx < 0 || file_idx >= nb_input_files) {
1128 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
1129 file_idx, fg->graph_desc);
1132 s = input_files[file_idx]->ctx;
1134 for (i = 0; i < s->nb_streams; i++) {
1135 if (s->streams[i]->codec->codec_type != type)
1137 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
1143 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
1144 "matches no streams.\n", p, fg->graph_desc);
1147 ist = input_streams[input_files[file_idx]->ist_index + st->index];
1149 /* find the first unused stream of corresponding type */
1150 for (i = 0; i < nb_input_streams; i++) {
1151 ist = input_streams[i];
1152 if (ist->st->codec->codec_type == type && ist->discard)
1155 if (i == nb_input_streams) {
1156 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
1157 "unlabeled input pad %d on filter %s", in->pad_idx,
1158 in->filter_ctx->name);
1163 ist->decoding_needed = 1;
1164 ist->st->discard = AVDISCARD_NONE;
1166 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
1167 &fg->nb_inputs, fg->nb_inputs + 1);
1168 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
1170 fg->inputs[fg->nb_inputs - 1]->ist = ist;
1171 fg->inputs[fg->nb_inputs - 1]->graph = fg;
1173 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
1174 &ist->nb_filters, ist->nb_filters + 1);
1175 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
1178 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1181 AVCodecContext *codec = ofilter->ost->st->codec;
1182 AVFilterContext *last_filter = out->filter_ctx;
1183 int pad_idx = out->pad_idx;
1185 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
1187 #if FF_API_OLD_VSINK_API
1188 ret = avfilter_graph_create_filter(&ofilter->filter,
1189 avfilter_get_by_name("buffersink"),
1190 "out", NULL, NULL, fg->graph);
1192 ret = avfilter_graph_create_filter(&ofilter->filter,
1193 avfilter_get_by_name("buffersink"),
1194 "out", NULL, buffersink_params, fg->graph);
1196 av_freep(&buffersink_params);
1201 if (codec->width || codec->height) {
1203 AVFilterContext *filter;
1205 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
1208 (unsigned)ofilter->ost->sws_flags);
1209 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
1210 NULL, args, NULL, fg->graph)) < 0)
1212 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1215 last_filter = filter;
1219 if ((pix_fmts = choose_pix_fmts(ofilter->ost))) {
1220 AVFilterContext *filter;
1221 if ((ret = avfilter_graph_create_filter(&filter,
1222 avfilter_get_by_name("format"),
1223 "format", pix_fmts, NULL,
1226 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
1229 last_filter = filter;
1231 av_freep(&pix_fmts);
1234 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1240 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1242 OutputStream *ost = ofilter->ost;
1243 AVCodecContext *codec = ost->st->codec;
1244 AVFilterContext *last_filter = out->filter_ctx;
1245 int pad_idx = out->pad_idx;
1246 char *sample_fmts, *sample_rates, *channel_layouts;
1249 ret = avfilter_graph_create_filter(&ofilter->filter,
1250 avfilter_get_by_name("abuffersink"),
1251 "out", NULL, NULL, fg->graph);
1255 if (codec->channels && !codec->channel_layout)
1256 codec->channel_layout = av_get_default_channel_layout(codec->channels);
1258 sample_fmts = choose_sample_fmts(ost);
1259 sample_rates = choose_sample_rates(ost);
1260 channel_layouts = choose_channel_layouts(ost);
1261 if (sample_fmts || sample_rates || channel_layouts) {
1262 AVFilterContext *format;
1267 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
1270 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
1272 if (channel_layouts)
1273 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
1277 av_freep(&sample_fmts);
1278 av_freep(&sample_rates);
1279 av_freep(&channel_layouts);
1281 ret = avfilter_graph_create_filter(&format,
1282 avfilter_get_by_name("aformat"),
1283 "aformat", args, NULL, fg->graph);
1287 ret = avfilter_link(last_filter, pad_idx, format, 0);
1291 last_filter = format;
1295 if (audio_sync_method > 0) {
1296 AVFilterContext *async;
1300 av_log(NULL, AV_LOG_WARNING, "-async has been deprecated. Used the "
1301 "asyncts audio filter instead.\n");
1303 if (audio_sync_method > 1)
1304 len += snprintf(args + len, sizeof(args) - len, "compensate=1:"
1305 "max_comp=%d:", audio_sync_method);
1306 snprintf(args + len, sizeof(args) - len, "min_delta=%f",
1307 audio_drift_threshold);
1309 ret = avfilter_graph_create_filter(&async,
1310 avfilter_get_by_name("asyncts"),
1311 "async", args, NULL, fg->graph);
1315 ret = avfilter_link(last_filter, pad_idx, async, 0);
1319 last_filter = async;
1323 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
1329 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1331 switch (out->filter_ctx->output_pads[out->pad_idx].type) {
1332 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1333 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1334 default: av_assert0(0);
1338 static int configure_complex_filter(FilterGraph *fg)
1340 AVFilterInOut *inputs, *outputs, *cur;
1341 int ret, i, init = !fg->graph;
1343 avfilter_graph_free(&fg->graph);
1344 if (!(fg->graph = avfilter_graph_alloc()))
1345 return AVERROR(ENOMEM);
1347 if ((ret = avfilter_graph_parse2(fg->graph, fg->graph_desc, &inputs, &outputs)) < 0)
1350 for (cur = inputs; init && cur; cur = cur->next)
1351 init_input_filter(fg, cur);
1353 for (cur = inputs, i = 0; cur; cur = cur->next, i++) {
1354 InputFilter *ifilter = fg->inputs[i];
1355 InputStream *ist = ifilter->ist;
1360 switch (cur->filter_ctx->input_pads[cur->pad_idx].type) {
1361 case AVMEDIA_TYPE_VIDEO:
1362 sar = ist->st->sample_aspect_ratio.num ?
1363 ist->st->sample_aspect_ratio :
1364 ist->st->codec->sample_aspect_ratio;
1365 snprintf(args, sizeof(args), "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
1366 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
1368 filter = avfilter_get_by_name("buffer");
1370 case AVMEDIA_TYPE_AUDIO:
1371 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:"
1372 "sample_fmt=%s:channel_layout=0x%"PRIx64,
1373 ist->st->time_base.num, ist->st->time_base.den,
1374 ist->st->codec->sample_rate,
1375 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1376 ist->st->codec->channel_layout);
1377 filter = avfilter_get_by_name("abuffer");
1383 if ((ret = avfilter_graph_create_filter(&ifilter->filter,
1385 args, NULL, fg->graph)) < 0)
1387 if ((ret = avfilter_link(ifilter->filter, 0,
1388 cur->filter_ctx, cur->pad_idx)) < 0)
1391 avfilter_inout_free(&inputs);
1394 /* we already know the mappings between lavfi outputs and output streams,
1395 * so we can finish the setup */
1396 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1397 configure_output_filter(fg, fg->outputs[i], cur);
1398 avfilter_inout_free(&outputs);
1400 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1403 /* wait until output mappings are processed */
1404 for (cur = outputs; cur;) {
1405 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1406 &fg->nb_outputs, fg->nb_outputs + 1);
1407 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1409 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1410 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1412 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1419 static int configure_complex_filters(void)
1423 for (i = 0; i < nb_filtergraphs; i++)
1424 if (!filtergraphs[i]->graph &&
1425 (ret = configure_complex_filter(filtergraphs[i])) < 0)
1430 static int configure_filtergraph(FilterGraph *fg)
1432 return fg->graph_desc ? configure_complex_filter(fg) :
1433 configure_simple_filtergraph(fg);
1436 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1439 for (i = 0; i < fg->nb_inputs; i++)
1440 if (fg->inputs[i]->ist == ist)
1445 static void term_exit(void)
1447 av_log(NULL, AV_LOG_QUIET, "%s", "");
1450 tcsetattr (0, TCSANOW, &oldtty);
1454 static volatile int received_sigterm = 0;
1456 static void sigterm_handler(int sig)
1458 received_sigterm = sig;
1459 received_nb_signals++;
1461 if(received_nb_signals > 3)
1465 static void term_init(void)
1471 if (tcgetattr (0, &tty) == 0) {
1476 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1477 |INLCR|IGNCR|ICRNL|IXON);
1478 tty.c_oflag |= OPOST;
1479 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1480 tty.c_cflag &= ~(CSIZE|PARENB);
1483 tty.c_cc[VTIME] = 0;
1485 tcsetattr (0, TCSANOW, &tty);
1487 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1490 avformat_network_deinit();
1492 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1493 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1495 signal(SIGXCPU, sigterm_handler);
1499 /* read a key without blocking */
1500 static int read_key(void)
1512 n = select(1, &rfds, NULL, NULL, &tv);
1514 n = read(0, &ch, 1);
1521 # if HAVE_PEEKNAMEDPIPE
1523 static HANDLE input_handle;
1526 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1527 is_pipe = !GetConsoleMode(input_handle, &dw);
1530 if (stdin->_cnt > 0) {
1535 /* When running under a GUI, you will end here. */
1536 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1553 static int decode_interrupt_cb(void *ctx)
1555 return received_nb_signals > 1;
1558 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1560 void av_noreturn exit_program(int ret)
1564 for (i = 0; i < nb_filtergraphs; i++) {
1565 avfilter_graph_free(&filtergraphs[i]->graph);
1566 for (j = 0; j < filtergraphs[i]->nb_inputs; j++)
1567 av_freep(&filtergraphs[i]->inputs[j]);
1568 av_freep(&filtergraphs[i]->inputs);
1569 for (j = 0; j < filtergraphs[i]->nb_outputs; j++)
1570 av_freep(&filtergraphs[i]->outputs[j]);
1571 av_freep(&filtergraphs[i]->outputs);
1572 av_freep(&filtergraphs[i]);
1574 av_freep(&filtergraphs);
1577 for (i = 0; i < nb_output_files; i++) {
1578 AVFormatContext *s = output_files[i]->ctx;
1579 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1581 avformat_free_context(s);
1582 av_dict_free(&output_files[i]->opts);
1583 av_freep(&output_files[i]);
1585 for (i = 0; i < nb_output_streams; i++) {
1586 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1588 AVBitStreamFilterContext *next = bsfc->next;
1589 av_bitstream_filter_close(bsfc);
1592 output_streams[i]->bitstream_filters = NULL;
1594 av_freep(&output_streams[i]->filtered_frame);
1595 av_freep(&output_streams[i]);
1597 for (i = 0; i < nb_input_files; i++) {
1598 avformat_close_input(&input_files[i]->ctx);
1599 av_freep(&input_files[i]);
1601 for (i = 0; i < nb_input_streams; i++) {
1602 av_freep(&input_streams[i]->decoded_frame);
1603 av_dict_free(&input_streams[i]->opts);
1604 free_buffer_pool(input_streams[i]);
1605 av_freep(&input_streams[i]->filters);
1606 av_freep(&input_streams[i]);
1610 fclose(vstats_file);
1611 av_free(vstats_filename);
1613 av_freep(&input_streams);
1614 av_freep(&input_files);
1615 av_freep(&output_streams);
1616 av_freep(&output_files);
1621 avformat_network_deinit();
1623 if (received_sigterm) {
1624 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1625 (int) received_sigterm);
1632 static void assert_avoptions(AVDictionary *m)
1634 AVDictionaryEntry *t;
1635 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1636 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1641 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1643 const char *codec_string = encoder ? "encoder" : "decoder";
1645 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1646 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1647 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1648 "results.\nAdd '-strict experimental' if you want to use it.\n",
1649 codec_string, c->codec->name);
1650 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1651 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1652 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1653 codec_string, codec->name);
1658 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1660 if (codec && codec->sample_fmts) {
1661 const enum AVSampleFormat *p = codec->sample_fmts;
1662 for (; *p != -1; p++) {
1663 if (*p == st->codec->sample_fmt)
1667 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1668 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1669 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1670 av_log(NULL, AV_LOG_WARNING,
1671 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1672 av_get_sample_fmt_name(st->codec->sample_fmt),
1674 av_get_sample_fmt_name(codec->sample_fmts[0]));
1675 st->codec->sample_fmt = codec->sample_fmts[0];
1681 get_sync_ipts(const OutputStream *ost, int64_t pts)
1683 OutputFile *of = output_files[ost->file_index];
1684 return (double)(pts - of->start_time) / AV_TIME_BASE;
1687 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1689 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1690 AVCodecContext *avctx = ost->st->codec;
1693 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1694 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1695 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1697 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1698 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1699 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1700 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1701 pkt->pts = pkt->dts = max;
1706 * Audio encoders may split the packets -- #frames in != #packets out.
1707 * But there is no reordering, so we can limit the number of output packets
1708 * by simply dropping them here.
1709 * Counting encoded video frames needs to be done separately because of
1710 * reordering, see do_video_out()
1712 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1713 if (ost->frame_number >= ost->max_frames) {
1714 av_free_packet(pkt);
1717 ost->frame_number++;
1721 AVPacket new_pkt = *pkt;
1722 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1723 &new_pkt.data, &new_pkt.size,
1724 pkt->data, pkt->size,
1725 pkt->flags & AV_PKT_FLAG_KEY);
1727 av_free_packet(pkt);
1728 new_pkt.destruct = av_destruct_packet;
1730 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1731 bsfc->filter->name, pkt->stream_index,
1732 avctx->codec ? avctx->codec->name : "copy");
1742 pkt->stream_index = ost->index;
1743 ret = av_interleaved_write_frame(s, pkt);
1745 print_error("av_interleaved_write_frame()", ret);
1750 static int check_recording_time(OutputStream *ost)
1752 OutputFile *of = output_files[ost->file_index];
1754 if (of->recording_time != INT64_MAX &&
1755 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1756 AV_TIME_BASE_Q) >= 0) {
1757 ost->is_past_recording_time = 1;
1763 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1766 AVCodecContext *enc = ost->st->codec;
1770 av_init_packet(&pkt);
1774 if (!check_recording_time(ost))
1777 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1778 frame->pts = ost->sync_opts;
1779 ost->sync_opts = frame->pts + frame->nb_samples;
1781 av_assert0(pkt.size || !pkt.data);
1782 update_benchmark(NULL);
1783 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1784 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1787 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1790 if (pkt.pts != AV_NOPTS_VALUE)
1791 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1792 if (pkt.dts != AV_NOPTS_VALUE)
1793 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1794 if (pkt.duration > 0)
1795 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1798 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1799 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1800 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1801 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1804 write_frame(s, &pkt, ost);
1806 audio_size += pkt.size;
1807 av_free_packet(&pkt);
1811 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1813 AVCodecContext *dec;
1814 AVPicture *picture2;
1815 AVPicture picture_tmp;
1818 dec = ist->st->codec;
1820 /* deinterlace : must be done before any resize */
1821 if (do_deinterlace) {
1824 /* create temporary picture */
1825 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1826 buf = av_malloc(size);
1830 picture2 = &picture_tmp;
1831 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1833 if (avpicture_deinterlace(picture2, picture,
1834 dec->pix_fmt, dec->width, dec->height) < 0) {
1835 /* if error, do not deinterlace */
1836 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1845 if (picture != picture2)
1846 *picture = *picture2;
1850 static void do_subtitle_out(AVFormatContext *s,
1856 static uint8_t *subtitle_out = NULL;
1857 int subtitle_out_max_size = 1024 * 1024;
1858 int subtitle_out_size, nb, i;
1859 AVCodecContext *enc;
1862 if (pts == AV_NOPTS_VALUE) {
1863 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1869 enc = ost->st->codec;
1871 if (!subtitle_out) {
1872 subtitle_out = av_malloc(subtitle_out_max_size);
1875 /* Note: DVB subtitle need one packet to draw them and one other
1876 packet to clear them */
1877 /* XXX: signal it in the codec context ? */
1878 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1883 for (i = 0; i < nb; i++) {
1884 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1886 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1887 // start_display_time is required to be 0
1888 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1889 sub->end_display_time -= sub->start_display_time;
1890 sub->start_display_time = 0;
1891 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1892 subtitle_out_max_size, sub);
1893 if (subtitle_out_size < 0) {
1894 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1898 av_init_packet(&pkt);
1899 pkt.data = subtitle_out;
1900 pkt.size = subtitle_out_size;
1901 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1902 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1903 /* XXX: the pts correction is handled here. Maybe handling
1904 it in the codec would be better */
1906 pkt.pts += 90 * sub->start_display_time;
1908 pkt.pts += 90 * sub->end_display_time;
1910 write_frame(s, &pkt, ost);
1914 static double psnr(double d)
1916 return -10.0 * log(d) / log(10.0);
1919 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1922 AVCodecContext *enc;
1924 double ti1, bitrate, avg_bitrate;
1926 /* this is executed just the first time do_video_stats is called */
1928 vstats_file = fopen(vstats_filename, "w");
1935 enc = ost->st->codec;
1936 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1937 frame_number = ost->frame_number;
1938 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1939 if (enc->flags&CODEC_FLAG_PSNR)
1940 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1942 fprintf(vstats_file,"f_size= %6d ", frame_size);
1943 /* compute pts value */
1944 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1948 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1949 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1950 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1951 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1952 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1957 static void do_video_out(AVFormatContext *s, OutputStream *ost,
1958 AVFrame *in_picture, float quality)
1960 int nb_frames, i, ret, format_video_sync;
1961 AVCodecContext *enc;
1962 double sync_ipts, delta;
1963 double duration = 0;
1965 InputStream *ist = NULL;
1967 if (ost->source_index >= 0)
1968 ist = input_streams[ost->source_index];
1970 enc = ost->st->codec;
1972 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1973 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1975 sync_ipts = get_sync_ipts(ost, in_picture->pts) / av_q2d(enc->time_base);
1976 delta = sync_ipts - ost->sync_opts + duration;
1978 /* by default, we output a single frame */
1981 format_video_sync = video_sync_method;
1982 if (format_video_sync == VSYNC_AUTO)
1983 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1985 switch (format_video_sync) {
1987 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1990 else if (delta > 1.1)
1991 nb_frames = lrintf(delta);
1996 else if (delta > 0.6)
1997 ost->sync_opts = lrint(sync_ipts);
2000 case VSYNC_PASSTHROUGH:
2001 ost->sync_opts = lrint(sync_ipts);
2007 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
2008 if (nb_frames == 0) {
2010 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
2012 } else if (nb_frames > 1) {
2013 nb_frames_dup += nb_frames - 1;
2014 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
2017 /* duplicates frame if needed */
2018 for (i = 0; i < nb_frames; i++) {
2020 av_init_packet(&pkt);
2024 if (s->oformat->flags & AVFMT_RAWPICTURE &&
2025 enc->codec->id == CODEC_ID_RAWVIDEO) {
2026 /* raw pictures are written as AVPicture structure to
2027 avoid any copies. We support temporarily the older
2029 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
2030 enc->coded_frame->top_field_first = in_picture->top_field_first;
2031 pkt.data = (uint8_t *)in_picture;
2032 pkt.size = sizeof(AVPicture);
2033 pkt.pts = av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
2034 pkt.flags |= AV_PKT_FLAG_KEY;
2036 write_frame(s, &pkt, ost);
2039 AVFrame big_picture;
2041 big_picture = *in_picture;
2042 /* better than nothing: use input picture interlaced
2044 big_picture.interlaced_frame = in_picture->interlaced_frame;
2045 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
2046 if (ost->top_field_first == -1)
2047 big_picture.top_field_first = in_picture->top_field_first;
2049 big_picture.top_field_first = !!ost->top_field_first;
2052 /* handles same_quant here. This is not correct because it may
2053 not be a global option */
2054 big_picture.quality = quality;
2055 if (!enc->me_threshold)
2056 big_picture.pict_type = 0;
2057 big_picture.pts = ost->sync_opts;
2058 if (ost->forced_kf_index < ost->forced_kf_count &&
2059 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
2060 big_picture.pict_type = AV_PICTURE_TYPE_I;
2061 ost->forced_kf_index++;
2063 update_benchmark(NULL);
2064 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
2065 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
2067 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
2072 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
2073 pkt.pts = ost->sync_opts;
2075 if (pkt.pts != AV_NOPTS_VALUE)
2076 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2077 if (pkt.dts != AV_NOPTS_VALUE)
2078 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2081 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
2082 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
2083 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
2084 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
2087 write_frame(s, &pkt, ost);
2088 frame_size = pkt.size;
2089 video_size += pkt.size;
2090 av_free_packet(&pkt);
2092 /* if two pass, output log */
2093 if (ost->logfile && enc->stats_out) {
2094 fprintf(ost->logfile, "%s", enc->stats_out);
2100 * For video, number of frames in == number of packets out.
2101 * But there may be reordering, so we can't throw away frames on encoder
2102 * flush, we need to limit them here, before they go into encoder.
2104 ost->frame_number++;
2106 if (vstats_filename && frame_size)
2107 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
2110 /* check for new output on any of the filtergraphs */
2111 static int poll_filters(void)
2113 AVFilterBufferRef *picref;
2114 AVFrame *filtered_frame = NULL;
2115 int i, ret, ret_all;
2116 unsigned nb_success, nb_eof;
2120 /* Reap all buffers present in the buffer sinks */
2121 for (i = 0; i < nb_output_streams; i++) {
2122 OutputStream *ost = output_streams[i];
2123 OutputFile *of = output_files[ost->file_index];
2126 if (!ost->filter || ost->is_past_recording_time)
2129 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
2130 return AVERROR(ENOMEM);
2132 avcodec_get_frame_defaults(ost->filtered_frame);
2133 filtered_frame = ost->filtered_frame;
2136 AVRational ist_pts_tb = ost->filter->filter->inputs[0]->time_base;
2137 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2138 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2139 ret = av_buffersink_read_samples(ost->filter->filter, &picref,
2140 ost->st->codec->frame_size);
2143 ret = av_buffersink_read(ost->filter->filter, &picref);
2145 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
2146 AV_BUFFERSINK_FLAG_NO_REQUEST);
2149 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
2151 av_strerror(ret, buf, sizeof(buf));
2152 av_log(NULL, AV_LOG_WARNING,
2153 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
2157 frame_pts = AV_NOPTS_VALUE;
2158 if (ost->enc->type == AVMEDIA_TYPE_VIDEO)
2159 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
2160 else if (picref->pts != AV_NOPTS_VALUE)
2161 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
2162 ost->filter->filter->inputs[0]->time_base,
2163 ost->st->codec->time_base) -
2164 av_rescale_q(of->start_time,
2166 ost->st->codec->time_base);
2167 //if (ost->source_index >= 0)
2168 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
2170 if (of->start_time && filtered_frame->pts < of->start_time) {
2171 avfilter_unref_buffer(picref);
2175 switch (ost->filter->filter->inputs[0]->type) {
2176 case AVMEDIA_TYPE_VIDEO:
2177 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
2178 filtered_frame->pts = frame_pts;
2179 if (!ost->frame_aspect_ratio)
2180 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
2182 do_video_out(of->ctx, ost, filtered_frame,
2183 same_quant ? ost->last_quality :
2184 ost->st->codec->global_quality);
2186 case AVMEDIA_TYPE_AUDIO:
2187 avfilter_copy_buf_props(filtered_frame, picref);
2188 filtered_frame->pts = frame_pts;
2189 do_audio_out(of->ctx, ost, filtered_frame);
2192 // TODO support subtitle filters
2196 avfilter_unref_buffer(picref);
2199 /* Request frames through all the graphs */
2200 ret_all = nb_success = nb_eof = 0;
2201 for (i = 0; i < nb_filtergraphs; i++) {
2202 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2205 } else if (ret == AVERROR_EOF) {
2207 } else if (ret != AVERROR(EAGAIN)) {
2209 av_strerror(ret, buf, sizeof(buf));
2210 av_log(NULL, AV_LOG_WARNING,
2211 "Error in request_frame(): %s\n", buf);
2217 /* Try again if anything succeeded */
2219 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2222 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2226 AVFormatContext *oc;
2228 AVCodecContext *enc;
2229 int frame_number, vid, i;
2231 int64_t pts = INT64_MAX;
2232 static int64_t last_time = -1;
2233 static int qp_histogram[52];
2234 int hours, mins, secs, us;
2236 if (!print_stats && !is_last_report)
2239 if (!is_last_report) {
2240 if (last_time == -1) {
2241 last_time = cur_time;
2244 if ((cur_time - last_time) < 500000)
2246 last_time = cur_time;
2250 oc = output_files[0]->ctx;
2252 total_size = avio_size(oc->pb);
2253 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2254 total_size = avio_tell(oc->pb);
2261 for (i = 0; i < nb_output_streams; i++) {
2263 ost = output_streams[i];
2264 enc = ost->st->codec;
2265 if (!ost->stream_copy && enc->coded_frame)
2266 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2267 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2268 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2270 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2271 float fps, t = (cur_time-timer_start) / 1000000.0;
2273 frame_number = ost->frame_number;
2274 fps = t > 1 ? frame_number / t : 0;
2275 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2276 frame_number, fps < 9.95, fps, q);
2278 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2282 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2284 for (j = 0; j < 32; j++)
2285 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2287 if (enc->flags&CODEC_FLAG_PSNR) {
2289 double error, error_sum = 0;
2290 double scale, scale_sum = 0;
2291 char type[3] = { 'Y','U','V' };
2292 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2293 for (j = 0; j < 3; j++) {
2294 if (is_last_report) {
2295 error = enc->error[j];
2296 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2298 error = enc->coded_frame->error[j];
2299 scale = enc->width * enc->height * 255.0 * 255.0;
2305 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
2307 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2311 /* compute min output value */
2312 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2313 ost->st->time_base, AV_TIME_BASE_Q));
2316 secs = pts / AV_TIME_BASE;
2317 us = pts % AV_TIME_BASE;
2323 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2325 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2326 "size=%8.0fkB time=", total_size / 1024.0);
2327 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2328 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2329 (100 * us) / AV_TIME_BASE);
2330 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2331 "bitrate=%6.1fkbits/s", bitrate);
2333 if (nb_frames_dup || nb_frames_drop)
2334 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2335 nb_frames_dup, nb_frames_drop);
2337 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2341 if (is_last_report) {
2342 int64_t raw= audio_size + video_size + extra_size;
2343 av_log(NULL, AV_LOG_INFO, "\n");
2344 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
2345 video_size / 1024.0,
2346 audio_size / 1024.0,
2347 extra_size / 1024.0,
2348 100.0 * (total_size - raw) / raw
2350 if(video_size + audio_size + extra_size == 0){
2351 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2356 static void flush_encoders(void)
2360 for (i = 0; i < nb_output_streams; i++) {
2361 OutputStream *ost = output_streams[i];
2362 AVCodecContext *enc = ost->st->codec;
2363 AVFormatContext *os = output_files[ost->file_index]->ctx;
2364 int stop_encoding = 0;
2366 if (!ost->encoding_needed)
2369 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2371 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2375 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2379 switch (ost->st->codec->codec_type) {
2380 case AVMEDIA_TYPE_AUDIO:
2381 encode = avcodec_encode_audio2;
2385 case AVMEDIA_TYPE_VIDEO:
2386 encode = avcodec_encode_video2;
2397 av_init_packet(&pkt);
2401 update_benchmark(NULL);
2402 ret = encode(enc, &pkt, NULL, &got_packet);
2403 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2405 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2409 if (ost->logfile && enc->stats_out) {
2410 fprintf(ost->logfile, "%s", enc->stats_out);
2416 if (pkt.pts != AV_NOPTS_VALUE)
2417 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2418 if (pkt.dts != AV_NOPTS_VALUE)
2419 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2420 write_frame(os, &pkt, ost);
2430 * Check whether a packet from ist should be written into ost at this time
2432 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2434 OutputFile *of = output_files[ost->file_index];
2435 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2437 if (ost->source_index != ist_index)
2440 if (of->start_time && ist->pts < of->start_time)
2443 if (of->recording_time != INT64_MAX &&
2444 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
2445 (AVRational){ 1, 1000000 }) >= 0) {
2446 ost->is_past_recording_time = 1;
2453 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2455 OutputFile *of = output_files[ost->file_index];
2456 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2460 av_init_packet(&opkt);
2462 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2463 !ost->copy_initial_nonkeyframes)
2466 /* force the input stream PTS */
2467 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2468 audio_size += pkt->size;
2469 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2470 video_size += pkt->size;
2474 if (pkt->pts != AV_NOPTS_VALUE)
2475 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2477 opkt.pts = AV_NOPTS_VALUE;
2479 if (pkt->dts == AV_NOPTS_VALUE)
2480 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2482 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2483 opkt.dts -= ost_tb_start_time;
2485 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2486 opkt.flags = pkt->flags;
2488 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2489 if ( ost->st->codec->codec_id != CODEC_ID_H264
2490 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2491 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2492 && ost->st->codec->codec_id != CODEC_ID_VC1
2494 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2495 opkt.destruct = av_destruct_packet;
2497 opkt.data = pkt->data;
2498 opkt.size = pkt->size;
2500 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2501 /* store AVPicture in AVPacket, as expected by the output format */
2502 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2503 opkt.data = (uint8_t *)&pict;
2504 opkt.size = sizeof(AVPicture);
2505 opkt.flags |= AV_PKT_FLAG_KEY;
2508 write_frame(of->ctx, &opkt, ost);
2509 ost->st->codec->frame_number++;
2510 av_free_packet(&opkt);
2513 static void rate_emu_sleep(InputStream *ist)
2515 if (input_files[ist->file_index]->rate_emu) {
2516 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2517 int64_t now = av_gettime() - ist->start;
2523 static int guess_input_channel_layout(InputStream *ist)
2525 AVCodecContext *dec = ist->st->codec;
2527 if (!dec->channel_layout) {
2528 char layout_name[256];
2530 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2531 if (!dec->channel_layout)
2533 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2534 dec->channels, dec->channel_layout);
2535 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2536 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2541 static int transcode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2543 AVFrame *decoded_frame;
2544 AVCodecContext *avctx = ist->st->codec;
2545 int i, ret, resample_changed;
2547 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2548 return AVERROR(ENOMEM);
2550 avcodec_get_frame_defaults(ist->decoded_frame);
2551 decoded_frame = ist->decoded_frame;
2553 update_benchmark(NULL);
2554 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2555 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2559 if (avctx->sample_rate <= 0) {
2560 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2561 return AVERROR_INVALIDDATA;
2565 /* no audio frame */
2567 for (i = 0; i < ist->nb_filters; i++)
2568 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2569 AV_BUFFERSRC_FLAG_NO_COPY);
2573 /* if the decoder provides a pts, use it instead of the last packet pts.
2574 the decoder could be delaying output by a packet or more. */
2575 if (decoded_frame->pts != AV_NOPTS_VALUE)
2576 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2577 else if (pkt->pts != AV_NOPTS_VALUE) {
2578 decoded_frame->pts = pkt->pts;
2579 pkt->pts = AV_NOPTS_VALUE;
2581 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2585 /* increment next_dts to use for the case where the input stream does not
2586 have timestamps or there are multiple frames in the packet */
2587 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2589 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2593 rate_emu_sleep(ist);
2595 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2596 ist->resample_channels != avctx->channels ||
2597 ist->resample_channel_layout != decoded_frame->channel_layout ||
2598 ist->resample_sample_rate != decoded_frame->sample_rate;
2599 if (resample_changed) {
2600 char layout1[64], layout2[64];
2602 if (!guess_input_channel_layout(ist)) {
2603 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2604 "layout for Input Stream #%d.%d\n", ist->file_index,
2608 decoded_frame->channel_layout = avctx->channel_layout;
2610 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2611 ist->resample_channel_layout);
2612 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2613 decoded_frame->channel_layout);
2615 av_log(NULL, AV_LOG_INFO,
2616 "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",
2617 ist->file_index, ist->st->index,
2618 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2619 ist->resample_channels, layout1,
2620 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2621 avctx->channels, layout2);
2623 ist->resample_sample_fmt = decoded_frame->format;
2624 ist->resample_sample_rate = decoded_frame->sample_rate;
2625 ist->resample_channel_layout = decoded_frame->channel_layout;
2626 ist->resample_channels = avctx->channels;
2628 for (i = 0; i < nb_filtergraphs; i++)
2629 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2630 configure_filtergraph(filtergraphs[i]) < 0) {
2631 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2636 for (i = 0; i < ist->nb_filters; i++)
2637 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2642 static int transcode_video(InputStream *ist, AVPacket *pkt, int *got_output, int64_t *pkt_pts)
2644 AVFrame *decoded_frame;
2645 void *buffer_to_free = NULL;
2646 int i, ret = 0, resample_changed;
2647 int64_t best_effort_timestamp;
2648 AVRational *frame_sample_aspect;
2651 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2652 return AVERROR(ENOMEM);
2654 avcodec_get_frame_defaults(ist->decoded_frame);
2655 decoded_frame = ist->decoded_frame;
2656 pkt->pts = *pkt_pts;
2657 pkt->dts = ist->dts;
2658 *pkt_pts = AV_NOPTS_VALUE;
2660 update_benchmark(NULL);
2661 ret = avcodec_decode_video2(ist->st->codec,
2662 decoded_frame, got_output, pkt);
2663 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2667 quality = same_quant ? decoded_frame->quality : 0;
2669 /* no picture yet */
2671 for (i = 0; i < ist->nb_filters; i++)
2672 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2676 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2677 if(best_effort_timestamp != AV_NOPTS_VALUE)
2678 ist->next_pts = ist->pts = decoded_frame->pts = best_effort_timestamp;
2681 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2683 rate_emu_sleep(ist);
2685 if (ist->st->sample_aspect_ratio.num)
2686 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2688 resample_changed = ist->resample_width != decoded_frame->width ||
2689 ist->resample_height != decoded_frame->height ||
2690 ist->resample_pix_fmt != decoded_frame->format;
2691 if (resample_changed) {
2692 av_log(NULL, AV_LOG_INFO,
2693 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2694 ist->file_index, ist->st->index,
2695 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2696 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2698 ist->resample_width = decoded_frame->width;
2699 ist->resample_height = decoded_frame->height;
2700 ist->resample_pix_fmt = decoded_frame->format;
2702 for (i = 0; i < nb_filtergraphs; i++)
2703 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2704 configure_filtergraph(filtergraphs[i]) < 0) {
2705 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2710 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2711 for (i = 0; i < ist->nb_filters; i++) {
2712 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2713 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2714 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2715 // XXX what an ugly hack
2716 if (ist->filters[i]->graph->nb_outputs == 1)
2717 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2719 if (!frame_sample_aspect->num)
2720 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2721 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2722 FrameBuffer *buf = decoded_frame->opaque;
2723 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2724 decoded_frame->data, decoded_frame->linesize,
2725 AV_PERM_READ | AV_PERM_PRESERVE,
2726 ist->st->codec->width, ist->st->codec->height,
2727 ist->st->codec->pix_fmt);
2729 avfilter_copy_frame_props(fb, decoded_frame);
2730 fb->buf->priv = buf;
2731 fb->buf->free = filter_release_buffer;
2733 av_assert0(buf->refcount>0);
2735 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2736 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2737 AV_BUFFERSRC_FLAG_NO_COPY);
2739 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2740 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2746 av_free(buffer_to_free);
2750 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2752 AVSubtitle subtitle;
2753 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2754 &subtitle, got_output, pkt);
2760 rate_emu_sleep(ist);
2762 for (i = 0; i < nb_output_streams; i++) {
2763 OutputStream *ost = output_streams[i];
2765 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2768 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2771 avsubtitle_free(&subtitle);
2775 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2776 static int output_packet(InputStream *ist, const AVPacket *pkt)
2780 int64_t pkt_pts = AV_NOPTS_VALUE;
2783 if (!ist->saw_first_ts) {
2784 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;
2786 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2787 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2788 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2790 ist->saw_first_ts = 1;
2793 if (ist->next_dts == AV_NOPTS_VALUE)
2794 ist->next_dts = ist->dts;
2795 if (ist->next_pts == AV_NOPTS_VALUE)
2796 ist->next_pts = ist->pts;
2800 av_init_packet(&avpkt);
2808 if (pkt->dts != AV_NOPTS_VALUE) {
2809 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2810 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2811 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2813 if(pkt->pts != AV_NOPTS_VALUE)
2814 pkt_pts = av_rescale_q(pkt->pts, 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, &pkt_pts);
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;
3157 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3158 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3160 fg = init_simple_filtergraph(ist, ost);
3161 if (configure_simple_filtergraph(fg)) {
3162 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3167 switch (codec->codec_type) {
3168 case AVMEDIA_TYPE_AUDIO:
3169 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3170 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3171 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3172 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3173 codec->time_base = (AVRational){ 1, codec->sample_rate };
3175 case AVMEDIA_TYPE_VIDEO:
3176 if (ist && !ost->frame_rate.num)
3177 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3178 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3179 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3180 ost->frame_rate = ost->enc->supported_framerates[idx];
3182 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3183 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3184 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3185 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3186 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3188 for (j = 0; j < ost->forced_kf_count; j++)
3189 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3193 codec->width = ost->filter->filter->inputs[0]->w;
3194 codec->height = ost->filter->filter->inputs[0]->h;
3195 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3196 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3197 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3198 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3199 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3201 if (codec->width != icodec->width ||
3202 codec->height != icodec->height ||
3203 codec->pix_fmt != icodec->pix_fmt) {
3204 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3208 case AVMEDIA_TYPE_SUBTITLE:
3209 codec->time_base = (AVRational){1, 1000};
3216 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3217 char logfilename[1024];
3220 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3221 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3223 if (!strcmp(ost->enc->name, "libx264")) {
3224 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3226 if (codec->flags & CODEC_FLAG_PASS2) {
3228 size_t logbuffer_size;
3229 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3230 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3234 codec->stats_in = logbuffer;
3236 if (codec->flags & CODEC_FLAG_PASS1) {
3237 f = fopen(logfilename, "wb");
3239 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3240 logfilename, strerror(errno));
3250 /* open each encoder */
3251 for (i = 0; i < nb_output_streams; i++) {
3252 ost = output_streams[i];
3253 if (ost->encoding_needed) {
3254 AVCodec *codec = ost->enc;
3255 AVCodecContext *dec = NULL;
3257 if ((ist = get_input_stream(ost)))
3258 dec = ist->st->codec;
3259 if (dec && dec->subtitle_header) {
3260 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3261 if (!ost->st->codec->subtitle_header) {
3262 ret = AVERROR(ENOMEM);
3265 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3266 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3268 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3269 av_dict_set(&ost->opts, "threads", "auto", 0);
3270 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3271 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3272 ost->file_index, ost->index);
3273 ret = AVERROR(EINVAL);
3276 assert_codec_experimental(ost->st->codec, 1);
3277 assert_avoptions(ost->opts);
3278 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3279 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3280 " It takes bits/s as argument, not kbits/s\n");
3281 extra_size += ost->st->codec->extradata_size;
3283 if (ost->st->codec->me_threshold)
3284 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3288 /* init input streams */
3289 for (i = 0; i < nb_input_streams; i++)
3290 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3293 /* discard unused programs */
3294 for (i = 0; i < nb_input_files; i++) {
3295 InputFile *ifile = input_files[i];
3296 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3297 AVProgram *p = ifile->ctx->programs[j];
3298 int discard = AVDISCARD_ALL;
3300 for (k = 0; k < p->nb_stream_indexes; k++)
3301 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3302 discard = AVDISCARD_DEFAULT;
3305 p->discard = discard;
3309 /* open files and write file headers */
3310 for (i = 0; i < nb_output_files; i++) {
3311 oc = output_files[i]->ctx;
3312 oc->interrupt_callback = int_cb;
3313 if (avformat_write_header(oc, &output_files[i]->opts) < 0) {
3314 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
3315 ret = AVERROR(EINVAL);
3318 // assert_avoptions(output_files[i]->opts);
3319 if (strcmp(oc->oformat->name, "rtp")) {
3325 /* dump the file output parameters - cannot be done before in case
3327 for (i = 0; i < nb_output_files; i++) {
3328 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3331 /* dump the stream mapping */
3332 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3333 for (i = 0; i < nb_input_streams; i++) {
3334 ist = input_streams[i];
3336 for (j = 0; j < ist->nb_filters; j++) {
3337 AVFilterLink *link = ist->filters[j]->filter->outputs[0];
3338 if (ist->filters[j]->graph->graph_desc) {
3339 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3340 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3341 link->dst->filter->name);
3342 if (link->dst->input_count > 1)
3343 av_log(NULL, AV_LOG_INFO, ":%s", link->dstpad->name);
3344 if (nb_filtergraphs > 1)
3345 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3346 av_log(NULL, AV_LOG_INFO, "\n");
3351 for (i = 0; i < nb_output_streams; i++) {
3352 ost = output_streams[i];
3354 if (ost->attachment_filename) {
3355 /* an attached file */
3356 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3357 ost->attachment_filename, ost->file_index, ost->index);
3361 if (ost->filter && ost->filter->graph->graph_desc) {
3362 /* output from a complex graph */
3363 AVFilterLink *link = ost->filter->filter->inputs[0];
3364 av_log(NULL, AV_LOG_INFO, " %s", link->src->filter->name);
3365 if (link->src->output_count > 1)
3366 av_log(NULL, AV_LOG_INFO, ":%s", link->srcpad->name);
3367 if (nb_filtergraphs > 1)
3368 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3370 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3371 ost->index, ost->enc ? ost->enc->name : "?");
3375 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3376 input_streams[ost->source_index]->file_index,
3377 input_streams[ost->source_index]->st->index,
3380 if (ost->sync_ist != input_streams[ost->source_index])
3381 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3382 ost->sync_ist->file_index,
3383 ost->sync_ist->st->index);
3384 if (ost->stream_copy)
3385 av_log(NULL, AV_LOG_INFO, " (copy)");
3387 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3388 input_streams[ost->source_index]->dec->name : "?",
3389 ost->enc ? ost->enc->name : "?");
3390 av_log(NULL, AV_LOG_INFO, "\n");
3394 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3406 * The following code is the main loop of the file converter
3408 static int transcode(void)
3411 AVFormatContext *is, *os;
3415 int no_packet_count = 0;
3416 int64_t timer_start;
3419 if (!(no_packet = av_mallocz(nb_input_files)))
3422 ret = transcode_init();
3427 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3430 timer_start = av_gettime();
3432 for (; received_sigterm == 0;) {
3433 int file_index, ist_index, past_recording_time = 1;
3436 int64_t cur_time= av_gettime();
3438 ipts_min = INT64_MAX;
3439 /* if 'q' pressed, exits */
3441 static int64_t last_time;
3442 if (received_nb_signals)
3444 /* read_key() returns 0 on EOF */
3445 if(cur_time - last_time >= 100000 && !run_as_daemon){
3447 last_time = cur_time;
3452 if (key == '+') av_log_set_level(av_log_get_level()+10);
3453 if (key == '-') av_log_set_level(av_log_get_level()-10);
3454 if (key == 's') qp_hist ^= 1;
3457 do_hex_dump = do_pkt_dump = 0;
3458 } else if(do_pkt_dump){
3462 av_log_set_level(AV_LOG_DEBUG);
3464 if (key == 'c' || key == 'C'){
3465 char buf[4096], target[64], command[256], arg[256] = {0};
3468 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3470 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3475 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3476 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3477 target, time, command, arg);
3478 for (i = 0; i < nb_filtergraphs; i++) {
3479 FilterGraph *fg = filtergraphs[i];
3482 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3483 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3484 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3486 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3491 av_log(NULL, AV_LOG_ERROR,
3492 "Parse error, at least 3 arguments were expected, "
3493 "only %d given in string '%s'\n", n, buf);
3496 if (key == 'd' || key == 'D'){
3499 debug = input_streams[0]->st->codec->debug<<1;
3500 if(!debug) debug = 1;
3501 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3504 if(scanf("%d", &debug)!=1)
3505 fprintf(stderr,"error parsing debug value\n");
3506 for(i=0;i<nb_input_streams;i++) {
3507 input_streams[i]->st->codec->debug = debug;
3509 for(i=0;i<nb_output_streams;i++) {
3510 ost = output_streams[i];
3511 ost->st->codec->debug = debug;
3513 if(debug) av_log_set_level(AV_LOG_DEBUG);
3514 fprintf(stderr,"debug=%d\n", debug);
3517 fprintf(stderr, "key function\n"
3518 "? show this help\n"
3519 "+ increase verbosity\n"
3520 "- decrease verbosity\n"
3521 "c Send command to filtergraph\n"
3522 "D cycle through available debug modes\n"
3523 "h dump packets/hex press to cycle through the 3 states\n"
3525 "s Show QP histogram\n"
3530 /* check if there's any stream where output is still needed */
3531 for (i = 0; i < nb_output_streams; i++) {
3533 ost = output_streams[i];
3534 of = output_files[ost->file_index];
3535 os = output_files[ost->file_index]->ctx;
3536 if (ost->is_past_recording_time ||
3537 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3539 if (ost->frame_number >= ost->max_frames) {
3541 for (j = 0; j < of->ctx->nb_streams; j++)
3542 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3545 past_recording_time = 0;
3547 if (past_recording_time)
3550 /* select the stream that we must read now by looking at the
3551 smallest output pts */
3553 for (i = 0; i < nb_input_streams; i++) {
3555 ist = input_streams[i];
3557 if (ist->discard || no_packet[ist->file_index])
3559 if (!input_files[ist->file_index]->eof_reached) {
3560 if (ipts < ipts_min) {
3562 file_index = ist->file_index;
3566 /* if none, if is finished */
3567 if (file_index < 0) {
3568 if (no_packet_count) {
3569 no_packet_count = 0;
3570 memset(no_packet, 0, nb_input_files);
3577 /* read a frame from it and output it in the fifo */
3578 is = input_files[file_index]->ctx;
3579 ret = av_read_frame(is, &pkt);
3580 if (ret == AVERROR(EAGAIN)) {
3581 no_packet[file_index] = 1;
3586 input_files[file_index]->eof_reached = 1;
3588 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3589 ist = input_streams[input_files[file_index]->ist_index + i];
3590 if (ist->decoding_needed)
3591 output_packet(ist, NULL);
3600 no_packet_count = 0;
3601 memset(no_packet, 0, nb_input_files);
3604 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3605 is->streams[pkt.stream_index]);
3607 /* the following test is needed in case new streams appear
3608 dynamically in stream : we ignore them */
3609 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3610 goto discard_packet;
3611 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3612 ist = input_streams[ist_index];
3614 goto discard_packet;
3616 if (pkt.dts != AV_NOPTS_VALUE)
3617 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3618 if (pkt.pts != AV_NOPTS_VALUE)
3619 pkt.pts += 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 *= ist->ts_scale;
3623 if (pkt.dts != AV_NOPTS_VALUE)
3624 pkt.dts *= ist->ts_scale;
3627 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3628 "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",
3629 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3630 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3631 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3632 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3633 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3634 input_files[ist->file_index]->ts_offset);
3637 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3638 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3639 int64_t delta = pkt_dts - ist->next_dts;
3640 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3641 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3642 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3643 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3644 pkt_dts+1<ist->pts){
3645 input_files[ist->file_index]->ts_offset -= delta;
3646 av_log(NULL, AV_LOG_DEBUG,
3647 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3648 delta, input_files[ist->file_index]->ts_offset);
3649 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3650 if (pkt.pts != AV_NOPTS_VALUE)
3651 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3654 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3655 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3656 pkt_dts+1<ist->pts){
3657 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3658 pkt.dts = AV_NOPTS_VALUE;
3660 if (pkt.pts != AV_NOPTS_VALUE){
3661 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3662 delta = pkt_pts - ist->next_dts;
3663 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3664 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3665 pkt_pts+1<ist->pts) {
3666 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3667 pkt.pts = AV_NOPTS_VALUE;
3673 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3674 if (output_packet(ist, &pkt) < 0 ||
3675 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3676 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
3677 ist->file_index, ist->st->index);
3680 av_free_packet(&pkt);
3685 av_free_packet(&pkt);
3687 /* dump report by using the output first video and audio streams */
3688 print_report(0, timer_start, cur_time);
3691 /* at the end of stream, we must flush the decoder buffers */
3692 for (i = 0; i < nb_input_streams; i++) {
3693 ist = input_streams[i];
3694 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3695 output_packet(ist, NULL);
3703 /* write the trailer if needed and close file */
3704 for (i = 0; i < nb_output_files; i++) {
3705 os = output_files[i]->ctx;
3706 av_write_trailer(os);
3709 /* dump report by using the first video and audio streams */
3710 print_report(1, timer_start, av_gettime());
3712 /* close each encoder */
3713 for (i = 0; i < nb_output_streams; i++) {
3714 ost = output_streams[i];
3715 if (ost->encoding_needed) {
3716 av_freep(&ost->st->codec->stats_in);
3717 avcodec_close(ost->st->codec);
3721 /* close each decoder */
3722 for (i = 0; i < nb_input_streams; i++) {
3723 ist = input_streams[i];
3724 if (ist->decoding_needed) {
3725 avcodec_close(ist->st->codec);
3733 av_freep(&no_packet);
3735 if (output_streams) {
3736 for (i = 0; i < nb_output_streams; i++) {
3737 ost = output_streams[i];
3739 if (ost->stream_copy)
3740 av_freep(&ost->st->codec->extradata);
3742 fclose(ost->logfile);
3743 ost->logfile = NULL;
3745 av_freep(&ost->st->codec->subtitle_header);
3746 av_free(ost->forced_kf_pts);
3747 av_dict_free(&ost->opts);
3754 static int opt_frame_crop(const char *opt, const char *arg)
3756 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3757 return AVERROR(EINVAL);
3760 static int opt_pad(const char *opt, const char *arg)
3762 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3766 static int opt_video_channel(const char *opt, const char *arg)
3768 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3769 return opt_default("channel", arg);
3772 static int opt_video_standard(const char *opt, const char *arg)
3774 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3775 return opt_default("standard", arg);
3778 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3780 audio_codec_name = arg;
3781 return parse_option(o, "codec:a", arg, options);
3784 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3786 video_codec_name = arg;
3787 return parse_option(o, "codec:v", arg, options);
3790 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3792 subtitle_codec_name = arg;
3793 return parse_option(o, "codec:s", arg, options);
3796 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3798 return parse_option(o, "codec:d", arg, options);
3801 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3803 StreamMap *m = NULL;
3804 int i, negative = 0, file_idx;
3805 int sync_file_idx = -1, sync_stream_idx = 0;
3813 map = av_strdup(arg);
3815 /* parse sync stream first, just pick first matching stream */
3816 if (sync = strchr(map, ',')) {
3818 sync_file_idx = strtol(sync + 1, &sync, 0);
3819 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3820 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3825 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3826 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3827 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3828 sync_stream_idx = i;
3831 if (i == input_files[sync_file_idx]->nb_streams) {
3832 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3833 "match any streams.\n", arg);
3839 if (map[0] == '[') {
3840 /* this mapping refers to lavfi output */
3841 const char *c = map + 1;
3842 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3843 &o->nb_stream_maps, o->nb_stream_maps + 1);
3844 m = &o->stream_maps[o->nb_stream_maps - 1];
3845 m->linklabel = av_get_token(&c, "]");
3846 if (!m->linklabel) {
3847 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3851 file_idx = strtol(map, &p, 0);
3852 if (file_idx >= nb_input_files || file_idx < 0) {
3853 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3857 /* disable some already defined maps */
3858 for (i = 0; i < o->nb_stream_maps; i++) {
3859 m = &o->stream_maps[i];
3860 if (file_idx == m->file_index &&
3861 check_stream_specifier(input_files[m->file_index]->ctx,
3862 input_files[m->file_index]->ctx->streams[m->stream_index],
3863 *p == ':' ? p + 1 : p) > 0)
3867 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3868 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3869 *p == ':' ? p + 1 : p) <= 0)
3871 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3872 &o->nb_stream_maps, o->nb_stream_maps + 1);
3873 m = &o->stream_maps[o->nb_stream_maps - 1];
3875 m->file_index = file_idx;
3876 m->stream_index = i;
3878 if (sync_file_idx >= 0) {
3879 m->sync_file_index = sync_file_idx;
3880 m->sync_stream_index = sync_stream_idx;
3882 m->sync_file_index = file_idx;
3883 m->sync_stream_index = i;
3889 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3897 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3899 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3900 &o->nb_attachments, o->nb_attachments + 1);
3901 o->attachments[o->nb_attachments - 1] = arg;
3905 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3911 o->audio_channel_maps =
3912 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3913 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3914 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3916 /* muted channel syntax */
3917 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3918 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3919 m->file_idx = m->stream_idx = -1;
3921 m->ofile_idx = m->ostream_idx = -1;
3926 n = sscanf(arg, "%d.%d.%d:%d.%d",
3927 &m->file_idx, &m->stream_idx, &m->channel_idx,
3928 &m->ofile_idx, &m->ostream_idx);
3930 if (n != 3 && n != 5) {
3931 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3932 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3936 if (n != 5) // only file.stream.channel specified
3937 m->ofile_idx = m->ostream_idx = -1;
3940 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3941 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3945 if (m->stream_idx < 0 ||
3946 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
3947 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3948 m->file_idx, m->stream_idx);
3951 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
3952 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3953 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3954 m->file_idx, m->stream_idx);
3957 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3958 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3959 m->file_idx, m->stream_idx, m->channel_idx);
3966 * Parse a metadata specifier in arg.
3967 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3968 * @param index for type c/p, chapter/program index is written here
3969 * @param stream_spec for type s, the stream specifier is written here
3971 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3979 if (*(++arg) && *arg != ':') {
3980 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3983 *stream_spec = *arg == ':' ? arg + 1 : "";
3987 if (*(++arg) == ':')
3988 *index = strtol(++arg, NULL, 0);
3991 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3998 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4000 AVDictionary **meta_in = NULL;
4001 AVDictionary **meta_out = NULL;
4003 char type_in, type_out;
4004 const char *istream_spec = NULL, *ostream_spec = NULL;
4005 int idx_in = 0, idx_out = 0;
4007 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4008 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4011 if (type_out == 'g' || !*outspec)
4012 o->metadata_global_manual = 1;
4013 if (type_out == 's' || !*outspec)
4014 o->metadata_streams_manual = 1;
4015 if (type_out == 'c' || !*outspec)
4016 o->metadata_chapters_manual = 1;
4020 if (type_in == 'g' || type_out == 'g')
4021 o->metadata_global_manual = 1;
4022 if (type_in == 's' || type_out == 's')
4023 o->metadata_streams_manual = 1;
4024 if (type_in == 'c' || type_out == 'c')
4025 o->metadata_chapters_manual = 1;
4027 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4028 if ((index) < 0 || (index) >= (nb_elems)) {\
4029 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4034 #define SET_DICT(type, meta, context, index)\
4037 meta = &context->metadata;\
4040 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4041 meta = &context->chapters[index]->metadata;\
4044 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4045 meta = &context->programs[index]->metadata;\
4049 SET_DICT(type_in, meta_in, ic, idx_in);
4050 SET_DICT(type_out, meta_out, oc, idx_out);
4052 /* for input streams choose first matching stream */
4053 if (type_in == 's') {
4054 for (i = 0; i < ic->nb_streams; i++) {
4055 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4056 meta_in = &ic->streams[i]->metadata;
4062 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4067 if (type_out == 's') {
4068 for (i = 0; i < oc->nb_streams; i++) {
4069 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4070 meta_out = &oc->streams[i]->metadata;
4071 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4076 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4081 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4084 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4085 struct tm time = *gmtime((time_t*)&recording_timestamp);
4086 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4087 parse_option(o, "metadata", buf, options);
4089 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4090 "tag instead.\n", opt);
4094 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4096 const char *codec_string = encoder ? "encoder" : "decoder";
4100 avcodec_find_encoder_by_name(name) :
4101 avcodec_find_decoder_by_name(name);
4103 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4106 if (codec->type != type) {
4107 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4113 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4115 char *codec_name = NULL;
4117 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4119 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4120 st->codec->codec_id = codec->id;
4123 return avcodec_find_decoder(st->codec->codec_id);
4127 * Add all the streams from the given input file to the global
4128 * list of input streams.
4130 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4133 char *next, *codec_tag = NULL;
4135 for (i = 0; i < ic->nb_streams; i++) {
4136 AVStream *st = ic->streams[i];
4137 AVCodecContext *dec = st->codec;
4138 InputStream *ist = av_mallocz(sizeof(*ist));
4143 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4144 input_streams[nb_input_streams - 1] = ist;
4147 ist->file_index = nb_input_files;
4149 st->discard = AVDISCARD_ALL;
4150 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
4152 ist->ts_scale = 1.0;
4153 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4155 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4157 uint32_t tag = strtol(codec_tag, &next, 0);
4159 tag = AV_RL32(codec_tag);
4160 st->codec->codec_tag = tag;
4163 ist->dec = choose_decoder(o, ic, st);
4165 switch (dec->codec_type) {
4166 case AVMEDIA_TYPE_VIDEO:
4168 ist->dec = avcodec_find_decoder(dec->codec_id);
4170 dec->flags |= CODEC_FLAG_EMU_EDGE;
4173 ist->resample_height = dec->height;
4174 ist->resample_width = dec->width;
4175 ist->resample_pix_fmt = dec->pix_fmt;
4178 case AVMEDIA_TYPE_AUDIO:
4179 guess_input_channel_layout(ist);
4181 ist->resample_sample_fmt = dec->sample_fmt;
4182 ist->resample_sample_rate = dec->sample_rate;
4183 ist->resample_channels = dec->channels;
4184 ist->resample_channel_layout = dec->channel_layout;
4187 case AVMEDIA_TYPE_DATA:
4188 case AVMEDIA_TYPE_SUBTITLE:
4190 ist->dec = avcodec_find_decoder(dec->codec_id);
4192 case AVMEDIA_TYPE_ATTACHMENT:
4193 case AVMEDIA_TYPE_UNKNOWN:
4201 static void assert_file_overwrite(const char *filename)
4203 if ((!file_overwrite || no_file_overwrite) &&
4204 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4205 av_strstart(filename, "file:", NULL))) {
4206 if (avio_check(filename, 0) == 0) {
4207 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
4208 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4211 signal(SIGINT, SIG_DFL);
4212 if (!read_yesno()) {
4213 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4219 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4226 static void dump_attachment(AVStream *st, const char *filename)
4229 AVIOContext *out = NULL;
4230 AVDictionaryEntry *e;
4232 if (!st->codec->extradata_size) {
4233 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4234 nb_input_files - 1, st->index);
4237 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4238 filename = e->value;
4240 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4241 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4245 assert_file_overwrite(filename);
4247 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4248 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4253 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4258 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4260 AVFormatContext *ic;
4261 AVInputFormat *file_iformat = NULL;
4265 AVDictionary **opts;
4266 int orig_nb_streams; // number of streams before avformat_find_stream_info
4269 if (!(file_iformat = av_find_input_format(o->format))) {
4270 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4275 if (!strcmp(filename, "-"))
4278 using_stdin |= !strncmp(filename, "pipe:", 5) ||
4279 !strcmp(filename, "/dev/stdin");
4281 /* get default parameters from command line */
4282 ic = avformat_alloc_context();
4284 print_error(filename, AVERROR(ENOMEM));
4287 if (o->nb_audio_sample_rate) {
4288 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4289 av_dict_set(&format_opts, "sample_rate", buf, 0);
4291 if (o->nb_audio_channels) {
4292 /* because we set audio_channels based on both the "ac" and
4293 * "channel_layout" options, we need to check that the specified
4294 * demuxer actually has the "channels" option before setting it */
4295 if (file_iformat && file_iformat->priv_class &&
4296 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4297 AV_OPT_SEARCH_FAKE_OBJ)) {
4298 snprintf(buf, sizeof(buf), "%d",
4299 o->audio_channels[o->nb_audio_channels - 1].u.i);
4300 av_dict_set(&format_opts, "channels", buf, 0);
4303 if (o->nb_frame_rates) {
4304 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4306 if (o->nb_frame_sizes) {
4307 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4309 if (o->nb_frame_pix_fmts)
4310 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4312 ic->video_codec_id = video_codec_name ?
4313 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4314 ic->audio_codec_id = audio_codec_name ?
4315 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4316 ic->subtitle_codec_id= subtitle_codec_name ?
4317 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4318 ic->flags |= AVFMT_FLAG_NONBLOCK;
4319 ic->interrupt_callback = int_cb;
4321 /* open the input file with generic avformat function */
4322 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4324 print_error(filename, err);
4327 assert_avoptions(format_opts);
4329 /* apply forced codec ids */
4330 for (i = 0; i < ic->nb_streams; i++)
4331 choose_decoder(o, ic, ic->streams[i]);
4333 /* Set AVCodecContext options for avformat_find_stream_info */
4334 opts = setup_find_stream_info_opts(ic, codec_opts);
4335 orig_nb_streams = ic->nb_streams;
4337 /* If not enough info to get the stream parameters, we decode the
4338 first frames to get it. (used in mpeg case for example) */
4339 ret = avformat_find_stream_info(ic, opts);
4341 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4342 avformat_close_input(&ic);
4346 timestamp = o->start_time;
4347 /* add the stream start time */
4348 if (ic->start_time != AV_NOPTS_VALUE)
4349 timestamp += ic->start_time;
4351 /* if seeking requested, we execute it */
4352 if (o->start_time != 0) {
4353 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4355 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4356 filename, (double)timestamp / AV_TIME_BASE);
4360 /* update the current parameters so that they match the one of the input stream */
4361 add_input_streams(o, ic);
4363 /* dump the file content */
4364 av_dump_format(ic, nb_input_files, filename, 0);
4366 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4367 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4370 input_files[nb_input_files - 1]->ctx = ic;
4371 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4372 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4373 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4374 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4376 for (i = 0; i < o->nb_dump_attachment; i++) {
4379 for (j = 0; j < ic->nb_streams; j++) {
4380 AVStream *st = ic->streams[j];
4382 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4383 dump_attachment(st, o->dump_attachment[i].u.str);
4387 for (i = 0; i < orig_nb_streams; i++)
4388 av_dict_free(&opts[i]);
4391 reset_options(o, 1);
4395 static void parse_forced_key_frames(char *kf, OutputStream *ost)
4400 for (p = kf; *p; p++)
4403 ost->forced_kf_count = n;
4404 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
4405 if (!ost->forced_kf_pts) {
4406 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
4410 for (i = 0; i < n; i++) {
4411 char *next = strchr(p, ',');
4412 if (next) *next++ = 0;
4413 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
4418 static uint8_t *get_line(AVIOContext *s)
4424 if (avio_open_dyn_buf(&line) < 0) {
4425 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4429 while ((c = avio_r8(s)) && c != '\n')
4432 avio_close_dyn_buf(line, &buf);
4437 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4440 char filename[1000];
4441 const char *base[3] = { getenv("AVCONV_DATADIR"),
4446 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4450 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4451 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4452 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4455 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4456 i != 1 ? "" : "/.avconv", preset_name);
4457 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4463 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4465 char *codec_name = NULL;
4467 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4469 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4470 NULL, ost->st->codec->codec_type);
4471 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4472 } else if (!strcmp(codec_name, "copy"))
4473 ost->stream_copy = 1;
4475 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4476 ost->st->codec->codec_id = ost->enc->id;
4480 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4483 AVStream *st = avformat_new_stream(oc, NULL);
4484 int idx = oc->nb_streams - 1, ret = 0;
4485 char *bsf = NULL, *next, *codec_tag = NULL;
4486 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4488 char *buf = NULL, *arg = NULL, *preset = NULL;
4489 AVIOContext *s = NULL;
4492 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4496 if (oc->nb_streams - 1 < o->nb_streamid_map)
4497 st->id = o->streamid_map[oc->nb_streams - 1];
4499 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4500 nb_output_streams + 1);
4501 if (!(ost = av_mallocz(sizeof(*ost))))
4503 output_streams[nb_output_streams - 1] = ost;
4505 ost->file_index = nb_output_files;
4508 st->codec->codec_type = type;
4509 choose_encoder(o, oc, ost);
4511 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
4514 avcodec_get_context_defaults3(st->codec, ost->enc);
4515 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4517 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4518 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4521 if (!buf[0] || buf[0] == '#') {
4525 if (!(arg = strchr(buf, '='))) {
4526 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4530 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4532 } while (!s->eof_reached);
4536 av_log(NULL, AV_LOG_FATAL,
4537 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4538 preset, ost->file_index, ost->index);
4542 ost->max_frames = INT64_MAX;
4543 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4545 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4547 if (next = strchr(bsf, ','))
4549 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4550 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4554 bsfc_prev->next = bsfc;
4556 ost->bitstream_filters = bsfc;
4562 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4564 uint32_t tag = strtol(codec_tag, &next, 0);
4566 tag = AV_RL32(codec_tag);
4567 st->codec->codec_tag = tag;
4570 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4571 if (qscale >= 0 || same_quant) {
4572 st->codec->flags |= CODEC_FLAG_QSCALE;
4573 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4576 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4577 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4579 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4580 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4581 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4583 ost->source_index = source_index;
4584 if (source_index >= 0) {
4585 ost->sync_ist = input_streams[source_index];
4586 input_streams[source_index]->discard = 0;
4587 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4593 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4596 const char *p = str;
4603 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4610 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4614 AVCodecContext *video_enc;
4616 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4618 video_enc = st->codec;
4620 if (!ost->stream_copy) {
4621 const char *p = NULL;
4622 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
4623 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4624 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
4627 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4628 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4629 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4633 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4634 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4635 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4639 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4640 if (frame_aspect_ratio) {
4642 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4643 q.num <= 0 || q.den <= 0) {
4644 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4647 ost->frame_aspect_ratio = av_q2d(q);
4650 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4651 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4652 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4653 ost->keep_pix_fmt = 1;
4654 if (!*++frame_pix_fmt)
4655 frame_pix_fmt = NULL;
4657 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4658 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4661 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4664 video_enc->gop_size = 0;
4665 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4667 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4668 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4671 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4673 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4675 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4676 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4679 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4682 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4683 for (i = 0; p; i++) {
4685 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4687 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4690 /* FIXME realloc failure */
4691 video_enc->rc_override =
4692 av_realloc(video_enc->rc_override,
4693 sizeof(RcOverride) * (i + 1));
4694 video_enc->rc_override[i].start_frame = start;
4695 video_enc->rc_override[i].end_frame = end;
4697 video_enc->rc_override[i].qscale = q;
4698 video_enc->rc_override[i].quality_factor = 1.0;
4701 video_enc->rc_override[i].qscale = 0;
4702 video_enc->rc_override[i].quality_factor = -q/100.0;
4707 video_enc->rc_override_count = i;
4708 if (!video_enc->rc_initial_buffer_occupancy)
4709 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4710 video_enc->intra_dc_precision = intra_dc_precision - 8;
4713 video_enc->flags|= CODEC_FLAG_PSNR;
4718 video_enc->flags |= CODEC_FLAG_PASS1;
4721 video_enc->flags |= CODEC_FLAG_PASS2;
4725 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4726 if (forced_key_frames)
4727 parse_forced_key_frames(forced_key_frames, ost);
4729 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4731 ost->top_field_first = -1;
4732 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4734 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4736 ost->avfilter = av_strdup(filters);
4738 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4744 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4749 AVCodecContext *audio_enc;
4751 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4754 audio_enc = st->codec;
4755 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4757 if (!ost->stream_copy) {
4758 char *sample_fmt = NULL, *filters = NULL;
4760 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4762 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4764 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4765 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4769 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4771 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4773 ost->avfilter = av_strdup(filters);
4775 /* check for channel mapping for this audio stream */
4776 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4777 AudioChannelMap *map = &o->audio_channel_maps[n];
4778 InputStream *ist = input_streams[ost->source_index];
4779 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4780 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4781 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4782 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4783 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4785 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4786 ost->file_index, ost->st->index);
4794 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4798 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4799 if (!ost->stream_copy) {
4800 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4807 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4809 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4810 ost->stream_copy = 1;
4814 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4818 AVCodecContext *subtitle_enc;
4820 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4822 subtitle_enc = st->codec;
4824 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4826 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4831 /* arg format is "output-stream-index:streamid-value". */
4832 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4838 av_strlcpy(idx_str, arg, sizeof(idx_str));
4839 p = strchr(idx_str, ':');
4841 av_log(NULL, AV_LOG_FATAL,
4842 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4847 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4848 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4849 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4853 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4855 AVFormatContext *is = ifile->ctx;
4856 AVFormatContext *os = ofile->ctx;
4859 for (i = 0; i < is->nb_chapters; i++) {
4860 AVChapter *in_ch = is->chapters[i], *out_ch;
4861 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4862 AV_TIME_BASE_Q, in_ch->time_base);
4863 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4864 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4867 if (in_ch->end < ts_off)
4869 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4872 out_ch = av_mallocz(sizeof(AVChapter));
4874 return AVERROR(ENOMEM);
4876 out_ch->id = in_ch->id;
4877 out_ch->time_base = in_ch->time_base;
4878 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4879 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4882 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4885 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4887 return AVERROR(ENOMEM);
4888 os->chapters[os->nb_chapters - 1] = out_ch;
4893 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4896 AVFormatContext *ic = avformat_alloc_context();
4898 ic->interrupt_callback = int_cb;
4899 err = avformat_open_input(&ic, filename, NULL, NULL);
4902 /* copy stream format */
4903 for(i=0;i<ic->nb_streams;i++) {
4907 AVCodecContext *avctx;
4909 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4910 ost = new_output_stream(o, s, codec->type, -1);
4915 // FIXME: a more elegant solution is needed
4916 memcpy(st, ic->streams[i], sizeof(AVStream));
4918 st->info = av_malloc(sizeof(*st->info));
4919 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4921 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4923 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4924 choose_sample_fmt(st, codec);
4925 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4926 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
4929 avformat_close_input(&ic);
4933 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
4934 AVFormatContext *oc)
4938 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
4939 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
4940 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
4942 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
4947 ost->source_index = -1;
4948 ost->filter = ofilter;
4952 if (ost->stream_copy) {
4953 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
4954 "which is fed from a complex filtergraph. Filtering and streamcopy "
4955 "cannot be used together.\n", ost->file_index, ost->index);
4959 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
4960 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
4963 avfilter_inout_free(&ofilter->out_tmp);
4966 static void opt_output_file(void *optctx, const char *filename)
4968 OptionsContext *o = optctx;
4969 AVFormatContext *oc;
4971 AVOutputFormat *file_oformat;
4975 if (configure_complex_filters() < 0) {
4976 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
4980 if (!strcmp(filename, "-"))
4983 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4985 print_error(filename, err);
4988 file_oformat= oc->oformat;
4989 oc->interrupt_callback = int_cb;
4991 /* create streams for all unlabeled output pads */
4992 for (i = 0; i < nb_filtergraphs; i++) {
4993 FilterGraph *fg = filtergraphs[i];
4994 for (j = 0; j < fg->nb_outputs; j++) {
4995 OutputFilter *ofilter = fg->outputs[j];
4997 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5000 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
5001 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5002 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5003 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5005 init_output_filter(ofilter, o, oc);
5009 if (!strcmp(file_oformat->name, "ffm") &&
5010 av_strstart(filename, "http:", NULL)) {
5012 /* special case for files sent to ffserver: we get the stream
5013 parameters from ffserver */
5014 int err = read_ffserver_streams(o, oc, filename);
5016 print_error(filename, err);
5019 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5020 ost = output_streams[j];
5021 for (i = 0; i < nb_input_streams; i++) {
5022 ist = input_streams[i];
5023 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5025 ost->source_index= i;
5027 ist->st->discard = AVDISCARD_NONE;
5032 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));
5036 } else if (!o->nb_stream_maps) {
5037 /* pick the "best" stream of each type */
5039 /* video: highest resolution */
5040 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5041 int area = 0, idx = -1;
5042 for (i = 0; i < nb_input_streams; i++) {
5043 ist = input_streams[i];
5044 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5045 ist->st->codec->width * ist->st->codec->height > area) {
5046 area = ist->st->codec->width * ist->st->codec->height;
5051 new_video_stream(o, oc, idx);
5054 /* audio: most channels */
5055 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5056 int channels = 0, idx = -1;
5057 for (i = 0; i < nb_input_streams; i++) {
5058 ist = input_streams[i];
5059 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5060 ist->st->codec->channels > channels) {
5061 channels = ist->st->codec->channels;
5066 new_audio_stream(o, oc, idx);
5069 /* subtitles: pick first */
5070 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5071 for (i = 0; i < nb_input_streams; i++)
5072 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5073 new_subtitle_stream(o, oc, i);
5077 /* do something with data? */
5079 for (i = 0; i < o->nb_stream_maps; i++) {
5080 StreamMap *map = &o->stream_maps[i];
5081 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5086 if (map->linklabel) {
5088 OutputFilter *ofilter = NULL;
5091 for (j = 0; j < nb_filtergraphs; j++) {
5092 fg = filtergraphs[j];
5093 for (k = 0; k < fg->nb_outputs; k++) {
5094 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5095 if (out && !strcmp(out->name, map->linklabel)) {
5096 ofilter = fg->outputs[k];
5103 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5104 "in any defined filter graph.\n", map->linklabel);
5107 init_output_filter(ofilter, o, oc);
5109 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5110 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5112 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5114 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5116 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5119 switch (ist->st->codec->codec_type) {
5120 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5121 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5122 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5123 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5124 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5126 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5127 map->file_index, map->stream_index);
5135 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5136 AVDictionaryEntry *e;
5137 ost = output_streams[i];
5139 if ( ost->stream_copy
5140 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5141 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5142 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5146 /* handle attached files */
5147 for (i = 0; i < o->nb_attachments; i++) {
5149 uint8_t *attachment;
5153 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5154 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5158 if ((len = avio_size(pb)) <= 0) {
5159 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5163 if (!(attachment = av_malloc(len))) {
5164 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5168 avio_read(pb, attachment, len);
5170 ost = new_attachment_stream(o, oc, -1);
5171 ost->stream_copy = 0;
5172 ost->attachment_filename = o->attachments[i];
5173 ost->st->codec->extradata = attachment;
5174 ost->st->codec->extradata_size = len;
5176 p = strrchr(o->attachments[i], '/');
5177 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5181 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5182 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5185 output_files[nb_output_files - 1]->ctx = oc;
5186 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5187 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5188 if (o->recording_time != INT64_MAX)
5189 oc->duration = o->recording_time;
5190 output_files[nb_output_files - 1]->start_time = o->start_time;
5191 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5192 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5194 /* check filename in case of an image number is expected */
5195 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5196 if (!av_filename_number_test(oc->filename)) {
5197 print_error(oc->filename, AVERROR(EINVAL));
5202 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5203 /* test if it already exists to avoid losing precious files */
5204 assert_file_overwrite(filename);
5207 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5208 &oc->interrupt_callback,
5209 &output_files[nb_output_files - 1]->opts)) < 0) {
5210 print_error(filename, err);
5215 if (o->mux_preload) {
5217 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5218 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5220 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5223 for (i = 0; i < o->nb_metadata_map; i++) {
5225 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5227 if (in_file_index >= nb_input_files) {
5228 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5231 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5235 if (o->chapters_input_file >= nb_input_files) {
5236 if (o->chapters_input_file == INT_MAX) {
5237 /* copy chapters from the first input file that has them*/
5238 o->chapters_input_file = -1;
5239 for (i = 0; i < nb_input_files; i++)
5240 if (input_files[i]->ctx->nb_chapters) {
5241 o->chapters_input_file = i;
5245 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5246 o->chapters_input_file);
5250 if (o->chapters_input_file >= 0)
5251 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5252 !o->metadata_chapters_manual);
5254 /* copy global metadata by default */
5255 if (!o->metadata_global_manual && nb_input_files){
5256 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5257 AV_DICT_DONT_OVERWRITE);
5258 if(o->recording_time != INT64_MAX)
5259 av_dict_set(&oc->metadata, "duration", NULL, 0);
5261 if (!o->metadata_streams_manual)
5262 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5264 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5266 ist = input_streams[output_streams[i]->source_index];
5267 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5270 /* process manually set metadata */
5271 for (i = 0; i < o->nb_metadata; i++) {
5274 const char *stream_spec;
5275 int index = 0, j, ret = 0;
5277 val = strchr(o->metadata[i].u.str, '=');
5279 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5280 o->metadata[i].u.str);
5285 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5287 for (j = 0; j < oc->nb_streams; j++) {
5288 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5289 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5293 printf("ret %d, stream_spec %s\n", ret, stream_spec);
5301 if (index < 0 || index >= oc->nb_chapters) {
5302 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5305 m = &oc->chapters[index]->metadata;
5308 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5311 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5315 reset_options(o, 0);
5318 /* same option as mencoder */
5319 static int opt_pass(const char *opt, const char *arg)
5321 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5325 static int64_t getmaxrss(void)
5327 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5328 struct rusage rusage;
5329 getrusage(RUSAGE_SELF, &rusage);
5330 return (int64_t)rusage.ru_maxrss * 1024;
5331 #elif HAVE_GETPROCESSMEMORYINFO
5333 PROCESS_MEMORY_COUNTERS memcounters;
5334 proc = GetCurrentProcess();
5335 memcounters.cb = sizeof(memcounters);
5336 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5337 return memcounters.PeakPagefileUsage;
5343 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5345 return parse_option(o, "q:a", arg, options);
5348 static void show_usage(void)
5350 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5351 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5352 av_log(NULL, AV_LOG_INFO, "\n");
5355 static int opt_help(const char *opt, const char *arg)
5357 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5358 av_log_set_callback(log_callback_help);
5360 show_help_options(options, "Main options:\n",
5361 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5362 show_help_options(options, "\nAdvanced options:\n",
5363 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5365 show_help_options(options, "\nVideo options:\n",
5366 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5368 show_help_options(options, "\nAdvanced Video options:\n",
5369 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5370 OPT_VIDEO | OPT_EXPERT);
5371 show_help_options(options, "\nAudio options:\n",
5372 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5374 show_help_options(options, "\nAdvanced Audio options:\n",
5375 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5376 OPT_AUDIO | OPT_EXPERT);
5377 show_help_options(options, "\nSubtitle options:\n",
5378 OPT_SUBTITLE | OPT_GRAB,
5380 show_help_options(options, "\nAudio/Video grab options:\n",
5384 show_help_children(avcodec_get_class(), flags);
5385 show_help_children(avformat_get_class(), flags);
5386 show_help_children(sws_get_class(), flags);
5391 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5393 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5394 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5396 if (!strncmp(arg, "pal-", 4)) {
5399 } else if (!strncmp(arg, "ntsc-", 5)) {
5402 } else if (!strncmp(arg, "film-", 5)) {
5406 /* Try to determine PAL/NTSC by peeking in the input files */
5407 if (nb_input_files) {
5409 for (j = 0; j < nb_input_files; j++) {
5410 for (i = 0; i < input_files[j]->nb_streams; i++) {
5411 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5412 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5414 fr = c->time_base.den * 1000 / c->time_base.num;
5418 } else if ((fr == 29970) || (fr == 23976)) {
5423 if (norm != UNKNOWN)
5427 if (norm != UNKNOWN)
5428 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5431 if (norm == UNKNOWN) {
5432 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5433 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5434 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5438 if (!strcmp(arg, "vcd")) {
5439 opt_video_codec(o, "c:v", "mpeg1video");
5440 opt_audio_codec(o, "c:a", "mp2");
5441 parse_option(o, "f", "vcd", options);
5443 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5444 parse_option(o, "r", frame_rates[norm], options);
5445 opt_default("g", norm == PAL ? "15" : "18");
5447 opt_default("b:v", "1150000");
5448 opt_default("maxrate", "1150000");
5449 opt_default("minrate", "1150000");
5450 opt_default("bufsize", "327680"); // 40*1024*8;
5452 opt_default("b:a", "224000");
5453 parse_option(o, "ar", "44100", options);
5454 parse_option(o, "ac", "2", options);
5456 opt_default("packetsize", "2324");
5457 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5459 /* We have to offset the PTS, so that it is consistent with the SCR.
5460 SCR starts at 36000, but the first two packs contain only padding
5461 and the first pack from the other stream, respectively, may also have
5462 been written before.
5463 So the real data starts at SCR 36000+3*1200. */
5464 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5465 } else if (!strcmp(arg, "svcd")) {
5467 opt_video_codec(o, "c:v", "mpeg2video");
5468 opt_audio_codec(o, "c:a", "mp2");
5469 parse_option(o, "f", "svcd", options);
5471 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5472 parse_option(o, "r", frame_rates[norm], options);
5473 parse_option(o, "pix_fmt", "yuv420p", options);
5474 opt_default("g", norm == PAL ? "15" : "18");
5476 opt_default("b:v", "2040000");
5477 opt_default("maxrate", "2516000");
5478 opt_default("minrate", "0"); // 1145000;
5479 opt_default("bufsize", "1835008"); // 224*1024*8;
5480 opt_default("scan_offset", "1");
5483 opt_default("b:a", "224000");
5484 parse_option(o, "ar", "44100", options);
5486 opt_default("packetsize", "2324");
5488 } else if (!strcmp(arg, "dvd")) {
5490 opt_video_codec(o, "c:v", "mpeg2video");
5491 opt_audio_codec(o, "c:a", "ac3");
5492 parse_option(o, "f", "dvd", options);
5494 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5495 parse_option(o, "r", frame_rates[norm], options);
5496 parse_option(o, "pix_fmt", "yuv420p", options);
5497 opt_default("g", norm == PAL ? "15" : "18");
5499 opt_default("b:v", "6000000");
5500 opt_default("maxrate", "9000000");
5501 opt_default("minrate", "0"); // 1500000;
5502 opt_default("bufsize", "1835008"); // 224*1024*8;
5504 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5505 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5507 opt_default("b:a", "448000");
5508 parse_option(o, "ar", "48000", options);
5510 } else if (!strncmp(arg, "dv", 2)) {
5512 parse_option(o, "f", "dv", options);
5514 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5515 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5516 norm == PAL ? "yuv420p" : "yuv411p", options);
5517 parse_option(o, "r", frame_rates[norm], options);
5519 parse_option(o, "ar", "48000", options);
5520 parse_option(o, "ac", "2", options);
5523 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5524 return AVERROR(EINVAL);
5529 static int opt_vstats_file(const char *opt, const char *arg)
5531 av_free (vstats_filename);
5532 vstats_filename = av_strdup (arg);
5536 static int opt_vstats(const char *opt, const char *arg)
5539 time_t today2 = time(NULL);
5540 struct tm *today = localtime(&today2);
5542 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5544 return opt_vstats_file(opt, filename);
5547 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5549 return parse_option(o, "frames:v", arg, options);
5552 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5554 return parse_option(o, "frames:a", arg, options);
5557 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5559 return parse_option(o, "frames:d", arg, options);
5562 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5565 char filename[1000], line[1000], tmp_line[1000];
5566 const char *codec_name = *opt == 'v' ? video_codec_name :
5567 *opt == 'a' ? audio_codec_name :
5568 subtitle_codec_name;
5570 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5571 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5572 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5574 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5578 while (fgets(line, sizeof(line), f)) {
5579 char *key = tmp_line, *value, *endptr;
5581 if (strcspn(line, "#\n\r") == 0)
5583 strcpy(tmp_line, line);
5584 if (!av_strtok(key, "=", &value) ||
5585 !av_strtok(value, "\r\n", &endptr)) {
5586 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5589 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5591 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5592 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5593 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5594 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5595 else if (opt_default(key, value) < 0) {
5596 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5597 filename, line, key, value);
5607 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5611 static int opt_passlogfile(const char *opt, const char *arg)
5613 pass_logfilename_prefix = arg;
5614 #if CONFIG_LIBX264_ENCODER
5615 return opt_default(opt, arg);
5621 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5623 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5624 int ret = parse_option(o, s, arg, options);
5629 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5631 if(!strcmp(opt, "b")){
5632 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5633 return parse_option(o, "b:v", arg, options);
5635 return opt_default(opt, arg);
5638 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5642 if(!strcmp(opt, "qscale")){
5643 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5644 return parse_option(o, "q:v", arg, options);
5646 s = av_asprintf("q%s", opt + 6);
5647 ret = parse_option(o, s, arg, options);
5652 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5654 if(!strcmp(opt, "profile")){
5655 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5656 return parse_option(o, "profile:v", arg, options);
5658 return opt_default(opt, arg);
5661 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5663 return parse_option(o, "filter:v", arg, options);
5666 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5668 return parse_option(o, "filter:a", arg, options);
5671 static int opt_vsync(const char *opt, const char *arg)
5673 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5674 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5675 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5676 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5678 if (video_sync_method == VSYNC_AUTO)
5679 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5683 static int opt_deinterlace(const char *opt, const char *arg)
5685 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5690 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5692 int idx = locate_option(argc, argv, options, "cpuflags");
5693 if (idx && argv[idx + 1])
5694 opt_cpuflags("cpuflags", argv[idx + 1]);
5697 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5699 char layout_str[32];
5702 int ret, channels, ac_str_size;
5705 layout = av_get_channel_layout(arg);
5707 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5708 return AVERROR(EINVAL);
5710 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5711 ret = opt_default(opt, layout_str);
5715 /* set 'ac' option based on channel layout */
5716 channels = av_get_channel_layout_nb_channels(layout);
5717 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5718 stream_str = strchr(opt, ':');
5719 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5720 ac_str = av_mallocz(ac_str_size);
5722 return AVERROR(ENOMEM);
5723 av_strlcpy(ac_str, "ac", 3);
5725 av_strlcat(ac_str, stream_str, ac_str_size);
5726 ret = parse_option(o, ac_str, layout_str, options);
5732 static int opt_filter_complex(const char *opt, const char *arg)
5734 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5735 &nb_filtergraphs, nb_filtergraphs + 1);
5736 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5737 return AVERROR(ENOMEM);
5738 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5739 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5743 #define OFFSET(x) offsetof(OptionsContext, x)
5744 static const OptionDef options[] = {
5746 #include "cmdutils_common_opts.h"
5747 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5748 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5749 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5750 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5751 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5752 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5753 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5754 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5755 { "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]" },
5756 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5757 "outfile[,metadata]:infile[,metadata]" },
5758 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5759 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5760 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5761 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5762 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5763 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5764 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5765 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5766 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5767 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5768 "add timings for benchmarking" },
5769 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5770 "add timings for each task" },
5771 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5772 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5773 "dump each input packet" },
5774 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5775 "when dumping packets, also dump the payload" },
5776 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5777 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5778 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5779 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5780 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5781 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5782 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5783 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5784 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5785 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5786 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5787 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5788 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5789 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5790 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5791 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5792 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5793 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5794 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5795 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5796 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5797 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5798 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5801 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5802 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5803 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5804 { "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" },
5805 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5806 { "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" },
5807 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5808 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5809 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5810 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5811 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5812 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5813 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5814 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5815 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5816 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5817 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5818 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5819 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5820 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5821 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5822 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5823 "use same quantizer as source (implies VBR)" },
5824 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5825 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5826 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5827 "this option is deprecated, use the yadif filter instead" },
5828 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5829 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5830 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5831 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5832 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5833 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5834 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5835 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5836 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5837 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5838 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5839 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5840 { "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" },
5841 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5844 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5845 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5846 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5847 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5848 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5849 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5850 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5851 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5852 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5853 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5854 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
5856 /* subtitle options */
5857 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5858 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5859 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5862 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5863 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5864 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5867 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5868 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5870 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5871 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5872 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5874 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5875 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5876 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5877 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5878 /* data codec support */
5879 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5880 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5882 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5886 int main(int argc, char **argv)
5888 OptionsContext o = { 0 };
5891 reset_options(&o, 0);
5893 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5894 parse_loglevel(argc, argv, options);
5896 if(argc>1 && !strcmp(argv[1], "-d")){
5898 av_log_set_callback(log_callback_null);
5903 avcodec_register_all();
5905 avdevice_register_all();
5907 avfilter_register_all();
5909 avformat_network_init();
5911 show_banner(argc, argv, options);
5915 parse_cpuflags(argc, argv, options);
5918 parse_options(&o, argc, argv, options, opt_output_file);
5920 if (nb_output_files <= 0 && nb_input_files == 0) {
5922 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5926 /* file converter / grab */
5927 if (nb_output_files <= 0) {
5928 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5932 if (nb_input_files == 0) {
5933 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5937 current_time = ti = getutime();
5938 if (transcode() < 0)
5940 ti = getutime() - ti;
5942 int maxrss = getmaxrss() / 1024;
5943 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);