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>
97 #include "libavutil/avassert.h"
100 #define VSYNC_PASSTHROUGH 0
103 #define VSYNC_DROP 0xff
107 const char program_name[] = "ffmpeg";
108 const int program_birth_year = 2000;
110 /* select an input stream for an output stream */
111 typedef struct StreamMap {
112 int disabled; /** 1 is this mapping is disabled by a negative map */
116 int sync_stream_index;
117 char *linklabel; /** name of an output link, for mapping lavfi outputs */
121 int file_idx, stream_idx, channel_idx; // input
122 int ofile_idx, ostream_idx; // output
125 static const OptionDef options[];
127 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
129 static int frame_bits_per_raw_sample = 0;
130 static int video_discard = 0;
131 static int same_quant = 0;
132 static int do_deinterlace = 0;
133 static int intra_dc_precision = 8;
134 static int qp_hist = 0;
135 static int intra_only = 0;
136 static const char *video_codec_name = NULL;
137 static const char *audio_codec_name = NULL;
138 static const char *subtitle_codec_name = NULL;
140 static int file_overwrite = 0;
141 static int no_file_overwrite = 0;
142 static int do_benchmark = 0;
143 static int do_benchmark_all = 0;
144 static int do_hex_dump = 0;
145 static int do_pkt_dump = 0;
146 static int do_psnr = 0;
147 static int do_pass = 0;
148 static const char *pass_logfilename_prefix;
149 static int video_sync_method = VSYNC_AUTO;
150 static int audio_sync_method = 0;
151 static float audio_drift_threshold = 0.1;
152 static int copy_ts = 0;
153 static int copy_tb = -1;
154 static int opt_shortest = 0;
155 static char *vstats_filename;
156 static FILE *vstats_file;
158 static int audio_volume = 256;
160 static int exit_on_error = 0;
161 static int using_stdin = 0;
162 static int run_as_daemon = 0;
163 static volatile int received_nb_signals = 0;
164 static int64_t video_size = 0;
165 static int64_t audio_size = 0;
166 static int64_t extra_size = 0;
167 static int nb_frames_dup = 0;
168 static int nb_frames_drop = 0;
169 static int input_sync;
171 static float dts_delta_threshold = 10;
172 static float dts_error_threshold = 3600*30;
174 static int print_stats = 1;
175 static int debug_ts = 0;
176 static int current_time;
179 /* signal to input threads that they should exit; set by the main thread */
180 static int transcoding_finished;
183 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
185 typedef struct InputFilter {
186 AVFilterContext *filter;
187 struct InputStream *ist;
188 struct FilterGraph *graph;
192 typedef struct OutputFilter {
193 AVFilterContext *filter;
194 struct OutputStream *ost;
195 struct FilterGraph *graph;
198 /* temporary storage until stream maps are processed */
199 AVFilterInOut *out_tmp;
202 typedef struct FilterGraph {
204 const char *graph_desc;
206 AVFilterGraph *graph;
208 InputFilter **inputs;
210 OutputFilter **outputs;
214 typedef struct InputStream {
217 int discard; /* true if stream data should be discarded */
218 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
220 AVFrame *decoded_frame;
222 int64_t start; /* time when read started */
223 /* predicted dts of the next packet read for this stream or (when there are
224 * several frames in a packet) of the next frame in current packet */
226 /* dts of the last packet read for this stream */
229 int64_t next_pts; /* synthetic pts for the next decode frame */
230 int64_t pts; /* current pts of the decoded frame */
232 int is_start; /* is 1 at the start and after a discontinuity */
234 int showed_multi_packet_warning;
236 AVRational framerate; /* framerate forced with -r */
241 int resample_pix_fmt;
243 int resample_sample_fmt;
244 int resample_sample_rate;
245 int resample_channels;
246 uint64_t resample_channel_layout;
248 /* a pool of free buffers for decoded data */
249 FrameBuffer *buffer_pool;
252 /* decoded data from this stream goes into all those filters
253 * currently video and audio only */
254 InputFilter **filters;
258 typedef struct InputFile {
259 AVFormatContext *ctx;
260 int eof_reached; /* true if eof reached */
261 int ist_index; /* index of first stream in input_streams */
262 int buffer_size; /* current total buffer size */
264 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
265 from ctx.nb_streams if new streams appear during av_read_frame() */
269 pthread_t thread; /* thread reading from this file */
270 int finished; /* the thread has exited */
271 int joined; /* the thread has been joined */
272 pthread_mutex_t fifo_lock; /* lock for access to fifo */
273 pthread_cond_t fifo_cond; /* the main thread will signal on this cond after reading from fifo */
274 AVFifoBuffer *fifo; /* demuxed packets are stored here; freed by the main thread */
278 typedef struct OutputStream {
279 int file_index; /* file index */
280 int index; /* stream index in the output file */
281 int source_index; /* InputStream index */
282 AVStream *st; /* stream in the output file */
283 int encoding_needed; /* true if encoding needed for this stream */
285 /* input pts and corresponding output pts
287 struct InputStream *sync_ist; /* input stream to sync against */
288 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
289 /* pts of the first frame encoded for this stream, used for limiting
292 AVBitStreamFilterContext *bitstream_filters;
295 AVFrame *filtered_frame;
298 AVRational frame_rate;
302 float frame_aspect_ratio;
305 /* forced key frames */
306 int64_t *forced_kf_pts;
311 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
312 int audio_channels_mapped; /* number of channels in audio_channels_map */
316 OutputFilter *filter;
320 int64_t swr_dither_method;
321 double swr_dither_scale;
323 int is_past_recording_time;
325 const char *attachment_filename;
326 int copy_initial_nonkeyframes;
334 /* init terminal so that we can grab keys */
335 static struct termios oldtty;
336 static int restore_tty;
339 typedef struct OutputFile {
340 AVFormatContext *ctx;
342 int ost_index; /* index of the first stream in output_streams */
343 int64_t recording_time; /* desired length of the resulting file in microseconds */
344 int64_t start_time; /* start time in microseconds */
345 uint64_t limit_filesize; /* filesize limit expressed in bytes */
348 static InputStream **input_streams = NULL;
349 static int nb_input_streams = 0;
350 static InputFile **input_files = NULL;
351 static int nb_input_files = 0;
353 static OutputStream **output_streams = NULL;
354 static int nb_output_streams = 0;
355 static OutputFile **output_files = NULL;
356 static int nb_output_files = 0;
358 static FilterGraph **filtergraphs;
361 typedef struct OptionsContext {
362 /* input/output options */
366 SpecifierOpt *codec_names;
368 SpecifierOpt *audio_channels;
369 int nb_audio_channels;
370 SpecifierOpt *audio_sample_rate;
371 int nb_audio_sample_rate;
372 SpecifierOpt *frame_rates;
374 SpecifierOpt *frame_sizes;
376 SpecifierOpt *frame_pix_fmts;
377 int nb_frame_pix_fmts;
380 int64_t input_ts_offset;
383 SpecifierOpt *ts_scale;
385 SpecifierOpt *dump_attachment;
386 int nb_dump_attachment;
389 StreamMap *stream_maps;
391 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
392 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
393 int metadata_global_manual;
394 int metadata_streams_manual;
395 int metadata_chapters_manual;
396 const char **attachments;
399 int chapters_input_file;
401 int64_t recording_time;
402 uint64_t limit_filesize;
408 int subtitle_disable;
411 /* indexed by output file stream index */
415 SpecifierOpt *metadata;
417 SpecifierOpt *max_frames;
419 SpecifierOpt *bitstream_filters;
420 int nb_bitstream_filters;
421 SpecifierOpt *codec_tags;
423 SpecifierOpt *sample_fmts;
425 SpecifierOpt *qscale;
427 SpecifierOpt *forced_key_frames;
428 int nb_forced_key_frames;
429 SpecifierOpt *force_fps;
431 SpecifierOpt *frame_aspect_ratios;
432 int nb_frame_aspect_ratios;
433 SpecifierOpt *rc_overrides;
435 SpecifierOpt *intra_matrices;
436 int nb_intra_matrices;
437 SpecifierOpt *inter_matrices;
438 int nb_inter_matrices;
439 SpecifierOpt *top_field_first;
440 int nb_top_field_first;
441 SpecifierOpt *metadata_map;
443 SpecifierOpt *presets;
445 SpecifierOpt *copy_initial_nonkeyframes;
446 int nb_copy_initial_nonkeyframes;
447 SpecifierOpt *filters;
451 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
453 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
456 for (i = 0; i < o->nb_ ## name; i++) {\
457 char *spec = o->name[i].specifier;\
458 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
459 outvar = o->name[i].u.type;\
465 static int64_t getutime(void)
468 struct rusage rusage;
470 getrusage(RUSAGE_SELF, &rusage);
471 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
472 #elif HAVE_GETPROCESSTIMES
475 proc = GetCurrentProcess();
476 GetProcessTimes(proc, &c, &e, &k, &u);
477 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
483 static void update_benchmark(const char *fmt, ...)
485 if (do_benchmark_all) {
486 int64_t t = getutime();
492 vsnprintf(buf, sizeof(buf), fmt, va);
494 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
500 static void reset_options(OptionsContext *o, int is_input)
502 const OptionDef *po = options;
503 OptionsContext bak= *o;
506 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
508 void *dst = (uint8_t*)o + po->u.off;
510 if (po->flags & OPT_SPEC) {
511 SpecifierOpt **so = dst;
512 int i, *count = (int*)(so + 1);
513 for (i = 0; i < *count; i++) {
514 av_freep(&(*so)[i].specifier);
515 if (po->flags & OPT_STRING)
516 av_freep(&(*so)[i].u.str);
520 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
525 for (i = 0; i < o->nb_stream_maps; i++)
526 av_freep(&o->stream_maps[i].linklabel);
527 av_freep(&o->stream_maps);
528 av_freep(&o->audio_channel_maps);
529 av_freep(&o->streamid_map);
531 memset(o, 0, sizeof(*o));
533 if(is_input) o->recording_time = bak.recording_time;
534 else o->recording_time = INT64_MAX;
535 o->mux_max_delay = 0.7;
536 o->limit_filesize = UINT64_MAX;
537 o->chapters_input_file = INT_MAX;
543 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
545 if (codec && codec->pix_fmts) {
546 const enum PixelFormat *p = codec->pix_fmts;
547 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
548 enum PixelFormat best= PIX_FMT_NONE;
549 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
550 if (st->codec->codec_id == CODEC_ID_MJPEG) {
551 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
552 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
553 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
554 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
557 for (; *p != PIX_FMT_NONE; p++) {
558 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
562 if (*p == PIX_FMT_NONE) {
563 if (target != PIX_FMT_NONE)
564 av_log(NULL, AV_LOG_WARNING,
565 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
566 av_pix_fmt_descriptors[target].name,
568 av_pix_fmt_descriptors[best].name);
575 static char *choose_pix_fmts(OutputStream *ost)
577 if (ost->keep_pix_fmt) {
579 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
580 AVFILTER_AUTO_CONVERT_NONE);
581 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
583 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
585 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
586 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
587 } else if (ost->enc && ost->enc->pix_fmts) {
588 const enum PixelFormat *p;
589 AVIOContext *s = NULL;
593 if (avio_open_dyn_buf(&s) < 0)
596 p = ost->enc->pix_fmts;
597 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
598 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
599 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
600 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
601 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
602 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
606 for (; *p != PIX_FMT_NONE; p++) {
607 const char *name = av_get_pix_fmt_name(*p);
608 avio_printf(s, "%s:", name);
610 len = avio_close_dyn_buf(s, &ret);
618 * Define a function for building a string containing a list of
621 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
622 static char *choose_ ## var ## s(OutputStream *ost) \
624 if (ost->st->codec->var != none) { \
625 get_name(ost->st->codec->var); \
626 return av_strdup(name); \
627 } else if (ost->enc->supported_list) { \
629 AVIOContext *s = NULL; \
633 if (avio_open_dyn_buf(&s) < 0) \
636 for (p = ost->enc->supported_list; *p != none; p++) { \
638 avio_printf(s, "%s" separator, name); \
640 len = avio_close_dyn_buf(s, &ret); \
647 #define GET_PIX_FMT_NAME(pix_fmt)\
648 const char *name = av_get_pix_fmt_name(pix_fmt);
650 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
651 // GET_PIX_FMT_NAME, ":")
653 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
654 const char *name = av_get_sample_fmt_name(sample_fmt)
656 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
657 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
659 #define GET_SAMPLE_RATE_NAME(rate)\
661 snprintf(name, sizeof(name), "%d", rate);
663 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
664 GET_SAMPLE_RATE_NAME, ",")
666 #define GET_CH_LAYOUT_NAME(ch_layout)\
668 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
670 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
671 GET_CH_LAYOUT_NAME, ",")
673 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
675 FilterGraph *fg = av_mallocz(sizeof(*fg));
679 fg->index = nb_filtergraphs;
681 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
683 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
685 fg->outputs[0]->ost = ost;
686 fg->outputs[0]->graph = fg;
688 ost->filter = fg->outputs[0];
690 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
692 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
694 fg->inputs[0]->ist = ist;
695 fg->inputs[0]->graph = fg;
697 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
698 &ist->nb_filters, ist->nb_filters + 1);
699 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
701 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
702 &nb_filtergraphs, nb_filtergraphs + 1);
703 filtergraphs[nb_filtergraphs - 1] = fg;
708 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
710 InputStream *ist = NULL;
711 enum AVMediaType type = in->filter_ctx->input_pads[in->pad_idx].type;
714 // TODO: support other filter types
715 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
716 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
725 int file_idx = strtol(in->name, &p, 0);
727 if (file_idx < 0 || file_idx >= nb_input_files) {
728 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
729 file_idx, fg->graph_desc);
732 s = input_files[file_idx]->ctx;
734 for (i = 0; i < s->nb_streams; i++) {
735 if (s->streams[i]->codec->codec_type != type)
737 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
743 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
744 "matches no streams.\n", p, fg->graph_desc);
747 ist = input_streams[input_files[file_idx]->ist_index + st->index];
749 /* find the first unused stream of corresponding type */
750 for (i = 0; i < nb_input_streams; i++) {
751 ist = input_streams[i];
752 if (ist->st->codec->codec_type == type && ist->discard)
755 if (i == nb_input_streams) {
756 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
757 "unlabeled input pad %d on filter %s\n", in->pad_idx,
758 in->filter_ctx->name);
763 ist->decoding_needed = 1;
764 ist->st->discard = AVDISCARD_NONE;
766 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
767 &fg->nb_inputs, fg->nb_inputs + 1);
768 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
770 fg->inputs[fg->nb_inputs - 1]->ist = ist;
771 fg->inputs[fg->nb_inputs - 1]->graph = fg;
773 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
774 &ist->nb_filters, ist->nb_filters + 1);
775 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
778 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
781 OutputStream *ost = ofilter->ost;
782 AVCodecContext *codec = ost->st->codec;
783 AVFilterContext *last_filter = out->filter_ctx;
784 int pad_idx = out->pad_idx;
786 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
788 #if FF_API_OLD_VSINK_API
789 ret = avfilter_graph_create_filter(&ofilter->filter,
790 avfilter_get_by_name("buffersink"),
791 "ffmpeg_buffersink", NULL, NULL, fg->graph);
793 ret = avfilter_graph_create_filter(&ofilter->filter,
794 avfilter_get_by_name("buffersink"),
795 "ffmpeg_buffersink", NULL, buffersink_params, fg->graph);
797 av_freep(&buffersink_params);
802 if (codec->width || codec->height) {
804 AVFilterContext *filter;
806 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
809 (unsigned)ost->sws_flags);
810 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
811 NULL, args, NULL, fg->graph)) < 0)
813 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
816 last_filter = filter;
820 if ((pix_fmts = choose_pix_fmts(ost))) {
821 AVFilterContext *filter;
822 if ((ret = avfilter_graph_create_filter(&filter,
823 avfilter_get_by_name("format"),
824 "format", pix_fmts, NULL,
827 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
830 last_filter = filter;
835 if (ost->frame_rate.num && 0) {
836 AVFilterContext *fps;
839 snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
840 ost->frame_rate.den);
841 ret = avfilter_graph_create_filter(&fps, avfilter_get_by_name("fps"),
842 "fps", args, NULL, fg->graph);
846 ret = avfilter_link(last_filter, pad_idx, fps, 0);
853 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
859 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
861 OutputStream *ost = ofilter->ost;
862 AVCodecContext *codec = ost->st->codec;
863 AVFilterContext *last_filter = out->filter_ctx;
864 int pad_idx = out->pad_idx;
865 char *sample_fmts, *sample_rates, *channel_layouts;
868 ret = avfilter_graph_create_filter(&ofilter->filter,
869 avfilter_get_by_name("abuffersink_old"),
870 "ffmpeg_abuffersink_old", NULL, NULL, fg->graph);
874 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
875 AVFilterContext *filt_ctx; \
877 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
878 "similarly to -af " filter_name "=%s.\n", arg); \
880 ret = avfilter_graph_create_filter(&filt_ctx, \
881 avfilter_get_by_name(filter_name), \
882 filter_name, arg, NULL, fg->graph); \
886 ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
890 last_filter = filt_ctx; \
893 if (ost->audio_channels_mapped) {
896 av_bprint_init(&pan_buf, 256, 8192);
897 av_bprintf(&pan_buf, "0x%"PRIx64,
898 av_get_default_channel_layout(ost->audio_channels_mapped));
899 for (i = 0; i < ost->audio_channels_mapped; i++)
900 if (ost->audio_channels_map[i] != -1)
901 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
903 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
904 av_bprint_finalize(&pan_buf, NULL);
907 if (codec->channels && !codec->channel_layout)
908 codec->channel_layout = av_get_default_channel_layout(codec->channels);
910 sample_fmts = choose_sample_fmts(ost);
911 sample_rates = choose_sample_rates(ost);
912 channel_layouts = choose_channel_layouts(ost);
913 if (sample_fmts || sample_rates || channel_layouts) {
914 AVFilterContext *format;
919 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
922 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
925 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
929 av_freep(&sample_fmts);
930 av_freep(&sample_rates);
931 av_freep(&channel_layouts);
933 ret = avfilter_graph_create_filter(&format,
934 avfilter_get_by_name("aformat"),
935 "aformat", args, NULL, fg->graph);
939 ret = avfilter_link(last_filter, pad_idx, format, 0);
943 last_filter = format;
947 if (audio_sync_method > 0 && 0) {
948 char args[256] = {0};
950 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
951 if (audio_sync_method > 1)
952 av_strlcatf(args, sizeof(args), ":max_soft_comp=%d", -audio_sync_method);
953 AUTO_INSERT_FILTER("-async", "aresample", args);
956 if (audio_volume != 256 && 0) {
959 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
960 AUTO_INSERT_FILTER("-vol", "volume", args);
963 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
969 #define DESCRIBE_FILTER_LINK(f, inout, in) \
971 AVFilterContext *ctx = inout->filter_ctx; \
972 AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads; \
973 int nb_pads = in ? ctx->input_count : ctx->output_count; \
976 if (avio_open_dyn_buf(&pb) < 0) \
979 avio_printf(pb, "%s", ctx->filter->name); \
981 avio_printf(pb, ":%s", pads[inout->pad_idx].name); \
983 avio_close_dyn_buf(pb, &f->name); \
986 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
988 av_freep(&ofilter->name);
989 DESCRIBE_FILTER_LINK(ofilter, out, 0);
991 switch (out->filter_ctx->output_pads[out->pad_idx].type) {
992 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
993 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
994 default: av_assert0(0);
998 static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
1001 AVFilterContext *first_filter = in->filter_ctx;
1002 AVFilter *filter = avfilter_get_by_name("buffer");
1003 InputStream *ist = ifilter->ist;
1004 AVRational tb = ist->framerate.num ? (AVRational){ist->framerate.den,
1005 ist->framerate.num} :
1007 AVRational fr = ist->framerate.num ? ist->framerate :
1008 ist->st->r_frame_rate;
1011 int pad_idx = in->pad_idx;
1014 sar = ist->st->sample_aspect_ratio.num ?
1015 ist->st->sample_aspect_ratio :
1016 ist->st->codec->sample_aspect_ratio;
1018 sar = (AVRational){0,1};
1019 av_bprint_init(&args, 0, 1);
1021 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
1022 "pixel_aspect=%d/%d:sws_param=flags=%d", ist->st->codec->width,
1023 ist->st->codec->height, ist->st->codec->pix_fmt,
1024 tb.num, tb.den, sar.num, sar.den,
1025 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
1026 if (fr.num && fr.den)
1027 av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
1029 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter, in->name,
1030 args.str, NULL, fg->graph)) < 0)
1033 if (ist->framerate.num) {
1034 AVFilterContext *setpts;
1036 if ((ret = avfilter_graph_create_filter(&setpts,
1037 avfilter_get_by_name("setpts"),
1038 "setpts", "N", NULL,
1042 if ((ret = avfilter_link(setpts, 0, first_filter, pad_idx)) < 0)
1045 first_filter = setpts;
1049 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1054 static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
1057 AVFilterContext *first_filter = in->filter_ctx;
1058 AVFilter *filter = avfilter_get_by_name("abuffer");
1059 InputStream *ist = ifilter->ist;
1060 int pad_idx = in->pad_idx;
1064 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
1065 ":channel_layout=0x%"PRIx64,
1066 ist->st->time_base.num, ist->st->time_base.den,
1067 ist->st->codec->sample_rate,
1068 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1069 ist->st->codec->channel_layout);
1071 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
1072 in->name, args, NULL,
1076 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
1077 AVFilterContext *filt_ctx; \
1079 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1080 "similarly to -af " filter_name "=%s.\n", arg); \
1082 ret = avfilter_graph_create_filter(&filt_ctx, \
1083 avfilter_get_by_name(filter_name), \
1084 filter_name, arg, NULL, fg->graph); \
1088 ret = avfilter_link(filt_ctx, 0, first_filter, pad_idx); \
1092 first_filter = filt_ctx; \
1095 if (audio_sync_method > 0) {
1096 char args[256] = {0};
1098 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
1099 if (audio_sync_method > 1)
1100 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)ist->st->codec->sample_rate);
1101 AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
1104 // if (ost->audio_channels_mapped) {
1106 // AVBPrint pan_buf;
1107 // av_bprint_init(&pan_buf, 256, 8192);
1108 // av_bprintf(&pan_buf, "0x%"PRIx64,
1109 // av_get_default_channel_layout(ost->audio_channels_mapped));
1110 // for (i = 0; i < ost->audio_channels_mapped; i++)
1111 // if (ost->audio_channels_map[i] != -1)
1112 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
1113 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
1114 // av_bprint_finalize(&pan_buf, NULL);
1117 if (audio_volume != 256) {
1120 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
1121 AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
1123 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1129 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
1132 av_freep(&ifilter->name);
1133 DESCRIBE_FILTER_LINK(ifilter, in, 1);
1135 switch (in->filter_ctx->input_pads[in->pad_idx].type) {
1136 case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
1137 case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
1138 default: av_assert0(0);
1142 static int configure_filtergraph(FilterGraph *fg)
1144 AVFilterInOut *inputs, *outputs, *cur;
1145 int ret, i, init = !fg->graph, simple = !fg->graph_desc;
1146 const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1149 avfilter_graph_free(&fg->graph);
1150 if (!(fg->graph = avfilter_graph_alloc()))
1151 return AVERROR(ENOMEM);
1154 OutputStream *ost = fg->outputs[0]->ost;
1156 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1157 fg->graph->scale_sws_opts = av_strdup(args);
1160 if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1163 if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1164 av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
1165 "exactly one input and output.\n", graph_desc);
1166 return AVERROR(EINVAL);
1169 for (cur = inputs; !simple && init && cur; cur = cur->next)
1170 init_input_filter(fg, cur);
1172 for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1173 if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
1175 avfilter_inout_free(&inputs);
1177 if (!init || simple) {
1178 /* we already know the mappings between lavfi outputs and output streams,
1179 * so we can finish the setup */
1180 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1181 configure_output_filter(fg, fg->outputs[i], cur);
1182 avfilter_inout_free(&outputs);
1184 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1187 /* wait until output mappings are processed */
1188 for (cur = outputs; cur;) {
1189 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1190 &fg->nb_outputs, fg->nb_outputs + 1);
1191 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1193 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1194 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1196 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1203 static int configure_complex_filters(void)
1207 for (i = 0; i < nb_filtergraphs; i++)
1208 if (!filtergraphs[i]->graph &&
1209 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1214 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1217 for (i = 0; i < fg->nb_inputs; i++)
1218 if (fg->inputs[i]->ist == ist)
1223 static void term_exit(void)
1225 av_log(NULL, AV_LOG_QUIET, "%s", "");
1228 tcsetattr (0, TCSANOW, &oldtty);
1232 static volatile int received_sigterm = 0;
1234 static void sigterm_handler(int sig)
1236 received_sigterm = sig;
1237 received_nb_signals++;
1239 if(received_nb_signals > 3)
1243 static void term_init(void)
1250 istty = isatty(0) && isatty(2);
1252 if (istty && tcgetattr (0, &tty) == 0) {
1257 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1258 |INLCR|IGNCR|ICRNL|IXON);
1259 tty.c_oflag |= OPOST;
1260 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1261 tty.c_cflag &= ~(CSIZE|PARENB);
1264 tty.c_cc[VTIME] = 0;
1266 tcsetattr (0, TCSANOW, &tty);
1268 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1271 avformat_network_deinit();
1273 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1274 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1276 signal(SIGXCPU, sigterm_handler);
1280 /* read a key without blocking */
1281 static int read_key(void)
1293 n = select(1, &rfds, NULL, NULL, &tv);
1295 n = read(0, &ch, 1);
1302 # if HAVE_PEEKNAMEDPIPE
1304 static HANDLE input_handle;
1307 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1308 is_pipe = !GetConsoleMode(input_handle, &dw);
1311 if (stdin->_cnt > 0) {
1316 /* When running under a GUI, you will end here. */
1317 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1334 static int decode_interrupt_cb(void *ctx)
1336 return received_nb_signals > 1;
1339 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1341 void av_noreturn exit_program(int ret)
1345 for (i = 0; i < nb_filtergraphs; i++) {
1346 avfilter_graph_free(&filtergraphs[i]->graph);
1347 for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
1348 av_freep(&filtergraphs[i]->inputs[j]->name);
1349 av_freep(&filtergraphs[i]->inputs[j]);
1351 av_freep(&filtergraphs[i]->inputs);
1352 for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
1353 av_freep(&filtergraphs[i]->outputs[j]->name);
1354 av_freep(&filtergraphs[i]->outputs[j]);
1356 av_freep(&filtergraphs[i]->outputs);
1357 av_freep(&filtergraphs[i]);
1359 av_freep(&filtergraphs);
1362 for (i = 0; i < nb_output_files; i++) {
1363 AVFormatContext *s = output_files[i]->ctx;
1364 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1366 avformat_free_context(s);
1367 av_dict_free(&output_files[i]->opts);
1368 av_freep(&output_files[i]);
1370 for (i = 0; i < nb_output_streams; i++) {
1371 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1373 AVBitStreamFilterContext *next = bsfc->next;
1374 av_bitstream_filter_close(bsfc);
1377 output_streams[i]->bitstream_filters = NULL;
1379 av_freep(&output_streams[i]->filtered_frame);
1380 av_freep(&output_streams[i]->avfilter);
1381 av_freep(&output_streams[i]);
1383 for (i = 0; i < nb_input_files; i++) {
1384 avformat_close_input(&input_files[i]->ctx);
1385 av_freep(&input_files[i]);
1387 for (i = 0; i < nb_input_streams; i++) {
1388 av_freep(&input_streams[i]->decoded_frame);
1389 av_dict_free(&input_streams[i]->opts);
1390 free_buffer_pool(&input_streams[i]->buffer_pool);
1391 av_freep(&input_streams[i]->filters);
1392 av_freep(&input_streams[i]);
1396 fclose(vstats_file);
1397 av_free(vstats_filename);
1399 av_freep(&input_streams);
1400 av_freep(&input_files);
1401 av_freep(&output_streams);
1402 av_freep(&output_files);
1407 avformat_network_deinit();
1409 if (received_sigterm) {
1410 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1411 (int) received_sigterm);
1418 static void assert_avoptions(AVDictionary *m)
1420 AVDictionaryEntry *t;
1421 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1422 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1427 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1429 const char *codec_string = encoder ? "encoder" : "decoder";
1431 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1432 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1433 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1434 "results.\nAdd '-strict experimental' if you want to use it.\n",
1435 codec_string, c->codec->name);
1436 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1437 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1438 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1439 codec_string, codec->name);
1444 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1446 if (codec && codec->sample_fmts) {
1447 const enum AVSampleFormat *p = codec->sample_fmts;
1448 for (; *p != -1; p++) {
1449 if (*p == st->codec->sample_fmt)
1453 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1454 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1455 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1456 av_log(NULL, AV_LOG_WARNING,
1457 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1458 av_get_sample_fmt_name(st->codec->sample_fmt),
1460 av_get_sample_fmt_name(codec->sample_fmts[0]));
1461 st->codec->sample_fmt = codec->sample_fmts[0];
1466 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1468 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1469 AVCodecContext *avctx = ost->st->codec;
1472 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1473 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1474 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1476 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1477 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1478 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1479 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1480 pkt->pts = pkt->dts = max;
1485 * Audio encoders may split the packets -- #frames in != #packets out.
1486 * But there is no reordering, so we can limit the number of output packets
1487 * by simply dropping them here.
1488 * Counting encoded video frames needs to be done separately because of
1489 * reordering, see do_video_out()
1491 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1492 if (ost->frame_number >= ost->max_frames) {
1493 av_free_packet(pkt);
1496 ost->frame_number++;
1500 AVPacket new_pkt = *pkt;
1501 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1502 &new_pkt.data, &new_pkt.size,
1503 pkt->data, pkt->size,
1504 pkt->flags & AV_PKT_FLAG_KEY);
1506 av_free_packet(pkt);
1507 new_pkt.destruct = av_destruct_packet;
1509 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1510 bsfc->filter->name, pkt->stream_index,
1511 avctx->codec ? avctx->codec->name : "copy");
1521 pkt->stream_index = ost->index;
1522 ret = av_interleaved_write_frame(s, pkt);
1524 print_error("av_interleaved_write_frame()", ret);
1529 static int check_recording_time(OutputStream *ost)
1531 OutputFile *of = output_files[ost->file_index];
1533 if (of->recording_time != INT64_MAX &&
1534 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1535 AV_TIME_BASE_Q) >= 0) {
1536 ost->is_past_recording_time = 1;
1542 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1545 AVCodecContext *enc = ost->st->codec;
1549 av_init_packet(&pkt);
1553 if (!check_recording_time(ost))
1556 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1557 frame->pts = ost->sync_opts;
1558 ost->sync_opts = frame->pts + frame->nb_samples;
1560 av_assert0(pkt.size || !pkt.data);
1561 update_benchmark(NULL);
1562 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1563 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1566 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1569 if (pkt.pts != AV_NOPTS_VALUE)
1570 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1571 if (pkt.dts != AV_NOPTS_VALUE)
1572 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1573 if (pkt.duration > 0)
1574 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1577 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1578 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1579 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1580 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1583 write_frame(s, &pkt, ost);
1585 audio_size += pkt.size;
1586 av_free_packet(&pkt);
1590 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1592 AVCodecContext *dec;
1593 AVPicture *picture2;
1594 AVPicture picture_tmp;
1597 dec = ist->st->codec;
1599 /* deinterlace : must be done before any resize */
1600 if (do_deinterlace) {
1603 /* create temporary picture */
1604 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1605 buf = av_malloc(size);
1609 picture2 = &picture_tmp;
1610 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1612 if (avpicture_deinterlace(picture2, picture,
1613 dec->pix_fmt, dec->width, dec->height) < 0) {
1614 /* if error, do not deinterlace */
1615 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1624 if (picture != picture2)
1625 *picture = *picture2;
1629 static void do_subtitle_out(AVFormatContext *s,
1635 static uint8_t *subtitle_out = NULL;
1636 int subtitle_out_max_size = 1024 * 1024;
1637 int subtitle_out_size, nb, i;
1638 AVCodecContext *enc;
1641 if (pts == AV_NOPTS_VALUE) {
1642 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1648 enc = ost->st->codec;
1650 if (!subtitle_out) {
1651 subtitle_out = av_malloc(subtitle_out_max_size);
1654 /* Note: DVB subtitle need one packet to draw them and one other
1655 packet to clear them */
1656 /* XXX: signal it in the codec context ? */
1657 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1662 for (i = 0; i < nb; i++) {
1663 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1665 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1666 // start_display_time is required to be 0
1667 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1668 sub->end_display_time -= sub->start_display_time;
1669 sub->start_display_time = 0;
1670 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1671 subtitle_out_max_size, sub);
1672 if (subtitle_out_size < 0) {
1673 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1677 av_init_packet(&pkt);
1678 pkt.data = subtitle_out;
1679 pkt.size = subtitle_out_size;
1680 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1681 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
1682 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1683 /* XXX: the pts correction is handled here. Maybe handling
1684 it in the codec would be better */
1686 pkt.pts += 90 * sub->start_display_time;
1688 pkt.pts += 90 * sub->end_display_time;
1690 write_frame(s, &pkt, ost);
1694 static void do_video_out(AVFormatContext *s,
1696 AVFrame *in_picture,
1699 int ret, format_video_sync;
1701 AVCodecContext *enc = ost->st->codec;
1703 double sync_ipts, delta;
1704 double duration = 0;
1706 InputStream *ist = NULL;
1708 if (ost->source_index >= 0)
1709 ist = input_streams[ost->source_index];
1711 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1712 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1714 sync_ipts = in_picture->pts;
1715 delta = sync_ipts - ost->sync_opts + duration;
1717 /* by default, we output a single frame */
1720 format_video_sync = video_sync_method;
1721 if (format_video_sync == VSYNC_AUTO)
1722 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1724 switch (format_video_sync) {
1726 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1729 else if (delta > 1.1)
1730 nb_frames = lrintf(delta);
1735 else if (delta > 0.6)
1736 ost->sync_opts = lrint(sync_ipts);
1739 case VSYNC_PASSTHROUGH:
1740 ost->sync_opts = lrint(sync_ipts);
1746 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1747 if (nb_frames == 0) {
1749 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1751 } else if (nb_frames > 1) {
1752 nb_frames_dup += nb_frames - 1;
1753 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1758 av_init_packet(&pkt);
1762 in_picture->pts = ost->sync_opts;
1764 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1765 enc->codec->id == CODEC_ID_RAWVIDEO) {
1766 /* raw pictures are written as AVPicture structure to
1767 avoid any copies. We support temporarily the older
1769 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1770 enc->coded_frame->top_field_first = in_picture->top_field_first;
1771 pkt.data = (uint8_t *)in_picture;
1772 pkt.size = sizeof(AVPicture);
1773 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1774 pkt.flags |= AV_PKT_FLAG_KEY;
1776 write_frame(s, &pkt, ost);
1777 video_size += pkt.size;
1780 AVFrame big_picture;
1782 big_picture = *in_picture;
1783 /* better than nothing: use input picture interlaced
1785 big_picture.interlaced_frame = in_picture->interlaced_frame;
1786 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1787 if (ost->top_field_first == -1)
1788 big_picture.top_field_first = in_picture->top_field_first;
1790 big_picture.top_field_first = !!ost->top_field_first;
1793 /* handles same_quant here. This is not correct because it may
1794 not be a global option */
1795 big_picture.quality = quality;
1796 if (!enc->me_threshold)
1797 big_picture.pict_type = 0;
1798 if (ost->forced_kf_index < ost->forced_kf_count &&
1799 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1800 big_picture.pict_type = AV_PICTURE_TYPE_I;
1801 ost->forced_kf_index++;
1803 update_benchmark(NULL);
1804 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1805 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1807 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1812 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1813 pkt.pts = ost->sync_opts;
1815 if (pkt.pts != AV_NOPTS_VALUE)
1816 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1817 if (pkt.dts != AV_NOPTS_VALUE)
1818 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1821 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1822 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1823 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1824 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1827 write_frame(s, &pkt, ost);
1828 frame_size = pkt.size;
1829 video_size += pkt.size;
1830 av_free_packet(&pkt);
1832 /* if two pass, output log */
1833 if (ost->logfile && enc->stats_out) {
1834 fprintf(ost->logfile, "%s", enc->stats_out);
1840 * For video, number of frames in == number of packets out.
1841 * But there may be reordering, so we can't throw away frames on encoder
1842 * flush, we need to limit them here, before they go into encoder.
1844 ost->frame_number++;
1847 goto duplicate_frame;
1849 if (vstats_filename && frame_size)
1850 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1853 static double psnr(double d)
1855 return -10.0 * log(d) / log(10.0);
1858 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1861 AVCodecContext *enc;
1863 double ti1, bitrate, avg_bitrate;
1865 /* this is executed just the first time do_video_stats is called */
1867 vstats_file = fopen(vstats_filename, "w");
1874 enc = ost->st->codec;
1875 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1876 frame_number = ost->frame_number;
1877 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1878 if (enc->flags&CODEC_FLAG_PSNR)
1879 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1881 fprintf(vstats_file,"f_size= %6d ", frame_size);
1882 /* compute pts value */
1883 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1887 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1888 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1889 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1890 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1891 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1895 /* check for new output on any of the filtergraphs */
1896 static int poll_filters(void)
1898 AVFilterBufferRef *picref;
1899 AVFrame *filtered_frame = NULL;
1900 int i, ret, ret_all;
1901 unsigned nb_success, nb_eof;
1905 /* Reap all buffers present in the buffer sinks */
1906 for (i = 0; i < nb_output_streams; i++) {
1907 OutputStream *ost = output_streams[i];
1908 OutputFile *of = output_files[ost->file_index];
1914 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1915 return AVERROR(ENOMEM);
1917 avcodec_get_frame_defaults(ost->filtered_frame);
1918 filtered_frame = ost->filtered_frame;
1920 while (!ost->is_past_recording_time) {
1921 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
1922 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
1923 ret = av_buffersink_read_samples(ost->filter->filter, &picref,
1924 ost->st->codec->frame_size);
1927 ret = av_buffersink_read(ost->filter->filter, &picref);
1929 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1930 AV_BUFFERSINK_FLAG_NO_REQUEST);
1933 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1935 av_strerror(ret, buf, sizeof(buf));
1936 av_log(NULL, AV_LOG_WARNING,
1937 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1941 frame_pts = AV_NOPTS_VALUE;
1942 if (picref->pts != AV_NOPTS_VALUE) {
1943 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1944 ost->filter->filter->inputs[0]->time_base,
1945 ost->st->codec->time_base) -
1946 av_rescale_q(of->start_time,
1948 ost->st->codec->time_base);
1950 if (of->start_time && filtered_frame->pts < 0) {
1951 avfilter_unref_buffer(picref);
1955 //if (ost->source_index >= 0)
1956 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1959 switch (ost->filter->filter->inputs[0]->type) {
1960 case AVMEDIA_TYPE_VIDEO:
1961 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
1962 filtered_frame->pts = frame_pts;
1963 if (!ost->frame_aspect_ratio)
1964 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1966 do_video_out(of->ctx, ost, filtered_frame,
1967 same_quant ? ost->last_quality :
1968 ost->st->codec->global_quality);
1970 case AVMEDIA_TYPE_AUDIO:
1971 avfilter_copy_buf_props(filtered_frame, picref);
1972 filtered_frame->pts = frame_pts;
1973 do_audio_out(of->ctx, ost, filtered_frame);
1976 // TODO support subtitle filters
1980 avfilter_unref_buffer(picref);
1983 /* Request frames through all the graphs */
1984 ret_all = nb_success = nb_eof = 0;
1985 for (i = 0; i < nb_filtergraphs; i++) {
1986 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
1989 } else if (ret == AVERROR_EOF) {
1991 } else if (ret != AVERROR(EAGAIN)) {
1993 av_strerror(ret, buf, sizeof(buf));
1994 av_log(NULL, AV_LOG_WARNING,
1995 "Error in request_frame(): %s\n", buf);
2001 /* Try again if anything succeeded */
2003 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2006 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2010 AVFormatContext *oc;
2012 AVCodecContext *enc;
2013 int frame_number, vid, i;
2015 int64_t pts = INT64_MAX;
2016 static int64_t last_time = -1;
2017 static int qp_histogram[52];
2018 int hours, mins, secs, us;
2020 if (!print_stats && !is_last_report)
2023 if (!is_last_report) {
2024 if (last_time == -1) {
2025 last_time = cur_time;
2028 if ((cur_time - last_time) < 500000)
2030 last_time = cur_time;
2034 oc = output_files[0]->ctx;
2036 total_size = avio_size(oc->pb);
2037 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2038 total_size = avio_tell(oc->pb);
2045 for (i = 0; i < nb_output_streams; i++) {
2047 ost = output_streams[i];
2048 enc = ost->st->codec;
2049 if (!ost->stream_copy && enc->coded_frame)
2050 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2051 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2052 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2054 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2055 float fps, t = (cur_time-timer_start) / 1000000.0;
2057 frame_number = ost->frame_number;
2058 fps = t > 1 ? frame_number / t : 0;
2059 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2060 frame_number, fps < 9.95, fps, q);
2062 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2066 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2068 for (j = 0; j < 32; j++)
2069 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2071 if (enc->flags&CODEC_FLAG_PSNR) {
2073 double error, error_sum = 0;
2074 double scale, scale_sum = 0;
2075 char type[3] = { 'Y','U','V' };
2076 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2077 for (j = 0; j < 3; j++) {
2078 if (is_last_report) {
2079 error = enc->error[j];
2080 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2082 error = enc->coded_frame->error[j];
2083 scale = enc->width * enc->height * 255.0 * 255.0;
2089 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
2091 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2095 /* compute min output value */
2096 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2097 ost->st->time_base, AV_TIME_BASE_Q));
2100 secs = pts / AV_TIME_BASE;
2101 us = pts % AV_TIME_BASE;
2107 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2109 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2110 "size=%8.0fkB time=", total_size / 1024.0);
2111 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2112 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2113 (100 * us) / AV_TIME_BASE);
2114 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2115 "bitrate=%6.1fkbits/s", bitrate);
2117 if (nb_frames_dup || nb_frames_drop)
2118 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2119 nb_frames_dup, nb_frames_drop);
2121 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2125 if (is_last_report) {
2126 int64_t raw= audio_size + video_size + extra_size;
2127 av_log(NULL, AV_LOG_INFO, "\n");
2128 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
2129 video_size / 1024.0,
2130 audio_size / 1024.0,
2131 extra_size / 1024.0,
2132 100.0 * (total_size - raw) / raw
2134 if(video_size + audio_size + extra_size == 0){
2135 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2140 static void flush_encoders(void)
2144 for (i = 0; i < nb_output_streams; i++) {
2145 OutputStream *ost = output_streams[i];
2146 AVCodecContext *enc = ost->st->codec;
2147 AVFormatContext *os = output_files[ost->file_index]->ctx;
2148 int stop_encoding = 0;
2150 if (!ost->encoding_needed)
2153 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2155 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2159 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2163 switch (ost->st->codec->codec_type) {
2164 case AVMEDIA_TYPE_AUDIO:
2165 encode = avcodec_encode_audio2;
2169 case AVMEDIA_TYPE_VIDEO:
2170 encode = avcodec_encode_video2;
2181 av_init_packet(&pkt);
2185 update_benchmark(NULL);
2186 ret = encode(enc, &pkt, NULL, &got_packet);
2187 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2189 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2193 if (ost->logfile && enc->stats_out) {
2194 fprintf(ost->logfile, "%s", enc->stats_out);
2200 if (pkt.pts != AV_NOPTS_VALUE)
2201 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2202 if (pkt.dts != AV_NOPTS_VALUE)
2203 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2204 write_frame(os, &pkt, ost);
2214 * Check whether a packet from ist should be written into ost at this time
2216 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2218 OutputFile *of = output_files[ost->file_index];
2219 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2221 if (ost->source_index != ist_index)
2224 if (of->start_time && ist->pts < of->start_time)
2227 if (of->recording_time != INT64_MAX &&
2228 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
2229 (AVRational){ 1, 1000000 }) >= 0) {
2230 ost->is_past_recording_time = 1;
2237 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2239 OutputFile *of = output_files[ost->file_index];
2240 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2244 av_init_packet(&opkt);
2246 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2247 !ost->copy_initial_nonkeyframes)
2250 /* force the input stream PTS */
2251 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2252 audio_size += pkt->size;
2253 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2254 video_size += pkt->size;
2258 if (pkt->pts != AV_NOPTS_VALUE)
2259 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2261 opkt.pts = AV_NOPTS_VALUE;
2263 if (pkt->dts == AV_NOPTS_VALUE)
2264 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2266 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2267 opkt.dts -= ost_tb_start_time;
2269 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2270 opkt.flags = pkt->flags;
2272 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2273 if ( ost->st->codec->codec_id != CODEC_ID_H264
2274 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2275 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2276 && ost->st->codec->codec_id != CODEC_ID_VC1
2278 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2279 opkt.destruct = av_destruct_packet;
2281 opkt.data = pkt->data;
2282 opkt.size = pkt->size;
2284 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2285 /* store AVPicture in AVPacket, as expected by the output format */
2286 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2287 opkt.data = (uint8_t *)&pict;
2288 opkt.size = sizeof(AVPicture);
2289 opkt.flags |= AV_PKT_FLAG_KEY;
2292 write_frame(of->ctx, &opkt, ost);
2293 ost->st->codec->frame_number++;
2294 av_free_packet(&opkt);
2297 static void rate_emu_sleep(InputStream *ist)
2299 if (input_files[ist->file_index]->rate_emu) {
2300 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2301 int64_t now = av_gettime() - ist->start;
2307 static int guess_input_channel_layout(InputStream *ist)
2309 AVCodecContext *dec = ist->st->codec;
2311 if (!dec->channel_layout) {
2312 char layout_name[256];
2314 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2315 if (!dec->channel_layout)
2317 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2318 dec->channels, dec->channel_layout);
2319 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2320 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2325 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2327 AVFrame *decoded_frame;
2328 AVCodecContext *avctx = ist->st->codec;
2329 int i, ret, resample_changed;
2331 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2332 return AVERROR(ENOMEM);
2334 avcodec_get_frame_defaults(ist->decoded_frame);
2335 decoded_frame = ist->decoded_frame;
2337 update_benchmark(NULL);
2338 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2339 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2343 if (avctx->sample_rate <= 0) {
2344 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2345 return AVERROR_INVALIDDATA;
2349 /* no audio frame */
2351 for (i = 0; i < ist->nb_filters; i++)
2352 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2353 AV_BUFFERSRC_FLAG_NO_COPY);
2357 /* if the decoder provides a pts, use it instead of the last packet pts.
2358 the decoder could be delaying output by a packet or more. */
2359 if (decoded_frame->pts != AV_NOPTS_VALUE)
2360 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2361 else if (pkt->pts != AV_NOPTS_VALUE) {
2362 decoded_frame->pts = pkt->pts;
2363 pkt->pts = AV_NOPTS_VALUE;
2365 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2369 /* increment next_dts to use for the case where the input stream does not
2370 have timestamps or there are multiple frames in the packet */
2371 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2373 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2377 rate_emu_sleep(ist);
2379 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2380 ist->resample_channels != avctx->channels ||
2381 ist->resample_channel_layout != decoded_frame->channel_layout ||
2382 ist->resample_sample_rate != decoded_frame->sample_rate;
2383 if (resample_changed) {
2384 char layout1[64], layout2[64];
2386 if (!guess_input_channel_layout(ist)) {
2387 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2388 "layout for Input Stream #%d.%d\n", ist->file_index,
2392 decoded_frame->channel_layout = avctx->channel_layout;
2394 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2395 ist->resample_channel_layout);
2396 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2397 decoded_frame->channel_layout);
2399 av_log(NULL, AV_LOG_INFO,
2400 "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",
2401 ist->file_index, ist->st->index,
2402 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2403 ist->resample_channels, layout1,
2404 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2405 avctx->channels, layout2);
2407 ist->resample_sample_fmt = decoded_frame->format;
2408 ist->resample_sample_rate = decoded_frame->sample_rate;
2409 ist->resample_channel_layout = decoded_frame->channel_layout;
2410 ist->resample_channels = avctx->channels;
2412 for (i = 0; i < nb_filtergraphs; i++)
2413 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2414 configure_filtergraph(filtergraphs[i]) < 0) {
2415 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2420 for (i = 0; i < ist->nb_filters; i++)
2421 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2426 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2428 AVFrame *decoded_frame;
2429 void *buffer_to_free = NULL;
2430 int i, ret = 0, resample_changed;
2431 int64_t best_effort_timestamp;
2432 AVRational *frame_sample_aspect;
2435 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2436 return AVERROR(ENOMEM);
2438 avcodec_get_frame_defaults(ist->decoded_frame);
2439 decoded_frame = ist->decoded_frame;
2440 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2442 update_benchmark(NULL);
2443 ret = avcodec_decode_video2(ist->st->codec,
2444 decoded_frame, got_output, pkt);
2445 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2449 quality = same_quant ? decoded_frame->quality : 0;
2451 /* no picture yet */
2453 for (i = 0; i < ist->nb_filters; i++)
2454 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2458 if(ist->top_field_first>=0)
2459 decoded_frame->top_field_first = ist->top_field_first;
2461 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2462 if(best_effort_timestamp != AV_NOPTS_VALUE)
2463 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2466 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2468 rate_emu_sleep(ist);
2470 if (ist->st->sample_aspect_ratio.num)
2471 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2473 resample_changed = ist->resample_width != decoded_frame->width ||
2474 ist->resample_height != decoded_frame->height ||
2475 ist->resample_pix_fmt != decoded_frame->format;
2476 if (resample_changed) {
2477 av_log(NULL, AV_LOG_INFO,
2478 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2479 ist->file_index, ist->st->index,
2480 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2481 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2483 ist->resample_width = decoded_frame->width;
2484 ist->resample_height = decoded_frame->height;
2485 ist->resample_pix_fmt = decoded_frame->format;
2487 for (i = 0; i < nb_filtergraphs; i++)
2488 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2489 configure_filtergraph(filtergraphs[i]) < 0) {
2490 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2495 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2496 for (i = 0; i < ist->nb_filters; i++) {
2497 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2498 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2499 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2500 // XXX what an ugly hack
2501 if (ist->filters[i]->graph->nb_outputs == 1)
2502 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2504 if (!frame_sample_aspect->num)
2505 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2506 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2507 FrameBuffer *buf = decoded_frame->opaque;
2508 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2509 decoded_frame->data, decoded_frame->linesize,
2510 AV_PERM_READ | AV_PERM_PRESERVE,
2511 ist->st->codec->width, ist->st->codec->height,
2512 ist->st->codec->pix_fmt);
2514 avfilter_copy_frame_props(fb, decoded_frame);
2515 fb->buf->priv = buf;
2516 fb->buf->free = filter_release_buffer;
2518 av_assert0(buf->refcount>0);
2520 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2521 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2522 AV_BUFFERSRC_FLAG_NO_COPY);
2524 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2525 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2531 av_free(buffer_to_free);
2535 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2537 AVSubtitle subtitle;
2538 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2539 &subtitle, got_output, pkt);
2545 rate_emu_sleep(ist);
2547 for (i = 0; i < nb_output_streams; i++) {
2548 OutputStream *ost = output_streams[i];
2550 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2553 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2556 avsubtitle_free(&subtitle);
2560 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2561 static int output_packet(InputStream *ist, const AVPacket *pkt)
2567 if (!ist->saw_first_ts) {
2568 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;
2570 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2571 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2572 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2574 ist->saw_first_ts = 1;
2577 if (ist->next_dts == AV_NOPTS_VALUE)
2578 ist->next_dts = ist->dts;
2579 if (ist->next_pts == AV_NOPTS_VALUE)
2580 ist->next_pts = ist->pts;
2584 av_init_packet(&avpkt);
2592 if (pkt->dts != AV_NOPTS_VALUE) {
2593 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2594 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2595 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2598 // while we have more to decode or while the decoder did output something on EOF
2599 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2603 ist->pts = ist->next_pts;
2604 ist->dts = ist->next_dts;
2606 if (avpkt.size && avpkt.size != pkt->size) {
2607 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2608 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2609 ist->showed_multi_packet_warning = 1;
2612 switch (ist->st->codec->codec_type) {
2613 case AVMEDIA_TYPE_AUDIO:
2614 ret = decode_audio (ist, &avpkt, &got_output);
2616 case AVMEDIA_TYPE_VIDEO:
2617 ret = decode_video (ist, &avpkt, &got_output);
2618 if (avpkt.duration) {
2619 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2620 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2621 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2622 duration = ((int64_t)AV_TIME_BASE *
2623 ist->st->codec->time_base.num * ticks) /
2624 ist->st->codec->time_base.den;
2628 if(ist->dts != AV_NOPTS_VALUE && duration) {
2629 ist->next_dts += duration;
2631 ist->next_dts = AV_NOPTS_VALUE;
2634 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2636 case AVMEDIA_TYPE_SUBTITLE:
2637 ret = transcode_subtitles(ist, &avpkt, &got_output);
2647 avpkt.pts= AV_NOPTS_VALUE;
2649 // touch data and size only if not EOF
2651 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2661 /* handle stream copy */
2662 if (!ist->decoding_needed) {
2663 rate_emu_sleep(ist);
2664 ist->dts = ist->next_dts;
2665 switch (ist->st->codec->codec_type) {
2666 case AVMEDIA_TYPE_AUDIO:
2667 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2668 ist->st->codec->sample_rate;
2670 case AVMEDIA_TYPE_VIDEO:
2671 if (pkt->duration) {
2672 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2673 } else if(ist->st->codec->time_base.num != 0) {
2674 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2675 ist->next_dts += ((int64_t)AV_TIME_BASE *
2676 ist->st->codec->time_base.num * ticks) /
2677 ist->st->codec->time_base.den;
2681 ist->pts = ist->dts;
2682 ist->next_pts = ist->next_dts;
2684 for (i = 0; pkt && i < nb_output_streams; i++) {
2685 OutputStream *ost = output_streams[i];
2687 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2690 do_streamcopy(ist, ost, pkt);
2696 static void print_sdp(void)
2700 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2704 for (i = 0; i < nb_output_files; i++)
2705 avc[i] = output_files[i]->ctx;
2707 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2708 printf("SDP:\n%s\n", sdp);
2713 static int init_input_stream(int ist_index, char *error, int error_len)
2715 InputStream *ist = input_streams[ist_index];
2717 if (ist->decoding_needed) {
2718 AVCodec *codec = ist->dec;
2720 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2721 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2722 return AVERROR(EINVAL);
2725 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2726 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2727 ist->st->codec->get_buffer = codec_get_buffer;
2728 ist->st->codec->release_buffer = codec_release_buffer;
2729 ist->st->codec->opaque = &ist->buffer_pool;
2732 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2733 av_dict_set(&ist->opts, "threads", "auto", 0);
2734 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2735 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2736 ist->file_index, ist->st->index);
2737 return AVERROR(EINVAL);
2739 assert_codec_experimental(ist->st->codec, 0);
2740 assert_avoptions(ist->opts);
2743 ist->next_pts = AV_NOPTS_VALUE;
2744 ist->next_dts = AV_NOPTS_VALUE;
2750 static InputStream *get_input_stream(OutputStream *ost)
2752 if (ost->source_index >= 0)
2753 return input_streams[ost->source_index];
2757 static int transcode_init(void)
2759 int ret = 0, i, j, k;
2760 AVFormatContext *oc;
2761 AVCodecContext *codec, *icodec = NULL;
2767 /* init framerate emulation */
2768 for (i = 0; i < nb_input_files; i++) {
2769 InputFile *ifile = input_files[i];
2770 if (ifile->rate_emu)
2771 for (j = 0; j < ifile->nb_streams; j++)
2772 input_streams[j + ifile->ist_index]->start = av_gettime();
2775 /* output stream init */
2776 for (i = 0; i < nb_output_files; i++) {
2777 oc = output_files[i]->ctx;
2778 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2779 av_dump_format(oc, i, oc->filename, 1);
2780 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2781 return AVERROR(EINVAL);
2785 /* init complex filtergraphs */
2786 for (i = 0; i < nb_filtergraphs; i++)
2787 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2790 /* for each output stream, we compute the right encoding parameters */
2791 for (i = 0; i < nb_output_streams; i++) {
2792 ost = output_streams[i];
2793 oc = output_files[ost->file_index]->ctx;
2794 ist = get_input_stream(ost);
2796 if (ost->attachment_filename)
2799 codec = ost->st->codec;
2802 icodec = ist->st->codec;
2804 ost->st->disposition = ist->st->disposition;
2805 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2806 codec->chroma_sample_location = icodec->chroma_sample_location;
2809 if (ost->stream_copy) {
2810 uint64_t extra_size;
2812 av_assert0(ist && !ost->filter);
2814 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2816 if (extra_size > INT_MAX) {
2817 return AVERROR(EINVAL);
2820 /* if stream_copy is selected, no need to decode or encode */
2821 codec->codec_id = icodec->codec_id;
2822 codec->codec_type = icodec->codec_type;
2824 if (!codec->codec_tag) {
2825 if (!oc->oformat->codec_tag ||
2826 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2827 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2828 codec->codec_tag = icodec->codec_tag;
2831 codec->bit_rate = icodec->bit_rate;
2832 codec->rc_max_rate = icodec->rc_max_rate;
2833 codec->rc_buffer_size = icodec->rc_buffer_size;
2834 codec->field_order = icodec->field_order;
2835 codec->extradata = av_mallocz(extra_size);
2836 if (!codec->extradata) {
2837 return AVERROR(ENOMEM);
2839 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2840 codec->extradata_size= icodec->extradata_size;
2841 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2843 codec->time_base = ist->st->time_base;
2845 * Avi is a special case here because it supports variable fps but
2846 * having the fps and timebase differe significantly adds quite some
2849 if(!strcmp(oc->oformat->name, "avi")) {
2850 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2851 && av_q2d(ist->st->time_base) < 1.0/500
2853 codec->time_base = icodec->time_base;
2854 codec->time_base.num *= icodec->ticks_per_frame;
2855 codec->time_base.den *= 2;
2856 codec->ticks_per_frame = 2;
2858 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2859 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2860 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2862 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2863 && av_q2d(ist->st->time_base) < 1.0/500
2865 codec->time_base = icodec->time_base;
2866 codec->time_base.num *= icodec->ticks_per_frame;
2870 if(ost->frame_rate.num)
2871 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2873 av_reduce(&codec->time_base.num, &codec->time_base.den,
2874 codec->time_base.num, codec->time_base.den, INT_MAX);
2876 switch (codec->codec_type) {
2877 case AVMEDIA_TYPE_AUDIO:
2878 if (audio_volume != 256) {
2879 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2882 codec->channel_layout = icodec->channel_layout;
2883 codec->sample_rate = icodec->sample_rate;
2884 codec->channels = icodec->channels;
2885 codec->frame_size = icodec->frame_size;
2886 codec->audio_service_type = icodec->audio_service_type;
2887 codec->block_align = icodec->block_align;
2888 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2889 codec->block_align= 0;
2890 if(codec->codec_id == CODEC_ID_AC3)
2891 codec->block_align= 0;
2893 case AVMEDIA_TYPE_VIDEO:
2894 codec->pix_fmt = icodec->pix_fmt;
2895 codec->width = icodec->width;
2896 codec->height = icodec->height;
2897 codec->has_b_frames = icodec->has_b_frames;
2898 if (!codec->sample_aspect_ratio.num) {
2899 codec->sample_aspect_ratio =
2900 ost->st->sample_aspect_ratio =
2901 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2902 ist->st->codec->sample_aspect_ratio.num ?
2903 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2905 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2907 case AVMEDIA_TYPE_SUBTITLE:
2908 codec->width = icodec->width;
2909 codec->height = icodec->height;
2911 case AVMEDIA_TYPE_DATA:
2912 case AVMEDIA_TYPE_ATTACHMENT:
2919 ost->enc = avcodec_find_encoder(codec->codec_id);
2921 /* should only happen when a default codec is not present. */
2922 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2923 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2924 ret = AVERROR(EINVAL);
2929 ist->decoding_needed = 1;
2930 ost->encoding_needed = 1;
2932 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2933 if (ost->filter && !ost->frame_rate.num)
2934 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
2935 if (ist && !ost->frame_rate.num)
2936 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
2937 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2938 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2939 ost->frame_rate = ost->enc->supported_framerates[idx];
2944 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2945 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
2947 fg = init_simple_filtergraph(ist, ost);
2948 if (configure_filtergraph(fg)) {
2949 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2954 switch (codec->codec_type) {
2955 case AVMEDIA_TYPE_AUDIO:
2956 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
2957 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
2958 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
2959 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
2960 codec->time_base = (AVRational){ 1, codec->sample_rate };
2962 case AVMEDIA_TYPE_VIDEO:
2963 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2964 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
2965 codec->time_base = ost->filter->filter->inputs[0]->time_base;
2966 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2967 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2968 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
2969 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
2971 for (j = 0; j < ost->forced_kf_count; j++)
2972 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2976 codec->width = ost->filter->filter->inputs[0]->w;
2977 codec->height = ost->filter->filter->inputs[0]->h;
2978 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
2979 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
2980 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
2981 ost->filter->filter->inputs[0]->sample_aspect_ratio;
2982 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
2985 codec->width != icodec->width ||
2986 codec->height != icodec->height ||
2987 codec->pix_fmt != icodec->pix_fmt) {
2988 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2992 case AVMEDIA_TYPE_SUBTITLE:
2993 codec->time_base = (AVRational){1, 1000};
3000 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3001 char logfilename[1024];
3004 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3005 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3007 if (!strcmp(ost->enc->name, "libx264")) {
3008 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3010 if (codec->flags & CODEC_FLAG_PASS2) {
3012 size_t logbuffer_size;
3013 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3014 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3018 codec->stats_in = logbuffer;
3020 if (codec->flags & CODEC_FLAG_PASS1) {
3021 f = fopen(logfilename, "wb");
3023 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3024 logfilename, strerror(errno));
3034 /* open each encoder */
3035 for (i = 0; i < nb_output_streams; i++) {
3036 ost = output_streams[i];
3037 if (ost->encoding_needed) {
3038 AVCodec *codec = ost->enc;
3039 AVCodecContext *dec = NULL;
3041 if ((ist = get_input_stream(ost)))
3042 dec = ist->st->codec;
3043 if (dec && dec->subtitle_header) {
3044 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3045 if (!ost->st->codec->subtitle_header) {
3046 ret = AVERROR(ENOMEM);
3049 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3050 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3052 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3053 av_dict_set(&ost->opts, "threads", "auto", 0);
3054 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3055 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3056 ost->file_index, ost->index);
3057 ret = AVERROR(EINVAL);
3060 assert_codec_experimental(ost->st->codec, 1);
3061 assert_avoptions(ost->opts);
3062 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3063 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3064 " It takes bits/s as argument, not kbits/s\n");
3065 extra_size += ost->st->codec->extradata_size;
3067 if (ost->st->codec->me_threshold)
3068 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3072 /* init input streams */
3073 for (i = 0; i < nb_input_streams; i++)
3074 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3077 /* discard unused programs */
3078 for (i = 0; i < nb_input_files; i++) {
3079 InputFile *ifile = input_files[i];
3080 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3081 AVProgram *p = ifile->ctx->programs[j];
3082 int discard = AVDISCARD_ALL;
3084 for (k = 0; k < p->nb_stream_indexes; k++)
3085 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3086 discard = AVDISCARD_DEFAULT;
3089 p->discard = discard;
3093 /* open files and write file headers */
3094 for (i = 0; i < nb_output_files; i++) {
3095 oc = output_files[i]->ctx;
3096 oc->interrupt_callback = int_cb;
3097 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3099 const char *errbuf_ptr = errbuf;
3100 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3101 errbuf_ptr = strerror(AVUNERROR(ret));
3102 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3103 ret = AVERROR(EINVAL);
3106 // assert_avoptions(output_files[i]->opts);
3107 if (strcmp(oc->oformat->name, "rtp")) {
3113 /* dump the file output parameters - cannot be done before in case
3115 for (i = 0; i < nb_output_files; i++) {
3116 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3119 /* dump the stream mapping */
3120 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3121 for (i = 0; i < nb_input_streams; i++) {
3122 ist = input_streams[i];
3124 for (j = 0; j < ist->nb_filters; j++) {
3125 if (ist->filters[j]->graph->graph_desc) {
3126 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3127 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3128 ist->filters[j]->name);
3129 if (nb_filtergraphs > 1)
3130 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3131 av_log(NULL, AV_LOG_INFO, "\n");
3136 for (i = 0; i < nb_output_streams; i++) {
3137 ost = output_streams[i];
3139 if (ost->attachment_filename) {
3140 /* an attached file */
3141 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3142 ost->attachment_filename, ost->file_index, ost->index);
3146 if (ost->filter && ost->filter->graph->graph_desc) {
3147 /* output from a complex graph */
3148 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3149 if (nb_filtergraphs > 1)
3150 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3152 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3153 ost->index, ost->enc ? ost->enc->name : "?");
3157 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3158 input_streams[ost->source_index]->file_index,
3159 input_streams[ost->source_index]->st->index,
3162 if (ost->sync_ist != input_streams[ost->source_index])
3163 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3164 ost->sync_ist->file_index,
3165 ost->sync_ist->st->index);
3166 if (ost->stream_copy)
3167 av_log(NULL, AV_LOG_INFO, " (copy)");
3169 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3170 input_streams[ost->source_index]->dec->name : "?",
3171 ost->enc ? ost->enc->name : "?");
3172 av_log(NULL, AV_LOG_INFO, "\n");
3176 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3188 * @return 1 if there are still streams where more output is wanted,
3191 static int need_output(void)
3195 for (i = 0; i < nb_output_streams; i++) {
3196 OutputStream *ost = output_streams[i];
3197 OutputFile *of = output_files[ost->file_index];
3198 AVFormatContext *os = output_files[ost->file_index]->ctx;
3200 if (ost->is_past_recording_time ||
3201 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3203 if (ost->frame_number >= ost->max_frames) {
3205 for (j = 0; j < of->ctx->nb_streams; j++)
3206 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3216 static int select_input_file(uint8_t *no_packet)
3218 int64_t ipts_min = INT64_MAX;
3219 int i, file_index = -1;
3221 for (i = 0; i < nb_input_streams; i++) {
3222 InputStream *ist = input_streams[i];
3223 int64_t ipts = ist->pts;
3225 if (ist->discard || no_packet[ist->file_index])
3227 if (!input_files[ist->file_index]->eof_reached) {
3228 if (ipts < ipts_min) {
3230 file_index = ist->file_index;
3238 static int check_keyboard_interaction(int64_t cur_time)
3241 static int64_t last_time;
3242 if (received_nb_signals)
3243 return AVERROR_EXIT;
3244 /* read_key() returns 0 on EOF */
3245 if(cur_time - last_time >= 100000 && !run_as_daemon){
3247 last_time = cur_time;
3251 return AVERROR_EXIT;
3252 if (key == '+') av_log_set_level(av_log_get_level()+10);
3253 if (key == '-') av_log_set_level(av_log_get_level()-10);
3254 if (key == 's') qp_hist ^= 1;
3257 do_hex_dump = do_pkt_dump = 0;
3258 } else if(do_pkt_dump){
3262 av_log_set_level(AV_LOG_DEBUG);
3264 if (key == 'c' || key == 'C'){
3265 char buf[4096], target[64], command[256], arg[256] = {0};
3268 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3270 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3275 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3276 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3277 target, time, command, arg);
3278 for (i = 0; i < nb_filtergraphs; i++) {
3279 FilterGraph *fg = filtergraphs[i];
3282 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3283 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3284 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3286 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3291 av_log(NULL, AV_LOG_ERROR,
3292 "Parse error, at least 3 arguments were expected, "
3293 "only %d given in string '%s'\n", n, buf);
3296 if (key == 'd' || key == 'D'){
3299 debug = input_streams[0]->st->codec->debug<<1;
3300 if(!debug) debug = 1;
3301 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3304 if(scanf("%d", &debug)!=1)
3305 fprintf(stderr,"error parsing debug value\n");
3306 for(i=0;i<nb_input_streams;i++) {
3307 input_streams[i]->st->codec->debug = debug;
3309 for(i=0;i<nb_output_streams;i++) {
3310 OutputStream *ost = output_streams[i];
3311 ost->st->codec->debug = debug;
3313 if(debug) av_log_set_level(AV_LOG_DEBUG);
3314 fprintf(stderr,"debug=%d\n", debug);
3317 fprintf(stderr, "key function\n"
3318 "? show this help\n"
3319 "+ increase verbosity\n"
3320 "- decrease verbosity\n"
3321 "c Send command to filtergraph\n"
3322 "D cycle through available debug modes\n"
3323 "h dump packets/hex press to cycle through the 3 states\n"
3325 "s Show QP histogram\n"
3332 static void *input_thread(void *arg)
3337 while (!transcoding_finished && ret >= 0) {
3339 ret = av_read_frame(f->ctx, &pkt);
3341 if (ret == AVERROR(EAGAIN)) {
3348 pthread_mutex_lock(&f->fifo_lock);
3349 while (!av_fifo_space(f->fifo))
3350 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3352 av_dup_packet(&pkt);
3353 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3355 pthread_mutex_unlock(&f->fifo_lock);
3362 static void free_input_threads(void)
3366 if (nb_input_files == 1)
3369 transcoding_finished = 1;
3371 for (i = 0; i < nb_input_files; i++) {
3372 InputFile *f = input_files[i];
3378 pthread_mutex_lock(&f->fifo_lock);
3379 while (av_fifo_size(f->fifo)) {
3380 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3381 av_free_packet(&pkt);
3383 pthread_cond_signal(&f->fifo_cond);
3384 pthread_mutex_unlock(&f->fifo_lock);
3386 pthread_join(f->thread, NULL);
3389 while (av_fifo_size(f->fifo)) {
3390 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3391 av_free_packet(&pkt);
3393 av_fifo_free(f->fifo);
3397 static int init_input_threads(void)
3401 if (nb_input_files == 1)
3404 for (i = 0; i < nb_input_files; i++) {
3405 InputFile *f = input_files[i];
3407 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3408 return AVERROR(ENOMEM);
3410 pthread_mutex_init(&f->fifo_lock, NULL);
3411 pthread_cond_init (&f->fifo_cond, NULL);
3413 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3414 return AVERROR(ret);
3419 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3423 pthread_mutex_lock(&f->fifo_lock);
3425 if (av_fifo_size(f->fifo)) {
3426 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3427 pthread_cond_signal(&f->fifo_cond);
3432 ret = AVERROR(EAGAIN);
3435 pthread_mutex_unlock(&f->fifo_lock);
3441 static int get_input_packet(InputFile *f, AVPacket *pkt)
3444 if (nb_input_files > 1)
3445 return get_input_packet_mt(f, pkt);
3447 return av_read_frame(f->ctx, pkt);
3451 * The following code is the main loop of the file converter
3453 static int transcode(void)
3456 AVFormatContext *is, *os;
3460 int no_packet_count = 0;
3461 int64_t timer_start;
3463 if (!(no_packet = av_mallocz(nb_input_files)))
3466 ret = transcode_init();
3471 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3474 timer_start = av_gettime();
3477 if ((ret = init_input_threads()) < 0)
3481 for (; received_sigterm == 0;) {
3482 int file_index, ist_index;
3484 int64_t cur_time= av_gettime();
3486 /* if 'q' pressed, exits */
3488 if (check_keyboard_interaction(cur_time) < 0)
3491 /* check if there's any stream where output is still needed */
3492 if (!need_output()) {
3493 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3497 /* select the stream that we must read now */
3498 file_index = select_input_file(no_packet);
3499 /* if none, if is finished */
3500 if (file_index < 0) {
3501 if (no_packet_count) {
3502 no_packet_count = 0;
3503 memset(no_packet, 0, nb_input_files);
3507 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3511 is = input_files[file_index]->ctx;
3512 ret = get_input_packet(input_files[file_index], &pkt);
3514 if (ret == AVERROR(EAGAIN)) {
3515 no_packet[file_index] = 1;
3520 input_files[file_index]->eof_reached = 1;
3522 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3523 ist = input_streams[input_files[file_index]->ist_index + i];
3524 if (ist->decoding_needed)
3525 output_packet(ist, NULL);
3534 no_packet_count = 0;
3535 memset(no_packet, 0, nb_input_files);
3538 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3539 is->streams[pkt.stream_index]);
3541 /* the following test is needed in case new streams appear
3542 dynamically in stream : we ignore them */
3543 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3544 goto discard_packet;
3545 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3546 ist = input_streams[ist_index];
3548 goto discard_packet;
3550 if (pkt.dts != AV_NOPTS_VALUE)
3551 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3552 if (pkt.pts != AV_NOPTS_VALUE)
3553 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3555 if (pkt.pts != AV_NOPTS_VALUE)
3556 pkt.pts *= ist->ts_scale;
3557 if (pkt.dts != AV_NOPTS_VALUE)
3558 pkt.dts *= ist->ts_scale;
3561 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3562 "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",
3563 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3564 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3565 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3566 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3567 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3568 input_files[ist->file_index]->ts_offset);
3571 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3572 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3573 int64_t delta = pkt_dts - ist->next_dts;
3574 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3575 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3576 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3577 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3578 pkt_dts+1<ist->pts){
3579 input_files[ist->file_index]->ts_offset -= delta;
3580 av_log(NULL, AV_LOG_DEBUG,
3581 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3582 delta, input_files[ist->file_index]->ts_offset);
3583 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3584 if (pkt.pts != AV_NOPTS_VALUE)
3585 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3588 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3589 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3590 pkt_dts+1<ist->pts){
3591 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3592 pkt.dts = AV_NOPTS_VALUE;
3594 if (pkt.pts != AV_NOPTS_VALUE){
3595 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3596 delta = pkt_pts - ist->next_dts;
3597 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3598 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3599 pkt_pts+1<ist->pts) {
3600 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3601 pkt.pts = AV_NOPTS_VALUE;
3607 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3608 if ((ret = output_packet(ist, &pkt)) < 0 ||
3609 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3611 av_strerror(ret, buf, sizeof(buf));
3612 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3613 ist->file_index, ist->st->index, buf);
3616 av_free_packet(&pkt);
3621 av_free_packet(&pkt);
3623 /* dump report by using the output first video and audio streams */
3624 print_report(0, timer_start, cur_time);
3627 free_input_threads();
3630 /* at the end of stream, we must flush the decoder buffers */
3631 for (i = 0; i < nb_input_streams; i++) {
3632 ist = input_streams[i];
3633 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3634 output_packet(ist, NULL);
3642 /* write the trailer if needed and close file */
3643 for (i = 0; i < nb_output_files; i++) {
3644 os = output_files[i]->ctx;
3645 av_write_trailer(os);
3648 /* dump report by using the first video and audio streams */
3649 print_report(1, timer_start, av_gettime());
3651 /* close each encoder */
3652 for (i = 0; i < nb_output_streams; i++) {
3653 ost = output_streams[i];
3654 if (ost->encoding_needed) {
3655 av_freep(&ost->st->codec->stats_in);
3656 avcodec_close(ost->st->codec);
3660 /* close each decoder */
3661 for (i = 0; i < nb_input_streams; i++) {
3662 ist = input_streams[i];
3663 if (ist->decoding_needed) {
3664 avcodec_close(ist->st->codec);
3672 av_freep(&no_packet);
3674 free_input_threads();
3677 if (output_streams) {
3678 for (i = 0; i < nb_output_streams; i++) {
3679 ost = output_streams[i];
3681 if (ost->stream_copy)
3682 av_freep(&ost->st->codec->extradata);
3684 fclose(ost->logfile);
3685 ost->logfile = NULL;
3687 av_freep(&ost->st->codec->subtitle_header);
3688 av_free(ost->forced_kf_pts);
3689 av_dict_free(&ost->opts);
3696 static int opt_frame_crop(const char *opt, const char *arg)
3698 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3699 return AVERROR(EINVAL);
3702 static int opt_pad(const char *opt, const char *arg)
3704 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3708 static int opt_video_channel(const char *opt, const char *arg)
3710 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3711 return opt_default("channel", arg);
3714 static int opt_video_standard(const char *opt, const char *arg)
3716 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3717 return opt_default("standard", arg);
3720 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3722 audio_codec_name = arg;
3723 return parse_option(o, "codec:a", arg, options);
3726 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3728 video_codec_name = arg;
3729 return parse_option(o, "codec:v", arg, options);
3732 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3734 subtitle_codec_name = arg;
3735 return parse_option(o, "codec:s", arg, options);
3738 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3740 return parse_option(o, "codec:d", arg, options);
3743 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3745 StreamMap *m = NULL;
3746 int i, negative = 0, file_idx;
3747 int sync_file_idx = -1, sync_stream_idx = 0;
3755 map = av_strdup(arg);
3757 /* parse sync stream first, just pick first matching stream */
3758 if (sync = strchr(map, ',')) {
3760 sync_file_idx = strtol(sync + 1, &sync, 0);
3761 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3762 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3767 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3768 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3769 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3770 sync_stream_idx = i;
3773 if (i == input_files[sync_file_idx]->nb_streams) {
3774 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3775 "match any streams.\n", arg);
3781 if (map[0] == '[') {
3782 /* this mapping refers to lavfi output */
3783 const char *c = map + 1;
3784 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3785 &o->nb_stream_maps, o->nb_stream_maps + 1);
3786 m = &o->stream_maps[o->nb_stream_maps - 1];
3787 m->linklabel = av_get_token(&c, "]");
3788 if (!m->linklabel) {
3789 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3793 file_idx = strtol(map, &p, 0);
3794 if (file_idx >= nb_input_files || file_idx < 0) {
3795 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3799 /* disable some already defined maps */
3800 for (i = 0; i < o->nb_stream_maps; i++) {
3801 m = &o->stream_maps[i];
3802 if (file_idx == m->file_index &&
3803 check_stream_specifier(input_files[m->file_index]->ctx,
3804 input_files[m->file_index]->ctx->streams[m->stream_index],
3805 *p == ':' ? p + 1 : p) > 0)
3809 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3810 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3811 *p == ':' ? p + 1 : p) <= 0)
3813 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3814 &o->nb_stream_maps, o->nb_stream_maps + 1);
3815 m = &o->stream_maps[o->nb_stream_maps - 1];
3817 m->file_index = file_idx;
3818 m->stream_index = i;
3820 if (sync_file_idx >= 0) {
3821 m->sync_file_index = sync_file_idx;
3822 m->sync_stream_index = sync_stream_idx;
3824 m->sync_file_index = file_idx;
3825 m->sync_stream_index = i;
3831 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3839 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3841 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3842 &o->nb_attachments, o->nb_attachments + 1);
3843 o->attachments[o->nb_attachments - 1] = arg;
3847 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3853 o->audio_channel_maps =
3854 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3855 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3856 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3858 /* muted channel syntax */
3859 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3860 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3861 m->file_idx = m->stream_idx = -1;
3863 m->ofile_idx = m->ostream_idx = -1;
3868 n = sscanf(arg, "%d.%d.%d:%d.%d",
3869 &m->file_idx, &m->stream_idx, &m->channel_idx,
3870 &m->ofile_idx, &m->ostream_idx);
3872 if (n != 3 && n != 5) {
3873 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3874 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3878 if (n != 5) // only file.stream.channel specified
3879 m->ofile_idx = m->ostream_idx = -1;
3882 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3883 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3887 if (m->stream_idx < 0 ||
3888 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
3889 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3890 m->file_idx, m->stream_idx);
3893 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
3894 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3895 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3896 m->file_idx, m->stream_idx);
3899 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3900 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3901 m->file_idx, m->stream_idx, m->channel_idx);
3908 * Parse a metadata specifier in arg.
3909 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3910 * @param index for type c/p, chapter/program index is written here
3911 * @param stream_spec for type s, the stream specifier is written here
3913 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3921 if (*(++arg) && *arg != ':') {
3922 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3925 *stream_spec = *arg == ':' ? arg + 1 : "";
3929 if (*(++arg) == ':')
3930 *index = strtol(++arg, NULL, 0);
3933 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3940 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3942 AVDictionary **meta_in = NULL;
3943 AVDictionary **meta_out = NULL;
3945 char type_in, type_out;
3946 const char *istream_spec = NULL, *ostream_spec = NULL;
3947 int idx_in = 0, idx_out = 0;
3949 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3950 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3953 if (type_out == 'g' || !*outspec)
3954 o->metadata_global_manual = 1;
3955 if (type_out == 's' || !*outspec)
3956 o->metadata_streams_manual = 1;
3957 if (type_out == 'c' || !*outspec)
3958 o->metadata_chapters_manual = 1;
3962 if (type_in == 'g' || type_out == 'g')
3963 o->metadata_global_manual = 1;
3964 if (type_in == 's' || type_out == 's')
3965 o->metadata_streams_manual = 1;
3966 if (type_in == 'c' || type_out == 'c')
3967 o->metadata_chapters_manual = 1;
3969 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3970 if ((index) < 0 || (index) >= (nb_elems)) {\
3971 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3976 #define SET_DICT(type, meta, context, index)\
3979 meta = &context->metadata;\
3982 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3983 meta = &context->chapters[index]->metadata;\
3986 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3987 meta = &context->programs[index]->metadata;\
3991 SET_DICT(type_in, meta_in, ic, idx_in);
3992 SET_DICT(type_out, meta_out, oc, idx_out);
3994 /* for input streams choose first matching stream */
3995 if (type_in == 's') {
3996 for (i = 0; i < ic->nb_streams; i++) {
3997 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
3998 meta_in = &ic->streams[i]->metadata;
4004 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4009 if (type_out == 's') {
4010 for (i = 0; i < oc->nb_streams; i++) {
4011 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4012 meta_out = &oc->streams[i]->metadata;
4013 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4018 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4023 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4026 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4027 struct tm time = *gmtime((time_t*)&recording_timestamp);
4028 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4029 parse_option(o, "metadata", buf, options);
4031 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4032 "tag instead.\n", opt);
4036 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4038 const char *codec_string = encoder ? "encoder" : "decoder";
4042 avcodec_find_encoder_by_name(name) :
4043 avcodec_find_decoder_by_name(name);
4045 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4048 if (codec->type != type) {
4049 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4055 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4057 char *codec_name = NULL;
4059 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4061 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4062 st->codec->codec_id = codec->id;
4065 return avcodec_find_decoder(st->codec->codec_id);
4069 * Add all the streams from the given input file to the global
4070 * list of input streams.
4072 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4075 char *next, *codec_tag = NULL;
4077 for (i = 0; i < ic->nb_streams; i++) {
4078 AVStream *st = ic->streams[i];
4079 AVCodecContext *dec = st->codec;
4080 InputStream *ist = av_mallocz(sizeof(*ist));
4081 char *framerate = NULL;
4086 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4087 input_streams[nb_input_streams - 1] = ist;
4090 ist->file_index = nb_input_files;
4092 st->discard = AVDISCARD_ALL;
4093 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
4095 ist->ts_scale = 1.0;
4096 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4098 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4100 uint32_t tag = strtol(codec_tag, &next, 0);
4102 tag = AV_RL32(codec_tag);
4103 st->codec->codec_tag = tag;
4106 ist->dec = choose_decoder(o, ic, st);
4108 switch (dec->codec_type) {
4109 case AVMEDIA_TYPE_VIDEO:
4111 ist->dec = avcodec_find_decoder(dec->codec_id);
4113 dec->flags |= CODEC_FLAG_EMU_EDGE;
4116 ist->resample_height = dec->height;
4117 ist->resample_width = dec->width;
4118 ist->resample_pix_fmt = dec->pix_fmt;
4120 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4121 if (framerate && av_parse_video_rate(&ist->framerate,
4123 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4128 ist->top_field_first = -1;
4129 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4132 case AVMEDIA_TYPE_AUDIO:
4133 guess_input_channel_layout(ist);
4135 ist->resample_sample_fmt = dec->sample_fmt;
4136 ist->resample_sample_rate = dec->sample_rate;
4137 ist->resample_channels = dec->channels;
4138 ist->resample_channel_layout = dec->channel_layout;
4141 case AVMEDIA_TYPE_DATA:
4142 case AVMEDIA_TYPE_SUBTITLE:
4144 ist->dec = avcodec_find_decoder(dec->codec_id);
4146 case AVMEDIA_TYPE_ATTACHMENT:
4147 case AVMEDIA_TYPE_UNKNOWN:
4155 static void assert_file_overwrite(const char *filename)
4157 if ((!file_overwrite || no_file_overwrite) &&
4158 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4159 av_strstart(filename, "file:", NULL))) {
4160 if (avio_check(filename, 0) == 0) {
4161 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
4162 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4165 signal(SIGINT, SIG_DFL);
4166 if (!read_yesno()) {
4167 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4173 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4180 static void dump_attachment(AVStream *st, const char *filename)
4183 AVIOContext *out = NULL;
4184 AVDictionaryEntry *e;
4186 if (!st->codec->extradata_size) {
4187 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4188 nb_input_files - 1, st->index);
4191 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4192 filename = e->value;
4194 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4195 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4199 assert_file_overwrite(filename);
4201 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4202 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4207 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4212 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4214 AVFormatContext *ic;
4215 AVInputFormat *file_iformat = NULL;
4219 AVDictionary **opts;
4220 int orig_nb_streams; // number of streams before avformat_find_stream_info
4223 if (!(file_iformat = av_find_input_format(o->format))) {
4224 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4229 if (!strcmp(filename, "-"))
4232 using_stdin |= !strncmp(filename, "pipe:", 5) ||
4233 !strcmp(filename, "/dev/stdin");
4235 /* get default parameters from command line */
4236 ic = avformat_alloc_context();
4238 print_error(filename, AVERROR(ENOMEM));
4241 if (o->nb_audio_sample_rate) {
4242 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4243 av_dict_set(&format_opts, "sample_rate", buf, 0);
4245 if (o->nb_audio_channels) {
4246 /* because we set audio_channels based on both the "ac" and
4247 * "channel_layout" options, we need to check that the specified
4248 * demuxer actually has the "channels" option before setting it */
4249 if (file_iformat && file_iformat->priv_class &&
4250 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4251 AV_OPT_SEARCH_FAKE_OBJ)) {
4252 snprintf(buf, sizeof(buf), "%d",
4253 o->audio_channels[o->nb_audio_channels - 1].u.i);
4254 av_dict_set(&format_opts, "channels", buf, 0);
4257 if (o->nb_frame_rates) {
4258 /* set the format-level framerate option;
4259 * this is important for video grabbers, e.g. x11 */
4260 if (file_iformat && file_iformat->priv_class &&
4261 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4262 AV_OPT_SEARCH_FAKE_OBJ)) {
4263 av_dict_set(&format_opts, "framerate",
4264 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4267 if (o->nb_frame_sizes) {
4268 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4270 if (o->nb_frame_pix_fmts)
4271 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4273 ic->video_codec_id = video_codec_name ?
4274 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4275 ic->audio_codec_id = audio_codec_name ?
4276 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4277 ic->subtitle_codec_id= subtitle_codec_name ?
4278 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4279 ic->flags |= AVFMT_FLAG_NONBLOCK;
4280 ic->interrupt_callback = int_cb;
4282 /* open the input file with generic avformat function */
4283 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4285 print_error(filename, err);
4288 assert_avoptions(format_opts);
4290 /* apply forced codec ids */
4291 for (i = 0; i < ic->nb_streams; i++)
4292 choose_decoder(o, ic, ic->streams[i]);
4294 /* Set AVCodecContext options for avformat_find_stream_info */
4295 opts = setup_find_stream_info_opts(ic, codec_opts);
4296 orig_nb_streams = ic->nb_streams;
4298 /* If not enough info to get the stream parameters, we decode the
4299 first frames to get it. (used in mpeg case for example) */
4300 ret = avformat_find_stream_info(ic, opts);
4302 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4303 avformat_close_input(&ic);
4307 timestamp = o->start_time;
4308 /* add the stream start time */
4309 if (ic->start_time != AV_NOPTS_VALUE)
4310 timestamp += ic->start_time;
4312 /* if seeking requested, we execute it */
4313 if (o->start_time != 0) {
4314 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4316 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4317 filename, (double)timestamp / AV_TIME_BASE);
4321 /* update the current parameters so that they match the one of the input stream */
4322 add_input_streams(o, ic);
4324 /* dump the file content */
4325 av_dump_format(ic, nb_input_files, filename, 0);
4327 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4328 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4331 input_files[nb_input_files - 1]->ctx = ic;
4332 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4333 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4334 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4335 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4337 for (i = 0; i < o->nb_dump_attachment; i++) {
4340 for (j = 0; j < ic->nb_streams; j++) {
4341 AVStream *st = ic->streams[j];
4343 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4344 dump_attachment(st, o->dump_attachment[i].u.str);
4348 for (i = 0; i < orig_nb_streams; i++)
4349 av_dict_free(&opts[i]);
4352 reset_options(o, 1);
4356 static void parse_forced_key_frames(char *kf, OutputStream *ost)
4361 for (p = kf; *p; p++)
4364 ost->forced_kf_count = n;
4365 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
4366 if (!ost->forced_kf_pts) {
4367 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
4371 for (i = 0; i < n; i++) {
4372 char *next = strchr(p, ',');
4373 if (next) *next++ = 0;
4374 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
4379 static uint8_t *get_line(AVIOContext *s)
4385 if (avio_open_dyn_buf(&line) < 0) {
4386 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4390 while ((c = avio_r8(s)) && c != '\n')
4393 avio_close_dyn_buf(line, &buf);
4398 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4401 char filename[1000];
4402 const char *base[3] = { getenv("AVCONV_DATADIR"),
4407 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4411 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4412 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4413 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4416 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4417 i != 1 ? "" : "/.avconv", preset_name);
4418 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4424 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4426 char *codec_name = NULL;
4428 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4430 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4431 NULL, ost->st->codec->codec_type);
4432 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4433 } else if (!strcmp(codec_name, "copy"))
4434 ost->stream_copy = 1;
4436 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4437 ost->st->codec->codec_id = ost->enc->id;
4441 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4444 AVStream *st = avformat_new_stream(oc, NULL);
4445 int idx = oc->nb_streams - 1, ret = 0;
4446 char *bsf = NULL, *next, *codec_tag = NULL;
4447 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4449 char *buf = NULL, *arg = NULL, *preset = NULL;
4450 AVIOContext *s = NULL;
4453 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4457 if (oc->nb_streams - 1 < o->nb_streamid_map)
4458 st->id = o->streamid_map[oc->nb_streams - 1];
4460 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4461 nb_output_streams + 1);
4462 if (!(ost = av_mallocz(sizeof(*ost))))
4464 output_streams[nb_output_streams - 1] = ost;
4466 ost->file_index = nb_output_files;
4469 st->codec->codec_type = type;
4470 choose_encoder(o, oc, ost);
4472 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
4475 avcodec_get_context_defaults3(st->codec, ost->enc);
4476 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4478 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4479 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4482 if (!buf[0] || buf[0] == '#') {
4486 if (!(arg = strchr(buf, '='))) {
4487 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4491 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4493 } while (!s->eof_reached);
4497 av_log(NULL, AV_LOG_FATAL,
4498 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4499 preset, ost->file_index, ost->index);
4503 ost->max_frames = INT64_MAX;
4504 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4506 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4508 if (next = strchr(bsf, ','))
4510 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4511 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4515 bsfc_prev->next = bsfc;
4517 ost->bitstream_filters = bsfc;
4523 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4525 uint32_t tag = strtol(codec_tag, &next, 0);
4527 tag = AV_RL32(codec_tag);
4528 st->codec->codec_tag = tag;
4531 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4532 if (qscale >= 0 || same_quant) {
4533 st->codec->flags |= CODEC_FLAG_QSCALE;
4534 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4537 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4538 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4540 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4541 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4542 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4544 ost->source_index = source_index;
4545 if (source_index >= 0) {
4546 ost->sync_ist = input_streams[source_index];
4547 input_streams[source_index]->discard = 0;
4548 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4554 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4557 const char *p = str;
4564 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4571 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4575 AVCodecContext *video_enc;
4576 char *frame_rate = NULL;
4578 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4580 video_enc = st->codec;
4582 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4583 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4584 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4588 if (!ost->stream_copy) {
4589 const char *p = NULL;
4590 char *forced_key_frames = NULL, *frame_size = NULL;
4591 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4592 char *intra_matrix = NULL, *inter_matrix = NULL;
4593 const char *filters = "null";
4596 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4597 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4598 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4602 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4603 if (frame_aspect_ratio) {
4605 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4606 q.num <= 0 || q.den <= 0) {
4607 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4610 ost->frame_aspect_ratio = av_q2d(q);
4613 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4614 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4615 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4616 ost->keep_pix_fmt = 1;
4617 if (!*++frame_pix_fmt)
4618 frame_pix_fmt = NULL;
4620 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4621 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4624 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4627 video_enc->gop_size = 0;
4628 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4630 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4631 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4634 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4636 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4638 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4639 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4642 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4645 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4646 for (i = 0; p; i++) {
4648 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4650 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4653 /* FIXME realloc failure */
4654 video_enc->rc_override =
4655 av_realloc(video_enc->rc_override,
4656 sizeof(RcOverride) * (i + 1));
4657 video_enc->rc_override[i].start_frame = start;
4658 video_enc->rc_override[i].end_frame = end;
4660 video_enc->rc_override[i].qscale = q;
4661 video_enc->rc_override[i].quality_factor = 1.0;
4664 video_enc->rc_override[i].qscale = 0;
4665 video_enc->rc_override[i].quality_factor = -q/100.0;
4670 video_enc->rc_override_count = i;
4671 if (!video_enc->rc_initial_buffer_occupancy)
4672 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4673 video_enc->intra_dc_precision = intra_dc_precision - 8;
4676 video_enc->flags|= CODEC_FLAG_PSNR;
4681 video_enc->flags |= CODEC_FLAG_PASS1;
4684 video_enc->flags |= CODEC_FLAG_PASS2;
4688 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4689 if (forced_key_frames)
4690 parse_forced_key_frames(forced_key_frames, ost);
4692 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4694 ost->top_field_first = -1;
4695 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4697 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4698 ost->avfilter = av_strdup(filters);
4700 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4706 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4711 AVCodecContext *audio_enc;
4713 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4716 audio_enc = st->codec;
4717 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4719 if (!ost->stream_copy) {
4720 char *sample_fmt = NULL;
4721 const char *filters = "anull";
4723 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4725 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4727 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4728 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4732 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4734 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4736 av_assert1(filters);
4737 ost->avfilter = av_strdup(filters);
4739 /* check for channel mapping for this audio stream */
4740 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4741 AudioChannelMap *map = &o->audio_channel_maps[n];
4742 InputStream *ist = input_streams[ost->source_index];
4743 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4744 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4745 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4746 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4747 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4749 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4750 ost->file_index, ost->st->index);
4758 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4762 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4763 if (!ost->stream_copy) {
4764 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4771 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4773 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4774 ost->stream_copy = 1;
4778 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4782 AVCodecContext *subtitle_enc;
4784 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4786 subtitle_enc = st->codec;
4788 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4790 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4795 /* arg format is "output-stream-index:streamid-value". */
4796 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4802 av_strlcpy(idx_str, arg, sizeof(idx_str));
4803 p = strchr(idx_str, ':');
4805 av_log(NULL, AV_LOG_FATAL,
4806 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4811 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4812 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4813 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4817 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4819 AVFormatContext *is = ifile->ctx;
4820 AVFormatContext *os = ofile->ctx;
4823 for (i = 0; i < is->nb_chapters; i++) {
4824 AVChapter *in_ch = is->chapters[i], *out_ch;
4825 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4826 AV_TIME_BASE_Q, in_ch->time_base);
4827 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4828 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4831 if (in_ch->end < ts_off)
4833 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4836 out_ch = av_mallocz(sizeof(AVChapter));
4838 return AVERROR(ENOMEM);
4840 out_ch->id = in_ch->id;
4841 out_ch->time_base = in_ch->time_base;
4842 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4843 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4846 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4849 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4851 return AVERROR(ENOMEM);
4852 os->chapters[os->nb_chapters - 1] = out_ch;
4857 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4860 AVFormatContext *ic = avformat_alloc_context();
4862 ic->interrupt_callback = int_cb;
4863 err = avformat_open_input(&ic, filename, NULL, NULL);
4866 /* copy stream format */
4867 for(i=0;i<ic->nb_streams;i++) {
4871 AVCodecContext *avctx;
4873 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4874 ost = new_output_stream(o, s, codec->type, -1);
4879 // FIXME: a more elegant solution is needed
4880 memcpy(st, ic->streams[i], sizeof(AVStream));
4882 st->info = av_malloc(sizeof(*st->info));
4883 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4885 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4887 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4888 choose_sample_fmt(st, codec);
4889 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4890 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
4893 avformat_close_input(&ic);
4897 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
4898 AVFormatContext *oc)
4902 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
4903 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
4904 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
4906 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
4911 ost->source_index = -1;
4912 ost->filter = ofilter;
4916 if (ost->stream_copy) {
4917 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
4918 "which is fed from a complex filtergraph. Filtering and streamcopy "
4919 "cannot be used together.\n", ost->file_index, ost->index);
4923 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
4924 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
4927 avfilter_inout_free(&ofilter->out_tmp);
4930 static void opt_output_file(void *optctx, const char *filename)
4932 OptionsContext *o = optctx;
4933 AVFormatContext *oc;
4935 AVOutputFormat *file_oformat;
4939 if (configure_complex_filters() < 0) {
4940 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
4944 if (!strcmp(filename, "-"))
4947 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4949 print_error(filename, err);
4952 file_oformat= oc->oformat;
4953 oc->interrupt_callback = int_cb;
4955 /* create streams for all unlabeled output pads */
4956 for (i = 0; i < nb_filtergraphs; i++) {
4957 FilterGraph *fg = filtergraphs[i];
4958 for (j = 0; j < fg->nb_outputs; j++) {
4959 OutputFilter *ofilter = fg->outputs[j];
4961 if (!ofilter->out_tmp || ofilter->out_tmp->name)
4964 switch (ofilter->out_tmp->filter_ctx->output_pads[ofilter->out_tmp->pad_idx].type) {
4965 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
4966 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
4967 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
4969 init_output_filter(ofilter, o, oc);
4973 if (!strcmp(file_oformat->name, "ffm") &&
4974 av_strstart(filename, "http:", NULL)) {
4976 /* special case for files sent to ffserver: we get the stream
4977 parameters from ffserver */
4978 int err = read_ffserver_streams(o, oc, filename);
4980 print_error(filename, err);
4983 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4984 ost = output_streams[j];
4985 for (i = 0; i < nb_input_streams; i++) {
4986 ist = input_streams[i];
4987 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4989 ost->source_index= i;
4990 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
4991 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
4993 ist->st->discard = AVDISCARD_NONE;
4998 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));
5002 } else if (!o->nb_stream_maps) {
5003 /* pick the "best" stream of each type */
5005 /* video: highest resolution */
5006 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5007 int area = 0, idx = -1;
5008 for (i = 0; i < nb_input_streams; i++) {
5009 ist = input_streams[i];
5010 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5011 ist->st->codec->width * ist->st->codec->height > area) {
5012 area = ist->st->codec->width * ist->st->codec->height;
5017 new_video_stream(o, oc, idx);
5020 /* audio: most channels */
5021 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5022 int channels = 0, idx = -1;
5023 for (i = 0; i < nb_input_streams; i++) {
5024 ist = input_streams[i];
5025 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5026 ist->st->codec->channels > channels) {
5027 channels = ist->st->codec->channels;
5032 new_audio_stream(o, oc, idx);
5035 /* subtitles: pick first */
5036 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5037 for (i = 0; i < nb_input_streams; i++)
5038 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5039 new_subtitle_stream(o, oc, i);
5043 /* do something with data? */
5045 for (i = 0; i < o->nb_stream_maps; i++) {
5046 StreamMap *map = &o->stream_maps[i];
5047 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5052 if (map->linklabel) {
5054 OutputFilter *ofilter = NULL;
5057 for (j = 0; j < nb_filtergraphs; j++) {
5058 fg = filtergraphs[j];
5059 for (k = 0; k < fg->nb_outputs; k++) {
5060 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5061 if (out && !strcmp(out->name, map->linklabel)) {
5062 ofilter = fg->outputs[k];
5069 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5070 "in any defined filter graph.\n", map->linklabel);
5073 init_output_filter(ofilter, o, oc);
5075 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5076 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5078 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5080 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5082 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5085 switch (ist->st->codec->codec_type) {
5086 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5087 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5088 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5089 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5090 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5092 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5093 map->file_index, map->stream_index);
5101 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5102 AVDictionaryEntry *e;
5103 ost = output_streams[i];
5105 if ( ost->stream_copy
5106 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5107 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5108 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5112 /* handle attached files */
5113 for (i = 0; i < o->nb_attachments; i++) {
5115 uint8_t *attachment;
5119 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5120 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5124 if ((len = avio_size(pb)) <= 0) {
5125 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5129 if (!(attachment = av_malloc(len))) {
5130 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5134 avio_read(pb, attachment, len);
5136 ost = new_attachment_stream(o, oc, -1);
5137 ost->stream_copy = 0;
5138 ost->attachment_filename = o->attachments[i];
5139 ost->st->codec->extradata = attachment;
5140 ost->st->codec->extradata_size = len;
5142 p = strrchr(o->attachments[i], '/');
5143 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5147 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5148 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5151 output_files[nb_output_files - 1]->ctx = oc;
5152 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5153 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5154 if (o->recording_time != INT64_MAX)
5155 oc->duration = o->recording_time;
5156 output_files[nb_output_files - 1]->start_time = o->start_time;
5157 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5158 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5160 /* check filename in case of an image number is expected */
5161 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5162 if (!av_filename_number_test(oc->filename)) {
5163 print_error(oc->filename, AVERROR(EINVAL));
5168 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5169 /* test if it already exists to avoid losing precious files */
5170 assert_file_overwrite(filename);
5173 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5174 &oc->interrupt_callback,
5175 &output_files[nb_output_files - 1]->opts)) < 0) {
5176 print_error(filename, err);
5181 if (o->mux_preload) {
5183 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5184 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5186 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5189 for (i = 0; i < o->nb_metadata_map; i++) {
5191 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5193 if (in_file_index >= nb_input_files) {
5194 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5197 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5201 if (o->chapters_input_file >= nb_input_files) {
5202 if (o->chapters_input_file == INT_MAX) {
5203 /* copy chapters from the first input file that has them*/
5204 o->chapters_input_file = -1;
5205 for (i = 0; i < nb_input_files; i++)
5206 if (input_files[i]->ctx->nb_chapters) {
5207 o->chapters_input_file = i;
5211 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5212 o->chapters_input_file);
5216 if (o->chapters_input_file >= 0)
5217 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5218 !o->metadata_chapters_manual);
5220 /* copy global metadata by default */
5221 if (!o->metadata_global_manual && nb_input_files){
5222 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5223 AV_DICT_DONT_OVERWRITE);
5224 if(o->recording_time != INT64_MAX)
5225 av_dict_set(&oc->metadata, "duration", NULL, 0);
5227 if (!o->metadata_streams_manual)
5228 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5230 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5232 ist = input_streams[output_streams[i]->source_index];
5233 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5236 /* process manually set metadata */
5237 for (i = 0; i < o->nb_metadata; i++) {
5240 const char *stream_spec;
5241 int index = 0, j, ret = 0;
5243 val = strchr(o->metadata[i].u.str, '=');
5245 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5246 o->metadata[i].u.str);
5251 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5253 for (j = 0; j < oc->nb_streams; j++) {
5254 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5255 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5259 printf("ret %d, stream_spec %s\n", ret, stream_spec);
5267 if (index < 0 || index >= oc->nb_chapters) {
5268 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5271 m = &oc->chapters[index]->metadata;
5274 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5277 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5281 reset_options(o, 0);
5284 /* same option as mencoder */
5285 static int opt_pass(const char *opt, const char *arg)
5287 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5291 static int64_t getmaxrss(void)
5293 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5294 struct rusage rusage;
5295 getrusage(RUSAGE_SELF, &rusage);
5296 return (int64_t)rusage.ru_maxrss * 1024;
5297 #elif HAVE_GETPROCESSMEMORYINFO
5299 PROCESS_MEMORY_COUNTERS memcounters;
5300 proc = GetCurrentProcess();
5301 memcounters.cb = sizeof(memcounters);
5302 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5303 return memcounters.PeakPagefileUsage;
5309 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5311 return parse_option(o, "q:a", arg, options);
5314 static void show_usage(void)
5316 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5317 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5318 av_log(NULL, AV_LOG_INFO, "\n");
5321 static int opt_help(const char *opt, const char *arg)
5323 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5324 av_log_set_callback(log_callback_help);
5326 show_help_options(options, "Main options:\n",
5327 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5328 show_help_options(options, "\nAdvanced options:\n",
5329 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5331 show_help_options(options, "\nVideo options:\n",
5332 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5334 show_help_options(options, "\nAdvanced Video options:\n",
5335 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5336 OPT_VIDEO | OPT_EXPERT);
5337 show_help_options(options, "\nAudio options:\n",
5338 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5340 show_help_options(options, "\nAdvanced Audio options:\n",
5341 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5342 OPT_AUDIO | OPT_EXPERT);
5343 show_help_options(options, "\nSubtitle options:\n",
5344 OPT_SUBTITLE | OPT_GRAB,
5346 show_help_options(options, "\nAudio/Video grab options:\n",
5350 show_help_children(avcodec_get_class(), flags);
5351 show_help_children(avformat_get_class(), flags);
5352 show_help_children(sws_get_class(), flags);
5357 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5359 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5360 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5362 if (!strncmp(arg, "pal-", 4)) {
5365 } else if (!strncmp(arg, "ntsc-", 5)) {
5368 } else if (!strncmp(arg, "film-", 5)) {
5372 /* Try to determine PAL/NTSC by peeking in the input files */
5373 if (nb_input_files) {
5375 for (j = 0; j < nb_input_files; j++) {
5376 for (i = 0; i < input_files[j]->nb_streams; i++) {
5377 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5378 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5380 fr = c->time_base.den * 1000 / c->time_base.num;
5384 } else if ((fr == 29970) || (fr == 23976)) {
5389 if (norm != UNKNOWN)
5393 if (norm != UNKNOWN)
5394 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5397 if (norm == UNKNOWN) {
5398 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5399 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5400 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5404 if (!strcmp(arg, "vcd")) {
5405 opt_video_codec(o, "c:v", "mpeg1video");
5406 opt_audio_codec(o, "c:a", "mp2");
5407 parse_option(o, "f", "vcd", options);
5409 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5410 parse_option(o, "r", frame_rates[norm], options);
5411 opt_default("g", norm == PAL ? "15" : "18");
5413 opt_default("b:v", "1150000");
5414 opt_default("maxrate", "1150000");
5415 opt_default("minrate", "1150000");
5416 opt_default("bufsize", "327680"); // 40*1024*8;
5418 opt_default("b:a", "224000");
5419 parse_option(o, "ar", "44100", options);
5420 parse_option(o, "ac", "2", options);
5422 opt_default("packetsize", "2324");
5423 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5425 /* We have to offset the PTS, so that it is consistent with the SCR.
5426 SCR starts at 36000, but the first two packs contain only padding
5427 and the first pack from the other stream, respectively, may also have
5428 been written before.
5429 So the real data starts at SCR 36000+3*1200. */
5430 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5431 } else if (!strcmp(arg, "svcd")) {
5433 opt_video_codec(o, "c:v", "mpeg2video");
5434 opt_audio_codec(o, "c:a", "mp2");
5435 parse_option(o, "f", "svcd", options);
5437 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5438 parse_option(o, "r", frame_rates[norm], options);
5439 parse_option(o, "pix_fmt", "yuv420p", options);
5440 opt_default("g", norm == PAL ? "15" : "18");
5442 opt_default("b:v", "2040000");
5443 opt_default("maxrate", "2516000");
5444 opt_default("minrate", "0"); // 1145000;
5445 opt_default("bufsize", "1835008"); // 224*1024*8;
5446 opt_default("scan_offset", "1");
5449 opt_default("b:a", "224000");
5450 parse_option(o, "ar", "44100", options);
5452 opt_default("packetsize", "2324");
5454 } else if (!strcmp(arg, "dvd")) {
5456 opt_video_codec(o, "c:v", "mpeg2video");
5457 opt_audio_codec(o, "c:a", "ac3");
5458 parse_option(o, "f", "dvd", options);
5460 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5461 parse_option(o, "r", frame_rates[norm], options);
5462 parse_option(o, "pix_fmt", "yuv420p", options);
5463 opt_default("g", norm == PAL ? "15" : "18");
5465 opt_default("b:v", "6000000");
5466 opt_default("maxrate", "9000000");
5467 opt_default("minrate", "0"); // 1500000;
5468 opt_default("bufsize", "1835008"); // 224*1024*8;
5470 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5471 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5473 opt_default("b:a", "448000");
5474 parse_option(o, "ar", "48000", options);
5476 } else if (!strncmp(arg, "dv", 2)) {
5478 parse_option(o, "f", "dv", options);
5480 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5481 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5482 norm == PAL ? "yuv420p" : "yuv411p", options);
5483 parse_option(o, "r", frame_rates[norm], options);
5485 parse_option(o, "ar", "48000", options);
5486 parse_option(o, "ac", "2", options);
5489 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5490 return AVERROR(EINVAL);
5495 static int opt_vstats_file(const char *opt, const char *arg)
5497 av_free (vstats_filename);
5498 vstats_filename = av_strdup (arg);
5502 static int opt_vstats(const char *opt, const char *arg)
5505 time_t today2 = time(NULL);
5506 struct tm *today = localtime(&today2);
5508 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5510 return opt_vstats_file(opt, filename);
5513 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5515 return parse_option(o, "frames:v", arg, options);
5518 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5520 return parse_option(o, "frames:a", arg, options);
5523 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5525 return parse_option(o, "frames:d", arg, options);
5528 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5531 char filename[1000], line[1000], tmp_line[1000];
5532 const char *codec_name = *opt == 'v' ? video_codec_name :
5533 *opt == 'a' ? audio_codec_name :
5534 subtitle_codec_name;
5536 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5537 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5538 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5540 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5544 while (fgets(line, sizeof(line), f)) {
5545 char *key = tmp_line, *value, *endptr;
5547 if (strcspn(line, "#\n\r") == 0)
5549 strcpy(tmp_line, line);
5550 if (!av_strtok(key, "=", &value) ||
5551 !av_strtok(value, "\r\n", &endptr)) {
5552 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5555 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5557 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5558 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5559 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5560 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5561 else if (opt_default(key, value) < 0) {
5562 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5563 filename, line, key, value);
5573 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5577 static int opt_passlogfile(const char *opt, const char *arg)
5579 pass_logfilename_prefix = arg;
5580 #if CONFIG_LIBX264_ENCODER
5581 return opt_default(opt, arg);
5587 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5589 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5590 int ret = parse_option(o, s, arg, options);
5595 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5597 if(!strcmp(opt, "b")){
5598 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5599 return parse_option(o, "b:v", arg, options);
5601 return opt_default(opt, arg);
5604 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5608 if(!strcmp(opt, "qscale")){
5609 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5610 return parse_option(o, "q:v", arg, options);
5612 s = av_asprintf("q%s", opt + 6);
5613 ret = parse_option(o, s, arg, options);
5618 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5620 if(!strcmp(opt, "profile")){
5621 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5622 return parse_option(o, "profile:v", arg, options);
5624 return opt_default(opt, arg);
5627 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5629 return parse_option(o, "filter:v", arg, options);
5632 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5634 return parse_option(o, "filter:a", arg, options);
5637 static int opt_vsync(const char *opt, const char *arg)
5639 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5640 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5641 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5642 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5644 if (video_sync_method == VSYNC_AUTO)
5645 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5649 static int opt_deinterlace(const char *opt, const char *arg)
5651 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5656 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5658 char *tcr = av_asprintf("timecode=%s", arg);
5659 int ret = parse_option(o, "metadata:g", tcr, options);
5661 ret = opt_default("gop_timecode", arg);
5666 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5668 int idx = locate_option(argc, argv, options, "cpuflags");
5669 if (idx && argv[idx + 1])
5670 opt_cpuflags("cpuflags", argv[idx + 1]);
5673 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5675 char layout_str[32];
5678 int ret, channels, ac_str_size;
5681 layout = av_get_channel_layout(arg);
5683 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5684 return AVERROR(EINVAL);
5686 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5687 ret = opt_default(opt, layout_str);
5691 /* set 'ac' option based on channel layout */
5692 channels = av_get_channel_layout_nb_channels(layout);
5693 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5694 stream_str = strchr(opt, ':');
5695 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5696 ac_str = av_mallocz(ac_str_size);
5698 return AVERROR(ENOMEM);
5699 av_strlcpy(ac_str, "ac", 3);
5701 av_strlcat(ac_str, stream_str, ac_str_size);
5702 ret = parse_option(o, ac_str, layout_str, options);
5708 static int opt_filter_complex(const char *opt, const char *arg)
5710 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5711 &nb_filtergraphs, nb_filtergraphs + 1);
5712 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5713 return AVERROR(ENOMEM);
5714 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5715 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5719 #define OFFSET(x) offsetof(OptionsContext, x)
5720 static const OptionDef options[] = {
5722 #include "cmdutils_common_opts.h"
5723 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5724 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5725 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5726 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5727 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5728 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5729 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5730 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5731 { "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]" },
5732 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5733 "outfile[,metadata]:infile[,metadata]" },
5734 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5735 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5736 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5737 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5738 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5739 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5740 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5741 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5742 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5743 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5744 "add timings for benchmarking" },
5745 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5746 "add timings for each task" },
5747 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5748 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5749 "dump each input packet" },
5750 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5751 "when dumping packets, also dump the payload" },
5752 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5753 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5754 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5755 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5756 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5757 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5758 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5759 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5760 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5761 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5762 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5763 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5764 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5765 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5766 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5767 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5768 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5769 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5770 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5771 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5772 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5773 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5774 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5777 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5778 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5779 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5780 { "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" },
5781 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5782 { "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" },
5783 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5784 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5785 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5786 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5787 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5788 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5789 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5790 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5791 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5792 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5793 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5794 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5795 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5796 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5797 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5798 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5799 "use same quantizer as source (implies VBR)" },
5800 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
5801 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5802 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5803 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5804 "this option is deprecated, use the yadif filter instead" },
5805 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5806 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5807 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5808 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5809 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5810 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5811 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5812 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5813 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5814 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5815 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5816 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5817 { "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" },
5818 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5821 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5822 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5823 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5824 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5825 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5826 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5827 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5828 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5829 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5830 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5831 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
5833 /* subtitle options */
5834 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5835 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5836 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5839 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5840 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5841 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5844 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5845 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5847 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5848 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5849 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5851 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5852 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5853 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5854 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5855 /* data codec support */
5856 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5857 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5859 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5863 int main(int argc, char **argv)
5865 OptionsContext o = { 0 };
5868 reset_options(&o, 0);
5870 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5871 parse_loglevel(argc, argv, options);
5873 if(argc>1 && !strcmp(argv[1], "-d")){
5875 av_log_set_callback(log_callback_null);
5880 avcodec_register_all();
5882 avdevice_register_all();
5884 avfilter_register_all();
5886 avformat_network_init();
5888 show_banner(argc, argv, options);
5892 parse_cpuflags(argc, argv, options);
5895 parse_options(&o, argc, argv, options, opt_output_file);
5897 if (nb_output_files <= 0 && nb_input_files == 0) {
5899 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5903 /* file converter / grab */
5904 if (nb_output_files <= 0) {
5905 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5909 if (nb_input_files == 0) {
5910 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5914 current_time = ti = getutime();
5915 if (transcode() < 0)
5917 ti = getutime() - ti;
5919 int maxrss = getmaxrss() / 1024;
5920 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);