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>
66 #include <sys/resource.h>
67 #elif HAVE_GETPROCESSTIMES
70 #if HAVE_GETPROCESSMEMORYINFO
76 #include <sys/select.h>
81 #include <sys/ioctl.h>
96 #include "libavutil/avassert.h"
99 #define VSYNC_PASSTHROUGH 0
102 #define VSYNC_DROP 0xff
106 const char program_name[] = "ffmpeg";
107 const int program_birth_year = 2000;
109 /* select an input stream for an output stream */
110 typedef struct StreamMap {
111 int disabled; /** 1 is this mapping is disabled by a negative map */
115 int sync_stream_index;
116 char *linklabel; /** name of an output link, for mapping lavfi outputs */
120 int file_idx, stream_idx, channel_idx; // input
121 int ofile_idx, ostream_idx; // output
124 static const OptionDef options[];
126 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
128 static int frame_bits_per_raw_sample = 0;
129 static int video_discard = 0;
130 static int same_quant = 0;
131 static int do_deinterlace = 0;
132 static int intra_dc_precision = 8;
133 static int qp_hist = 0;
134 static int intra_only = 0;
135 static const char *video_codec_name = NULL;
136 static const char *audio_codec_name = NULL;
137 static const char *subtitle_codec_name = NULL;
139 static int file_overwrite = 0;
140 static int no_file_overwrite = 0;
141 static int do_benchmark = 0;
142 static int do_benchmark_all = 0;
143 static int do_hex_dump = 0;
144 static int do_pkt_dump = 0;
145 static int do_psnr = 0;
146 static int do_pass = 0;
147 static const char *pass_logfilename_prefix;
148 static int video_sync_method = VSYNC_AUTO;
149 static int audio_sync_method = 0;
150 static float audio_drift_threshold = 0.1;
151 static int copy_ts = 0;
152 static int copy_tb = -1;
153 static int opt_shortest = 0;
154 static char *vstats_filename;
155 static FILE *vstats_file;
157 static int audio_volume = 256;
159 static int exit_on_error = 0;
160 static int using_stdin = 0;
161 static int run_as_daemon = 0;
162 static volatile int received_nb_signals = 0;
163 static int64_t video_size = 0;
164 static int64_t audio_size = 0;
165 static int64_t subtitle_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 = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
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", avfilter_pad_get_name(pads, inout->pad_idx));\
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 (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
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 (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
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);
1691 subtitle_size += pkt.size;
1695 static void do_video_out(AVFormatContext *s,
1697 AVFrame *in_picture,
1700 int ret, format_video_sync;
1702 AVCodecContext *enc = ost->st->codec;
1704 double sync_ipts, delta;
1705 double duration = 0;
1707 InputStream *ist = NULL;
1709 if (ost->source_index >= 0)
1710 ist = input_streams[ost->source_index];
1712 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1713 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1715 sync_ipts = in_picture->pts;
1716 delta = sync_ipts - ost->sync_opts + duration;
1718 /* by default, we output a single frame */
1721 format_video_sync = video_sync_method;
1722 if (format_video_sync == VSYNC_AUTO)
1723 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1725 switch (format_video_sync) {
1727 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1730 else if (delta > 1.1)
1731 nb_frames = lrintf(delta);
1736 else if (delta > 0.6)
1737 ost->sync_opts = lrint(sync_ipts);
1740 case VSYNC_PASSTHROUGH:
1741 ost->sync_opts = lrint(sync_ipts);
1747 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1748 if (nb_frames == 0) {
1750 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1752 } else if (nb_frames > 1) {
1753 nb_frames_dup += nb_frames - 1;
1754 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1759 av_init_packet(&pkt);
1763 in_picture->pts = ost->sync_opts;
1765 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1766 enc->codec->id == CODEC_ID_RAWVIDEO) {
1767 /* raw pictures are written as AVPicture structure to
1768 avoid any copies. We support temporarily the older
1770 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1771 enc->coded_frame->top_field_first = in_picture->top_field_first;
1772 pkt.data = (uint8_t *)in_picture;
1773 pkt.size = sizeof(AVPicture);
1774 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1775 pkt.flags |= AV_PKT_FLAG_KEY;
1777 write_frame(s, &pkt, ost);
1778 video_size += pkt.size;
1781 AVFrame big_picture;
1783 big_picture = *in_picture;
1784 /* better than nothing: use input picture interlaced
1786 big_picture.interlaced_frame = in_picture->interlaced_frame;
1787 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1788 if (ost->top_field_first == -1)
1789 big_picture.top_field_first = in_picture->top_field_first;
1791 big_picture.top_field_first = !!ost->top_field_first;
1794 /* handles same_quant here. This is not correct because it may
1795 not be a global option */
1796 big_picture.quality = quality;
1797 if (!enc->me_threshold)
1798 big_picture.pict_type = 0;
1799 if (ost->forced_kf_index < ost->forced_kf_count &&
1800 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1801 big_picture.pict_type = AV_PICTURE_TYPE_I;
1802 ost->forced_kf_index++;
1804 update_benchmark(NULL);
1805 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1806 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1808 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1813 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1814 pkt.pts = ost->sync_opts;
1816 if (pkt.pts != AV_NOPTS_VALUE)
1817 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1818 if (pkt.dts != AV_NOPTS_VALUE)
1819 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1822 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1823 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1824 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1825 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1828 write_frame(s, &pkt, ost);
1829 frame_size = pkt.size;
1830 video_size += pkt.size;
1831 av_free_packet(&pkt);
1833 /* if two pass, output log */
1834 if (ost->logfile && enc->stats_out) {
1835 fprintf(ost->logfile, "%s", enc->stats_out);
1841 * For video, number of frames in == number of packets out.
1842 * But there may be reordering, so we can't throw away frames on encoder
1843 * flush, we need to limit them here, before they go into encoder.
1845 ost->frame_number++;
1848 goto duplicate_frame;
1850 if (vstats_filename && frame_size)
1851 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1854 static double psnr(double d)
1856 return -10.0 * log(d) / log(10.0);
1859 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1862 AVCodecContext *enc;
1864 double ti1, bitrate, avg_bitrate;
1866 /* this is executed just the first time do_video_stats is called */
1868 vstats_file = fopen(vstats_filename, "w");
1875 enc = ost->st->codec;
1876 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1877 frame_number = ost->frame_number;
1878 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1879 if (enc->flags&CODEC_FLAG_PSNR)
1880 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1882 fprintf(vstats_file,"f_size= %6d ", frame_size);
1883 /* compute pts value */
1884 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1888 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1889 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1890 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1891 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1892 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1896 /* check for new output on any of the filtergraphs */
1897 static int poll_filters(void)
1899 AVFilterBufferRef *picref;
1900 AVFrame *filtered_frame = NULL;
1901 int i, ret, ret_all;
1902 unsigned nb_success, nb_eof;
1906 /* Reap all buffers present in the buffer sinks */
1907 for (i = 0; i < nb_output_streams; i++) {
1908 OutputStream *ost = output_streams[i];
1909 OutputFile *of = output_files[ost->file_index];
1915 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1916 return AVERROR(ENOMEM);
1918 avcodec_get_frame_defaults(ost->filtered_frame);
1919 filtered_frame = ost->filtered_frame;
1921 while (!ost->is_past_recording_time) {
1922 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
1923 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
1924 ret = av_buffersink_read_samples(ost->filter->filter, &picref,
1925 ost->st->codec->frame_size);
1928 ret = av_buffersink_read(ost->filter->filter, &picref);
1930 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1931 AV_BUFFERSINK_FLAG_NO_REQUEST);
1934 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1936 av_strerror(ret, buf, sizeof(buf));
1937 av_log(NULL, AV_LOG_WARNING,
1938 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1942 frame_pts = AV_NOPTS_VALUE;
1943 if (picref->pts != AV_NOPTS_VALUE) {
1944 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1945 ost->filter->filter->inputs[0]->time_base,
1946 ost->st->codec->time_base) -
1947 av_rescale_q(of->start_time,
1949 ost->st->codec->time_base);
1951 if (of->start_time && filtered_frame->pts < 0) {
1952 avfilter_unref_buffer(picref);
1956 //if (ost->source_index >= 0)
1957 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1960 switch (ost->filter->filter->inputs[0]->type) {
1961 case AVMEDIA_TYPE_VIDEO:
1962 avfilter_fill_frame_from_video_buffer_ref(filtered_frame, picref);
1963 filtered_frame->pts = frame_pts;
1964 if (!ost->frame_aspect_ratio)
1965 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1967 do_video_out(of->ctx, ost, filtered_frame,
1968 same_quant ? ost->last_quality :
1969 ost->st->codec->global_quality);
1971 case AVMEDIA_TYPE_AUDIO:
1972 avfilter_copy_buf_props(filtered_frame, picref);
1973 filtered_frame->pts = frame_pts;
1974 do_audio_out(of->ctx, ost, filtered_frame);
1977 // TODO support subtitle filters
1981 avfilter_unref_buffer(picref);
1984 /* Request frames through all the graphs */
1985 ret_all = nb_success = nb_eof = 0;
1986 for (i = 0; i < nb_filtergraphs; i++) {
1987 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
1990 } else if (ret == AVERROR_EOF) {
1992 } else if (ret != AVERROR(EAGAIN)) {
1994 av_strerror(ret, buf, sizeof(buf));
1995 av_log(NULL, AV_LOG_WARNING,
1996 "Error in request_frame(): %s\n", buf);
2002 /* Try again if anything succeeded */
2004 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2007 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2011 AVFormatContext *oc;
2013 AVCodecContext *enc;
2014 int frame_number, vid, i;
2016 int64_t pts = INT64_MAX;
2017 static int64_t last_time = -1;
2018 static int qp_histogram[52];
2019 int hours, mins, secs, us;
2021 if (!print_stats && !is_last_report)
2024 if (!is_last_report) {
2025 if (last_time == -1) {
2026 last_time = cur_time;
2029 if ((cur_time - last_time) < 500000)
2031 last_time = cur_time;
2035 oc = output_files[0]->ctx;
2037 total_size = avio_size(oc->pb);
2038 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2039 total_size = avio_tell(oc->pb);
2046 for (i = 0; i < nb_output_streams; i++) {
2048 ost = output_streams[i];
2049 enc = ost->st->codec;
2050 if (!ost->stream_copy && enc->coded_frame)
2051 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2052 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2053 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2055 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2056 float fps, t = (cur_time-timer_start) / 1000000.0;
2058 frame_number = ost->frame_number;
2059 fps = t > 1 ? frame_number / t : 0;
2060 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2061 frame_number, fps < 9.95, fps, q);
2063 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2067 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2069 for (j = 0; j < 32; j++)
2070 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2072 if (enc->flags&CODEC_FLAG_PSNR) {
2074 double error, error_sum = 0;
2075 double scale, scale_sum = 0;
2076 char type[3] = { 'Y','U','V' };
2077 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2078 for (j = 0; j < 3; j++) {
2079 if (is_last_report) {
2080 error = enc->error[j];
2081 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2083 error = enc->coded_frame->error[j];
2084 scale = enc->width * enc->height * 255.0 * 255.0;
2090 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error / scale));
2092 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2096 /* compute min output value */
2097 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2098 ost->st->time_base, AV_TIME_BASE_Q));
2101 secs = pts / AV_TIME_BASE;
2102 us = pts % AV_TIME_BASE;
2108 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2110 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2111 "size=%8.0fkB time=", total_size / 1024.0);
2112 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2113 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2114 (100 * us) / AV_TIME_BASE);
2115 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2116 "bitrate=%6.1fkbits/s", bitrate);
2118 if (nb_frames_dup || nb_frames_drop)
2119 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2120 nb_frames_dup, nb_frames_drop);
2122 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2126 if (is_last_report) {
2127 int64_t raw= audio_size + video_size + subtitle_size + extra_size;
2128 av_log(NULL, AV_LOG_INFO, "\n");
2129 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
2130 video_size / 1024.0,
2131 audio_size / 1024.0,
2132 subtitle_size / 1024.0,
2133 extra_size / 1024.0,
2134 100.0 * (total_size - raw) / raw
2136 if(video_size + audio_size + subtitle_size + extra_size == 0){
2137 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2142 static void flush_encoders(void)
2146 for (i = 0; i < nb_output_streams; i++) {
2147 OutputStream *ost = output_streams[i];
2148 AVCodecContext *enc = ost->st->codec;
2149 AVFormatContext *os = output_files[ost->file_index]->ctx;
2150 int stop_encoding = 0;
2152 if (!ost->encoding_needed)
2155 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2157 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2161 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2165 switch (ost->st->codec->codec_type) {
2166 case AVMEDIA_TYPE_AUDIO:
2167 encode = avcodec_encode_audio2;
2171 case AVMEDIA_TYPE_VIDEO:
2172 encode = avcodec_encode_video2;
2183 av_init_packet(&pkt);
2187 update_benchmark(NULL);
2188 ret = encode(enc, &pkt, NULL, &got_packet);
2189 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2191 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2195 if (ost->logfile && enc->stats_out) {
2196 fprintf(ost->logfile, "%s", enc->stats_out);
2202 if (pkt.pts != AV_NOPTS_VALUE)
2203 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2204 if (pkt.dts != AV_NOPTS_VALUE)
2205 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2206 write_frame(os, &pkt, ost);
2216 * Check whether a packet from ist should be written into ost at this time
2218 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2220 OutputFile *of = output_files[ost->file_index];
2221 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2223 if (ost->source_index != ist_index)
2226 if (of->start_time && ist->pts < of->start_time)
2229 if (of->recording_time != INT64_MAX &&
2230 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
2231 (AVRational){ 1, 1000000 }) >= 0) {
2232 ost->is_past_recording_time = 1;
2239 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2241 OutputFile *of = output_files[ost->file_index];
2242 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2246 av_init_packet(&opkt);
2248 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2249 !ost->copy_initial_nonkeyframes)
2252 /* force the input stream PTS */
2253 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2254 audio_size += pkt->size;
2255 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2256 video_size += pkt->size;
2258 } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2259 subtitle_size += pkt->size;
2262 if (pkt->pts != AV_NOPTS_VALUE)
2263 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2265 opkt.pts = AV_NOPTS_VALUE;
2267 if (pkt->dts == AV_NOPTS_VALUE)
2268 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2270 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2271 opkt.dts -= ost_tb_start_time;
2273 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2274 opkt.flags = pkt->flags;
2276 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2277 if ( ost->st->codec->codec_id != CODEC_ID_H264
2278 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2279 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2280 && ost->st->codec->codec_id != CODEC_ID_VC1
2282 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2283 opkt.destruct = av_destruct_packet;
2285 opkt.data = pkt->data;
2286 opkt.size = pkt->size;
2288 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2289 /* store AVPicture in AVPacket, as expected by the output format */
2290 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2291 opkt.data = (uint8_t *)&pict;
2292 opkt.size = sizeof(AVPicture);
2293 opkt.flags |= AV_PKT_FLAG_KEY;
2296 write_frame(of->ctx, &opkt, ost);
2297 ost->st->codec->frame_number++;
2298 av_free_packet(&opkt);
2301 static void rate_emu_sleep(InputStream *ist)
2303 if (input_files[ist->file_index]->rate_emu) {
2304 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2305 int64_t now = av_gettime() - ist->start;
2311 static int guess_input_channel_layout(InputStream *ist)
2313 AVCodecContext *dec = ist->st->codec;
2315 if (!dec->channel_layout) {
2316 char layout_name[256];
2318 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2319 if (!dec->channel_layout)
2321 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2322 dec->channels, dec->channel_layout);
2323 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2324 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2329 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2331 AVFrame *decoded_frame;
2332 AVCodecContext *avctx = ist->st->codec;
2333 int i, ret, resample_changed;
2335 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2336 return AVERROR(ENOMEM);
2338 avcodec_get_frame_defaults(ist->decoded_frame);
2339 decoded_frame = ist->decoded_frame;
2341 update_benchmark(NULL);
2342 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2343 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2347 if (avctx->sample_rate <= 0) {
2348 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2349 return AVERROR_INVALIDDATA;
2353 /* no audio frame */
2355 for (i = 0; i < ist->nb_filters; i++)
2356 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2357 AV_BUFFERSRC_FLAG_NO_COPY);
2361 /* if the decoder provides a pts, use it instead of the last packet pts.
2362 the decoder could be delaying output by a packet or more. */
2363 if (decoded_frame->pts != AV_NOPTS_VALUE)
2364 ist->dts = ist->next_dts = ist->pts = ist->next_pts = decoded_frame->pts;
2365 else if (pkt->pts != AV_NOPTS_VALUE) {
2366 decoded_frame->pts = pkt->pts;
2367 pkt->pts = AV_NOPTS_VALUE;
2369 decoded_frame->pts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2373 /* increment next_dts to use for the case where the input stream does not
2374 have timestamps or there are multiple frames in the packet */
2375 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2377 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2381 rate_emu_sleep(ist);
2383 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2384 ist->resample_channels != avctx->channels ||
2385 ist->resample_channel_layout != decoded_frame->channel_layout ||
2386 ist->resample_sample_rate != decoded_frame->sample_rate;
2387 if (resample_changed) {
2388 char layout1[64], layout2[64];
2390 if (!guess_input_channel_layout(ist)) {
2391 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2392 "layout for Input Stream #%d.%d\n", ist->file_index,
2396 decoded_frame->channel_layout = avctx->channel_layout;
2398 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2399 ist->resample_channel_layout);
2400 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2401 decoded_frame->channel_layout);
2403 av_log(NULL, AV_LOG_INFO,
2404 "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",
2405 ist->file_index, ist->st->index,
2406 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2407 ist->resample_channels, layout1,
2408 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2409 avctx->channels, layout2);
2411 ist->resample_sample_fmt = decoded_frame->format;
2412 ist->resample_sample_rate = decoded_frame->sample_rate;
2413 ist->resample_channel_layout = decoded_frame->channel_layout;
2414 ist->resample_channels = avctx->channels;
2416 for (i = 0; i < nb_filtergraphs; i++)
2417 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2418 configure_filtergraph(filtergraphs[i]) < 0) {
2419 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2424 for (i = 0; i < ist->nb_filters; i++)
2425 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2430 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2432 AVFrame *decoded_frame;
2433 void *buffer_to_free = NULL;
2434 int i, ret = 0, resample_changed;
2435 int64_t best_effort_timestamp;
2436 AVRational *frame_sample_aspect;
2439 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2440 return AVERROR(ENOMEM);
2442 avcodec_get_frame_defaults(ist->decoded_frame);
2443 decoded_frame = ist->decoded_frame;
2444 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2446 update_benchmark(NULL);
2447 ret = avcodec_decode_video2(ist->st->codec,
2448 decoded_frame, got_output, pkt);
2449 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2453 quality = same_quant ? decoded_frame->quality : 0;
2455 /* no picture yet */
2457 for (i = 0; i < ist->nb_filters; i++)
2458 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2462 if(ist->top_field_first>=0)
2463 decoded_frame->top_field_first = ist->top_field_first;
2465 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2466 if(best_effort_timestamp != AV_NOPTS_VALUE)
2467 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2470 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2472 rate_emu_sleep(ist);
2474 if (ist->st->sample_aspect_ratio.num)
2475 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2477 resample_changed = ist->resample_width != decoded_frame->width ||
2478 ist->resample_height != decoded_frame->height ||
2479 ist->resample_pix_fmt != decoded_frame->format;
2480 if (resample_changed) {
2481 av_log(NULL, AV_LOG_INFO,
2482 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2483 ist->file_index, ist->st->index,
2484 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2485 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2487 ist->resample_width = decoded_frame->width;
2488 ist->resample_height = decoded_frame->height;
2489 ist->resample_pix_fmt = decoded_frame->format;
2491 for (i = 0; i < nb_filtergraphs; i++)
2492 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2493 configure_filtergraph(filtergraphs[i]) < 0) {
2494 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2499 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2500 for (i = 0; i < ist->nb_filters; i++) {
2501 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2502 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2503 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2504 // XXX what an ugly hack
2505 if (ist->filters[i]->graph->nb_outputs == 1)
2506 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2508 if (!frame_sample_aspect->num)
2509 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2510 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2511 FrameBuffer *buf = decoded_frame->opaque;
2512 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2513 decoded_frame->data, decoded_frame->linesize,
2514 AV_PERM_READ | AV_PERM_PRESERVE,
2515 ist->st->codec->width, ist->st->codec->height,
2516 ist->st->codec->pix_fmt);
2518 avfilter_copy_frame_props(fb, decoded_frame);
2519 fb->buf->priv = buf;
2520 fb->buf->free = filter_release_buffer;
2522 av_assert0(buf->refcount>0);
2524 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2525 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2526 AV_BUFFERSRC_FLAG_NO_COPY);
2528 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2529 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2535 av_free(buffer_to_free);
2539 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2541 AVSubtitle subtitle;
2542 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2543 &subtitle, got_output, pkt);
2549 rate_emu_sleep(ist);
2551 for (i = 0; i < nb_output_streams; i++) {
2552 OutputStream *ost = output_streams[i];
2554 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2557 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2560 avsubtitle_free(&subtitle);
2564 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2565 static int output_packet(InputStream *ist, const AVPacket *pkt)
2571 if (!ist->saw_first_ts) {
2572 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;
2574 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2575 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2576 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2578 ist->saw_first_ts = 1;
2581 if (ist->next_dts == AV_NOPTS_VALUE)
2582 ist->next_dts = ist->dts;
2583 if (ist->next_pts == AV_NOPTS_VALUE)
2584 ist->next_pts = ist->pts;
2588 av_init_packet(&avpkt);
2596 if (pkt->dts != AV_NOPTS_VALUE) {
2597 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2598 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2599 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2602 // while we have more to decode or while the decoder did output something on EOF
2603 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2607 ist->pts = ist->next_pts;
2608 ist->dts = ist->next_dts;
2610 if (avpkt.size && avpkt.size != pkt->size) {
2611 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2612 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2613 ist->showed_multi_packet_warning = 1;
2616 switch (ist->st->codec->codec_type) {
2617 case AVMEDIA_TYPE_AUDIO:
2618 ret = decode_audio (ist, &avpkt, &got_output);
2620 case AVMEDIA_TYPE_VIDEO:
2621 ret = decode_video (ist, &avpkt, &got_output);
2622 if (avpkt.duration) {
2623 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2624 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2625 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2626 duration = ((int64_t)AV_TIME_BASE *
2627 ist->st->codec->time_base.num * ticks) /
2628 ist->st->codec->time_base.den;
2632 if(ist->dts != AV_NOPTS_VALUE && duration) {
2633 ist->next_dts += duration;
2635 ist->next_dts = AV_NOPTS_VALUE;
2638 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2640 case AVMEDIA_TYPE_SUBTITLE:
2641 ret = transcode_subtitles(ist, &avpkt, &got_output);
2651 avpkt.pts= AV_NOPTS_VALUE;
2653 // touch data and size only if not EOF
2655 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2665 /* handle stream copy */
2666 if (!ist->decoding_needed) {
2667 rate_emu_sleep(ist);
2668 ist->dts = ist->next_dts;
2669 switch (ist->st->codec->codec_type) {
2670 case AVMEDIA_TYPE_AUDIO:
2671 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2672 ist->st->codec->sample_rate;
2674 case AVMEDIA_TYPE_VIDEO:
2675 if (pkt->duration) {
2676 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2677 } else if(ist->st->codec->time_base.num != 0) {
2678 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2679 ist->next_dts += ((int64_t)AV_TIME_BASE *
2680 ist->st->codec->time_base.num * ticks) /
2681 ist->st->codec->time_base.den;
2685 ist->pts = ist->dts;
2686 ist->next_pts = ist->next_dts;
2688 for (i = 0; pkt && i < nb_output_streams; i++) {
2689 OutputStream *ost = output_streams[i];
2691 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2694 do_streamcopy(ist, ost, pkt);
2700 static void print_sdp(void)
2704 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2708 for (i = 0; i < nb_output_files; i++)
2709 avc[i] = output_files[i]->ctx;
2711 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2712 printf("SDP:\n%s\n", sdp);
2717 static int init_input_stream(int ist_index, char *error, int error_len)
2719 InputStream *ist = input_streams[ist_index];
2721 if (ist->decoding_needed) {
2722 AVCodec *codec = ist->dec;
2724 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2725 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2726 return AVERROR(EINVAL);
2729 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2730 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2731 ist->st->codec->get_buffer = codec_get_buffer;
2732 ist->st->codec->release_buffer = codec_release_buffer;
2733 ist->st->codec->opaque = &ist->buffer_pool;
2736 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2737 av_dict_set(&ist->opts, "threads", "auto", 0);
2738 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2739 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2740 ist->file_index, ist->st->index);
2741 return AVERROR(EINVAL);
2743 assert_codec_experimental(ist->st->codec, 0);
2744 assert_avoptions(ist->opts);
2747 ist->next_pts = AV_NOPTS_VALUE;
2748 ist->next_dts = AV_NOPTS_VALUE;
2754 static InputStream *get_input_stream(OutputStream *ost)
2756 if (ost->source_index >= 0)
2757 return input_streams[ost->source_index];
2761 static int transcode_init(void)
2763 int ret = 0, i, j, k;
2764 AVFormatContext *oc;
2765 AVCodecContext *codec, *icodec = NULL;
2771 /* init framerate emulation */
2772 for (i = 0; i < nb_input_files; i++) {
2773 InputFile *ifile = input_files[i];
2774 if (ifile->rate_emu)
2775 for (j = 0; j < ifile->nb_streams; j++)
2776 input_streams[j + ifile->ist_index]->start = av_gettime();
2779 /* output stream init */
2780 for (i = 0; i < nb_output_files; i++) {
2781 oc = output_files[i]->ctx;
2782 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2783 av_dump_format(oc, i, oc->filename, 1);
2784 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2785 return AVERROR(EINVAL);
2789 /* init complex filtergraphs */
2790 for (i = 0; i < nb_filtergraphs; i++)
2791 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2794 /* for each output stream, we compute the right encoding parameters */
2795 for (i = 0; i < nb_output_streams; i++) {
2796 ost = output_streams[i];
2797 oc = output_files[ost->file_index]->ctx;
2798 ist = get_input_stream(ost);
2800 if (ost->attachment_filename)
2803 codec = ost->st->codec;
2806 icodec = ist->st->codec;
2808 ost->st->disposition = ist->st->disposition;
2809 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2810 codec->chroma_sample_location = icodec->chroma_sample_location;
2813 if (ost->stream_copy) {
2814 uint64_t extra_size;
2816 av_assert0(ist && !ost->filter);
2818 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2820 if (extra_size > INT_MAX) {
2821 return AVERROR(EINVAL);
2824 /* if stream_copy is selected, no need to decode or encode */
2825 codec->codec_id = icodec->codec_id;
2826 codec->codec_type = icodec->codec_type;
2828 if (!codec->codec_tag) {
2829 if (!oc->oformat->codec_tag ||
2830 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2831 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2832 codec->codec_tag = icodec->codec_tag;
2835 codec->bit_rate = icodec->bit_rate;
2836 codec->rc_max_rate = icodec->rc_max_rate;
2837 codec->rc_buffer_size = icodec->rc_buffer_size;
2838 codec->field_order = icodec->field_order;
2839 codec->extradata = av_mallocz(extra_size);
2840 if (!codec->extradata) {
2841 return AVERROR(ENOMEM);
2843 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2844 codec->extradata_size= icodec->extradata_size;
2845 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2847 codec->time_base = ist->st->time_base;
2849 * Avi is a special case here because it supports variable fps but
2850 * having the fps and timebase differe significantly adds quite some
2853 if(!strcmp(oc->oformat->name, "avi")) {
2854 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2855 && av_q2d(ist->st->time_base) < 1.0/500
2857 codec->time_base = icodec->time_base;
2858 codec->time_base.num *= icodec->ticks_per_frame;
2859 codec->time_base.den *= 2;
2860 codec->ticks_per_frame = 2;
2862 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
2863 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
2864 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
2866 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
2867 && av_q2d(ist->st->time_base) < 1.0/500
2869 codec->time_base = icodec->time_base;
2870 codec->time_base.num *= icodec->ticks_per_frame;
2874 if(ost->frame_rate.num)
2875 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2877 av_reduce(&codec->time_base.num, &codec->time_base.den,
2878 codec->time_base.num, codec->time_base.den, INT_MAX);
2880 switch (codec->codec_type) {
2881 case AVMEDIA_TYPE_AUDIO:
2882 if (audio_volume != 256) {
2883 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2886 codec->channel_layout = icodec->channel_layout;
2887 codec->sample_rate = icodec->sample_rate;
2888 codec->channels = icodec->channels;
2889 codec->frame_size = icodec->frame_size;
2890 codec->audio_service_type = icodec->audio_service_type;
2891 codec->block_align = icodec->block_align;
2892 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2893 codec->block_align= 0;
2894 if(codec->codec_id == CODEC_ID_AC3)
2895 codec->block_align= 0;
2897 case AVMEDIA_TYPE_VIDEO:
2898 codec->pix_fmt = icodec->pix_fmt;
2899 codec->width = icodec->width;
2900 codec->height = icodec->height;
2901 codec->has_b_frames = icodec->has_b_frames;
2902 if (!codec->sample_aspect_ratio.num) {
2903 codec->sample_aspect_ratio =
2904 ost->st->sample_aspect_ratio =
2905 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2906 ist->st->codec->sample_aspect_ratio.num ?
2907 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2909 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
2911 case AVMEDIA_TYPE_SUBTITLE:
2912 codec->width = icodec->width;
2913 codec->height = icodec->height;
2915 case AVMEDIA_TYPE_DATA:
2916 case AVMEDIA_TYPE_ATTACHMENT:
2923 ost->enc = avcodec_find_encoder(codec->codec_id);
2925 /* should only happen when a default codec is not present. */
2926 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
2927 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2928 ret = AVERROR(EINVAL);
2933 ist->decoding_needed = 1;
2934 ost->encoding_needed = 1;
2936 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2937 if (ost->filter && !ost->frame_rate.num)
2938 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
2939 if (ist && !ost->frame_rate.num)
2940 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
2941 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2942 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2943 ost->frame_rate = ost->enc->supported_framerates[idx];
2948 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
2949 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
2951 fg = init_simple_filtergraph(ist, ost);
2952 if (configure_filtergraph(fg)) {
2953 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2958 switch (codec->codec_type) {
2959 case AVMEDIA_TYPE_AUDIO:
2960 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
2961 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
2962 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
2963 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
2964 codec->time_base = (AVRational){ 1, codec->sample_rate };
2966 case AVMEDIA_TYPE_VIDEO:
2967 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2968 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
2969 codec->time_base = ost->filter->filter->inputs[0]->time_base;
2970 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
2971 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
2972 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
2973 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
2975 for (j = 0; j < ost->forced_kf_count; j++)
2976 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
2980 codec->width = ost->filter->filter->inputs[0]->w;
2981 codec->height = ost->filter->filter->inputs[0]->h;
2982 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
2983 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
2984 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
2985 ost->filter->filter->inputs[0]->sample_aspect_ratio;
2986 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
2989 codec->width != icodec->width ||
2990 codec->height != icodec->height ||
2991 codec->pix_fmt != icodec->pix_fmt) {
2992 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
2996 case AVMEDIA_TYPE_SUBTITLE:
2997 codec->time_base = (AVRational){1, 1000};
3004 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3005 char logfilename[1024];
3008 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3009 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3011 if (!strcmp(ost->enc->name, "libx264")) {
3012 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3014 if (codec->flags & CODEC_FLAG_PASS2) {
3016 size_t logbuffer_size;
3017 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3018 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3022 codec->stats_in = logbuffer;
3024 if (codec->flags & CODEC_FLAG_PASS1) {
3025 f = fopen(logfilename, "wb");
3027 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3028 logfilename, strerror(errno));
3038 /* open each encoder */
3039 for (i = 0; i < nb_output_streams; i++) {
3040 ost = output_streams[i];
3041 if (ost->encoding_needed) {
3042 AVCodec *codec = ost->enc;
3043 AVCodecContext *dec = NULL;
3045 if ((ist = get_input_stream(ost)))
3046 dec = ist->st->codec;
3047 if (dec && dec->subtitle_header) {
3048 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3049 if (!ost->st->codec->subtitle_header) {
3050 ret = AVERROR(ENOMEM);
3053 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3054 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3056 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3057 av_dict_set(&ost->opts, "threads", "auto", 0);
3058 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3059 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3060 ost->file_index, ost->index);
3061 ret = AVERROR(EINVAL);
3064 assert_codec_experimental(ost->st->codec, 1);
3065 assert_avoptions(ost->opts);
3066 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3067 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3068 " It takes bits/s as argument, not kbits/s\n");
3069 extra_size += ost->st->codec->extradata_size;
3071 if (ost->st->codec->me_threshold)
3072 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3076 /* init input streams */
3077 for (i = 0; i < nb_input_streams; i++)
3078 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3081 /* discard unused programs */
3082 for (i = 0; i < nb_input_files; i++) {
3083 InputFile *ifile = input_files[i];
3084 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3085 AVProgram *p = ifile->ctx->programs[j];
3086 int discard = AVDISCARD_ALL;
3088 for (k = 0; k < p->nb_stream_indexes; k++)
3089 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3090 discard = AVDISCARD_DEFAULT;
3093 p->discard = discard;
3097 /* open files and write file headers */
3098 for (i = 0; i < nb_output_files; i++) {
3099 oc = output_files[i]->ctx;
3100 oc->interrupt_callback = int_cb;
3101 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3103 const char *errbuf_ptr = errbuf;
3104 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3105 errbuf_ptr = strerror(AVUNERROR(ret));
3106 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3107 ret = AVERROR(EINVAL);
3110 // assert_avoptions(output_files[i]->opts);
3111 if (strcmp(oc->oformat->name, "rtp")) {
3117 /* dump the file output parameters - cannot be done before in case
3119 for (i = 0; i < nb_output_files; i++) {
3120 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3123 /* dump the stream mapping */
3124 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3125 for (i = 0; i < nb_input_streams; i++) {
3126 ist = input_streams[i];
3128 for (j = 0; j < ist->nb_filters; j++) {
3129 if (ist->filters[j]->graph->graph_desc) {
3130 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3131 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3132 ist->filters[j]->name);
3133 if (nb_filtergraphs > 1)
3134 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3135 av_log(NULL, AV_LOG_INFO, "\n");
3140 for (i = 0; i < nb_output_streams; i++) {
3141 ost = output_streams[i];
3143 if (ost->attachment_filename) {
3144 /* an attached file */
3145 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3146 ost->attachment_filename, ost->file_index, ost->index);
3150 if (ost->filter && ost->filter->graph->graph_desc) {
3151 /* output from a complex graph */
3152 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3153 if (nb_filtergraphs > 1)
3154 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3156 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3157 ost->index, ost->enc ? ost->enc->name : "?");
3161 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3162 input_streams[ost->source_index]->file_index,
3163 input_streams[ost->source_index]->st->index,
3166 if (ost->sync_ist != input_streams[ost->source_index])
3167 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3168 ost->sync_ist->file_index,
3169 ost->sync_ist->st->index);
3170 if (ost->stream_copy)
3171 av_log(NULL, AV_LOG_INFO, " (copy)");
3173 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3174 input_streams[ost->source_index]->dec->name : "?",
3175 ost->enc ? ost->enc->name : "?");
3176 av_log(NULL, AV_LOG_INFO, "\n");
3180 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3192 * @return 1 if there are still streams where more output is wanted,
3195 static int need_output(void)
3199 for (i = 0; i < nb_output_streams; i++) {
3200 OutputStream *ost = output_streams[i];
3201 OutputFile *of = output_files[ost->file_index];
3202 AVFormatContext *os = output_files[ost->file_index]->ctx;
3204 if (ost->is_past_recording_time ||
3205 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3207 if (ost->frame_number >= ost->max_frames) {
3209 for (j = 0; j < of->ctx->nb_streams; j++)
3210 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3220 static int select_input_file(uint8_t *no_packet)
3222 int64_t ipts_min = INT64_MAX;
3223 int i, file_index = -1;
3225 for (i = 0; i < nb_input_streams; i++) {
3226 InputStream *ist = input_streams[i];
3227 int64_t ipts = ist->pts;
3229 if (ist->discard || no_packet[ist->file_index])
3231 if (!input_files[ist->file_index]->eof_reached) {
3232 if (ipts < ipts_min) {
3234 file_index = ist->file_index;
3242 static int check_keyboard_interaction(int64_t cur_time)
3245 static int64_t last_time;
3246 if (received_nb_signals)
3247 return AVERROR_EXIT;
3248 /* read_key() returns 0 on EOF */
3249 if(cur_time - last_time >= 100000 && !run_as_daemon){
3251 last_time = cur_time;
3255 return AVERROR_EXIT;
3256 if (key == '+') av_log_set_level(av_log_get_level()+10);
3257 if (key == '-') av_log_set_level(av_log_get_level()-10);
3258 if (key == 's') qp_hist ^= 1;
3261 do_hex_dump = do_pkt_dump = 0;
3262 } else if(do_pkt_dump){
3266 av_log_set_level(AV_LOG_DEBUG);
3268 if (key == 'c' || key == 'C'){
3269 char buf[4096], target[64], command[256], arg[256] = {0};
3272 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3274 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3279 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3280 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3281 target, time, command, arg);
3282 for (i = 0; i < nb_filtergraphs; i++) {
3283 FilterGraph *fg = filtergraphs[i];
3286 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3287 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3288 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3290 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3295 av_log(NULL, AV_LOG_ERROR,
3296 "Parse error, at least 3 arguments were expected, "
3297 "only %d given in string '%s'\n", n, buf);
3300 if (key == 'd' || key == 'D'){
3303 debug = input_streams[0]->st->codec->debug<<1;
3304 if(!debug) debug = 1;
3305 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3308 if(scanf("%d", &debug)!=1)
3309 fprintf(stderr,"error parsing debug value\n");
3310 for(i=0;i<nb_input_streams;i++) {
3311 input_streams[i]->st->codec->debug = debug;
3313 for(i=0;i<nb_output_streams;i++) {
3314 OutputStream *ost = output_streams[i];
3315 ost->st->codec->debug = debug;
3317 if(debug) av_log_set_level(AV_LOG_DEBUG);
3318 fprintf(stderr,"debug=%d\n", debug);
3321 fprintf(stderr, "key function\n"
3322 "? show this help\n"
3323 "+ increase verbosity\n"
3324 "- decrease verbosity\n"
3325 "c Send command to filtergraph\n"
3326 "D cycle through available debug modes\n"
3327 "h dump packets/hex press to cycle through the 3 states\n"
3329 "s Show QP histogram\n"
3336 static void *input_thread(void *arg)
3341 while (!transcoding_finished && ret >= 0) {
3343 ret = av_read_frame(f->ctx, &pkt);
3345 if (ret == AVERROR(EAGAIN)) {
3352 pthread_mutex_lock(&f->fifo_lock);
3353 while (!av_fifo_space(f->fifo))
3354 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3356 av_dup_packet(&pkt);
3357 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3359 pthread_mutex_unlock(&f->fifo_lock);
3366 static void free_input_threads(void)
3370 if (nb_input_files == 1)
3373 transcoding_finished = 1;
3375 for (i = 0; i < nb_input_files; i++) {
3376 InputFile *f = input_files[i];
3379 if (!f->fifo || f->joined)
3382 pthread_mutex_lock(&f->fifo_lock);
3383 while (av_fifo_size(f->fifo)) {
3384 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3385 av_free_packet(&pkt);
3387 pthread_cond_signal(&f->fifo_cond);
3388 pthread_mutex_unlock(&f->fifo_lock);
3390 pthread_join(f->thread, NULL);
3393 while (av_fifo_size(f->fifo)) {
3394 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3395 av_free_packet(&pkt);
3397 av_fifo_free(f->fifo);
3401 static int init_input_threads(void)
3405 if (nb_input_files == 1)
3408 for (i = 0; i < nb_input_files; i++) {
3409 InputFile *f = input_files[i];
3411 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3412 return AVERROR(ENOMEM);
3414 pthread_mutex_init(&f->fifo_lock, NULL);
3415 pthread_cond_init (&f->fifo_cond, NULL);
3417 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3418 return AVERROR(ret);
3423 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3427 pthread_mutex_lock(&f->fifo_lock);
3429 if (av_fifo_size(f->fifo)) {
3430 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3431 pthread_cond_signal(&f->fifo_cond);
3436 ret = AVERROR(EAGAIN);
3439 pthread_mutex_unlock(&f->fifo_lock);
3445 static int get_input_packet(InputFile *f, AVPacket *pkt)
3448 if (nb_input_files > 1)
3449 return get_input_packet_mt(f, pkt);
3451 return av_read_frame(f->ctx, pkt);
3455 * The following code is the main loop of the file converter
3457 static int transcode(void)
3460 AVFormatContext *is, *os;
3464 int no_packet_count = 0;
3465 int64_t timer_start;
3467 if (!(no_packet = av_mallocz(nb_input_files)))
3470 ret = transcode_init();
3475 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3478 timer_start = av_gettime();
3481 if ((ret = init_input_threads()) < 0)
3485 for (; received_sigterm == 0;) {
3486 int file_index, ist_index;
3488 int64_t cur_time= av_gettime();
3490 /* if 'q' pressed, exits */
3492 if (check_keyboard_interaction(cur_time) < 0)
3495 /* check if there's any stream where output is still needed */
3496 if (!need_output()) {
3497 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3501 /* select the stream that we must read now */
3502 file_index = select_input_file(no_packet);
3503 /* if none, if is finished */
3504 if (file_index < 0) {
3505 if (no_packet_count) {
3506 no_packet_count = 0;
3507 memset(no_packet, 0, nb_input_files);
3511 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3515 is = input_files[file_index]->ctx;
3516 ret = get_input_packet(input_files[file_index], &pkt);
3518 if (ret == AVERROR(EAGAIN)) {
3519 no_packet[file_index] = 1;
3524 input_files[file_index]->eof_reached = 1;
3526 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3527 ist = input_streams[input_files[file_index]->ist_index + i];
3528 if (ist->decoding_needed)
3529 output_packet(ist, NULL);
3538 no_packet_count = 0;
3539 memset(no_packet, 0, nb_input_files);
3542 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3543 is->streams[pkt.stream_index]);
3545 /* the following test is needed in case new streams appear
3546 dynamically in stream : we ignore them */
3547 if (pkt.stream_index >= input_files[file_index]->nb_streams)
3548 goto discard_packet;
3549 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3550 ist = input_streams[ist_index];
3552 goto discard_packet;
3554 if (pkt.dts != AV_NOPTS_VALUE)
3555 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3556 if (pkt.pts != AV_NOPTS_VALUE)
3557 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3559 if (pkt.pts != AV_NOPTS_VALUE)
3560 pkt.pts *= ist->ts_scale;
3561 if (pkt.dts != AV_NOPTS_VALUE)
3562 pkt.dts *= ist->ts_scale;
3565 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3566 "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",
3567 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3568 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &ist->st->time_base),
3569 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &ist->st->time_base),
3570 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3571 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3572 input_files[ist->file_index]->ts_offset);
3575 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3576 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3577 int64_t delta = pkt_dts - ist->next_dts;
3578 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3579 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3580 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3581 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3582 pkt_dts+1<ist->pts){
3583 input_files[ist->file_index]->ts_offset -= delta;
3584 av_log(NULL, AV_LOG_DEBUG,
3585 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3586 delta, input_files[ist->file_index]->ts_offset);
3587 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3588 if (pkt.pts != AV_NOPTS_VALUE)
3589 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3592 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3593 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3594 pkt_dts+1<ist->pts){
3595 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3596 pkt.dts = AV_NOPTS_VALUE;
3598 if (pkt.pts != AV_NOPTS_VALUE){
3599 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3600 delta = pkt_pts - ist->next_dts;
3601 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3602 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3603 pkt_pts+1<ist->pts) {
3604 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3605 pkt.pts = AV_NOPTS_VALUE;
3611 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3612 if ((ret = output_packet(ist, &pkt)) < 0 ||
3613 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3615 av_strerror(ret, buf, sizeof(buf));
3616 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3617 ist->file_index, ist->st->index, buf);
3620 av_free_packet(&pkt);
3625 av_free_packet(&pkt);
3627 /* dump report by using the output first video and audio streams */
3628 print_report(0, timer_start, cur_time);
3631 free_input_threads();
3634 /* at the end of stream, we must flush the decoder buffers */
3635 for (i = 0; i < nb_input_streams; i++) {
3636 ist = input_streams[i];
3637 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3638 output_packet(ist, NULL);
3646 /* write the trailer if needed and close file */
3647 for (i = 0; i < nb_output_files; i++) {
3648 os = output_files[i]->ctx;
3649 av_write_trailer(os);
3652 /* dump report by using the first video and audio streams */
3653 print_report(1, timer_start, av_gettime());
3655 /* close each encoder */
3656 for (i = 0; i < nb_output_streams; i++) {
3657 ost = output_streams[i];
3658 if (ost->encoding_needed) {
3659 av_freep(&ost->st->codec->stats_in);
3660 avcodec_close(ost->st->codec);
3664 /* close each decoder */
3665 for (i = 0; i < nb_input_streams; i++) {
3666 ist = input_streams[i];
3667 if (ist->decoding_needed) {
3668 avcodec_close(ist->st->codec);
3676 av_freep(&no_packet);
3678 free_input_threads();
3681 if (output_streams) {
3682 for (i = 0; i < nb_output_streams; i++) {
3683 ost = output_streams[i];
3685 if (ost->stream_copy)
3686 av_freep(&ost->st->codec->extradata);
3688 fclose(ost->logfile);
3689 ost->logfile = NULL;
3691 av_freep(&ost->st->codec->subtitle_header);
3692 av_free(ost->forced_kf_pts);
3693 av_dict_free(&ost->opts);
3700 static int opt_frame_crop(const char *opt, const char *arg)
3702 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3703 return AVERROR(EINVAL);
3706 static int opt_pad(const char *opt, const char *arg)
3708 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3712 static int opt_video_channel(const char *opt, const char *arg)
3714 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3715 return opt_default("channel", arg);
3718 static int opt_video_standard(const char *opt, const char *arg)
3720 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3721 return opt_default("standard", arg);
3724 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3726 audio_codec_name = arg;
3727 return parse_option(o, "codec:a", arg, options);
3730 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3732 video_codec_name = arg;
3733 return parse_option(o, "codec:v", arg, options);
3736 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3738 subtitle_codec_name = arg;
3739 return parse_option(o, "codec:s", arg, options);
3742 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3744 return parse_option(o, "codec:d", arg, options);
3747 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3749 StreamMap *m = NULL;
3750 int i, negative = 0, file_idx;
3751 int sync_file_idx = -1, sync_stream_idx = 0;
3759 map = av_strdup(arg);
3761 /* parse sync stream first, just pick first matching stream */
3762 if (sync = strchr(map, ',')) {
3764 sync_file_idx = strtol(sync + 1, &sync, 0);
3765 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3766 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3771 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3772 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3773 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3774 sync_stream_idx = i;
3777 if (i == input_files[sync_file_idx]->nb_streams) {
3778 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
3779 "match any streams.\n", arg);
3785 if (map[0] == '[') {
3786 /* this mapping refers to lavfi output */
3787 const char *c = map + 1;
3788 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3789 &o->nb_stream_maps, o->nb_stream_maps + 1);
3790 m = &o->stream_maps[o->nb_stream_maps - 1];
3791 m->linklabel = av_get_token(&c, "]");
3792 if (!m->linklabel) {
3793 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
3797 file_idx = strtol(map, &p, 0);
3798 if (file_idx >= nb_input_files || file_idx < 0) {
3799 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
3803 /* disable some already defined maps */
3804 for (i = 0; i < o->nb_stream_maps; i++) {
3805 m = &o->stream_maps[i];
3806 if (file_idx == m->file_index &&
3807 check_stream_specifier(input_files[m->file_index]->ctx,
3808 input_files[m->file_index]->ctx->streams[m->stream_index],
3809 *p == ':' ? p + 1 : p) > 0)
3813 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
3814 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
3815 *p == ':' ? p + 1 : p) <= 0)
3817 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
3818 &o->nb_stream_maps, o->nb_stream_maps + 1);
3819 m = &o->stream_maps[o->nb_stream_maps - 1];
3821 m->file_index = file_idx;
3822 m->stream_index = i;
3824 if (sync_file_idx >= 0) {
3825 m->sync_file_index = sync_file_idx;
3826 m->sync_stream_index = sync_stream_idx;
3828 m->sync_file_index = file_idx;
3829 m->sync_stream_index = i;
3835 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
3843 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
3845 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
3846 &o->nb_attachments, o->nb_attachments + 1);
3847 o->attachments[o->nb_attachments - 1] = arg;
3851 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
3857 o->audio_channel_maps =
3858 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
3859 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
3860 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
3862 /* muted channel syntax */
3863 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
3864 if ((n == 1 || n == 3) && m->channel_idx == -1) {
3865 m->file_idx = m->stream_idx = -1;
3867 m->ofile_idx = m->ostream_idx = -1;
3872 n = sscanf(arg, "%d.%d.%d:%d.%d",
3873 &m->file_idx, &m->stream_idx, &m->channel_idx,
3874 &m->ofile_idx, &m->ostream_idx);
3876 if (n != 3 && n != 5) {
3877 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
3878 "[file.stream.channel|-1][:syncfile:syncstream]\n");
3882 if (n != 5) // only file.stream.channel specified
3883 m->ofile_idx = m->ostream_idx = -1;
3886 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
3887 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
3891 if (m->stream_idx < 0 ||
3892 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
3893 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
3894 m->file_idx, m->stream_idx);
3897 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
3898 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
3899 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
3900 m->file_idx, m->stream_idx);
3903 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
3904 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
3905 m->file_idx, m->stream_idx, m->channel_idx);
3912 * Parse a metadata specifier in arg.
3913 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
3914 * @param index for type c/p, chapter/program index is written here
3915 * @param stream_spec for type s, the stream specifier is written here
3917 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
3925 if (*(++arg) && *arg != ':') {
3926 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
3929 *stream_spec = *arg == ':' ? arg + 1 : "";
3933 if (*(++arg) == ':')
3934 *index = strtol(++arg, NULL, 0);
3937 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
3944 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
3946 AVDictionary **meta_in = NULL;
3947 AVDictionary **meta_out = NULL;
3949 char type_in, type_out;
3950 const char *istream_spec = NULL, *ostream_spec = NULL;
3951 int idx_in = 0, idx_out = 0;
3953 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
3954 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
3957 if (type_out == 'g' || !*outspec)
3958 o->metadata_global_manual = 1;
3959 if (type_out == 's' || !*outspec)
3960 o->metadata_streams_manual = 1;
3961 if (type_out == 'c' || !*outspec)
3962 o->metadata_chapters_manual = 1;
3966 if (type_in == 'g' || type_out == 'g')
3967 o->metadata_global_manual = 1;
3968 if (type_in == 's' || type_out == 's')
3969 o->metadata_streams_manual = 1;
3970 if (type_in == 'c' || type_out == 'c')
3971 o->metadata_chapters_manual = 1;
3973 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3974 if ((index) < 0 || (index) >= (nb_elems)) {\
3975 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
3980 #define SET_DICT(type, meta, context, index)\
3983 meta = &context->metadata;\
3986 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
3987 meta = &context->chapters[index]->metadata;\
3990 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
3991 meta = &context->programs[index]->metadata;\
3995 SET_DICT(type_in, meta_in, ic, idx_in);
3996 SET_DICT(type_out, meta_out, oc, idx_out);
3998 /* for input streams choose first matching stream */
3999 if (type_in == 's') {
4000 for (i = 0; i < ic->nb_streams; i++) {
4001 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4002 meta_in = &ic->streams[i]->metadata;
4008 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4013 if (type_out == 's') {
4014 for (i = 0; i < oc->nb_streams; i++) {
4015 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4016 meta_out = &oc->streams[i]->metadata;
4017 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4022 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4027 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4030 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4031 struct tm time = *gmtime((time_t*)&recording_timestamp);
4032 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4033 parse_option(o, "metadata", buf, options);
4035 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4036 "tag instead.\n", opt);
4040 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4042 const char *codec_string = encoder ? "encoder" : "decoder";
4046 avcodec_find_encoder_by_name(name) :
4047 avcodec_find_decoder_by_name(name);
4049 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4052 if (codec->type != type) {
4053 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4059 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4061 char *codec_name = NULL;
4063 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4065 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4066 st->codec->codec_id = codec->id;
4069 return avcodec_find_decoder(st->codec->codec_id);
4073 * Add all the streams from the given input file to the global
4074 * list of input streams.
4076 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4079 char *next, *codec_tag = NULL;
4081 for (i = 0; i < ic->nb_streams; i++) {
4082 AVStream *st = ic->streams[i];
4083 AVCodecContext *dec = st->codec;
4084 InputStream *ist = av_mallocz(sizeof(*ist));
4085 char *framerate = NULL;
4090 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4091 input_streams[nb_input_streams - 1] = ist;
4094 ist->file_index = nb_input_files;
4096 st->discard = AVDISCARD_ALL;
4097 ist->opts = filter_codec_opts(codec_opts, choose_decoder(o, ic, st), ic, st);
4099 ist->ts_scale = 1.0;
4100 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4102 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4104 uint32_t tag = strtol(codec_tag, &next, 0);
4106 tag = AV_RL32(codec_tag);
4107 st->codec->codec_tag = tag;
4110 ist->dec = choose_decoder(o, ic, st);
4112 switch (dec->codec_type) {
4113 case AVMEDIA_TYPE_VIDEO:
4115 ist->dec = avcodec_find_decoder(dec->codec_id);
4117 dec->flags |= CODEC_FLAG_EMU_EDGE;
4120 ist->resample_height = dec->height;
4121 ist->resample_width = dec->width;
4122 ist->resample_pix_fmt = dec->pix_fmt;
4124 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4125 if (framerate && av_parse_video_rate(&ist->framerate,
4127 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4132 ist->top_field_first = -1;
4133 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4136 case AVMEDIA_TYPE_AUDIO:
4137 guess_input_channel_layout(ist);
4139 ist->resample_sample_fmt = dec->sample_fmt;
4140 ist->resample_sample_rate = dec->sample_rate;
4141 ist->resample_channels = dec->channels;
4142 ist->resample_channel_layout = dec->channel_layout;
4145 case AVMEDIA_TYPE_DATA:
4146 case AVMEDIA_TYPE_SUBTITLE:
4148 ist->dec = avcodec_find_decoder(dec->codec_id);
4150 case AVMEDIA_TYPE_ATTACHMENT:
4151 case AVMEDIA_TYPE_UNKNOWN:
4159 static void assert_file_overwrite(const char *filename)
4161 if ((!file_overwrite || no_file_overwrite) &&
4162 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4163 av_strstart(filename, "file:", NULL))) {
4164 if (avio_check(filename, 0) == 0) {
4165 if (!using_stdin && (!no_file_overwrite || file_overwrite)) {
4166 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4169 signal(SIGINT, SIG_DFL);
4170 if (!read_yesno()) {
4171 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4177 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4184 static void dump_attachment(AVStream *st, const char *filename)
4187 AVIOContext *out = NULL;
4188 AVDictionaryEntry *e;
4190 if (!st->codec->extradata_size) {
4191 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4192 nb_input_files - 1, st->index);
4195 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4196 filename = e->value;
4198 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4199 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4203 assert_file_overwrite(filename);
4205 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4206 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4211 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4216 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4218 AVFormatContext *ic;
4219 AVInputFormat *file_iformat = NULL;
4223 AVDictionary **opts;
4224 int orig_nb_streams; // number of streams before avformat_find_stream_info
4227 if (!(file_iformat = av_find_input_format(o->format))) {
4228 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4233 if (!strcmp(filename, "-"))
4236 using_stdin |= !strncmp(filename, "pipe:", 5) ||
4237 !strcmp(filename, "/dev/stdin");
4239 /* get default parameters from command line */
4240 ic = avformat_alloc_context();
4242 print_error(filename, AVERROR(ENOMEM));
4245 if (o->nb_audio_sample_rate) {
4246 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4247 av_dict_set(&format_opts, "sample_rate", buf, 0);
4249 if (o->nb_audio_channels) {
4250 /* because we set audio_channels based on both the "ac" and
4251 * "channel_layout" options, we need to check that the specified
4252 * demuxer actually has the "channels" option before setting it */
4253 if (file_iformat && file_iformat->priv_class &&
4254 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4255 AV_OPT_SEARCH_FAKE_OBJ)) {
4256 snprintf(buf, sizeof(buf), "%d",
4257 o->audio_channels[o->nb_audio_channels - 1].u.i);
4258 av_dict_set(&format_opts, "channels", buf, 0);
4261 if (o->nb_frame_rates) {
4262 /* set the format-level framerate option;
4263 * this is important for video grabbers, e.g. x11 */
4264 if (file_iformat && file_iformat->priv_class &&
4265 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4266 AV_OPT_SEARCH_FAKE_OBJ)) {
4267 av_dict_set(&format_opts, "framerate",
4268 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4271 if (o->nb_frame_sizes) {
4272 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4274 if (o->nb_frame_pix_fmts)
4275 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4277 ic->video_codec_id = video_codec_name ?
4278 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4279 ic->audio_codec_id = audio_codec_name ?
4280 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4281 ic->subtitle_codec_id= subtitle_codec_name ?
4282 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4283 ic->flags |= AVFMT_FLAG_NONBLOCK;
4284 ic->interrupt_callback = int_cb;
4286 /* open the input file with generic avformat function */
4287 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4289 print_error(filename, err);
4292 assert_avoptions(format_opts);
4294 /* apply forced codec ids */
4295 for (i = 0; i < ic->nb_streams; i++)
4296 choose_decoder(o, ic, ic->streams[i]);
4298 /* Set AVCodecContext options for avformat_find_stream_info */
4299 opts = setup_find_stream_info_opts(ic, codec_opts);
4300 orig_nb_streams = ic->nb_streams;
4302 /* If not enough info to get the stream parameters, we decode the
4303 first frames to get it. (used in mpeg case for example) */
4304 ret = avformat_find_stream_info(ic, opts);
4306 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4307 avformat_close_input(&ic);
4311 timestamp = o->start_time;
4312 /* add the stream start time */
4313 if (ic->start_time != AV_NOPTS_VALUE)
4314 timestamp += ic->start_time;
4316 /* if seeking requested, we execute it */
4317 if (o->start_time != 0) {
4318 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4320 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4321 filename, (double)timestamp / AV_TIME_BASE);
4325 /* update the current parameters so that they match the one of the input stream */
4326 add_input_streams(o, ic);
4328 /* dump the file content */
4329 av_dump_format(ic, nb_input_files, filename, 0);
4331 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4332 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4335 input_files[nb_input_files - 1]->ctx = ic;
4336 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4337 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4338 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4339 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4341 for (i = 0; i < o->nb_dump_attachment; i++) {
4344 for (j = 0; j < ic->nb_streams; j++) {
4345 AVStream *st = ic->streams[j];
4347 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4348 dump_attachment(st, o->dump_attachment[i].u.str);
4352 for (i = 0; i < orig_nb_streams; i++)
4353 av_dict_free(&opts[i]);
4356 reset_options(o, 1);
4360 static void parse_forced_key_frames(char *kf, OutputStream *ost)
4365 for (p = kf; *p; p++)
4368 ost->forced_kf_count = n;
4369 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
4370 if (!ost->forced_kf_pts) {
4371 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
4375 for (i = 0; i < n; i++) {
4376 char *next = strchr(p, ',');
4377 if (next) *next++ = 0;
4378 ost->forced_kf_pts[i] = parse_time_or_die("force_key_frames", p, 1);
4383 static uint8_t *get_line(AVIOContext *s)
4389 if (avio_open_dyn_buf(&line) < 0) {
4390 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4394 while ((c = avio_r8(s)) && c != '\n')
4397 avio_close_dyn_buf(line, &buf);
4402 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4405 char filename[1000];
4406 const char *base[3] = { getenv("AVCONV_DATADIR"),
4411 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4415 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4416 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4417 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4420 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4421 i != 1 ? "" : "/.avconv", preset_name);
4422 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4428 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4430 char *codec_name = NULL;
4432 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4434 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4435 NULL, ost->st->codec->codec_type);
4436 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4437 } else if (!strcmp(codec_name, "copy"))
4438 ost->stream_copy = 1;
4440 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4441 ost->st->codec->codec_id = ost->enc->id;
4445 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4448 AVStream *st = avformat_new_stream(oc, NULL);
4449 int idx = oc->nb_streams - 1, ret = 0;
4450 char *bsf = NULL, *next, *codec_tag = NULL;
4451 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4453 char *buf = NULL, *arg = NULL, *preset = NULL;
4454 AVIOContext *s = NULL;
4457 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4461 if (oc->nb_streams - 1 < o->nb_streamid_map)
4462 st->id = o->streamid_map[oc->nb_streams - 1];
4464 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4465 nb_output_streams + 1);
4466 if (!(ost = av_mallocz(sizeof(*ost))))
4468 output_streams[nb_output_streams - 1] = ost;
4470 ost->file_index = nb_output_files;
4473 st->codec->codec_type = type;
4474 choose_encoder(o, oc, ost);
4476 ost->opts = filter_codec_opts(codec_opts, ost->enc, oc, st);
4479 avcodec_get_context_defaults3(st->codec, ost->enc);
4480 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4482 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4483 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4486 if (!buf[0] || buf[0] == '#') {
4490 if (!(arg = strchr(buf, '='))) {
4491 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4495 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4497 } while (!s->eof_reached);
4501 av_log(NULL, AV_LOG_FATAL,
4502 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4503 preset, ost->file_index, ost->index);
4507 ost->max_frames = INT64_MAX;
4508 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4510 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4512 if (next = strchr(bsf, ','))
4514 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4515 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4519 bsfc_prev->next = bsfc;
4521 ost->bitstream_filters = bsfc;
4527 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4529 uint32_t tag = strtol(codec_tag, &next, 0);
4531 tag = AV_RL32(codec_tag);
4532 st->codec->codec_tag = tag;
4535 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4536 if (qscale >= 0 || same_quant) {
4537 st->codec->flags |= CODEC_FLAG_QSCALE;
4538 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4541 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4542 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4544 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4545 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4546 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4548 ost->source_index = source_index;
4549 if (source_index >= 0) {
4550 ost->sync_ist = input_streams[source_index];
4551 input_streams[source_index]->discard = 0;
4552 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4558 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4561 const char *p = str;
4568 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4575 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4579 AVCodecContext *video_enc;
4580 char *frame_rate = NULL;
4582 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4584 video_enc = st->codec;
4586 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4587 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4588 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4592 if (!ost->stream_copy) {
4593 const char *p = NULL;
4594 char *forced_key_frames = NULL, *frame_size = NULL;
4595 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4596 char *intra_matrix = NULL, *inter_matrix = NULL;
4597 const char *filters = "null";
4600 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4601 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4602 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4606 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4607 if (frame_aspect_ratio) {
4609 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4610 q.num <= 0 || q.den <= 0) {
4611 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4614 ost->frame_aspect_ratio = av_q2d(q);
4617 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4618 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4619 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4620 ost->keep_pix_fmt = 1;
4621 if (!*++frame_pix_fmt)
4622 frame_pix_fmt = NULL;
4624 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4625 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4628 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4631 video_enc->gop_size = 0;
4632 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4634 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4635 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4638 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4640 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4642 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4643 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4646 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4649 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4650 for (i = 0; p; i++) {
4652 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4654 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4657 /* FIXME realloc failure */
4658 video_enc->rc_override =
4659 av_realloc(video_enc->rc_override,
4660 sizeof(RcOverride) * (i + 1));
4661 video_enc->rc_override[i].start_frame = start;
4662 video_enc->rc_override[i].end_frame = end;
4664 video_enc->rc_override[i].qscale = q;
4665 video_enc->rc_override[i].quality_factor = 1.0;
4668 video_enc->rc_override[i].qscale = 0;
4669 video_enc->rc_override[i].quality_factor = -q/100.0;
4674 video_enc->rc_override_count = i;
4675 if (!video_enc->rc_initial_buffer_occupancy)
4676 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4677 video_enc->intra_dc_precision = intra_dc_precision - 8;
4680 video_enc->flags|= CODEC_FLAG_PSNR;
4685 video_enc->flags |= CODEC_FLAG_PASS1;
4688 video_enc->flags |= CODEC_FLAG_PASS2;
4692 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
4693 if (forced_key_frames)
4694 parse_forced_key_frames(forced_key_frames, ost);
4696 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4698 ost->top_field_first = -1;
4699 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4701 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4702 ost->avfilter = av_strdup(filters);
4704 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4710 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4715 AVCodecContext *audio_enc;
4717 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4720 audio_enc = st->codec;
4721 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4723 if (!ost->stream_copy) {
4724 char *sample_fmt = NULL;
4725 const char *filters = "anull";
4727 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4729 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4731 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4732 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4736 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4738 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4740 av_assert1(filters);
4741 ost->avfilter = av_strdup(filters);
4743 /* check for channel mapping for this audio stream */
4744 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4745 AudioChannelMap *map = &o->audio_channel_maps[n];
4746 InputStream *ist = input_streams[ost->source_index];
4747 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4748 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4749 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4750 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4751 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4753 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4754 ost->file_index, ost->st->index);
4762 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4766 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4767 if (!ost->stream_copy) {
4768 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4775 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4777 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4778 ost->stream_copy = 1;
4782 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4786 AVCodecContext *subtitle_enc;
4788 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4790 subtitle_enc = st->codec;
4792 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4794 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
4799 /* arg format is "output-stream-index:streamid-value". */
4800 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
4806 av_strlcpy(idx_str, arg, sizeof(idx_str));
4807 p = strchr(idx_str, ':');
4809 av_log(NULL, AV_LOG_FATAL,
4810 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
4815 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
4816 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
4817 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
4821 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
4823 AVFormatContext *is = ifile->ctx;
4824 AVFormatContext *os = ofile->ctx;
4827 for (i = 0; i < is->nb_chapters; i++) {
4828 AVChapter *in_ch = is->chapters[i], *out_ch;
4829 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
4830 AV_TIME_BASE_Q, in_ch->time_base);
4831 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
4832 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
4835 if (in_ch->end < ts_off)
4837 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
4840 out_ch = av_mallocz(sizeof(AVChapter));
4842 return AVERROR(ENOMEM);
4844 out_ch->id = in_ch->id;
4845 out_ch->time_base = in_ch->time_base;
4846 out_ch->start = FFMAX(0, in_ch->start - ts_off);
4847 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
4850 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
4853 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
4855 return AVERROR(ENOMEM);
4856 os->chapters[os->nb_chapters - 1] = out_ch;
4861 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
4864 AVFormatContext *ic = avformat_alloc_context();
4866 ic->interrupt_callback = int_cb;
4867 err = avformat_open_input(&ic, filename, NULL, NULL);
4870 /* copy stream format */
4871 for(i=0;i<ic->nb_streams;i++) {
4875 AVCodecContext *avctx;
4877 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
4878 ost = new_output_stream(o, s, codec->type, -1);
4883 // FIXME: a more elegant solution is needed
4884 memcpy(st, ic->streams[i], sizeof(AVStream));
4886 st->info = av_malloc(sizeof(*st->info));
4887 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
4889 avcodec_copy_context(st->codec, ic->streams[i]->codec);
4891 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
4892 choose_sample_fmt(st, codec);
4893 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
4894 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
4897 avformat_close_input(&ic);
4901 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
4902 AVFormatContext *oc)
4906 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
4907 ofilter->out_tmp->pad_idx)) {
4908 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
4909 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
4911 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
4916 ost->source_index = -1;
4917 ost->filter = ofilter;
4921 if (ost->stream_copy) {
4922 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
4923 "which is fed from a complex filtergraph. Filtering and streamcopy "
4924 "cannot be used together.\n", ost->file_index, ost->index);
4928 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
4929 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
4932 avfilter_inout_free(&ofilter->out_tmp);
4935 static void opt_output_file(void *optctx, const char *filename)
4937 OptionsContext *o = optctx;
4938 AVFormatContext *oc;
4940 AVOutputFormat *file_oformat;
4944 if (configure_complex_filters() < 0) {
4945 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
4949 if (!strcmp(filename, "-"))
4952 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
4954 print_error(filename, err);
4957 file_oformat= oc->oformat;
4958 oc->interrupt_callback = int_cb;
4960 /* create streams for all unlabeled output pads */
4961 for (i = 0; i < nb_filtergraphs; i++) {
4962 FilterGraph *fg = filtergraphs[i];
4963 for (j = 0; j < fg->nb_outputs; j++) {
4964 OutputFilter *ofilter = fg->outputs[j];
4966 if (!ofilter->out_tmp || ofilter->out_tmp->name)
4969 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
4970 ofilter->out_tmp->pad_idx)) {
4971 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
4972 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
4973 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
4975 init_output_filter(ofilter, o, oc);
4979 if (!strcmp(file_oformat->name, "ffm") &&
4980 av_strstart(filename, "http:", NULL)) {
4982 /* special case for files sent to ffserver: we get the stream
4983 parameters from ffserver */
4984 int err = read_ffserver_streams(o, oc, filename);
4986 print_error(filename, err);
4989 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
4990 ost = output_streams[j];
4991 for (i = 0; i < nb_input_streams; i++) {
4992 ist = input_streams[i];
4993 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
4995 ost->source_index= i;
4996 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
4997 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
4999 ist->st->discard = AVDISCARD_NONE;
5004 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));
5008 } else if (!o->nb_stream_maps) {
5009 /* pick the "best" stream of each type */
5011 /* video: highest resolution */
5012 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5013 int area = 0, idx = -1;
5014 for (i = 0; i < nb_input_streams; i++) {
5015 ist = input_streams[i];
5016 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5017 ist->st->codec->width * ist->st->codec->height > area) {
5018 area = ist->st->codec->width * ist->st->codec->height;
5023 new_video_stream(o, oc, idx);
5026 /* audio: most channels */
5027 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5028 int channels = 0, idx = -1;
5029 for (i = 0; i < nb_input_streams; i++) {
5030 ist = input_streams[i];
5031 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5032 ist->st->codec->channels > channels) {
5033 channels = ist->st->codec->channels;
5038 new_audio_stream(o, oc, idx);
5041 /* subtitles: pick first */
5042 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5043 for (i = 0; i < nb_input_streams; i++)
5044 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5045 new_subtitle_stream(o, oc, i);
5049 /* do something with data? */
5051 for (i = 0; i < o->nb_stream_maps; i++) {
5052 StreamMap *map = &o->stream_maps[i];
5053 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5058 if (map->linklabel) {
5060 OutputFilter *ofilter = NULL;
5063 for (j = 0; j < nb_filtergraphs; j++) {
5064 fg = filtergraphs[j];
5065 for (k = 0; k < fg->nb_outputs; k++) {
5066 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5067 if (out && !strcmp(out->name, map->linklabel)) {
5068 ofilter = fg->outputs[k];
5075 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5076 "in any defined filter graph.\n", map->linklabel);
5079 init_output_filter(ofilter, o, oc);
5081 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5082 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5084 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5086 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5088 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5091 switch (ist->st->codec->codec_type) {
5092 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5093 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5094 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5095 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5096 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5098 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5099 map->file_index, map->stream_index);
5107 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5108 AVDictionaryEntry *e;
5109 ost = output_streams[i];
5111 if ( ost->stream_copy
5112 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5113 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5114 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5118 /* handle attached files */
5119 for (i = 0; i < o->nb_attachments; i++) {
5121 uint8_t *attachment;
5125 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5126 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5130 if ((len = avio_size(pb)) <= 0) {
5131 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5135 if (!(attachment = av_malloc(len))) {
5136 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5140 avio_read(pb, attachment, len);
5142 ost = new_attachment_stream(o, oc, -1);
5143 ost->stream_copy = 0;
5144 ost->attachment_filename = o->attachments[i];
5145 ost->st->codec->extradata = attachment;
5146 ost->st->codec->extradata_size = len;
5148 p = strrchr(o->attachments[i], '/');
5149 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5153 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5154 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5157 output_files[nb_output_files - 1]->ctx = oc;
5158 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5159 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5160 if (o->recording_time != INT64_MAX)
5161 oc->duration = o->recording_time;
5162 output_files[nb_output_files - 1]->start_time = o->start_time;
5163 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5164 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5166 /* check filename in case of an image number is expected */
5167 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5168 if (!av_filename_number_test(oc->filename)) {
5169 print_error(oc->filename, AVERROR(EINVAL));
5174 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5175 /* test if it already exists to avoid losing precious files */
5176 assert_file_overwrite(filename);
5179 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5180 &oc->interrupt_callback,
5181 &output_files[nb_output_files - 1]->opts)) < 0) {
5182 print_error(filename, err);
5187 if (o->mux_preload) {
5189 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5190 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5192 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5195 for (i = 0; i < o->nb_metadata_map; i++) {
5197 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5199 if (in_file_index >= nb_input_files) {
5200 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5203 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5207 if (o->chapters_input_file >= nb_input_files) {
5208 if (o->chapters_input_file == INT_MAX) {
5209 /* copy chapters from the first input file that has them*/
5210 o->chapters_input_file = -1;
5211 for (i = 0; i < nb_input_files; i++)
5212 if (input_files[i]->ctx->nb_chapters) {
5213 o->chapters_input_file = i;
5217 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5218 o->chapters_input_file);
5222 if (o->chapters_input_file >= 0)
5223 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5224 !o->metadata_chapters_manual);
5226 /* copy global metadata by default */
5227 if (!o->metadata_global_manual && nb_input_files){
5228 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5229 AV_DICT_DONT_OVERWRITE);
5230 if(o->recording_time != INT64_MAX)
5231 av_dict_set(&oc->metadata, "duration", NULL, 0);
5233 if (!o->metadata_streams_manual)
5234 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5236 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5238 ist = input_streams[output_streams[i]->source_index];
5239 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5242 /* process manually set metadata */
5243 for (i = 0; i < o->nb_metadata; i++) {
5246 const char *stream_spec;
5247 int index = 0, j, ret = 0;
5249 val = strchr(o->metadata[i].u.str, '=');
5251 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5252 o->metadata[i].u.str);
5257 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5259 for (j = 0; j < oc->nb_streams; j++) {
5260 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5261 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5265 printf("ret %d, stream_spec %s\n", ret, stream_spec);
5273 if (index < 0 || index >= oc->nb_chapters) {
5274 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5277 m = &oc->chapters[index]->metadata;
5280 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5283 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5287 reset_options(o, 0);
5290 /* same option as mencoder */
5291 static int opt_pass(const char *opt, const char *arg)
5293 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5297 static int64_t getmaxrss(void)
5299 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5300 struct rusage rusage;
5301 getrusage(RUSAGE_SELF, &rusage);
5302 return (int64_t)rusage.ru_maxrss * 1024;
5303 #elif HAVE_GETPROCESSMEMORYINFO
5305 PROCESS_MEMORY_COUNTERS memcounters;
5306 proc = GetCurrentProcess();
5307 memcounters.cb = sizeof(memcounters);
5308 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5309 return memcounters.PeakPagefileUsage;
5315 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5317 return parse_option(o, "q:a", arg, options);
5320 static void show_usage(void)
5322 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5323 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5324 av_log(NULL, AV_LOG_INFO, "\n");
5327 static int opt_help(const char *opt, const char *arg)
5329 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5330 av_log_set_callback(log_callback_help);
5332 show_help_options(options, "Main options:\n",
5333 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5334 show_help_options(options, "\nAdvanced options:\n",
5335 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5337 show_help_options(options, "\nVideo options:\n",
5338 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5340 show_help_options(options, "\nAdvanced Video options:\n",
5341 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5342 OPT_VIDEO | OPT_EXPERT);
5343 show_help_options(options, "\nAudio options:\n",
5344 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5346 show_help_options(options, "\nAdvanced Audio options:\n",
5347 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5348 OPT_AUDIO | OPT_EXPERT);
5349 show_help_options(options, "\nSubtitle options:\n",
5350 OPT_SUBTITLE | OPT_GRAB,
5352 show_help_options(options, "\nAudio/Video grab options:\n",
5356 show_help_children(avcodec_get_class(), flags);
5357 show_help_children(avformat_get_class(), flags);
5358 show_help_children(sws_get_class(), flags);
5359 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
5364 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5366 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5367 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5369 if (!strncmp(arg, "pal-", 4)) {
5372 } else if (!strncmp(arg, "ntsc-", 5)) {
5375 } else if (!strncmp(arg, "film-", 5)) {
5379 /* Try to determine PAL/NTSC by peeking in the input files */
5380 if (nb_input_files) {
5382 for (j = 0; j < nb_input_files; j++) {
5383 for (i = 0; i < input_files[j]->nb_streams; i++) {
5384 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5385 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5387 fr = c->time_base.den * 1000 / c->time_base.num;
5391 } else if ((fr == 29970) || (fr == 23976)) {
5396 if (norm != UNKNOWN)
5400 if (norm != UNKNOWN)
5401 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5404 if (norm == UNKNOWN) {
5405 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5406 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5407 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5411 if (!strcmp(arg, "vcd")) {
5412 opt_video_codec(o, "c:v", "mpeg1video");
5413 opt_audio_codec(o, "c:a", "mp2");
5414 parse_option(o, "f", "vcd", options);
5416 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5417 parse_option(o, "r", frame_rates[norm], options);
5418 opt_default("g", norm == PAL ? "15" : "18");
5420 opt_default("b:v", "1150000");
5421 opt_default("maxrate", "1150000");
5422 opt_default("minrate", "1150000");
5423 opt_default("bufsize", "327680"); // 40*1024*8;
5425 opt_default("b:a", "224000");
5426 parse_option(o, "ar", "44100", options);
5427 parse_option(o, "ac", "2", options);
5429 opt_default("packetsize", "2324");
5430 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5432 /* We have to offset the PTS, so that it is consistent with the SCR.
5433 SCR starts at 36000, but the first two packs contain only padding
5434 and the first pack from the other stream, respectively, may also have
5435 been written before.
5436 So the real data starts at SCR 36000+3*1200. */
5437 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5438 } else if (!strcmp(arg, "svcd")) {
5440 opt_video_codec(o, "c:v", "mpeg2video");
5441 opt_audio_codec(o, "c:a", "mp2");
5442 parse_option(o, "f", "svcd", options);
5444 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5445 parse_option(o, "r", frame_rates[norm], options);
5446 parse_option(o, "pix_fmt", "yuv420p", options);
5447 opt_default("g", norm == PAL ? "15" : "18");
5449 opt_default("b:v", "2040000");
5450 opt_default("maxrate", "2516000");
5451 opt_default("minrate", "0"); // 1145000;
5452 opt_default("bufsize", "1835008"); // 224*1024*8;
5453 opt_default("scan_offset", "1");
5456 opt_default("b:a", "224000");
5457 parse_option(o, "ar", "44100", options);
5459 opt_default("packetsize", "2324");
5461 } else if (!strcmp(arg, "dvd")) {
5463 opt_video_codec(o, "c:v", "mpeg2video");
5464 opt_audio_codec(o, "c:a", "ac3");
5465 parse_option(o, "f", "dvd", options);
5467 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5468 parse_option(o, "r", frame_rates[norm], options);
5469 parse_option(o, "pix_fmt", "yuv420p", options);
5470 opt_default("g", norm == PAL ? "15" : "18");
5472 opt_default("b:v", "6000000");
5473 opt_default("maxrate", "9000000");
5474 opt_default("minrate", "0"); // 1500000;
5475 opt_default("bufsize", "1835008"); // 224*1024*8;
5477 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5478 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5480 opt_default("b:a", "448000");
5481 parse_option(o, "ar", "48000", options);
5483 } else if (!strncmp(arg, "dv", 2)) {
5485 parse_option(o, "f", "dv", options);
5487 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5488 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5489 norm == PAL ? "yuv420p" : "yuv411p", options);
5490 parse_option(o, "r", frame_rates[norm], options);
5492 parse_option(o, "ar", "48000", options);
5493 parse_option(o, "ac", "2", options);
5496 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5497 return AVERROR(EINVAL);
5502 static int opt_vstats_file(const char *opt, const char *arg)
5504 av_free (vstats_filename);
5505 vstats_filename = av_strdup (arg);
5509 static int opt_vstats(const char *opt, const char *arg)
5512 time_t today2 = time(NULL);
5513 struct tm *today = localtime(&today2);
5515 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5517 return opt_vstats_file(opt, filename);
5520 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5522 return parse_option(o, "frames:v", arg, options);
5525 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5527 return parse_option(o, "frames:a", arg, options);
5530 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5532 return parse_option(o, "frames:d", arg, options);
5535 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5538 char filename[1000], line[1000], tmp_line[1000];
5539 const char *codec_name = *opt == 'v' ? video_codec_name :
5540 *opt == 'a' ? audio_codec_name :
5541 subtitle_codec_name;
5543 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5544 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5545 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5547 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5551 while (fgets(line, sizeof(line), f)) {
5552 char *key = tmp_line, *value, *endptr;
5554 if (strcspn(line, "#\n\r") == 0)
5556 strcpy(tmp_line, line);
5557 if (!av_strtok(key, "=", &value) ||
5558 !av_strtok(value, "\r\n", &endptr)) {
5559 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5562 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5564 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5565 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5566 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5567 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5568 else if (opt_default(key, value) < 0) {
5569 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5570 filename, line, key, value);
5580 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5584 static int opt_passlogfile(const char *opt, const char *arg)
5586 pass_logfilename_prefix = arg;
5587 #if CONFIG_LIBX264_ENCODER
5588 return opt_default(opt, arg);
5594 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5596 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5597 int ret = parse_option(o, s, arg, options);
5602 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5604 if(!strcmp(opt, "b")){
5605 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5606 return parse_option(o, "b:v", arg, options);
5608 return opt_default(opt, arg);
5611 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5615 if(!strcmp(opt, "qscale")){
5616 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5617 return parse_option(o, "q:v", arg, options);
5619 s = av_asprintf("q%s", opt + 6);
5620 ret = parse_option(o, s, arg, options);
5625 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5627 if(!strcmp(opt, "profile")){
5628 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5629 return parse_option(o, "profile:v", arg, options);
5631 return opt_default(opt, arg);
5634 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5636 return parse_option(o, "filter:v", arg, options);
5639 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5641 return parse_option(o, "filter:a", arg, options);
5644 static int opt_vsync(const char *opt, const char *arg)
5646 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5647 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5648 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5649 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5651 if (video_sync_method == VSYNC_AUTO)
5652 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5656 static int opt_deinterlace(const char *opt, const char *arg)
5658 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5663 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5665 char *tcr = av_asprintf("timecode=%s", arg);
5666 int ret = parse_option(o, "metadata:g", tcr, options);
5668 ret = opt_default("gop_timecode", arg);
5673 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5675 int idx = locate_option(argc, argv, options, "cpuflags");
5676 if (idx && argv[idx + 1])
5677 opt_cpuflags("cpuflags", argv[idx + 1]);
5680 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5682 char layout_str[32];
5685 int ret, channels, ac_str_size;
5688 layout = av_get_channel_layout(arg);
5690 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5691 return AVERROR(EINVAL);
5693 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5694 ret = opt_default(opt, layout_str);
5698 /* set 'ac' option based on channel layout */
5699 channels = av_get_channel_layout_nb_channels(layout);
5700 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5701 stream_str = strchr(opt, ':');
5702 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5703 ac_str = av_mallocz(ac_str_size);
5705 return AVERROR(ENOMEM);
5706 av_strlcpy(ac_str, "ac", 3);
5708 av_strlcat(ac_str, stream_str, ac_str_size);
5709 ret = parse_option(o, ac_str, layout_str, options);
5715 static int opt_filter_complex(const char *opt, const char *arg)
5717 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5718 &nb_filtergraphs, nb_filtergraphs + 1);
5719 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5720 return AVERROR(ENOMEM);
5721 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5722 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5726 #define OFFSET(x) offsetof(OptionsContext, x)
5727 static const OptionDef options[] = {
5729 #include "cmdutils_common_opts.h"
5730 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5731 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5732 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5733 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5734 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5735 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5736 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5737 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5738 { "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]" },
5739 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5740 "outfile[,metadata]:infile[,metadata]" },
5741 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5742 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5743 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5744 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5745 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5746 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5747 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5748 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5749 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5750 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5751 "add timings for benchmarking" },
5752 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5753 "add timings for each task" },
5754 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5755 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5756 "dump each input packet" },
5757 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5758 "when dumping packets, also dump the payload" },
5759 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5760 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5761 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5762 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5763 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5764 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5765 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5766 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5767 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5768 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5769 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5770 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5771 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5772 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
5773 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
5774 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
5775 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
5776 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
5777 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
5778 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
5779 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
5780 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
5781 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
5784 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
5785 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
5786 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
5787 { "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" },
5788 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
5789 { "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" },
5790 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5791 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5792 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5793 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
5794 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5795 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5796 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5797 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
5798 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
5799 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
5800 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
5801 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
5802 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
5803 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
5804 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
5805 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
5806 "use same quantizer as source (implies VBR)" },
5807 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
5808 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
5809 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
5810 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
5811 "this option is deprecated, use the yadif filter instead" },
5812 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
5813 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
5814 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
5815 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
5816 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
5817 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
5818 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
5819 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
5820 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
5821 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
5822 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
5823 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
5824 { "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" },
5825 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
5828 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
5829 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
5830 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
5831 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
5832 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
5833 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
5834 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
5835 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
5836 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
5837 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
5838 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
5840 /* subtitle options */
5841 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
5842 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
5843 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
5846 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
5847 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
5848 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
5851 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
5852 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
5854 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
5855 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
5856 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
5858 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
5859 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
5860 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
5861 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
5862 /* data codec support */
5863 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
5864 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
5866 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
5870 int main(int argc, char **argv)
5872 OptionsContext o = { 0 };
5875 reset_options(&o, 0);
5877 av_log_set_flags(AV_LOG_SKIP_REPEATED);
5878 parse_loglevel(argc, argv, options);
5880 if(argc>1 && !strcmp(argv[1], "-d")){
5882 av_log_set_callback(log_callback_null);
5887 avcodec_register_all();
5889 avdevice_register_all();
5891 avfilter_register_all();
5893 avformat_network_init();
5895 show_banner(argc, argv, options);
5899 parse_cpuflags(argc, argv, options);
5902 parse_options(&o, argc, argv, options, opt_output_file);
5904 if (nb_output_files <= 0 && nb_input_files == 0) {
5906 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
5910 /* file converter / grab */
5911 if (nb_output_files <= 0) {
5912 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
5916 if (nb_input_files == 0) {
5917 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
5921 current_time = ti = getutime();
5922 if (transcode() < 0)
5924 ti = getutime() - ti;
5926 int maxrss = getmaxrss() / 1024;
5927 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);