2 * Copyright (c) 2000-2003 Fabrice Bellard
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * multimedia converter based on the FFmpeg libraries
37 #include "libavformat/avformat.h"
38 #include "libavdevice/avdevice.h"
39 #include "libswscale/swscale.h"
40 #include "libswresample/swresample.h"
41 #include "libavutil/opt.h"
42 #include "libavutil/audioconvert.h"
43 #include "libavutil/parseutils.h"
44 #include "libavutil/samplefmt.h"
45 #include "libavutil/colorspace.h"
46 #include "libavutil/fifo.h"
47 #include "libavutil/intreadwrite.h"
48 #include "libavutil/dict.h"
49 #include "libavutil/mathematics.h"
50 #include "libavutil/pixdesc.h"
51 #include "libavutil/avstring.h"
52 #include "libavutil/libm.h"
53 #include "libavutil/imgutils.h"
54 #include "libavutil/timestamp.h"
55 #include "libavutil/bprint.h"
56 #include "libavutil/time.h"
57 #include "libavformat/os_support.h"
59 #include "libavformat/ffm.h" // not public API
61 # include "libavfilter/avcodec.h"
62 # include "libavfilter/avfilter.h"
63 # include "libavfilter/avfiltergraph.h"
64 # include "libavfilter/buffersrc.h"
65 # include "libavfilter/buffersink.h"
67 #if HAVE_SYS_RESOURCE_H
68 #include <sys/types.h>
69 #include <sys/resource.h>
70 #elif HAVE_GETPROCESSTIMES
73 #if HAVE_GETPROCESSMEMORYINFO
79 #include <sys/select.h>
84 #include <sys/ioctl.h>
99 #include "libavutil/avassert.h"
101 #define VSYNC_AUTO -1
102 #define VSYNC_PASSTHROUGH 0
105 #define VSYNC_DROP 0xff
107 const char program_name[] = "ffmpeg";
108 const int program_birth_year = 2000;
110 /* select an input stream for an output stream */
111 typedef struct StreamMap {
112 int disabled; /** 1 is this mapping is disabled by a negative map */
116 int sync_stream_index;
117 char *linklabel; /** name of an output link, for mapping lavfi outputs */
121 int file_idx, stream_idx, channel_idx; // input
122 int ofile_idx, ostream_idx; // output
125 static const OptionDef options[];
127 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
129 static int frame_bits_per_raw_sample = 0;
130 static int video_discard = 0;
131 static int same_quant = 0;
132 static int do_deinterlace = 0;
133 static int intra_dc_precision = 8;
134 static int qp_hist = 0;
135 static int intra_only = 0;
136 static const char *video_codec_name = NULL;
137 static const char *audio_codec_name = NULL;
138 static const char *subtitle_codec_name = NULL;
140 static int file_overwrite = 0;
141 static int no_file_overwrite = 0;
142 static int do_benchmark = 0;
143 static int do_benchmark_all = 0;
144 static int do_hex_dump = 0;
145 static int do_pkt_dump = 0;
146 static int do_psnr = 0;
147 static int do_pass = 0;
148 static const char *pass_logfilename_prefix;
149 static int video_sync_method = VSYNC_AUTO;
150 static int audio_sync_method = 0;
151 static float audio_drift_threshold = 0.1;
152 static int copy_ts = 0;
153 static int copy_tb = -1;
154 static int opt_shortest = 0;
155 static char *vstats_filename;
156 static FILE *vstats_file;
158 static int audio_volume = 256;
160 static int exit_on_error = 0;
161 static int stdin_interaction = 1;
162 static int run_as_daemon = 0;
163 static volatile int received_nb_signals = 0;
164 static int64_t video_size = 0;
165 static int64_t audio_size = 0;
166 static int64_t subtitle_size = 0;
167 static int64_t extra_size = 0;
168 static int nb_frames_dup = 0;
169 static int nb_frames_drop = 0;
170 static int input_sync;
172 static float dts_delta_threshold = 10;
173 static float dts_error_threshold = 3600*30;
175 static int print_stats = 1;
176 static int debug_ts = 0;
177 static int current_time;
178 static AVIOContext *progress_avio = NULL;
180 static uint8_t *subtitle_out;
183 /* signal to input threads that they should exit; set by the main thread */
184 static int transcoding_finished;
187 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
189 typedef struct InputFilter {
190 AVFilterContext *filter;
191 struct InputStream *ist;
192 struct FilterGraph *graph;
196 typedef struct OutputFilter {
197 AVFilterContext *filter;
198 struct OutputStream *ost;
199 struct FilterGraph *graph;
202 /* temporary storage until stream maps are processed */
203 AVFilterInOut *out_tmp;
206 typedef struct FilterGraph {
208 const char *graph_desc;
210 AVFilterGraph *graph;
212 InputFilter **inputs;
214 OutputFilter **outputs;
218 typedef struct InputStream {
221 int discard; /* true if stream data should be discarded */
222 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
224 AVFrame *decoded_frame;
226 int64_t start; /* time when read started */
227 /* predicted dts of the next packet read for this stream or (when there are
228 * several frames in a packet) of the next frame in current packet (in AV_TIME_BASE units) */
230 int64_t dts; ///< dts of the last packet read for this stream (in AV_TIME_BASE units)
232 int64_t next_pts; ///< synthetic pts for the next decode frame (in AV_TIME_BASE units)
233 int64_t pts; ///< current pts of the decoded frame (in AV_TIME_BASE units)
234 int wrap_correction_done;
236 int is_start; /* is 1 at the start and after a discontinuity */
238 int showed_multi_packet_warning;
240 AVRational framerate; /* framerate forced with -r */
245 int resample_pix_fmt;
247 int resample_sample_fmt;
248 int resample_sample_rate;
249 int resample_channels;
250 uint64_t resample_channel_layout;
252 /* a pool of free buffers for decoded data */
253 FrameBuffer *buffer_pool;
256 /* decoded data from this stream goes into all those filters
257 * currently video and audio only */
258 InputFilter **filters;
262 typedef struct InputFile {
263 AVFormatContext *ctx;
264 int eof_reached; /* true if eof reached */
265 int unavailable; /* true if the file is unavailable (possibly temporarily) */
266 int ist_index; /* index of first stream in input_streams */
268 int nb_streams; /* number of stream that ffmpeg is aware of; may be different
269 from ctx.nb_streams if new streams appear during av_read_frame() */
270 int nb_streams_warn; /* number of streams that the user was warned of */
274 pthread_t thread; /* thread reading from this file */
275 int finished; /* the thread has exited */
276 int joined; /* the thread has been joined */
277 pthread_mutex_t fifo_lock; /* lock for access to fifo */
278 pthread_cond_t fifo_cond; /* the main thread will signal on this cond after reading from fifo */
279 AVFifoBuffer *fifo; /* demuxed packets are stored here; freed by the main thread */
283 typedef struct OutputStream {
284 int file_index; /* file index */
285 int index; /* stream index in the output file */
286 int source_index; /* InputStream index */
287 AVStream *st; /* stream in the output file */
288 int encoding_needed; /* true if encoding needed for this stream */
290 /* input pts and corresponding output pts
292 struct InputStream *sync_ist; /* input stream to sync against */
293 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ // FIXME look at frame_number
294 /* pts of the first frame encoded for this stream, used for limiting
297 AVBitStreamFilterContext *bitstream_filters;
300 AVFrame *filtered_frame;
303 AVRational frame_rate;
307 float frame_aspect_ratio;
310 /* forced key frames */
311 int64_t *forced_kf_pts;
314 char *forced_keyframes;
317 int audio_channels_map[SWR_CH_MAX]; /* list of the channels id to pick from the source stream */
318 int audio_channels_mapped; /* number of channels in audio_channels_map */
322 OutputFilter *filter;
326 int64_t swr_dither_method;
327 double swr_dither_scale;
329 int is_past_recording_time;
330 int unavailable; /* true if the steram is unavailable (possibly temporarily) */
332 const char *attachment_filename;
333 int copy_initial_nonkeyframes;
341 /* init terminal so that we can grab keys */
342 static struct termios oldtty;
343 static int restore_tty;
346 typedef struct OutputFile {
347 AVFormatContext *ctx;
349 int ost_index; /* index of the first stream in output_streams */
350 int64_t recording_time; ///< desired length of the resulting file in microseconds == AV_TIME_BASE units
351 int64_t start_time; ///< start time in microseconds == AV_TIME_BASE units
352 uint64_t limit_filesize; /* filesize limit expressed in bytes */
355 static InputStream **input_streams = NULL;
356 static int nb_input_streams = 0;
357 static InputFile **input_files = NULL;
358 static int nb_input_files = 0;
360 static OutputStream **output_streams = NULL;
361 static int nb_output_streams = 0;
362 static OutputFile **output_files = NULL;
363 static int nb_output_files = 0;
365 static FilterGraph **filtergraphs;
368 typedef struct OptionsContext {
369 /* input/output options */
373 SpecifierOpt *codec_names;
375 SpecifierOpt *audio_channels;
376 int nb_audio_channels;
377 SpecifierOpt *audio_sample_rate;
378 int nb_audio_sample_rate;
379 SpecifierOpt *frame_rates;
381 SpecifierOpt *frame_sizes;
383 SpecifierOpt *frame_pix_fmts;
384 int nb_frame_pix_fmts;
387 int64_t input_ts_offset;
390 SpecifierOpt *ts_scale;
392 SpecifierOpt *dump_attachment;
393 int nb_dump_attachment;
396 StreamMap *stream_maps;
398 AudioChannelMap *audio_channel_maps; /* one info entry per -map_channel */
399 int nb_audio_channel_maps; /* number of (valid) -map_channel settings */
400 int metadata_global_manual;
401 int metadata_streams_manual;
402 int metadata_chapters_manual;
403 const char **attachments;
406 int chapters_input_file;
408 int64_t recording_time;
409 uint64_t limit_filesize;
415 int subtitle_disable;
418 /* indexed by output file stream index */
422 SpecifierOpt *metadata;
424 SpecifierOpt *max_frames;
426 SpecifierOpt *bitstream_filters;
427 int nb_bitstream_filters;
428 SpecifierOpt *codec_tags;
430 SpecifierOpt *sample_fmts;
432 SpecifierOpt *qscale;
434 SpecifierOpt *forced_key_frames;
435 int nb_forced_key_frames;
436 SpecifierOpt *force_fps;
438 SpecifierOpt *frame_aspect_ratios;
439 int nb_frame_aspect_ratios;
440 SpecifierOpt *rc_overrides;
442 SpecifierOpt *intra_matrices;
443 int nb_intra_matrices;
444 SpecifierOpt *inter_matrices;
445 int nb_inter_matrices;
446 SpecifierOpt *top_field_first;
447 int nb_top_field_first;
448 SpecifierOpt *metadata_map;
450 SpecifierOpt *presets;
452 SpecifierOpt *copy_initial_nonkeyframes;
453 int nb_copy_initial_nonkeyframes;
454 SpecifierOpt *filters;
458 static void do_video_stats(AVFormatContext *os, OutputStream *ost, int frame_size);
460 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
463 for (i = 0; i < o->nb_ ## name; i++) {\
464 char *spec = o->name[i].specifier;\
465 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
466 outvar = o->name[i].u.type;\
472 static int64_t getutime(void)
475 struct rusage rusage;
477 getrusage(RUSAGE_SELF, &rusage);
478 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
479 #elif HAVE_GETPROCESSTIMES
482 proc = GetCurrentProcess();
483 GetProcessTimes(proc, &c, &e, &k, &u);
484 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
490 static void update_benchmark(const char *fmt, ...)
492 if (do_benchmark_all) {
493 int64_t t = getutime();
499 vsnprintf(buf, sizeof(buf), fmt, va);
501 printf("bench: %8"PRIu64" %s \n", t - current_time, buf);
507 static void reset_options(OptionsContext *o, int is_input)
509 const OptionDef *po = options;
510 OptionsContext bak= *o;
513 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
515 void *dst = (uint8_t*)o + po->u.off;
517 if (po->flags & OPT_SPEC) {
518 SpecifierOpt **so = dst;
519 int i, *count = (int*)(so + 1);
520 for (i = 0; i < *count; i++) {
521 av_freep(&(*so)[i].specifier);
522 if (po->flags & OPT_STRING)
523 av_freep(&(*so)[i].u.str);
527 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
532 for (i = 0; i < o->nb_stream_maps; i++)
533 av_freep(&o->stream_maps[i].linklabel);
534 av_freep(&o->stream_maps);
535 av_freep(&o->audio_channel_maps);
536 av_freep(&o->streamid_map);
538 memset(o, 0, sizeof(*o));
541 o->recording_time = bak.recording_time;
542 if (o->recording_time != INT64_MAX)
543 av_log(NULL, AV_LOG_WARNING,
544 "-t is not an input option, keeping it for the next output;"
545 " consider fixing your command line.\n");
547 o->recording_time = INT64_MAX;
548 o->mux_max_delay = 0.7;
549 o->limit_filesize = UINT64_MAX;
550 o->chapters_input_file = INT_MAX;
556 static enum PixelFormat choose_pixel_fmt(AVStream *st, AVCodec *codec, enum PixelFormat target)
558 if (codec && codec->pix_fmts) {
559 const enum PixelFormat *p = codec->pix_fmts;
560 int has_alpha= av_pix_fmt_descriptors[target].nb_components % 2 == 0;
561 enum PixelFormat best= PIX_FMT_NONE;
562 if (st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
563 if (st->codec->codec_id == CODEC_ID_MJPEG) {
564 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
565 } else if (st->codec->codec_id == CODEC_ID_LJPEG) {
566 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
567 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
570 for (; *p != PIX_FMT_NONE; p++) {
571 best= avcodec_find_best_pix_fmt2(best, *p, target, has_alpha, NULL);
575 if (*p == PIX_FMT_NONE) {
576 if (target != PIX_FMT_NONE)
577 av_log(NULL, AV_LOG_WARNING,
578 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
579 av_pix_fmt_descriptors[target].name,
581 av_pix_fmt_descriptors[best].name);
588 static char *choose_pix_fmts(OutputStream *ost)
590 if (ost->keep_pix_fmt) {
592 avfilter_graph_set_auto_convert(ost->filter->graph->graph,
593 AVFILTER_AUTO_CONVERT_NONE);
594 if (ost->st->codec->pix_fmt == PIX_FMT_NONE)
596 return av_strdup(av_get_pix_fmt_name(ost->st->codec->pix_fmt));
598 if (ost->st->codec->pix_fmt != PIX_FMT_NONE) {
599 return av_strdup(av_get_pix_fmt_name(choose_pixel_fmt(ost->st, ost->enc, ost->st->codec->pix_fmt)));
600 } else if (ost->enc && ost->enc->pix_fmts) {
601 const enum PixelFormat *p;
602 AVIOContext *s = NULL;
606 if (avio_open_dyn_buf(&s) < 0)
609 p = ost->enc->pix_fmts;
610 if (ost->st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL) {
611 if (ost->st->codec->codec_id == CODEC_ID_MJPEG) {
612 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE };
613 } else if (ost->st->codec->codec_id == CODEC_ID_LJPEG) {
614 p = (const enum PixelFormat[]) { PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P,
615 PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE };
619 for (; *p != PIX_FMT_NONE; p++) {
620 const char *name = av_get_pix_fmt_name(*p);
621 avio_printf(s, "%s:", name);
623 len = avio_close_dyn_buf(s, &ret);
631 * Define a function for building a string containing a list of
634 #define DEF_CHOOSE_FORMAT(type, var, supported_list, none, get_name, separator) \
635 static char *choose_ ## var ## s(OutputStream *ost) \
637 if (ost->st->codec->var != none) { \
638 get_name(ost->st->codec->var); \
639 return av_strdup(name); \
640 } else if (ost->enc->supported_list) { \
642 AVIOContext *s = NULL; \
646 if (avio_open_dyn_buf(&s) < 0) \
649 for (p = ost->enc->supported_list; *p != none; p++) { \
651 avio_printf(s, "%s" separator, name); \
653 len = avio_close_dyn_buf(s, &ret); \
660 #define GET_PIX_FMT_NAME(pix_fmt)\
661 const char *name = av_get_pix_fmt_name(pix_fmt);
663 // DEF_CHOOSE_FORMAT(enum PixelFormat, pix_fmt, pix_fmts, PIX_FMT_NONE,
664 // GET_PIX_FMT_NAME, ":")
666 #define GET_SAMPLE_FMT_NAME(sample_fmt)\
667 const char *name = av_get_sample_fmt_name(sample_fmt)
669 DEF_CHOOSE_FORMAT(enum AVSampleFormat, sample_fmt, sample_fmts,
670 AV_SAMPLE_FMT_NONE, GET_SAMPLE_FMT_NAME, ",")
672 #define GET_SAMPLE_RATE_NAME(rate)\
674 snprintf(name, sizeof(name), "%d", rate);
676 DEF_CHOOSE_FORMAT(int, sample_rate, supported_samplerates, 0,
677 GET_SAMPLE_RATE_NAME, ",")
679 #define GET_CH_LAYOUT_NAME(ch_layout)\
681 snprintf(name, sizeof(name), "0x%"PRIx64, ch_layout);
683 DEF_CHOOSE_FORMAT(uint64_t, channel_layout, channel_layouts, 0,
684 GET_CH_LAYOUT_NAME, ",")
686 static FilterGraph *init_simple_filtergraph(InputStream *ist, OutputStream *ost)
688 FilterGraph *fg = av_mallocz(sizeof(*fg));
692 fg->index = nb_filtergraphs;
694 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs), &fg->nb_outputs,
696 if (!(fg->outputs[0] = av_mallocz(sizeof(*fg->outputs[0]))))
698 fg->outputs[0]->ost = ost;
699 fg->outputs[0]->graph = fg;
701 ost->filter = fg->outputs[0];
703 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs), &fg->nb_inputs,
705 if (!(fg->inputs[0] = av_mallocz(sizeof(*fg->inputs[0]))))
707 fg->inputs[0]->ist = ist;
708 fg->inputs[0]->graph = fg;
710 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
711 &ist->nb_filters, ist->nb_filters + 1);
712 ist->filters[ist->nb_filters - 1] = fg->inputs[0];
714 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
715 &nb_filtergraphs, nb_filtergraphs + 1);
716 filtergraphs[nb_filtergraphs - 1] = fg;
721 static void init_input_filter(FilterGraph *fg, AVFilterInOut *in)
723 InputStream *ist = NULL;
724 enum AVMediaType type = avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx);
727 // TODO: support other filter types
728 if (type != AVMEDIA_TYPE_VIDEO && type != AVMEDIA_TYPE_AUDIO) {
729 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters supported "
738 int file_idx = strtol(in->name, &p, 0);
740 if (file_idx < 0 || file_idx >= nb_input_files) {
741 av_log(NULL, AV_LOG_FATAL, "Invalid file index %d in filtergraph description %s.\n",
742 file_idx, fg->graph_desc);
745 s = input_files[file_idx]->ctx;
747 for (i = 0; i < s->nb_streams; i++) {
748 if (s->streams[i]->codec->codec_type != type)
750 if (check_stream_specifier(s, s->streams[i], *p == ':' ? p + 1 : p) == 1) {
756 av_log(NULL, AV_LOG_FATAL, "Stream specifier '%s' in filtergraph description %s "
757 "matches no streams.\n", p, fg->graph_desc);
760 ist = input_streams[input_files[file_idx]->ist_index + st->index];
762 /* find the first unused stream of corresponding type */
763 for (i = 0; i < nb_input_streams; i++) {
764 ist = input_streams[i];
765 if (ist->st->codec->codec_type == type && ist->discard)
768 if (i == nb_input_streams) {
769 av_log(NULL, AV_LOG_FATAL, "Cannot find a matching stream for "
770 "unlabeled input pad %d on filter %s\n", in->pad_idx,
771 in->filter_ctx->name);
778 ist->decoding_needed = 1;
779 ist->st->discard = AVDISCARD_NONE;
781 fg->inputs = grow_array(fg->inputs, sizeof(*fg->inputs),
782 &fg->nb_inputs, fg->nb_inputs + 1);
783 if (!(fg->inputs[fg->nb_inputs - 1] = av_mallocz(sizeof(*fg->inputs[0]))))
785 fg->inputs[fg->nb_inputs - 1]->ist = ist;
786 fg->inputs[fg->nb_inputs - 1]->graph = fg;
788 ist->filters = grow_array(ist->filters, sizeof(*ist->filters),
789 &ist->nb_filters, ist->nb_filters + 1);
790 ist->filters[ist->nb_filters - 1] = fg->inputs[fg->nb_inputs - 1];
793 static int configure_output_video_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
796 OutputStream *ost = ofilter->ost;
797 AVCodecContext *codec = ost->st->codec;
798 AVFilterContext *last_filter = out->filter_ctx;
799 int pad_idx = out->pad_idx;
802 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
804 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
805 ret = avfilter_graph_create_filter(&ofilter->filter,
806 avfilter_get_by_name("buffersink"),
807 name, NULL, NULL/*buffersink_params*/, fg->graph);
808 av_freep(&buffersink_params);
813 if (codec->width || codec->height) {
815 AVFilterContext *filter;
817 snprintf(args, sizeof(args), "%d:%d:flags=0x%X",
820 (unsigned)ost->sws_flags);
821 snprintf(name, sizeof(name), "scaler for output stream %d:%d",
822 ost->file_index, ost->index);
823 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
824 name, args, NULL, fg->graph)) < 0)
826 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
829 last_filter = filter;
833 if ((pix_fmts = choose_pix_fmts(ost))) {
834 AVFilterContext *filter;
835 snprintf(name, sizeof(name), "pixel format for output stream %d:%d",
836 ost->file_index, ost->index);
837 if ((ret = avfilter_graph_create_filter(&filter,
838 avfilter_get_by_name("format"),
839 "format", pix_fmts, NULL,
842 if ((ret = avfilter_link(last_filter, pad_idx, filter, 0)) < 0)
845 last_filter = filter;
850 if (ost->frame_rate.num && 0) {
851 AVFilterContext *fps;
854 snprintf(args, sizeof(args), "fps=%d/%d", ost->frame_rate.num,
855 ost->frame_rate.den);
856 snprintf(name, sizeof(name), "fps for output stream %d:%d",
857 ost->file_index, ost->index);
858 ret = avfilter_graph_create_filter(&fps, avfilter_get_by_name("fps"),
859 name, args, NULL, fg->graph);
863 ret = avfilter_link(last_filter, pad_idx, fps, 0);
870 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
876 static int configure_output_audio_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
878 OutputStream *ost = ofilter->ost;
879 AVCodecContext *codec = ost->st->codec;
880 AVFilterContext *last_filter = out->filter_ctx;
881 int pad_idx = out->pad_idx;
882 char *sample_fmts, *sample_rates, *channel_layouts;
887 snprintf(name, sizeof(name), "output stream %d:%d", ost->file_index, ost->index);
888 ret = avfilter_graph_create_filter(&ofilter->filter,
889 avfilter_get_by_name("abuffersink"),
890 name, NULL, NULL, fg->graph);
894 #define AUTO_INSERT_FILTER(opt_name, filter_name, arg) do { \
895 AVFilterContext *filt_ctx; \
897 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
898 "similarly to -af " filter_name "=%s.\n", arg); \
900 ret = avfilter_graph_create_filter(&filt_ctx, \
901 avfilter_get_by_name(filter_name), \
902 filter_name, arg, NULL, fg->graph); \
906 ret = avfilter_link(last_filter, pad_idx, filt_ctx, 0); \
910 last_filter = filt_ctx; \
913 if (ost->audio_channels_mapped) {
916 av_bprint_init(&pan_buf, 256, 8192);
917 av_bprintf(&pan_buf, "0x%"PRIx64,
918 av_get_default_channel_layout(ost->audio_channels_mapped));
919 for (i = 0; i < ost->audio_channels_mapped; i++)
920 if (ost->audio_channels_map[i] != -1)
921 av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
923 AUTO_INSERT_FILTER("-map_channel", "pan", pan_buf.str);
924 av_bprint_finalize(&pan_buf, NULL);
927 if (codec->channels && !codec->channel_layout)
928 codec->channel_layout = av_get_default_channel_layout(codec->channels);
930 sample_fmts = choose_sample_fmts(ost);
931 sample_rates = choose_sample_rates(ost);
932 channel_layouts = choose_channel_layouts(ost);
933 if (sample_fmts || sample_rates || channel_layouts) {
934 AVFilterContext *format;
939 len += snprintf(args + len, sizeof(args) - len, "sample_fmts=%s:",
942 len += snprintf(args + len, sizeof(args) - len, "sample_rates=%s:",
945 len += snprintf(args + len, sizeof(args) - len, "channel_layouts=%s:",
949 av_freep(&sample_fmts);
950 av_freep(&sample_rates);
951 av_freep(&channel_layouts);
953 snprintf(name, sizeof(name), "audio format for output stream %d:%d",
954 ost->file_index, ost->index);
955 ret = avfilter_graph_create_filter(&format,
956 avfilter_get_by_name("aformat"),
957 name, args, NULL, fg->graph);
961 ret = avfilter_link(last_filter, pad_idx, format, 0);
965 last_filter = format;
969 if (audio_volume != 256 && 0) {
972 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
973 AUTO_INSERT_FILTER("-vol", "volume", args);
976 if ((ret = avfilter_link(last_filter, pad_idx, ofilter->filter, 0)) < 0)
982 #define DESCRIBE_FILTER_LINK(f, inout, in) \
984 AVFilterContext *ctx = inout->filter_ctx; \
985 AVFilterPad *pads = in ? ctx->input_pads : ctx->output_pads; \
986 int nb_pads = in ? ctx->input_count : ctx->output_count; \
989 if (avio_open_dyn_buf(&pb) < 0) \
992 avio_printf(pb, "%s", ctx->filter->name); \
994 avio_printf(pb, ":%s", avfilter_pad_get_name(pads, inout->pad_idx));\
996 avio_close_dyn_buf(pb, &f->name); \
999 static int configure_output_filter(FilterGraph *fg, OutputFilter *ofilter, AVFilterInOut *out)
1001 av_freep(&ofilter->name);
1002 DESCRIBE_FILTER_LINK(ofilter, out, 0);
1004 switch (avfilter_pad_get_type(out->filter_ctx->output_pads, out->pad_idx)) {
1005 case AVMEDIA_TYPE_VIDEO: return configure_output_video_filter(fg, ofilter, out);
1006 case AVMEDIA_TYPE_AUDIO: return configure_output_audio_filter(fg, ofilter, out);
1007 default: av_assert0(0);
1011 static int configure_input_video_filter(FilterGraph *fg, InputFilter *ifilter,
1014 AVFilterContext *first_filter = in->filter_ctx;
1015 AVFilter *filter = avfilter_get_by_name("buffer");
1016 InputStream *ist = ifilter->ist;
1017 AVRational tb = ist->framerate.num ? (AVRational){ist->framerate.den,
1018 ist->framerate.num} :
1020 AVRational fr = ist->framerate.num ? ist->framerate :
1021 ist->st->r_frame_rate;
1025 int pad_idx = in->pad_idx;
1028 sar = ist->st->sample_aspect_ratio.num ?
1029 ist->st->sample_aspect_ratio :
1030 ist->st->codec->sample_aspect_ratio;
1032 sar = (AVRational){0,1};
1033 av_bprint_init(&args, 0, 1);
1035 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:"
1036 "pixel_aspect=%d/%d:sws_param=flags=%d", ist->st->codec->width,
1037 ist->st->codec->height, ist->st->codec->pix_fmt,
1038 tb.num, tb.den, sar.num, sar.den,
1039 SWS_BILINEAR + ((ist->st->codec->flags&CODEC_FLAG_BITEXACT) ? SWS_BITEXACT:0));
1040 if (fr.num && fr.den)
1041 av_bprintf(&args, ":frame_rate=%d/%d", fr.num, fr.den);
1042 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1043 ist->file_index, ist->st->index);
1045 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter, name,
1046 args.str, NULL, fg->graph)) < 0)
1049 if (ist->framerate.num) {
1050 AVFilterContext *setpts;
1052 snprintf(name, sizeof(name), "force CFR for input from stream %d:%d",
1053 ist->file_index, ist->st->index);
1054 if ((ret = avfilter_graph_create_filter(&setpts,
1055 avfilter_get_by_name("setpts"),
1060 if ((ret = avfilter_link(setpts, 0, first_filter, pad_idx)) < 0)
1063 first_filter = setpts;
1067 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1072 static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
1075 AVFilterContext *first_filter = in->filter_ctx;
1076 AVFilter *filter = avfilter_get_by_name("abuffer");
1077 InputStream *ist = ifilter->ist;
1078 int pad_idx = in->pad_idx;
1079 char args[255], name[255];
1082 snprintf(args, sizeof(args), "time_base=%d/%d:sample_rate=%d:sample_fmt=%s"
1083 ":channel_layout=0x%"PRIx64,
1084 1, ist->st->codec->sample_rate,
1085 ist->st->codec->sample_rate,
1086 av_get_sample_fmt_name(ist->st->codec->sample_fmt),
1087 ist->st->codec->channel_layout);
1088 snprintf(name, sizeof(name), "graph %d input from stream %d:%d", fg->index,
1089 ist->file_index, ist->st->index);
1091 if ((ret = avfilter_graph_create_filter(&ifilter->filter, filter,
1096 #define AUTO_INSERT_FILTER_INPUT(opt_name, filter_name, arg) do { \
1097 AVFilterContext *filt_ctx; \
1099 av_log(NULL, AV_LOG_INFO, opt_name " is forwarded to lavfi " \
1100 "similarly to -af " filter_name "=%s.\n", arg); \
1102 snprintf(name, sizeof(name), "graph %d %s for input stream %d:%d", \
1103 fg->index, filter_name, ist->file_index, ist->st->index); \
1104 ret = avfilter_graph_create_filter(&filt_ctx, \
1105 avfilter_get_by_name(filter_name), \
1106 name, arg, NULL, fg->graph); \
1110 ret = avfilter_link(filt_ctx, 0, first_filter, pad_idx); \
1114 first_filter = filt_ctx; \
1117 if (audio_sync_method > 0) {
1118 char args[256] = {0};
1120 av_strlcatf(args, sizeof(args), "min_comp=0.001:min_hard_comp=%f", audio_drift_threshold);
1121 if (audio_sync_method > 1)
1122 av_strlcatf(args, sizeof(args), ":max_soft_comp=%f", audio_sync_method/(double)ist->st->codec->sample_rate);
1123 AUTO_INSERT_FILTER_INPUT("-async", "aresample", args);
1126 // if (ost->audio_channels_mapped) {
1128 // AVBPrint pan_buf;
1129 // av_bprint_init(&pan_buf, 256, 8192);
1130 // av_bprintf(&pan_buf, "0x%"PRIx64,
1131 // av_get_default_channel_layout(ost->audio_channels_mapped));
1132 // for (i = 0; i < ost->audio_channels_mapped; i++)
1133 // if (ost->audio_channels_map[i] != -1)
1134 // av_bprintf(&pan_buf, ":c%d=c%d", i, ost->audio_channels_map[i]);
1135 // AUTO_INSERT_FILTER_INPUT("-map_channel", "pan", pan_buf.str);
1136 // av_bprint_finalize(&pan_buf, NULL);
1139 if (audio_volume != 256) {
1142 snprintf(args, sizeof(args), "%f", audio_volume / 256.);
1143 AUTO_INSERT_FILTER_INPUT("-vol", "volume", args);
1145 if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
1151 static int configure_input_filter(FilterGraph *fg, InputFilter *ifilter,
1154 av_freep(&ifilter->name);
1155 DESCRIBE_FILTER_LINK(ifilter, in, 1);
1157 switch (avfilter_pad_get_type(in->filter_ctx->input_pads, in->pad_idx)) {
1158 case AVMEDIA_TYPE_VIDEO: return configure_input_video_filter(fg, ifilter, in);
1159 case AVMEDIA_TYPE_AUDIO: return configure_input_audio_filter(fg, ifilter, in);
1160 default: av_assert0(0);
1164 static int configure_filtergraph(FilterGraph *fg)
1166 AVFilterInOut *inputs, *outputs, *cur;
1167 int ret, i, init = !fg->graph, simple = !fg->graph_desc;
1168 const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter :
1171 avfilter_graph_free(&fg->graph);
1172 if (!(fg->graph = avfilter_graph_alloc()))
1173 return AVERROR(ENOMEM);
1176 OutputStream *ost = fg->outputs[0]->ost;
1178 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
1179 fg->graph->scale_sws_opts = av_strdup(args);
1182 if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0)
1185 if (simple && (!inputs || inputs->next || !outputs || outputs->next)) {
1186 av_log(NULL, AV_LOG_ERROR, "Simple filtergraph '%s' does not have "
1187 "exactly one input and output.\n", graph_desc);
1188 return AVERROR(EINVAL);
1191 for (cur = inputs; !simple && init && cur; cur = cur->next)
1192 init_input_filter(fg, cur);
1194 for (cur = inputs, i = 0; cur; cur = cur->next, i++)
1195 if ((ret = configure_input_filter(fg, fg->inputs[i], cur)) < 0)
1197 avfilter_inout_free(&inputs);
1199 if (!init || simple) {
1200 /* we already know the mappings between lavfi outputs and output streams,
1201 * so we can finish the setup */
1202 for (cur = outputs, i = 0; cur; cur = cur->next, i++)
1203 configure_output_filter(fg, fg->outputs[i], cur);
1204 avfilter_inout_free(&outputs);
1206 if ((ret = avfilter_graph_config(fg->graph, NULL)) < 0)
1209 /* wait until output mappings are processed */
1210 for (cur = outputs; cur;) {
1211 fg->outputs = grow_array(fg->outputs, sizeof(*fg->outputs),
1212 &fg->nb_outputs, fg->nb_outputs + 1);
1213 if (!(fg->outputs[fg->nb_outputs - 1] = av_mallocz(sizeof(*fg->outputs[0]))))
1215 fg->outputs[fg->nb_outputs - 1]->graph = fg;
1216 fg->outputs[fg->nb_outputs - 1]->out_tmp = cur;
1218 fg->outputs[fg->nb_outputs - 1]->out_tmp->next = NULL;
1225 static int configure_complex_filters(void)
1229 for (i = 0; i < nb_filtergraphs; i++)
1230 if (!filtergraphs[i]->graph &&
1231 (ret = configure_filtergraph(filtergraphs[i])) < 0)
1236 static int ist_in_filtergraph(FilterGraph *fg, InputStream *ist)
1239 for (i = 0; i < fg->nb_inputs; i++)
1240 if (fg->inputs[i]->ist == ist)
1245 static void term_exit(void)
1247 av_log(NULL, AV_LOG_QUIET, "%s", "");
1250 tcsetattr (0, TCSANOW, &oldtty);
1254 static volatile int received_sigterm = 0;
1256 static void sigterm_handler(int sig)
1258 received_sigterm = sig;
1259 received_nb_signals++;
1261 if(received_nb_signals > 3)
1265 static void term_init(void)
1272 istty = isatty(0) && isatty(2);
1274 if (istty && tcgetattr (0, &tty) == 0) {
1279 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
1280 |INLCR|IGNCR|ICRNL|IXON);
1281 tty.c_oflag |= OPOST;
1282 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
1283 tty.c_cflag &= ~(CSIZE|PARENB);
1286 tty.c_cc[VTIME] = 0;
1288 tcsetattr (0, TCSANOW, &tty);
1290 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
1293 avformat_network_deinit();
1295 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
1296 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
1298 signal(SIGXCPU, sigterm_handler);
1302 /* read a key without blocking */
1303 static int read_key(void)
1315 n = select(1, &rfds, NULL, NULL, &tv);
1317 n = read(0, &ch, 1);
1324 # if HAVE_PEEKNAMEDPIPE
1326 static HANDLE input_handle;
1329 input_handle = GetStdHandle(STD_INPUT_HANDLE);
1330 is_pipe = !GetConsoleMode(input_handle, &dw);
1333 if (stdin->_cnt > 0) {
1338 /* When running under a GUI, you will end here. */
1339 if (!PeekNamedPipe(input_handle, NULL, 0, NULL, &nchars, NULL))
1356 static int decode_interrupt_cb(void *ctx)
1358 return received_nb_signals > 1;
1361 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
1363 void av_noreturn exit_program(int ret)
1367 for (i = 0; i < nb_filtergraphs; i++) {
1368 avfilter_graph_free(&filtergraphs[i]->graph);
1369 for (j = 0; j < filtergraphs[i]->nb_inputs; j++) {
1370 av_freep(&filtergraphs[i]->inputs[j]->name);
1371 av_freep(&filtergraphs[i]->inputs[j]);
1373 av_freep(&filtergraphs[i]->inputs);
1374 for (j = 0; j < filtergraphs[i]->nb_outputs; j++) {
1375 av_freep(&filtergraphs[i]->outputs[j]->name);
1376 av_freep(&filtergraphs[i]->outputs[j]);
1378 av_freep(&filtergraphs[i]->outputs);
1379 av_freep(&filtergraphs[i]);
1381 av_freep(&filtergraphs);
1383 av_freep(&subtitle_out);
1386 for (i = 0; i < nb_output_files; i++) {
1387 AVFormatContext *s = output_files[i]->ctx;
1388 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
1390 avformat_free_context(s);
1391 av_dict_free(&output_files[i]->opts);
1392 av_freep(&output_files[i]);
1394 for (i = 0; i < nb_output_streams; i++) {
1395 AVBitStreamFilterContext *bsfc = output_streams[i]->bitstream_filters;
1397 AVBitStreamFilterContext *next = bsfc->next;
1398 av_bitstream_filter_close(bsfc);
1401 output_streams[i]->bitstream_filters = NULL;
1403 av_freep(&output_streams[i]->forced_keyframes);
1404 av_freep(&output_streams[i]->filtered_frame);
1405 av_freep(&output_streams[i]->avfilter);
1406 av_freep(&output_streams[i]);
1408 for (i = 0; i < nb_input_files; i++) {
1409 avformat_close_input(&input_files[i]->ctx);
1410 av_freep(&input_files[i]);
1412 for (i = 0; i < nb_input_streams; i++) {
1413 av_freep(&input_streams[i]->decoded_frame);
1414 av_dict_free(&input_streams[i]->opts);
1415 free_buffer_pool(&input_streams[i]->buffer_pool);
1416 av_freep(&input_streams[i]->filters);
1417 av_freep(&input_streams[i]);
1421 fclose(vstats_file);
1422 av_free(vstats_filename);
1424 av_freep(&input_streams);
1425 av_freep(&input_files);
1426 av_freep(&output_streams);
1427 av_freep(&output_files);
1432 avformat_network_deinit();
1434 if (received_sigterm) {
1435 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
1436 (int) received_sigterm);
1443 static void assert_avoptions(AVDictionary *m)
1445 AVDictionaryEntry *t;
1446 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
1447 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
1452 static void assert_codec_experimental(AVCodecContext *c, int encoder)
1454 const char *codec_string = encoder ? "encoder" : "decoder";
1456 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
1457 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
1458 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
1459 "results.\nAdd '-strict experimental' if you want to use it.\n",
1460 codec_string, c->codec->name);
1461 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
1462 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
1463 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
1464 codec_string, codec->name);
1469 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
1471 if (codec && codec->sample_fmts) {
1472 const enum AVSampleFormat *p = codec->sample_fmts;
1473 for (; *p != -1; p++) {
1474 if (*p == st->codec->sample_fmt)
1478 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
1479 av_log(NULL, AV_LOG_ERROR, "Conversion will not be lossless.\n");
1480 if(av_get_sample_fmt_name(st->codec->sample_fmt))
1481 av_log(NULL, AV_LOG_WARNING,
1482 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
1483 av_get_sample_fmt_name(st->codec->sample_fmt),
1485 av_get_sample_fmt_name(codec->sample_fmts[0]));
1486 st->codec->sample_fmt = codec->sample_fmts[0];
1491 static void write_frame(AVFormatContext *s, AVPacket *pkt, OutputStream *ost)
1493 AVBitStreamFilterContext *bsfc = ost->bitstream_filters;
1494 AVCodecContext *avctx = ost->st->codec;
1497 if ((avctx->codec_type == AVMEDIA_TYPE_VIDEO && video_sync_method == VSYNC_DROP) ||
1498 (avctx->codec_type == AVMEDIA_TYPE_AUDIO && audio_sync_method < 0))
1499 pkt->pts = pkt->dts = AV_NOPTS_VALUE;
1501 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO && pkt->dts != AV_NOPTS_VALUE) {
1502 int64_t max = ost->st->cur_dts + !(s->oformat->flags & AVFMT_TS_NONSTRICT);
1503 if (ost->st->cur_dts && ost->st->cur_dts != AV_NOPTS_VALUE && max > pkt->dts) {
1504 av_log(s, max - pkt->dts > 2 ? AV_LOG_WARNING : AV_LOG_DEBUG, "Audio timestamp %"PRId64" < %"PRId64" invalid, cliping\n", pkt->dts, max);
1505 pkt->pts = pkt->dts = max;
1510 * Audio encoders may split the packets -- #frames in != #packets out.
1511 * But there is no reordering, so we can limit the number of output packets
1512 * by simply dropping them here.
1513 * Counting encoded video frames needs to be done separately because of
1514 * reordering, see do_video_out()
1516 if (!(avctx->codec_type == AVMEDIA_TYPE_VIDEO && avctx->codec)) {
1517 if (ost->frame_number >= ost->max_frames) {
1518 av_free_packet(pkt);
1521 ost->frame_number++;
1525 AVPacket new_pkt = *pkt;
1526 int a = av_bitstream_filter_filter(bsfc, avctx, NULL,
1527 &new_pkt.data, &new_pkt.size,
1528 pkt->data, pkt->size,
1529 pkt->flags & AV_PKT_FLAG_KEY);
1531 av_free_packet(pkt);
1532 new_pkt.destruct = av_destruct_packet;
1534 av_log(NULL, AV_LOG_ERROR, "Failed to open bitstream filter %s for stream %d with codec %s",
1535 bsfc->filter->name, pkt->stream_index,
1536 avctx->codec ? avctx->codec->name : "copy");
1546 pkt->stream_index = ost->index;
1547 ret = av_interleaved_write_frame(s, pkt);
1549 print_error("av_interleaved_write_frame()", ret);
1554 static int check_recording_time(OutputStream *ost)
1556 OutputFile *of = output_files[ost->file_index];
1558 if (of->recording_time != INT64_MAX &&
1559 av_compare_ts(ost->sync_opts - ost->first_pts, ost->st->codec->time_base, of->recording_time,
1560 AV_TIME_BASE_Q) >= 0) {
1561 ost->is_past_recording_time = 1;
1567 static void do_audio_out(AVFormatContext *s, OutputStream *ost,
1570 AVCodecContext *enc = ost->st->codec;
1574 av_init_packet(&pkt);
1578 if (!check_recording_time(ost))
1581 if (frame->pts == AV_NOPTS_VALUE || audio_sync_method < 0)
1582 frame->pts = ost->sync_opts;
1583 ost->sync_opts = frame->pts + frame->nb_samples;
1585 av_assert0(pkt.size || !pkt.data);
1586 update_benchmark(NULL);
1587 if (avcodec_encode_audio2(enc, &pkt, frame, &got_packet) < 0) {
1588 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed (avcodec_encode_audio2)\n");
1591 update_benchmark("encode_audio %d.%d", ost->file_index, ost->index);
1594 if (pkt.pts != AV_NOPTS_VALUE)
1595 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1596 if (pkt.dts != AV_NOPTS_VALUE)
1597 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1598 if (pkt.duration > 0)
1599 pkt.duration = av_rescale_q(pkt.duration, enc->time_base, ost->st->time_base);
1602 av_log(NULL, AV_LOG_INFO, "encoder -> type:audio "
1603 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1604 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1605 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1608 write_frame(s, &pkt, ost);
1610 audio_size += pkt.size;
1611 av_free_packet(&pkt);
1615 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1617 AVCodecContext *dec;
1618 AVPicture *picture2;
1619 AVPicture picture_tmp;
1622 dec = ist->st->codec;
1624 /* deinterlace : must be done before any resize */
1625 if (do_deinterlace) {
1628 /* create temporary picture */
1629 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1630 buf = av_malloc(size);
1634 picture2 = &picture_tmp;
1635 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1637 if (avpicture_deinterlace(picture2, picture,
1638 dec->pix_fmt, dec->width, dec->height) < 0) {
1639 /* if error, do not deinterlace */
1640 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1649 if (picture != picture2)
1650 *picture = *picture2;
1654 static void do_subtitle_out(AVFormatContext *s,
1660 int subtitle_out_max_size = 1024 * 1024;
1661 int subtitle_out_size, nb, i;
1662 AVCodecContext *enc;
1665 if (pts == AV_NOPTS_VALUE) {
1666 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1672 enc = ost->st->codec;
1674 if (!subtitle_out) {
1675 subtitle_out = av_malloc(subtitle_out_max_size);
1678 /* Note: DVB subtitle need one packet to draw them and one other
1679 packet to clear them */
1680 /* XXX: signal it in the codec context ? */
1681 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1686 for (i = 0; i < nb; i++) {
1687 ost->sync_opts = av_rescale_q(pts, ist->st->time_base, enc->time_base);
1688 if (!check_recording_time(ost))
1691 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1692 // start_display_time is required to be 0
1693 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){ 1, 1000 }, AV_TIME_BASE_Q);
1694 sub->end_display_time -= sub->start_display_time;
1695 sub->start_display_time = 0;
1696 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1697 subtitle_out_max_size, sub);
1698 if (subtitle_out_size < 0) {
1699 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1703 av_init_packet(&pkt);
1704 pkt.data = subtitle_out;
1705 pkt.size = subtitle_out_size;
1706 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1707 pkt.duration = av_rescale_q(sub->end_display_time, (AVRational){ 1, 1000 }, ost->st->time_base);
1708 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1709 /* XXX: the pts correction is handled here. Maybe handling
1710 it in the codec would be better */
1712 pkt.pts += 90 * sub->start_display_time;
1714 pkt.pts += 90 * sub->end_display_time;
1716 write_frame(s, &pkt, ost);
1717 subtitle_size += pkt.size;
1721 static void do_video_out(AVFormatContext *s,
1723 AVFrame *in_picture,
1726 int ret, format_video_sync;
1728 AVCodecContext *enc = ost->st->codec;
1730 double sync_ipts, delta;
1731 double duration = 0;
1733 InputStream *ist = NULL;
1735 if (ost->source_index >= 0)
1736 ist = input_streams[ost->source_index];
1738 if(ist && ist->st->start_time != AV_NOPTS_VALUE && ist->st->first_dts != AV_NOPTS_VALUE && ost->frame_rate.num)
1739 duration = 1/(av_q2d(ost->frame_rate) * av_q2d(enc->time_base));
1741 sync_ipts = in_picture->pts;
1742 delta = sync_ipts - ost->sync_opts + duration;
1744 /* by default, we output a single frame */
1747 format_video_sync = video_sync_method;
1748 if (format_video_sync == VSYNC_AUTO)
1749 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? ((s->oformat->flags & AVFMT_NOTIMESTAMPS) ? VSYNC_PASSTHROUGH : VSYNC_VFR) : 1;
1751 switch (format_video_sync) {
1753 // FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1756 else if (delta > 1.1)
1757 nb_frames = lrintf(delta);
1762 else if (delta > 0.6)
1763 ost->sync_opts = lrint(sync_ipts);
1766 case VSYNC_PASSTHROUGH:
1767 ost->sync_opts = lrint(sync_ipts);
1773 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1774 if (nb_frames == 0) {
1776 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1778 } else if (nb_frames > 1) {
1779 if (nb_frames > dts_error_threshold * 30) {
1780 av_log(NULL, AV_LOG_ERROR, "%d frame duplication too large, skiping\n", nb_frames - 1);
1784 nb_frames_dup += nb_frames - 1;
1785 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames - 1);
1788 /* duplicates frame if needed */
1789 for (i = 0; i < nb_frames; i++) {
1790 av_init_packet(&pkt);
1794 in_picture->pts = ost->sync_opts;
1796 if (!check_recording_time(ost))
1799 if (s->oformat->flags & AVFMT_RAWPICTURE &&
1800 enc->codec->id == CODEC_ID_RAWVIDEO) {
1801 /* raw pictures are written as AVPicture structure to
1802 avoid any copies. We support temporarily the older
1804 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1805 enc->coded_frame->top_field_first = in_picture->top_field_first;
1806 pkt.data = (uint8_t *)in_picture;
1807 pkt.size = sizeof(AVPicture);
1808 pkt.pts = av_rescale_q(in_picture->pts, enc->time_base, ost->st->time_base);
1809 pkt.flags |= AV_PKT_FLAG_KEY;
1811 write_frame(s, &pkt, ost);
1812 video_size += pkt.size;
1815 AVFrame big_picture;
1817 big_picture = *in_picture;
1818 /* better than nothing: use input picture interlaced
1820 big_picture.interlaced_frame = in_picture->interlaced_frame;
1821 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1822 if (ost->top_field_first == -1)
1823 big_picture.top_field_first = in_picture->top_field_first;
1825 big_picture.top_field_first = !!ost->top_field_first;
1828 /* handles same_quant here. This is not correct because it may
1829 not be a global option */
1830 big_picture.quality = quality;
1831 if (!enc->me_threshold)
1832 big_picture.pict_type = 0;
1833 if (ost->forced_kf_index < ost->forced_kf_count &&
1834 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1835 big_picture.pict_type = AV_PICTURE_TYPE_I;
1836 ost->forced_kf_index++;
1838 update_benchmark(NULL);
1839 ret = avcodec_encode_video2(enc, &pkt, &big_picture, &got_packet);
1840 update_benchmark("encode_video %d.%d", ost->file_index, ost->index);
1842 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1847 if (pkt.pts == AV_NOPTS_VALUE && !(enc->codec->capabilities & CODEC_CAP_DELAY))
1848 pkt.pts = ost->sync_opts;
1850 if (pkt.pts != AV_NOPTS_VALUE)
1851 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
1852 if (pkt.dts != AV_NOPTS_VALUE)
1853 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
1856 av_log(NULL, AV_LOG_INFO, "encoder -> type:video "
1857 "pkt_pts:%s pkt_pts_time:%s pkt_dts:%s pkt_dts_time:%s\n",
1858 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ost->st->time_base),
1859 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ost->st->time_base));
1862 write_frame(s, &pkt, ost);
1863 frame_size = pkt.size;
1864 video_size += pkt.size;
1865 av_free_packet(&pkt);
1867 /* if two pass, output log */
1868 if (ost->logfile && enc->stats_out) {
1869 fprintf(ost->logfile, "%s", enc->stats_out);
1875 * For video, number of frames in == number of packets out.
1876 * But there may be reordering, so we can't throw away frames on encoder
1877 * flush, we need to limit them here, before they go into encoder.
1879 ost->frame_number++;
1882 if (vstats_filename && frame_size)
1883 do_video_stats(output_files[ost->file_index]->ctx, ost, frame_size);
1886 static double psnr(double d)
1888 return -10.0 * log(d) / log(10.0);
1891 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1894 AVCodecContext *enc;
1896 double ti1, bitrate, avg_bitrate;
1898 /* this is executed just the first time do_video_stats is called */
1900 vstats_file = fopen(vstats_filename, "w");
1907 enc = ost->st->codec;
1908 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1909 frame_number = ost->frame_number;
1910 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality / (float)FF_QP2LAMBDA);
1911 if (enc->flags&CODEC_FLAG_PSNR)
1912 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0] / (enc->width * enc->height * 255.0 * 255.0)));
1914 fprintf(vstats_file,"f_size= %6d ", frame_size);
1915 /* compute pts value */
1916 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1920 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1921 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1922 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1923 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1924 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1928 /* check for new output on any of the filtergraphs */
1929 static int poll_filters(void)
1931 AVFilterBufferRef *picref;
1932 AVFrame *filtered_frame = NULL;
1933 int i, ret, ret_all;
1934 unsigned nb_success = 1, av_uninit(nb_eof);
1938 /* Reap all buffers present in the buffer sinks */
1939 for (i = 0; i < nb_output_streams; i++) {
1940 OutputStream *ost = output_streams[i];
1941 OutputFile *of = output_files[ost->file_index];
1947 if (!ost->filtered_frame && !(ost->filtered_frame = avcodec_alloc_frame())) {
1948 return AVERROR(ENOMEM);
1950 avcodec_get_frame_defaults(ost->filtered_frame);
1951 filtered_frame = ost->filtered_frame;
1954 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &picref,
1955 AV_BUFFERSINK_FLAG_NO_REQUEST);
1957 if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) {
1959 av_strerror(ret, buf, sizeof(buf));
1960 av_log(NULL, AV_LOG_WARNING,
1961 "Error in av_buffersink_get_buffer_ref(): %s\n", buf);
1965 frame_pts = AV_NOPTS_VALUE;
1966 if (picref->pts != AV_NOPTS_VALUE) {
1967 filtered_frame->pts = frame_pts = av_rescale_q(picref->pts,
1968 ost->filter->filter->inputs[0]->time_base,
1969 ost->st->codec->time_base) -
1970 av_rescale_q(of->start_time,
1972 ost->st->codec->time_base);
1974 if (of->start_time && filtered_frame->pts < 0) {
1975 avfilter_unref_buffer(picref);
1979 //if (ost->source_index >= 0)
1980 // *filtered_frame= *input_streams[ost->source_index]->decoded_frame; //for me_threshold
1983 switch (ost->filter->filter->inputs[0]->type) {
1984 case AVMEDIA_TYPE_VIDEO:
1985 avfilter_copy_buf_props(filtered_frame, picref);
1986 filtered_frame->pts = frame_pts;
1987 if (!ost->frame_aspect_ratio)
1988 ost->st->codec->sample_aspect_ratio = picref->video->sample_aspect_ratio;
1990 do_video_out(of->ctx, ost, filtered_frame,
1991 same_quant ? ost->last_quality :
1992 ost->st->codec->global_quality);
1994 case AVMEDIA_TYPE_AUDIO:
1995 avfilter_copy_buf_props(filtered_frame, picref);
1996 filtered_frame->pts = frame_pts;
1997 do_audio_out(of->ctx, ost, filtered_frame);
2000 // TODO support subtitle filters
2004 avfilter_unref_buffer(picref);
2007 if (!nb_success) /* from last round */
2009 /* Request frames through all the graphs */
2010 ret_all = nb_success = nb_eof = 0;
2011 for (i = 0; i < nb_filtergraphs; i++) {
2012 ret = avfilter_graph_request_oldest(filtergraphs[i]->graph);
2015 } else if (ret == AVERROR_EOF) {
2017 } else if (ret != AVERROR(EAGAIN)) {
2019 av_strerror(ret, buf, sizeof(buf));
2020 av_log(NULL, AV_LOG_WARNING,
2021 "Error in request_frame(): %s\n", buf);
2025 /* Try again if anything succeeded */
2027 return nb_eof == nb_filtergraphs ? AVERROR_EOF : ret_all;
2030 static void print_report(int is_last_report, int64_t timer_start, int64_t cur_time)
2033 AVBPrint buf_script;
2035 AVFormatContext *oc;
2037 AVCodecContext *enc;
2038 int frame_number, vid, i;
2040 int64_t pts = INT64_MAX;
2041 static int64_t last_time = -1;
2042 static int qp_histogram[52];
2043 int hours, mins, secs, us;
2045 if (!print_stats && !is_last_report && !progress_avio)
2048 if (!is_last_report) {
2049 if (last_time == -1) {
2050 last_time = cur_time;
2053 if ((cur_time - last_time) < 500000)
2055 last_time = cur_time;
2059 oc = output_files[0]->ctx;
2061 total_size = avio_size(oc->pb);
2062 if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
2063 total_size = avio_tell(oc->pb);
2070 av_bprint_init(&buf_script, 0, 1);
2071 for (i = 0; i < nb_output_streams; i++) {
2073 ost = output_streams[i];
2074 enc = ost->st->codec;
2075 if (!ost->stream_copy && enc->coded_frame)
2076 q = enc->coded_frame->quality / (float)FF_QP2LAMBDA;
2077 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2078 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
2079 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2080 ost->file_index, ost->index, q);
2082 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
2083 float fps, t = (cur_time-timer_start) / 1000000.0;
2085 frame_number = ost->frame_number;
2086 fps = t > 1 ? frame_number / t : 0;
2087 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3.*f q=%3.1f ",
2088 frame_number, fps < 9.95, fps, q);
2089 av_bprintf(&buf_script, "frame=%d\n", frame_number);
2090 av_bprintf(&buf_script, "fps=%.1f\n", fps);
2091 av_bprintf(&buf_script, "stream_%d_%d_q=%.1f\n",
2092 ost->file_index, ost->index, q);
2094 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
2098 if (qp >= 0 && qp < FF_ARRAY_ELEMS(qp_histogram))
2100 for (j = 0; j < 32; j++)
2101 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j] + 1) / log(2)));
2103 if (enc->flags&CODEC_FLAG_PSNR) {
2105 double error, error_sum = 0;
2106 double scale, scale_sum = 0;
2108 char type[3] = { 'Y','U','V' };
2109 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
2110 for (j = 0; j < 3; j++) {
2111 if (is_last_report) {
2112 error = enc->error[j];
2113 scale = enc->width * enc->height * 255.0 * 255.0 * frame_number;
2115 error = enc->coded_frame->error[j];
2116 scale = enc->width * enc->height * 255.0 * 255.0;
2122 p = psnr(error / scale);
2123 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], p);
2124 av_bprintf(&buf_script, "stream_%d_%d_psnr_%c=%2.2f\n",
2125 ost->file_index, ost->index, type[i] | 32, p);
2127 p = psnr(error_sum / scale_sum);
2128 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum / scale_sum));
2129 av_bprintf(&buf_script, "stream_%d_%d_psnr_all=%2.2f\n",
2130 ost->file_index, ost->index, p);
2134 /* compute min output value */
2135 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
2136 ost->st->time_base, AV_TIME_BASE_Q));
2139 secs = pts / AV_TIME_BASE;
2140 us = pts % AV_TIME_BASE;
2146 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
2148 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2149 "size=%8.0fkB time=", total_size / 1024.0);
2150 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2151 "%02d:%02d:%02d.%02d ", hours, mins, secs,
2152 (100 * us) / AV_TIME_BASE);
2153 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
2154 "bitrate=%6.1fkbits/s", bitrate);
2155 av_bprintf(&buf_script, "total_size=%"PRId64"\n", total_size);
2156 av_bprintf(&buf_script, "out_time_ms=%"PRId64"\n", pts);
2157 av_bprintf(&buf_script, "out_time=%02d:%02d:%02d.%06d\n",
2158 hours, mins, secs, us);
2160 if (nb_frames_dup || nb_frames_drop)
2161 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
2162 nb_frames_dup, nb_frames_drop);
2163 av_bprintf(&buf_script, "dup_frames=%d\n", nb_frames_dup);
2164 av_bprintf(&buf_script, "drop_frames=%d\n", nb_frames_drop);
2166 if (print_stats || is_last_report) {
2167 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
2172 if (progress_avio) {
2173 av_bprintf(&buf_script, "progress=%s\n",
2174 is_last_report ? "end" : "continue");
2175 avio_write(progress_avio, buf_script.str,
2176 FFMIN(buf_script.len, buf_script.size - 1));
2177 avio_flush(progress_avio);
2178 av_bprint_finalize(&buf_script, NULL);
2179 if (is_last_report) {
2180 avio_close(progress_avio);
2181 progress_avio = NULL;
2185 if (is_last_report) {
2186 int64_t raw= audio_size + video_size + subtitle_size + extra_size;
2187 av_log(NULL, AV_LOG_INFO, "\n");
2188 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB subtitle:%1.0f global headers:%1.0fkB muxing overhead %f%%\n",
2189 video_size / 1024.0,
2190 audio_size / 1024.0,
2191 subtitle_size / 1024.0,
2192 extra_size / 1024.0,
2193 100.0 * (total_size - raw) / raw
2195 if(video_size + audio_size + subtitle_size + extra_size == 0){
2196 av_log(NULL, AV_LOG_WARNING, "Output file is empty, nothing was encoded (check -ss / -t / -frames parameters if used)\n");
2201 static void flush_encoders(void)
2205 for (i = 0; i < nb_output_streams; i++) {
2206 OutputStream *ost = output_streams[i];
2207 AVCodecContext *enc = ost->st->codec;
2208 AVFormatContext *os = output_files[ost->file_index]->ctx;
2209 int stop_encoding = 0;
2211 if (!ost->encoding_needed)
2214 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <= 1)
2216 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE) && enc->codec->id == CODEC_ID_RAWVIDEO)
2220 int (*encode)(AVCodecContext*, AVPacket*, const AVFrame*, int*) = NULL;
2224 switch (ost->st->codec->codec_type) {
2225 case AVMEDIA_TYPE_AUDIO:
2226 encode = avcodec_encode_audio2;
2230 case AVMEDIA_TYPE_VIDEO:
2231 encode = avcodec_encode_video2;
2242 av_init_packet(&pkt);
2246 update_benchmark(NULL);
2247 ret = encode(enc, &pkt, NULL, &got_packet);
2248 update_benchmark("flush %s %d.%d", desc, ost->file_index, ost->index);
2250 av_log(NULL, AV_LOG_FATAL, "%s encoding failed\n", desc);
2254 if (ost->logfile && enc->stats_out) {
2255 fprintf(ost->logfile, "%s", enc->stats_out);
2261 if (pkt.pts != AV_NOPTS_VALUE)
2262 pkt.pts = av_rescale_q(pkt.pts, enc->time_base, ost->st->time_base);
2263 if (pkt.dts != AV_NOPTS_VALUE)
2264 pkt.dts = av_rescale_q(pkt.dts, enc->time_base, ost->st->time_base);
2265 write_frame(os, &pkt, ost);
2275 * Check whether a packet from ist should be written into ost at this time
2277 static int check_output_constraints(InputStream *ist, OutputStream *ost)
2279 OutputFile *of = output_files[ost->file_index];
2280 int ist_index = input_files[ist->file_index]->ist_index + ist->st->index;
2282 if (ost->source_index != ist_index)
2285 if (of->start_time && ist->pts < of->start_time)
2291 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
2293 OutputFile *of = output_files[ost->file_index];
2294 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
2298 av_init_packet(&opkt);
2300 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
2301 !ost->copy_initial_nonkeyframes)
2304 if (of->recording_time != INT64_MAX &&
2305 ist->pts >= of->recording_time + of->start_time) {
2306 ost->is_past_recording_time = 1;
2310 /* force the input stream PTS */
2311 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
2312 audio_size += pkt->size;
2313 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
2314 video_size += pkt->size;
2316 } else if (ost->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
2317 subtitle_size += pkt->size;
2320 if (pkt->pts != AV_NOPTS_VALUE)
2321 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
2323 opkt.pts = AV_NOPTS_VALUE;
2325 if (pkt->dts == AV_NOPTS_VALUE)
2326 opkt.dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ost->st->time_base);
2328 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
2329 opkt.dts -= ost_tb_start_time;
2331 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
2332 opkt.flags = pkt->flags;
2334 // FIXME remove the following 2 lines they shall be replaced by the bitstream filters
2335 if ( ost->st->codec->codec_id != CODEC_ID_H264
2336 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
2337 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
2338 && ost->st->codec->codec_id != CODEC_ID_VC1
2340 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
2341 opkt.destruct = av_destruct_packet;
2343 opkt.data = pkt->data;
2344 opkt.size = pkt->size;
2346 if (of->ctx->oformat->flags & AVFMT_RAWPICTURE) {
2347 /* store AVPicture in AVPacket, as expected by the output format */
2348 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
2349 opkt.data = (uint8_t *)&pict;
2350 opkt.size = sizeof(AVPicture);
2351 opkt.flags |= AV_PKT_FLAG_KEY;
2354 write_frame(of->ctx, &opkt, ost);
2355 ost->st->codec->frame_number++;
2356 av_free_packet(&opkt);
2359 static void rate_emu_sleep(InputStream *ist)
2361 if (input_files[ist->file_index]->rate_emu) {
2362 int64_t pts = av_rescale(ist->dts, 1000000, AV_TIME_BASE);
2363 int64_t now = av_gettime() - ist->start;
2365 av_usleep(pts - now);
2369 static int guess_input_channel_layout(InputStream *ist)
2371 AVCodecContext *dec = ist->st->codec;
2373 if (!dec->channel_layout) {
2374 char layout_name[256];
2376 dec->channel_layout = av_get_default_channel_layout(dec->channels);
2377 if (!dec->channel_layout)
2379 av_get_channel_layout_string(layout_name, sizeof(layout_name),
2380 dec->channels, dec->channel_layout);
2381 av_log(NULL, AV_LOG_WARNING, "Guessed Channel Layout for Input Stream "
2382 "#%d.%d : %s\n", ist->file_index, ist->st->index, layout_name);
2387 static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
2389 AVFrame *decoded_frame;
2390 AVCodecContext *avctx = ist->st->codec;
2391 int i, ret, resample_changed;
2392 AVRational decoded_frame_tb;
2394 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2395 return AVERROR(ENOMEM);
2397 avcodec_get_frame_defaults(ist->decoded_frame);
2398 decoded_frame = ist->decoded_frame;
2400 update_benchmark(NULL);
2401 ret = avcodec_decode_audio4(avctx, decoded_frame, got_output, pkt);
2402 update_benchmark("decode_audio %d.%d", ist->file_index, ist->st->index);
2406 if (avctx->sample_rate <= 0) {
2407 av_log(avctx, AV_LOG_ERROR, "Sample rate %d invalid\n", avctx->sample_rate);
2408 return AVERROR_INVALIDDATA;
2412 /* no audio frame */
2414 for (i = 0; i < ist->nb_filters; i++)
2415 av_buffersrc_add_ref(ist->filters[i]->filter, NULL,
2416 AV_BUFFERSRC_FLAG_NO_COPY);
2421 /* increment next_dts to use for the case where the input stream does not
2422 have timestamps or there are multiple frames in the packet */
2423 ist->next_pts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2425 ist->next_dts += ((int64_t)AV_TIME_BASE * decoded_frame->nb_samples) /
2429 rate_emu_sleep(ist);
2431 resample_changed = ist->resample_sample_fmt != decoded_frame->format ||
2432 ist->resample_channels != avctx->channels ||
2433 ist->resample_channel_layout != decoded_frame->channel_layout ||
2434 ist->resample_sample_rate != decoded_frame->sample_rate;
2435 if (resample_changed) {
2436 char layout1[64], layout2[64];
2438 if (!guess_input_channel_layout(ist)) {
2439 av_log(NULL, AV_LOG_FATAL, "Unable to find default channel "
2440 "layout for Input Stream #%d.%d\n", ist->file_index,
2444 decoded_frame->channel_layout = avctx->channel_layout;
2446 av_get_channel_layout_string(layout1, sizeof(layout1), ist->resample_channels,
2447 ist->resample_channel_layout);
2448 av_get_channel_layout_string(layout2, sizeof(layout2), avctx->channels,
2449 decoded_frame->channel_layout);
2451 av_log(NULL, AV_LOG_INFO,
2452 "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",
2453 ist->file_index, ist->st->index,
2454 ist->resample_sample_rate, av_get_sample_fmt_name(ist->resample_sample_fmt),
2455 ist->resample_channels, layout1,
2456 decoded_frame->sample_rate, av_get_sample_fmt_name(decoded_frame->format),
2457 avctx->channels, layout2);
2459 ist->resample_sample_fmt = decoded_frame->format;
2460 ist->resample_sample_rate = decoded_frame->sample_rate;
2461 ist->resample_channel_layout = decoded_frame->channel_layout;
2462 ist->resample_channels = avctx->channels;
2464 for (i = 0; i < nb_filtergraphs; i++)
2465 if (ist_in_filtergraph(filtergraphs[i], ist)) {
2466 FilterGraph *fg = filtergraphs[i];
2468 if (configure_filtergraph(fg) < 0) {
2469 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2472 for (j = 0; j < fg->nb_outputs; j++) {
2473 OutputStream *ost = fg->outputs[j]->ost;
2474 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
2475 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
2476 av_buffersink_set_frame_size(ost->filter->filter,
2477 ost->st->codec->frame_size);
2482 /* if the decoder provides a pts, use it instead of the last packet pts.
2483 the decoder could be delaying output by a packet or more. */
2484 if (decoded_frame->pts != AV_NOPTS_VALUE) {
2485 ist->dts = ist->next_dts = ist->pts = ist->next_pts = av_rescale_q(decoded_frame->pts, avctx->time_base, AV_TIME_BASE_Q);
2486 decoded_frame_tb = avctx->time_base;
2487 } else if (decoded_frame->pkt_pts != AV_NOPTS_VALUE) {
2488 decoded_frame->pts = decoded_frame->pkt_pts;
2489 pkt->pts = AV_NOPTS_VALUE;
2490 decoded_frame_tb = ist->st->time_base;
2491 } else if (pkt->pts != AV_NOPTS_VALUE) {
2492 decoded_frame->pts = pkt->pts;
2493 pkt->pts = AV_NOPTS_VALUE;
2494 decoded_frame_tb = ist->st->time_base;
2496 decoded_frame->pts = ist->dts;
2497 decoded_frame_tb = AV_TIME_BASE_Q;
2499 if (decoded_frame->pts != AV_NOPTS_VALUE)
2500 decoded_frame->pts = av_rescale_q(decoded_frame->pts,
2502 (AVRational){1, ist->st->codec->sample_rate});
2503 for (i = 0; i < ist->nb_filters; i++)
2504 av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0);
2506 decoded_frame->pts = AV_NOPTS_VALUE;
2511 static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output)
2513 AVFrame *decoded_frame;
2514 void *buffer_to_free = NULL;
2515 int i, ret = 0, resample_changed;
2516 int64_t best_effort_timestamp;
2517 AVRational *frame_sample_aspect;
2520 if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
2521 return AVERROR(ENOMEM);
2523 avcodec_get_frame_defaults(ist->decoded_frame);
2524 decoded_frame = ist->decoded_frame;
2525 pkt->dts = av_rescale_q(ist->dts, AV_TIME_BASE_Q, ist->st->time_base);
2527 update_benchmark(NULL);
2528 ret = avcodec_decode_video2(ist->st->codec,
2529 decoded_frame, got_output, pkt);
2530 update_benchmark("decode_video %d.%d", ist->file_index, ist->st->index);
2534 quality = same_quant ? decoded_frame->quality : 0;
2536 /* no picture yet */
2538 for (i = 0; i < ist->nb_filters; i++)
2539 av_buffersrc_add_ref(ist->filters[i]->filter, NULL, AV_BUFFERSRC_FLAG_NO_COPY);
2543 if(ist->top_field_first>=0)
2544 decoded_frame->top_field_first = ist->top_field_first;
2546 best_effort_timestamp= av_frame_get_best_effort_timestamp(decoded_frame);
2547 if(best_effort_timestamp != AV_NOPTS_VALUE)
2548 ist->next_pts = ist->pts = av_rescale_q(decoded_frame->pts = best_effort_timestamp, ist->st->time_base, AV_TIME_BASE_Q);
2551 av_log(NULL, AV_LOG_INFO, "decoder -> ist_index:%d type:video "
2552 "frame_pts:%s frame_pts_time:%s best_effort_ts:%"PRId64" best_effort_ts_time:%s keyframe:%d frame_type:%d \n",
2553 ist->st->index, av_ts2str(decoded_frame->pts),
2554 av_ts2timestr(decoded_frame->pts, &ist->st->time_base),
2555 best_effort_timestamp,
2556 av_ts2timestr(best_effort_timestamp, &ist->st->time_base),
2557 decoded_frame->key_frame, decoded_frame->pict_type);
2561 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
2563 rate_emu_sleep(ist);
2565 if (ist->st->sample_aspect_ratio.num)
2566 decoded_frame->sample_aspect_ratio = ist->st->sample_aspect_ratio;
2568 resample_changed = ist->resample_width != decoded_frame->width ||
2569 ist->resample_height != decoded_frame->height ||
2570 ist->resample_pix_fmt != decoded_frame->format;
2571 if (resample_changed) {
2572 av_log(NULL, AV_LOG_INFO,
2573 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
2574 ist->file_index, ist->st->index,
2575 ist->resample_width, ist->resample_height, av_get_pix_fmt_name(ist->resample_pix_fmt),
2576 decoded_frame->width, decoded_frame->height, av_get_pix_fmt_name(decoded_frame->format));
2578 ist->resample_width = decoded_frame->width;
2579 ist->resample_height = decoded_frame->height;
2580 ist->resample_pix_fmt = decoded_frame->format;
2582 for (i = 0; i < nb_filtergraphs; i++)
2583 if (ist_in_filtergraph(filtergraphs[i], ist) &&
2584 configure_filtergraph(filtergraphs[i]) < 0) {
2585 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
2590 frame_sample_aspect= av_opt_ptr(avcodec_get_frame_class(), decoded_frame, "sample_aspect_ratio");
2591 for (i = 0; i < ist->nb_filters; i++) {
2592 int changed = ist->st->codec->width != ist->filters[i]->filter->outputs[0]->w
2593 || ist->st->codec->height != ist->filters[i]->filter->outputs[0]->h
2594 || ist->st->codec->pix_fmt != ist->filters[i]->filter->outputs[0]->format;
2595 // XXX what an ugly hack
2596 if (ist->filters[i]->graph->nb_outputs == 1)
2597 ist->filters[i]->graph->outputs[0]->ost->last_quality = quality;
2599 if (!frame_sample_aspect->num)
2600 *frame_sample_aspect = ist->st->sample_aspect_ratio;
2601 if (ist->dr1 && decoded_frame->type==FF_BUFFER_TYPE_USER && !changed) {
2602 FrameBuffer *buf = decoded_frame->opaque;
2603 AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays(
2604 decoded_frame->data, decoded_frame->linesize,
2605 AV_PERM_READ | AV_PERM_PRESERVE,
2606 ist->st->codec->width, ist->st->codec->height,
2607 ist->st->codec->pix_fmt);
2609 avfilter_copy_frame_props(fb, decoded_frame);
2610 fb->buf->priv = buf;
2611 fb->buf->free = filter_release_buffer;
2613 av_assert0(buf->refcount>0);
2615 av_buffersrc_add_ref(ist->filters[i]->filter, fb,
2616 AV_BUFFERSRC_FLAG_NO_CHECK_FORMAT |
2617 AV_BUFFERSRC_FLAG_NO_COPY);
2619 if(av_buffersrc_add_frame(ist->filters[i]->filter, decoded_frame, 0)<0) {
2620 av_log(NULL, AV_LOG_FATAL, "Failed to inject frame into filter network\n");
2626 av_free(buffer_to_free);
2630 static int transcode_subtitles(InputStream *ist, AVPacket *pkt, int *got_output)
2632 AVSubtitle subtitle;
2633 int i, ret = avcodec_decode_subtitle2(ist->st->codec,
2634 &subtitle, got_output, pkt);
2640 rate_emu_sleep(ist);
2642 for (i = 0; i < nb_output_streams; i++) {
2643 OutputStream *ost = output_streams[i];
2645 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
2648 do_subtitle_out(output_files[ost->file_index]->ctx, ost, ist, &subtitle, pkt->pts);
2651 avsubtitle_free(&subtitle);
2655 /* pkt = NULL means EOF (needed to flush decoder buffers) */
2656 static int output_packet(InputStream *ist, const AVPacket *pkt)
2662 if (!ist->saw_first_ts) {
2663 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;
2665 if (pkt != NULL && pkt->pts != AV_NOPTS_VALUE && !ist->decoding_needed) {
2666 ist->dts += av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
2667 ist->pts = ist->dts; //unused but better to set it to a value thats not totally wrong
2669 ist->saw_first_ts = 1;
2672 if (ist->next_dts == AV_NOPTS_VALUE)
2673 ist->next_dts = ist->dts;
2674 if (ist->next_pts == AV_NOPTS_VALUE)
2675 ist->next_pts = ist->pts;
2679 av_init_packet(&avpkt);
2687 if (pkt->dts != AV_NOPTS_VALUE) {
2688 ist->next_dts = ist->dts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2689 if (ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO || !ist->decoding_needed)
2690 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
2693 // while we have more to decode or while the decoder did output something on EOF
2694 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
2698 ist->pts = ist->next_pts;
2699 ist->dts = ist->next_dts;
2701 if (avpkt.size && avpkt.size != pkt->size) {
2702 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
2703 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
2704 ist->showed_multi_packet_warning = 1;
2707 switch (ist->st->codec->codec_type) {
2708 case AVMEDIA_TYPE_AUDIO:
2709 ret = decode_audio (ist, &avpkt, &got_output);
2711 case AVMEDIA_TYPE_VIDEO:
2712 ret = decode_video (ist, &avpkt, &got_output);
2713 if (avpkt.duration) {
2714 duration = av_rescale_q(avpkt.duration, ist->st->time_base, AV_TIME_BASE_Q);
2715 } else if(ist->st->codec->time_base.num != 0 && ist->st->codec->time_base.den != 0) {
2716 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
2717 duration = ((int64_t)AV_TIME_BASE *
2718 ist->st->codec->time_base.num * ticks) /
2719 ist->st->codec->time_base.den;
2723 if(ist->dts != AV_NOPTS_VALUE && duration) {
2724 ist->next_dts += duration;
2726 ist->next_dts = AV_NOPTS_VALUE;
2729 ist->next_pts += duration; //FIXME the duration is not correct in some cases
2731 case AVMEDIA_TYPE_SUBTITLE:
2732 ret = transcode_subtitles(ist, &avpkt, &got_output);
2742 avpkt.pts= AV_NOPTS_VALUE;
2744 // touch data and size only if not EOF
2746 if(ist->st->codec->codec_type != AVMEDIA_TYPE_AUDIO)
2756 /* handle stream copy */
2757 if (!ist->decoding_needed) {
2758 rate_emu_sleep(ist);
2759 ist->dts = ist->next_dts;
2760 switch (ist->st->codec->codec_type) {
2761 case AVMEDIA_TYPE_AUDIO:
2762 ist->next_dts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
2763 ist->st->codec->sample_rate;
2765 case AVMEDIA_TYPE_VIDEO:
2766 if (pkt->duration) {
2767 ist->next_dts += av_rescale_q(pkt->duration, ist->st->time_base, AV_TIME_BASE_Q);
2768 } else if(ist->st->codec->time_base.num != 0) {
2769 int ticks= ist->st->parser ? ist->st->parser->repeat_pict + 1 : ist->st->codec->ticks_per_frame;
2770 ist->next_dts += ((int64_t)AV_TIME_BASE *
2771 ist->st->codec->time_base.num * ticks) /
2772 ist->st->codec->time_base.den;
2776 ist->pts = ist->dts;
2777 ist->next_pts = ist->next_dts;
2779 for (i = 0; pkt && i < nb_output_streams; i++) {
2780 OutputStream *ost = output_streams[i];
2782 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
2785 do_streamcopy(ist, ost, pkt);
2791 static void print_sdp(void)
2795 AVFormatContext **avc = av_malloc(sizeof(*avc) * nb_output_files);
2799 for (i = 0; i < nb_output_files; i++)
2800 avc[i] = output_files[i]->ctx;
2802 av_sdp_create(avc, nb_output_files, sdp, sizeof(sdp));
2803 printf("SDP:\n%s\n", sdp);
2808 static int init_input_stream(int ist_index, char *error, int error_len)
2810 InputStream *ist = input_streams[ist_index];
2812 if (ist->decoding_needed) {
2813 AVCodec *codec = ist->dec;
2815 snprintf(error, error_len, "Decoder (codec %s) not found for input stream #%d:%d",
2816 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2817 return AVERROR(EINVAL);
2820 ist->dr1 = (codec->capabilities & CODEC_CAP_DR1) && !do_deinterlace;
2821 if (codec->type == AVMEDIA_TYPE_VIDEO && ist->dr1) {
2822 ist->st->codec->get_buffer = codec_get_buffer;
2823 ist->st->codec->release_buffer = codec_release_buffer;
2824 ist->st->codec->opaque = &ist->buffer_pool;
2827 if (!av_dict_get(ist->opts, "threads", NULL, 0))
2828 av_dict_set(&ist->opts, "threads", "auto", 0);
2829 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2830 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
2831 ist->file_index, ist->st->index);
2832 return AVERROR(EINVAL);
2834 assert_codec_experimental(ist->st->codec, 0);
2835 assert_avoptions(ist->opts);
2838 ist->next_pts = AV_NOPTS_VALUE;
2839 ist->next_dts = AV_NOPTS_VALUE;
2845 static InputStream *get_input_stream(OutputStream *ost)
2847 if (ost->source_index >= 0)
2848 return input_streams[ost->source_index];
2852 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2853 AVCodecContext *avctx)
2859 for (p = kf; *p; p++)
2862 ost->forced_kf_count = n;
2863 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2864 if (!ost->forced_kf_pts) {
2865 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2870 for (i = 0; i < n; i++) {
2871 char *next = strchr(p, ',');
2876 t = parse_time_or_die("force_key_frames", p, 1);
2877 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2883 static void report_new_stream(int input_index, AVPacket *pkt)
2885 InputFile *file = input_files[input_index];
2886 AVStream *st = file->ctx->streams[pkt->stream_index];
2888 if (pkt->stream_index < file->nb_streams_warn)
2890 av_log(file->ctx, AV_LOG_WARNING,
2891 "New %s stream %d:%d at pos:%"PRId64" and DTS:%ss\n",
2892 av_get_media_type_string(st->codec->codec_type),
2893 input_index, pkt->stream_index,
2894 pkt->pos, av_ts2timestr(pkt->dts, &st->time_base));
2895 file->nb_streams_warn = pkt->stream_index + 1;
2898 static int transcode_init(void)
2900 int ret = 0, i, j, k;
2901 AVFormatContext *oc;
2902 AVCodecContext *codec, *icodec = NULL;
2908 /* init framerate emulation */
2909 for (i = 0; i < nb_input_files; i++) {
2910 InputFile *ifile = input_files[i];
2911 if (ifile->rate_emu)
2912 for (j = 0; j < ifile->nb_streams; j++)
2913 input_streams[j + ifile->ist_index]->start = av_gettime();
2916 /* output stream init */
2917 for (i = 0; i < nb_output_files; i++) {
2918 oc = output_files[i]->ctx;
2919 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2920 av_dump_format(oc, i, oc->filename, 1);
2921 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2922 return AVERROR(EINVAL);
2926 /* init complex filtergraphs */
2927 for (i = 0; i < nb_filtergraphs; i++)
2928 if ((ret = avfilter_graph_config(filtergraphs[i]->graph, NULL)) < 0)
2931 /* for each output stream, we compute the right encoding parameters */
2932 for (i = 0; i < nb_output_streams; i++) {
2933 ost = output_streams[i];
2934 oc = output_files[ost->file_index]->ctx;
2935 ist = get_input_stream(ost);
2937 if (ost->attachment_filename)
2940 codec = ost->st->codec;
2943 icodec = ist->st->codec;
2945 ost->st->disposition = ist->st->disposition;
2946 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2947 codec->chroma_sample_location = icodec->chroma_sample_location;
2950 if (ost->stream_copy) {
2951 uint64_t extra_size;
2953 av_assert0(ist && !ost->filter);
2955 extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2957 if (extra_size > INT_MAX) {
2958 return AVERROR(EINVAL);
2961 /* if stream_copy is selected, no need to decode or encode */
2962 codec->codec_id = icodec->codec_id;
2963 codec->codec_type = icodec->codec_type;
2965 if (!codec->codec_tag) {
2966 if (!oc->oformat->codec_tag ||
2967 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2968 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2969 codec->codec_tag = icodec->codec_tag;
2972 codec->bit_rate = icodec->bit_rate;
2973 codec->rc_max_rate = icodec->rc_max_rate;
2974 codec->rc_buffer_size = icodec->rc_buffer_size;
2975 codec->field_order = icodec->field_order;
2976 codec->extradata = av_mallocz(extra_size);
2977 if (!codec->extradata) {
2978 return AVERROR(ENOMEM);
2980 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2981 codec->extradata_size= icodec->extradata_size;
2982 codec->bits_per_coded_sample = icodec->bits_per_coded_sample;
2984 codec->time_base = ist->st->time_base;
2986 * Avi is a special case here because it supports variable fps but
2987 * having the fps and timebase differe significantly adds quite some
2990 if(!strcmp(oc->oformat->name, "avi")) {
2991 if ( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base)
2992 && av_q2d(ist->st->time_base) < 1.0/500
2994 codec->time_base = icodec->time_base;
2995 codec->time_base.num *= icodec->ticks_per_frame;
2996 codec->time_base.den *= 2;
2997 codec->ticks_per_frame = 2;
2999 } else if(!(oc->oformat->flags & AVFMT_VARIABLE_FPS)
3000 && strcmp(oc->oformat->name, "mov") && strcmp(oc->oformat->name, "mp4") && strcmp(oc->oformat->name, "3gp")
3001 && strcmp(oc->oformat->name, "3g2") && strcmp(oc->oformat->name, "psp") && strcmp(oc->oformat->name, "ipod")
3003 if( copy_tb<0 && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base)
3004 && av_q2d(ist->st->time_base) < 1.0/500
3006 codec->time_base = icodec->time_base;
3007 codec->time_base.num *= icodec->ticks_per_frame;
3011 if(ost->frame_rate.num)
3012 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3014 av_reduce(&codec->time_base.num, &codec->time_base.den,
3015 codec->time_base.num, codec->time_base.den, INT_MAX);
3017 switch (codec->codec_type) {
3018 case AVMEDIA_TYPE_AUDIO:
3019 if (audio_volume != 256) {
3020 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
3023 codec->channel_layout = icodec->channel_layout;
3024 codec->sample_rate = icodec->sample_rate;
3025 codec->channels = icodec->channels;
3026 codec->frame_size = icodec->frame_size;
3027 codec->audio_service_type = icodec->audio_service_type;
3028 codec->block_align = icodec->block_align;
3029 if((codec->block_align == 1 || codec->block_align == 1152) && codec->codec_id == CODEC_ID_MP3)
3030 codec->block_align= 0;
3031 if(codec->codec_id == CODEC_ID_AC3)
3032 codec->block_align= 0;
3034 case AVMEDIA_TYPE_VIDEO:
3035 codec->pix_fmt = icodec->pix_fmt;
3036 codec->width = icodec->width;
3037 codec->height = icodec->height;
3038 codec->has_b_frames = icodec->has_b_frames;
3039 if (!codec->sample_aspect_ratio.num) {
3040 codec->sample_aspect_ratio =
3041 ost->st->sample_aspect_ratio =
3042 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
3043 ist->st->codec->sample_aspect_ratio.num ?
3044 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
3046 ost->st->avg_frame_rate = ist->st->avg_frame_rate;
3048 case AVMEDIA_TYPE_SUBTITLE:
3049 codec->width = icodec->width;
3050 codec->height = icodec->height;
3052 case AVMEDIA_TYPE_DATA:
3053 case AVMEDIA_TYPE_ATTACHMENT:
3060 ost->enc = avcodec_find_encoder(codec->codec_id);
3062 /* should only happen when a default codec is not present. */
3063 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d:%d",
3064 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
3065 ret = AVERROR(EINVAL);
3070 ist->decoding_needed = 1;
3071 ost->encoding_needed = 1;
3073 if (codec->codec_type == AVMEDIA_TYPE_VIDEO) {
3074 if (ost->filter && !ost->frame_rate.num)
3075 ost->frame_rate = av_buffersink_get_frame_rate(ost->filter->filter);
3076 if (ist && !ost->frame_rate.num)
3077 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25, 1};
3078 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
3079 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
3080 ost->frame_rate = ost->enc->supported_framerates[idx];
3085 (codec->codec_type == AVMEDIA_TYPE_VIDEO ||
3086 codec->codec_type == AVMEDIA_TYPE_AUDIO)) {
3088 fg = init_simple_filtergraph(ist, ost);
3089 if (configure_filtergraph(fg)) {
3090 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
3095 switch (codec->codec_type) {
3096 case AVMEDIA_TYPE_AUDIO:
3097 codec->sample_fmt = ost->filter->filter->inputs[0]->format;
3098 codec->sample_rate = ost->filter->filter->inputs[0]->sample_rate;
3099 codec->channel_layout = ost->filter->filter->inputs[0]->channel_layout;
3100 codec->channels = av_get_channel_layout_nb_channels(codec->channel_layout);
3101 codec->time_base = (AVRational){ 1, codec->sample_rate };
3103 case AVMEDIA_TYPE_VIDEO:
3104 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
3105 if (ost->filter && !(codec->time_base.num && codec->time_base.den))
3106 codec->time_base = ost->filter->filter->inputs[0]->time_base;
3107 if ( av_q2d(codec->time_base) < 0.001 && video_sync_method != VSYNC_PASSTHROUGH
3108 && (video_sync_method == VSYNC_CFR || (video_sync_method == VSYNC_AUTO && !(oc->oformat->flags & AVFMT_VARIABLE_FPS)))){
3109 av_log(oc, AV_LOG_WARNING, "Frame rate very high for a muxer not efficiently supporting it.\n"
3110 "Please consider specifying a lower framerate, a different muxer or -vsync 2\n");
3112 for (j = 0; j < ost->forced_kf_count; j++)
3113 ost->forced_kf_pts[j] = av_rescale_q(ost->forced_kf_pts[j],
3117 codec->width = ost->filter->filter->inputs[0]->w;
3118 codec->height = ost->filter->filter->inputs[0]->h;
3119 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
3120 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
3121 av_d2q(ost->frame_aspect_ratio * codec->height/codec->width, 255) :
3122 ost->filter->filter->inputs[0]->sample_aspect_ratio;
3123 codec->pix_fmt = ost->filter->filter->inputs[0]->format;
3126 codec->width != icodec->width ||
3127 codec->height != icodec->height ||
3128 codec->pix_fmt != icodec->pix_fmt) {
3129 codec->bits_per_raw_sample = frame_bits_per_raw_sample;
3132 if (ost->forced_keyframes)
3133 parse_forced_key_frames(ost->forced_keyframes, ost,
3136 case AVMEDIA_TYPE_SUBTITLE:
3137 codec->time_base = (AVRational){1, 1000};
3144 if (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2)) {
3145 char logfilename[1024];
3148 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
3149 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
3151 if (!strcmp(ost->enc->name, "libx264")) {
3152 av_dict_set(&ost->opts, "stats", logfilename, AV_DICT_DONT_OVERWRITE);
3154 if (codec->flags & CODEC_FLAG_PASS2) {
3156 size_t logbuffer_size;
3157 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
3158 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
3162 codec->stats_in = logbuffer;
3164 if (codec->flags & CODEC_FLAG_PASS1) {
3165 f = fopen(logfilename, "wb");
3167 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
3168 logfilename, strerror(errno));
3178 /* open each encoder */
3179 for (i = 0; i < nb_output_streams; i++) {
3180 ost = output_streams[i];
3181 if (ost->encoding_needed) {
3182 AVCodec *codec = ost->enc;
3183 AVCodecContext *dec = NULL;
3185 if ((ist = get_input_stream(ost)))
3186 dec = ist->st->codec;
3187 if (dec && dec->subtitle_header) {
3188 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
3189 if (!ost->st->codec->subtitle_header) {
3190 ret = AVERROR(ENOMEM);
3193 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
3194 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
3196 if (!av_dict_get(ost->opts, "threads", NULL, 0))
3197 av_dict_set(&ost->opts, "threads", "auto", 0);
3198 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
3199 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
3200 ost->file_index, ost->index);
3201 ret = AVERROR(EINVAL);
3204 if (ost->enc->type == AVMEDIA_TYPE_AUDIO &&
3205 !(ost->enc->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE))
3206 av_buffersink_set_frame_size(ost->filter->filter,
3207 ost->st->codec->frame_size);
3208 assert_codec_experimental(ost->st->codec, 1);
3209 assert_avoptions(ost->opts);
3210 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
3211 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
3212 " It takes bits/s as argument, not kbits/s\n");
3213 extra_size += ost->st->codec->extradata_size;
3215 if (ost->st->codec->me_threshold)
3216 input_streams[ost->source_index]->st->codec->debug |= FF_DEBUG_MV;
3220 /* init input streams */
3221 for (i = 0; i < nb_input_streams; i++)
3222 if ((ret = init_input_stream(i, error, sizeof(error))) < 0)
3225 /* discard unused programs */
3226 for (i = 0; i < nb_input_files; i++) {
3227 InputFile *ifile = input_files[i];
3228 for (j = 0; j < ifile->ctx->nb_programs; j++) {
3229 AVProgram *p = ifile->ctx->programs[j];
3230 int discard = AVDISCARD_ALL;
3232 for (k = 0; k < p->nb_stream_indexes; k++)
3233 if (!input_streams[ifile->ist_index + p->stream_index[k]]->discard) {
3234 discard = AVDISCARD_DEFAULT;
3237 p->discard = discard;
3241 /* open files and write file headers */
3242 for (i = 0; i < nb_output_files; i++) {
3243 oc = output_files[i]->ctx;
3244 oc->interrupt_callback = int_cb;
3245 if ((ret = avformat_write_header(oc, &output_files[i]->opts)) < 0) {
3247 const char *errbuf_ptr = errbuf;
3248 if (av_strerror(ret, errbuf, sizeof(errbuf)) < 0)
3249 errbuf_ptr = strerror(AVUNERROR(ret));
3250 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?): %s", i, errbuf_ptr);
3251 ret = AVERROR(EINVAL);
3254 // assert_avoptions(output_files[i]->opts);
3255 if (strcmp(oc->oformat->name, "rtp")) {
3261 /* dump the file output parameters - cannot be done before in case
3263 for (i = 0; i < nb_output_files; i++) {
3264 av_dump_format(output_files[i]->ctx, i, output_files[i]->ctx->filename, 1);
3267 /* dump the stream mapping */
3268 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
3269 for (i = 0; i < nb_input_streams; i++) {
3270 ist = input_streams[i];
3272 for (j = 0; j < ist->nb_filters; j++) {
3273 if (ist->filters[j]->graph->graph_desc) {
3274 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d (%s) -> %s",
3275 ist->file_index, ist->st->index, ist->dec ? ist->dec->name : "?",
3276 ist->filters[j]->name);
3277 if (nb_filtergraphs > 1)
3278 av_log(NULL, AV_LOG_INFO, " (graph %d)", ist->filters[j]->graph->index);
3279 av_log(NULL, AV_LOG_INFO, "\n");
3284 for (i = 0; i < nb_output_streams; i++) {
3285 ost = output_streams[i];
3287 if (ost->attachment_filename) {
3288 /* an attached file */
3289 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
3290 ost->attachment_filename, ost->file_index, ost->index);
3294 if (ost->filter && ost->filter->graph->graph_desc) {
3295 /* output from a complex graph */
3296 av_log(NULL, AV_LOG_INFO, " %s", ost->filter->name);
3297 if (nb_filtergraphs > 1)
3298 av_log(NULL, AV_LOG_INFO, " (graph %d)", ost->filter->graph->index);
3300 av_log(NULL, AV_LOG_INFO, " -> Stream #%d:%d (%s)\n", ost->file_index,
3301 ost->index, ost->enc ? ost->enc->name : "?");
3305 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
3306 input_streams[ost->source_index]->file_index,
3307 input_streams[ost->source_index]->st->index,
3310 if (ost->sync_ist != input_streams[ost->source_index])
3311 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
3312 ost->sync_ist->file_index,
3313 ost->sync_ist->st->index);
3314 if (ost->stream_copy)
3315 av_log(NULL, AV_LOG_INFO, " (copy)");
3317 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index]->dec ?
3318 input_streams[ost->source_index]->dec->name : "?",
3319 ost->enc ? ost->enc->name : "?");
3320 av_log(NULL, AV_LOG_INFO, "\n");
3324 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
3336 * @return 1 if there are still streams where more output is wanted,
3339 static int need_output(void)
3343 for (i = 0; i < nb_output_streams; i++) {
3344 OutputStream *ost = output_streams[i];
3345 OutputFile *of = output_files[ost->file_index];
3346 AVFormatContext *os = output_files[ost->file_index]->ctx;
3348 if (ost->is_past_recording_time ||
3349 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
3351 if (ost->frame_number >= ost->max_frames) {
3353 for (j = 0; j < of->ctx->nb_streams; j++)
3354 output_streams[of->ost_index + j]->is_past_recording_time = 1;
3364 static int input_acceptable(InputStream *ist)
3366 av_assert1(!ist->discard);
3367 return !input_files[ist->file_index]->unavailable &&
3368 !input_files[ist->file_index]->eof_reached;
3371 static int find_graph_input(FilterGraph *graph)
3373 int i, nb_req_max = 0, file_index = -1;
3375 for (i = 0; i < graph->nb_inputs; i++) {
3376 int nb_req = av_buffersrc_get_nb_failed_requests(graph->inputs[i]->filter);
3377 if (nb_req > nb_req_max) {
3378 InputStream *ist = graph->inputs[i]->ist;
3379 if (input_acceptable(ist)) {
3380 nb_req_max = nb_req;
3381 file_index = ist->file_index;
3390 * Select the input file to read from.
3392 * @return >=0 index of the input file to use;
3393 * -1 if no file is acceptable;
3394 * -2 to read from filters without reading from a file
3396 static int select_input_file(void)
3398 int i, ret, nb_active_out = nb_output_streams, ost_index = -1;
3401 AVFilterBufferRef *dummy;
3403 for (i = 0; i < nb_output_streams; i++)
3404 nb_active_out -= output_streams[i]->unavailable =
3405 output_streams[i]->is_past_recording_time;
3406 while (nb_active_out) {
3407 opts_min = INT64_MAX;
3409 for (i = 0; i < nb_output_streams; i++) {
3410 OutputStream *ost = output_streams[i];
3411 int64_t opts = av_rescale_q(ost->st->cur_dts, ost->st->time_base,
3413 if (!ost->unavailable && opts < opts_min) {
3421 ost = output_streams[ost_index];
3422 if (ost->source_index >= 0) {
3423 /* ost is directly connected to an input */
3424 InputStream *ist = input_streams[ost->source_index];
3425 if (input_acceptable(ist))
3426 return ist->file_index;
3428 /* ost is connected to a complex filtergraph */
3429 av_assert1(ost->filter);
3430 ret = av_buffersink_get_buffer_ref(ost->filter->filter, &dummy,
3431 AV_BUFFERSINK_FLAG_PEEK);
3434 ret = find_graph_input(ost->filter->graph);
3438 ost->unavailable = 1;
3444 static int check_keyboard_interaction(int64_t cur_time)
3447 static int64_t last_time;
3448 if (received_nb_signals)
3449 return AVERROR_EXIT;
3450 /* read_key() returns 0 on EOF */
3451 if(cur_time - last_time >= 100000 && !run_as_daemon){
3453 last_time = cur_time;
3457 return AVERROR_EXIT;
3458 if (key == '+') av_log_set_level(av_log_get_level()+10);
3459 if (key == '-') av_log_set_level(av_log_get_level()-10);
3460 if (key == 's') qp_hist ^= 1;
3463 do_hex_dump = do_pkt_dump = 0;
3464 } else if(do_pkt_dump){
3468 av_log_set_level(AV_LOG_DEBUG);
3470 if (key == 'c' || key == 'C'){
3471 char buf[4096], target[64], command[256], arg[256] = {0};
3474 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
3476 while ((k = read_key()) != '\n' && k != '\r' && i < sizeof(buf)-1)
3481 (n = sscanf(buf, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &time, command, arg)) >= 3) {
3482 av_log(NULL, AV_LOG_DEBUG, "Processing command target:%s time:%f command:%s arg:%s",
3483 target, time, command, arg);
3484 for (i = 0; i < nb_filtergraphs; i++) {
3485 FilterGraph *fg = filtergraphs[i];
3488 ret = avfilter_graph_send_command(fg->graph, target, command, arg, buf, sizeof(buf),
3489 key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
3490 fprintf(stderr, "Command reply for stream %d: ret:%d res:%s\n", i, ret, buf);
3492 ret = avfilter_graph_queue_command(fg->graph, target, command, arg, 0, time);
3497 av_log(NULL, AV_LOG_ERROR,
3498 "Parse error, at least 3 arguments were expected, "
3499 "only %d given in string '%s'\n", n, buf);
3502 if (key == 'd' || key == 'D'){
3505 debug = input_streams[0]->st->codec->debug<<1;
3506 if(!debug) debug = 1;
3507 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
3510 if(scanf("%d", &debug)!=1)
3511 fprintf(stderr,"error parsing debug value\n");
3512 for(i=0;i<nb_input_streams;i++) {
3513 input_streams[i]->st->codec->debug = debug;
3515 for(i=0;i<nb_output_streams;i++) {
3516 OutputStream *ost = output_streams[i];
3517 ost->st->codec->debug = debug;
3519 if(debug) av_log_set_level(AV_LOG_DEBUG);
3520 fprintf(stderr,"debug=%d\n", debug);
3523 fprintf(stderr, "key function\n"
3524 "? show this help\n"
3525 "+ increase verbosity\n"
3526 "- decrease verbosity\n"
3527 "c Send command to filtergraph\n"
3528 "D cycle through available debug modes\n"
3529 "h dump packets/hex press to cycle through the 3 states\n"
3531 "s Show QP histogram\n"
3538 static void *input_thread(void *arg)
3543 while (!transcoding_finished && ret >= 0) {
3545 ret = av_read_frame(f->ctx, &pkt);
3547 if (ret == AVERROR(EAGAIN)) {
3554 pthread_mutex_lock(&f->fifo_lock);
3555 while (!av_fifo_space(f->fifo))
3556 pthread_cond_wait(&f->fifo_cond, &f->fifo_lock);
3558 av_dup_packet(&pkt);
3559 av_fifo_generic_write(f->fifo, &pkt, sizeof(pkt), NULL);
3561 pthread_mutex_unlock(&f->fifo_lock);
3568 static void free_input_threads(void)
3572 if (nb_input_files == 1)
3575 transcoding_finished = 1;
3577 for (i = 0; i < nb_input_files; i++) {
3578 InputFile *f = input_files[i];
3581 if (!f->fifo || f->joined)
3584 pthread_mutex_lock(&f->fifo_lock);
3585 while (av_fifo_size(f->fifo)) {
3586 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3587 av_free_packet(&pkt);
3589 pthread_cond_signal(&f->fifo_cond);
3590 pthread_mutex_unlock(&f->fifo_lock);
3592 pthread_join(f->thread, NULL);
3595 while (av_fifo_size(f->fifo)) {
3596 av_fifo_generic_read(f->fifo, &pkt, sizeof(pkt), NULL);
3597 av_free_packet(&pkt);
3599 av_fifo_free(f->fifo);
3603 static int init_input_threads(void)
3607 if (nb_input_files == 1)
3610 for (i = 0; i < nb_input_files; i++) {
3611 InputFile *f = input_files[i];
3613 if (!(f->fifo = av_fifo_alloc(8*sizeof(AVPacket))))
3614 return AVERROR(ENOMEM);
3616 pthread_mutex_init(&f->fifo_lock, NULL);
3617 pthread_cond_init (&f->fifo_cond, NULL);
3619 if ((ret = pthread_create(&f->thread, NULL, input_thread, f)))
3620 return AVERROR(ret);
3625 static int get_input_packet_mt(InputFile *f, AVPacket *pkt)
3629 pthread_mutex_lock(&f->fifo_lock);
3631 if (av_fifo_size(f->fifo)) {
3632 av_fifo_generic_read(f->fifo, pkt, sizeof(*pkt), NULL);
3633 pthread_cond_signal(&f->fifo_cond);
3638 ret = AVERROR(EAGAIN);
3641 pthread_mutex_unlock(&f->fifo_lock);
3647 static int get_input_packet(InputFile *f, AVPacket *pkt)
3650 if (nb_input_files > 1)
3651 return get_input_packet_mt(f, pkt);
3653 return av_read_frame(f->ctx, pkt);
3657 * The following code is the main loop of the file converter
3659 static int transcode(void)
3662 AVFormatContext *is, *os;
3665 int no_packet_count = 0;
3666 int64_t timer_start;
3668 ret = transcode_init();
3672 if (stdin_interaction) {
3673 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
3676 timer_start = av_gettime();
3679 if ((ret = init_input_threads()) < 0)
3683 for (; received_sigterm == 0;) {
3684 int file_index, ist_index;
3686 int64_t cur_time= av_gettime();
3688 /* if 'q' pressed, exits */
3689 if (stdin_interaction)
3690 if (check_keyboard_interaction(cur_time) < 0)
3693 /* check if there's any stream where output is still needed */
3694 if (!need_output()) {
3695 av_log(NULL, AV_LOG_VERBOSE, "No more output streams to write to, finishing.\n");
3699 /* select the stream that we must read now */
3700 file_index = select_input_file();
3701 /* if none, if is finished */
3702 if (file_index == -2) {
3706 if (file_index < 0) {
3707 if (no_packet_count) {
3708 no_packet_count = 0;
3709 for (i = 0; i < nb_input_files; i++)
3710 input_files[i]->unavailable = 0;
3714 av_log(NULL, AV_LOG_VERBOSE, "No more inputs to read from, finishing.\n");
3718 is = input_files[file_index]->ctx;
3719 ret = get_input_packet(input_files[file_index], &pkt);
3721 if (ret == AVERROR(EAGAIN)) {
3722 input_files[file_index]->unavailable = 1;
3727 if (ret != AVERROR_EOF) {
3728 print_error(is->filename, ret);
3732 input_files[file_index]->eof_reached = 1;
3734 for (i = 0; i < input_files[file_index]->nb_streams; i++) {
3735 ist = input_streams[input_files[file_index]->ist_index + i];
3736 if (ist->decoding_needed)
3737 output_packet(ist, NULL);
3747 no_packet_count = 0;
3748 for (i = 0; i < nb_input_files; i++)
3749 input_files[i]->unavailable = 0;
3752 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
3753 is->streams[pkt.stream_index]);
3755 /* the following test is needed in case new streams appear
3756 dynamically in stream : we ignore them */
3757 if (pkt.stream_index >= input_files[file_index]->nb_streams) {
3758 report_new_stream(file_index, &pkt);
3759 goto discard_packet;
3761 ist_index = input_files[file_index]->ist_index + pkt.stream_index;
3762 ist = input_streams[ist_index];
3764 goto discard_packet;
3766 if(!ist->wrap_correction_done && input_files[file_index]->ctx->start_time != AV_NOPTS_VALUE && ist->st->pts_wrap_bits < 64){
3767 uint64_t stime = av_rescale_q(input_files[file_index]->ctx->start_time, AV_TIME_BASE_Q, ist->st->time_base);
3768 uint64_t stime2= stime + (1LL<<ist->st->pts_wrap_bits);
3769 ist->wrap_correction_done = 1;
3770 if(pkt.dts != AV_NOPTS_VALUE && pkt.dts > stime && pkt.dts - stime > stime2 - pkt.dts) {
3771 pkt.dts -= 1LL<<ist->st->pts_wrap_bits;
3772 ist->wrap_correction_done = 0;
3774 if(pkt.pts != AV_NOPTS_VALUE && pkt.pts > stime && pkt.pts - stime > stime2 - pkt.pts) {
3775 pkt.pts -= 1LL<<ist->st->pts_wrap_bits;
3776 ist->wrap_correction_done = 0;
3780 if (pkt.dts != AV_NOPTS_VALUE)
3781 pkt.dts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3782 if (pkt.pts != AV_NOPTS_VALUE)
3783 pkt.pts += av_rescale_q(input_files[ist->file_index]->ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
3785 if (pkt.pts != AV_NOPTS_VALUE)
3786 pkt.pts *= ist->ts_scale;
3787 if (pkt.dts != AV_NOPTS_VALUE)
3788 pkt.dts *= ist->ts_scale;
3791 av_log(NULL, AV_LOG_INFO, "demuxer -> ist_index:%d type:%s "
3792 "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",
3793 ist_index, av_get_media_type_string(ist->st->codec->codec_type),
3794 av_ts2str(ist->next_dts), av_ts2timestr(ist->next_dts, &AV_TIME_BASE_Q),
3795 av_ts2str(ist->next_pts), av_ts2timestr(ist->next_pts, &AV_TIME_BASE_Q),
3796 av_ts2str(pkt.pts), av_ts2timestr(pkt.pts, &ist->st->time_base),
3797 av_ts2str(pkt.dts), av_ts2timestr(pkt.dts, &ist->st->time_base),
3798 input_files[ist->file_index]->ts_offset);
3801 if (pkt.dts != AV_NOPTS_VALUE && ist->next_dts != AV_NOPTS_VALUE && !copy_ts) {
3802 int64_t pkt_dts = av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
3803 int64_t delta = pkt_dts - ist->next_dts;
3804 if (is->iformat->flags & AVFMT_TS_DISCONT) {
3805 if(delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
3806 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
3807 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3808 pkt_dts+1<ist->pts){
3809 input_files[ist->file_index]->ts_offset -= delta;
3810 av_log(NULL, AV_LOG_DEBUG,
3811 "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
3812 delta, input_files[ist->file_index]->ts_offset);
3813 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3814 if (pkt.pts != AV_NOPTS_VALUE)
3815 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
3818 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3819 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3820 pkt_dts+1<ist->pts){
3821 av_log(NULL, AV_LOG_WARNING, "DTS %"PRId64", next:%"PRId64" st:%d invalid dropping\n", pkt.dts, ist->next_dts, pkt.stream_index);
3822 pkt.dts = AV_NOPTS_VALUE;
3824 if (pkt.pts != AV_NOPTS_VALUE){
3825 int64_t pkt_pts = av_rescale_q(pkt.pts, ist->st->time_base, AV_TIME_BASE_Q);
3826 delta = pkt_pts - ist->next_dts;
3827 if ( delta < -1LL*dts_error_threshold*AV_TIME_BASE ||
3828 (delta > 1LL*dts_error_threshold*AV_TIME_BASE && ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
3829 pkt_pts+1<ist->pts) {
3830 av_log(NULL, AV_LOG_WARNING, "PTS %"PRId64", next:%"PRId64" invalid dropping st:%d\n", pkt.pts, ist->next_dts, pkt.stream_index);
3831 pkt.pts = AV_NOPTS_VALUE;
3837 // fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
3838 if ((ret = output_packet(ist, &pkt)) < 0 ||
3839 ((ret = poll_filters()) < 0 && ret != AVERROR_EOF)) {
3841 av_strerror(ret, buf, sizeof(buf));
3842 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d: %s\n",
3843 ist->file_index, ist->st->index, buf);
3846 av_free_packet(&pkt);
3851 av_free_packet(&pkt);
3853 /* dump report by using the output first video and audio streams */
3854 print_report(0, timer_start, cur_time);
3857 free_input_threads();
3860 /* at the end of stream, we must flush the decoder buffers */
3861 for (i = 0; i < nb_input_streams; i++) {
3862 ist = input_streams[i];
3863 if (!input_files[ist->file_index]->eof_reached && ist->decoding_needed) {
3864 output_packet(ist, NULL);
3872 /* write the trailer if needed and close file */
3873 for (i = 0; i < nb_output_files; i++) {
3874 os = output_files[i]->ctx;
3875 av_write_trailer(os);
3878 /* dump report by using the first video and audio streams */
3879 print_report(1, timer_start, av_gettime());
3881 /* close each encoder */
3882 for (i = 0; i < nb_output_streams; i++) {
3883 ost = output_streams[i];
3884 if (ost->encoding_needed) {
3885 av_freep(&ost->st->codec->stats_in);
3886 avcodec_close(ost->st->codec);
3890 /* close each decoder */
3891 for (i = 0; i < nb_input_streams; i++) {
3892 ist = input_streams[i];
3893 if (ist->decoding_needed) {
3894 avcodec_close(ist->st->codec);
3903 free_input_threads();
3906 if (output_streams) {
3907 for (i = 0; i < nb_output_streams; i++) {
3908 ost = output_streams[i];
3910 if (ost->stream_copy)
3911 av_freep(&ost->st->codec->extradata);
3913 fclose(ost->logfile);
3914 ost->logfile = NULL;
3916 av_freep(&ost->st->codec->subtitle_header);
3917 av_free(ost->forced_kf_pts);
3918 av_dict_free(&ost->opts);
3925 static int opt_frame_crop(const char *opt, const char *arg)
3927 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the crop filter instead\n", opt);
3928 return AVERROR(EINVAL);
3931 static int opt_pad(const char *opt, const char *arg)
3933 av_log(NULL, AV_LOG_FATAL, "Option '%s' has been removed, use the pad filter instead\n", opt);
3937 static int opt_video_channel(const char *opt, const char *arg)
3939 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
3940 return opt_default("channel", arg);
3943 static int opt_video_standard(const char *opt, const char *arg)
3945 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
3946 return opt_default("standard", arg);
3949 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
3951 audio_codec_name = arg;
3952 return parse_option(o, "codec:a", arg, options);
3955 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
3957 video_codec_name = arg;
3958 return parse_option(o, "codec:v", arg, options);
3961 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
3963 subtitle_codec_name = arg;
3964 return parse_option(o, "codec:s", arg, options);
3967 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
3969 return parse_option(o, "codec:d", arg, options);
3972 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
3974 StreamMap *m = NULL;
3975 int i, negative = 0, file_idx;
3976 int sync_file_idx = -1, sync_stream_idx = 0;
3984 map = av_strdup(arg);
3986 /* parse sync stream first, just pick first matching stream */
3987 if (sync = strchr(map, ',')) {
3989 sync_file_idx = strtol(sync + 1, &sync, 0);
3990 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
3991 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
3996 for (i = 0; i < input_files[sync_file_idx]->nb_streams; i++)
3997 if (check_stream_specifier(input_files[sync_file_idx]->ctx,
3998 input_files[sync_file_idx]->ctx->streams[i], sync) == 1) {
3999 sync_stream_idx = i;
4002 if (i == input_files[sync_file_idx]->nb_streams) {
4003 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
4004 "match any streams.\n", arg);
4010 if (map[0] == '[') {
4011 /* this mapping refers to lavfi output */
4012 const char *c = map + 1;
4013 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
4014 &o->nb_stream_maps, o->nb_stream_maps + 1);
4015 m = &o->stream_maps[o->nb_stream_maps - 1];
4016 m->linklabel = av_get_token(&c, "]");
4017 if (!m->linklabel) {
4018 av_log(NULL, AV_LOG_ERROR, "Invalid output link label: %s.\n", map);
4022 file_idx = strtol(map, &p, 0);
4023 if (file_idx >= nb_input_files || file_idx < 0) {
4024 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
4028 /* disable some already defined maps */
4029 for (i = 0; i < o->nb_stream_maps; i++) {
4030 m = &o->stream_maps[i];
4031 if (file_idx == m->file_index &&
4032 check_stream_specifier(input_files[m->file_index]->ctx,
4033 input_files[m->file_index]->ctx->streams[m->stream_index],
4034 *p == ':' ? p + 1 : p) > 0)
4038 for (i = 0; i < input_files[file_idx]->nb_streams; i++) {
4039 if (check_stream_specifier(input_files[file_idx]->ctx, input_files[file_idx]->ctx->streams[i],
4040 *p == ':' ? p + 1 : p) <= 0)
4042 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
4043 &o->nb_stream_maps, o->nb_stream_maps + 1);
4044 m = &o->stream_maps[o->nb_stream_maps - 1];
4046 m->file_index = file_idx;
4047 m->stream_index = i;
4049 if (sync_file_idx >= 0) {
4050 m->sync_file_index = sync_file_idx;
4051 m->sync_stream_index = sync_stream_idx;
4053 m->sync_file_index = file_idx;
4054 m->sync_stream_index = i;
4060 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
4068 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
4070 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
4071 &o->nb_attachments, o->nb_attachments + 1);
4072 o->attachments[o->nb_attachments - 1] = arg;
4076 static int opt_map_channel(OptionsContext *o, const char *opt, const char *arg)
4082 o->audio_channel_maps =
4083 grow_array(o->audio_channel_maps, sizeof(*o->audio_channel_maps),
4084 &o->nb_audio_channel_maps, o->nb_audio_channel_maps + 1);
4085 m = &o->audio_channel_maps[o->nb_audio_channel_maps - 1];
4087 /* muted channel syntax */
4088 n = sscanf(arg, "%d:%d.%d", &m->channel_idx, &m->ofile_idx, &m->ostream_idx);
4089 if ((n == 1 || n == 3) && m->channel_idx == -1) {
4090 m->file_idx = m->stream_idx = -1;
4092 m->ofile_idx = m->ostream_idx = -1;
4097 n = sscanf(arg, "%d.%d.%d:%d.%d",
4098 &m->file_idx, &m->stream_idx, &m->channel_idx,
4099 &m->ofile_idx, &m->ostream_idx);
4101 if (n != 3 && n != 5) {
4102 av_log(NULL, AV_LOG_FATAL, "Syntax error, mapchan usage: "
4103 "[file.stream.channel|-1][:syncfile:syncstream]\n");
4107 if (n != 5) // only file.stream.channel specified
4108 m->ofile_idx = m->ostream_idx = -1;
4111 if (m->file_idx < 0 || m->file_idx >= nb_input_files) {
4112 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file index: %d\n",
4116 if (m->stream_idx < 0 ||
4117 m->stream_idx >= input_files[m->file_idx]->nb_streams) {
4118 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid input file stream index #%d.%d\n",
4119 m->file_idx, m->stream_idx);
4122 st = input_files[m->file_idx]->ctx->streams[m->stream_idx];
4123 if (st->codec->codec_type != AVMEDIA_TYPE_AUDIO) {
4124 av_log(NULL, AV_LOG_FATAL, "mapchan: stream #%d.%d is not an audio stream.\n",
4125 m->file_idx, m->stream_idx);
4128 if (m->channel_idx < 0 || m->channel_idx >= st->codec->channels) {
4129 av_log(NULL, AV_LOG_FATAL, "mapchan: invalid audio channel #%d.%d.%d\n",
4130 m->file_idx, m->stream_idx, m->channel_idx);
4137 * Parse a metadata specifier in arg.
4138 * @param type metadata type is written here -- g(lobal)/s(tream)/c(hapter)/p(rogram)
4139 * @param index for type c/p, chapter/program index is written here
4140 * @param stream_spec for type s, the stream specifier is written here
4142 static void parse_meta_type(char *arg, char *type, int *index, const char **stream_spec)
4150 if (*(++arg) && *arg != ':') {
4151 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", arg);
4154 *stream_spec = *arg == ':' ? arg + 1 : "";
4158 if (*(++arg) == ':')
4159 *index = strtol(++arg, NULL, 0);
4162 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
4169 static int copy_metadata(char *outspec, char *inspec, AVFormatContext *oc, AVFormatContext *ic, OptionsContext *o)
4171 AVDictionary **meta_in = NULL;
4172 AVDictionary **meta_out = NULL;
4174 char type_in, type_out;
4175 const char *istream_spec = NULL, *ostream_spec = NULL;
4176 int idx_in = 0, idx_out = 0;
4178 parse_meta_type(inspec, &type_in, &idx_in, &istream_spec);
4179 parse_meta_type(outspec, &type_out, &idx_out, &ostream_spec);
4182 if (type_out == 'g' || !*outspec)
4183 o->metadata_global_manual = 1;
4184 if (type_out == 's' || !*outspec)
4185 o->metadata_streams_manual = 1;
4186 if (type_out == 'c' || !*outspec)
4187 o->metadata_chapters_manual = 1;
4191 if (type_in == 'g' || type_out == 'g')
4192 o->metadata_global_manual = 1;
4193 if (type_in == 's' || type_out == 's')
4194 o->metadata_streams_manual = 1;
4195 if (type_in == 'c' || type_out == 'c')
4196 o->metadata_chapters_manual = 1;
4198 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
4199 if ((index) < 0 || (index) >= (nb_elems)) {\
4200 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps.\n",\
4205 #define SET_DICT(type, meta, context, index)\
4208 meta = &context->metadata;\
4211 METADATA_CHECK_INDEX(index, context->nb_chapters, "chapter")\
4212 meta = &context->chapters[index]->metadata;\
4215 METADATA_CHECK_INDEX(index, context->nb_programs, "program")\
4216 meta = &context->programs[index]->metadata;\
4218 default: av_assert0(0);\
4221 SET_DICT(type_in, meta_in, ic, idx_in);
4222 SET_DICT(type_out, meta_out, oc, idx_out);
4224 /* for input streams choose first matching stream */
4225 if (type_in == 's') {
4226 for (i = 0; i < ic->nb_streams; i++) {
4227 if ((ret = check_stream_specifier(ic, ic->streams[i], istream_spec)) > 0) {
4228 meta_in = &ic->streams[i]->metadata;
4234 av_log(NULL, AV_LOG_FATAL, "Stream specifier %s does not match any streams.\n", istream_spec);
4239 if (type_out == 's') {
4240 for (i = 0; i < oc->nb_streams; i++) {
4241 if ((ret = check_stream_specifier(oc, oc->streams[i], ostream_spec)) > 0) {
4242 meta_out = &oc->streams[i]->metadata;
4243 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4248 av_dict_copy(meta_out, *meta_in, AV_DICT_DONT_OVERWRITE);
4253 static int opt_recording_timestamp(OptionsContext *o, const char *opt, const char *arg)
4256 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
4257 struct tm time = *gmtime((time_t*)&recording_timestamp);
4258 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
4259 parse_option(o, "metadata", buf, options);
4261 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
4262 "tag instead.\n", opt);
4266 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
4268 const char *codec_string = encoder ? "encoder" : "decoder";
4272 avcodec_find_encoder_by_name(name) :
4273 avcodec_find_decoder_by_name(name);
4275 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
4278 if (codec->type != type) {
4279 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
4285 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
4287 char *codec_name = NULL;
4289 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
4291 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
4292 st->codec->codec_id = codec->id;
4295 return avcodec_find_decoder(st->codec->codec_id);
4299 * Add all the streams from the given input file to the global
4300 * list of input streams.
4302 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
4305 char *next, *codec_tag = NULL;
4307 for (i = 0; i < ic->nb_streams; i++) {
4308 AVStream *st = ic->streams[i];
4309 AVCodecContext *dec = st->codec;
4310 InputStream *ist = av_mallocz(sizeof(*ist));
4311 char *framerate = NULL;
4316 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
4317 input_streams[nb_input_streams - 1] = ist;
4320 ist->file_index = nb_input_files;
4322 st->discard = AVDISCARD_ALL;
4323 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st, choose_decoder(o, ic, st));
4325 ist->ts_scale = 1.0;
4326 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
4328 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, ic, st);
4330 uint32_t tag = strtol(codec_tag, &next, 0);
4332 tag = AV_RL32(codec_tag);
4333 st->codec->codec_tag = tag;
4336 ist->dec = choose_decoder(o, ic, st);
4338 switch (dec->codec_type) {
4339 case AVMEDIA_TYPE_VIDEO:
4341 ist->dec = avcodec_find_decoder(dec->codec_id);
4343 dec->flags |= CODEC_FLAG_EMU_EDGE;
4346 ist->resample_height = dec->height;
4347 ist->resample_width = dec->width;
4348 ist->resample_pix_fmt = dec->pix_fmt;
4350 MATCH_PER_STREAM_OPT(frame_rates, str, framerate, ic, st);
4351 if (framerate && av_parse_video_rate(&ist->framerate,
4353 av_log(NULL, AV_LOG_ERROR, "Error parsing framerate %s.\n",
4358 ist->top_field_first = -1;
4359 MATCH_PER_STREAM_OPT(top_field_first, i, ist->top_field_first, ic, st);
4362 case AVMEDIA_TYPE_AUDIO:
4363 guess_input_channel_layout(ist);
4365 ist->resample_sample_fmt = dec->sample_fmt;
4366 ist->resample_sample_rate = dec->sample_rate;
4367 ist->resample_channels = dec->channels;
4368 ist->resample_channel_layout = dec->channel_layout;
4371 case AVMEDIA_TYPE_DATA:
4372 case AVMEDIA_TYPE_SUBTITLE:
4374 ist->dec = avcodec_find_decoder(dec->codec_id);
4376 case AVMEDIA_TYPE_ATTACHMENT:
4377 case AVMEDIA_TYPE_UNKNOWN:
4385 static void assert_file_overwrite(const char *filename)
4387 if ((!file_overwrite || no_file_overwrite) &&
4388 (strchr(filename, ':') == NULL || filename[1] == ':' ||
4389 av_strstart(filename, "file:", NULL))) {
4390 if (avio_check(filename, 0) == 0) {
4391 if (stdin_interaction && (!no_file_overwrite || file_overwrite)) {
4392 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
4395 signal(SIGINT, SIG_DFL);
4396 if (!read_yesno()) {
4397 av_log(NULL, AV_LOG_FATAL, "Not overwriting - exiting\n");
4403 av_log(NULL, AV_LOG_FATAL, "File '%s' already exists. Exiting.\n", filename);
4410 static void dump_attachment(AVStream *st, const char *filename)
4413 AVIOContext *out = NULL;
4414 AVDictionaryEntry *e;
4416 if (!st->codec->extradata_size) {
4417 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
4418 nb_input_files - 1, st->index);
4421 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
4422 filename = e->value;
4424 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
4425 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
4429 assert_file_overwrite(filename);
4431 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
4432 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
4437 avio_write(out, st->codec->extradata, st->codec->extradata_size);
4442 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
4444 AVFormatContext *ic;
4445 AVInputFormat *file_iformat = NULL;
4449 AVDictionary **opts;
4450 int orig_nb_streams; // number of streams before avformat_find_stream_info
4453 if (!(file_iformat = av_find_input_format(o->format))) {
4454 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
4459 if (!strcmp(filename, "-"))
4462 stdin_interaction &= strncmp(filename, "pipe:", 5) &&
4463 strcmp(filename, "/dev/stdin");
4465 /* get default parameters from command line */
4466 ic = avformat_alloc_context();
4468 print_error(filename, AVERROR(ENOMEM));
4471 if (o->nb_audio_sample_rate) {
4472 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
4473 av_dict_set(&format_opts, "sample_rate", buf, 0);
4475 if (o->nb_audio_channels) {
4476 /* because we set audio_channels based on both the "ac" and
4477 * "channel_layout" options, we need to check that the specified
4478 * demuxer actually has the "channels" option before setting it */
4479 if (file_iformat && file_iformat->priv_class &&
4480 av_opt_find(&file_iformat->priv_class, "channels", NULL, 0,
4481 AV_OPT_SEARCH_FAKE_OBJ)) {
4482 snprintf(buf, sizeof(buf), "%d",
4483 o->audio_channels[o->nb_audio_channels - 1].u.i);
4484 av_dict_set(&format_opts, "channels", buf, 0);
4487 if (o->nb_frame_rates) {
4488 /* set the format-level framerate option;
4489 * this is important for video grabbers, e.g. x11 */
4490 if (file_iformat && file_iformat->priv_class &&
4491 av_opt_find(&file_iformat->priv_class, "framerate", NULL, 0,
4492 AV_OPT_SEARCH_FAKE_OBJ)) {
4493 av_dict_set(&format_opts, "framerate",
4494 o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
4497 if (o->nb_frame_sizes) {
4498 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
4500 if (o->nb_frame_pix_fmts)
4501 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
4503 ic->video_codec_id = video_codec_name ?
4504 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0)->id : CODEC_ID_NONE;
4505 ic->audio_codec_id = audio_codec_name ?
4506 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0)->id : CODEC_ID_NONE;
4507 ic->subtitle_codec_id= subtitle_codec_name ?
4508 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0)->id : CODEC_ID_NONE;
4509 ic->flags |= AVFMT_FLAG_NONBLOCK;
4510 ic->interrupt_callback = int_cb;
4512 /* open the input file with generic avformat function */
4513 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
4515 print_error(filename, err);
4518 assert_avoptions(format_opts);
4520 /* apply forced codec ids */
4521 for (i = 0; i < ic->nb_streams; i++)
4522 choose_decoder(o, ic, ic->streams[i]);
4524 /* Set AVCodecContext options for avformat_find_stream_info */
4525 opts = setup_find_stream_info_opts(ic, codec_opts);
4526 orig_nb_streams = ic->nb_streams;
4528 /* If not enough info to get the stream parameters, we decode the
4529 first frames to get it. (used in mpeg case for example) */
4530 ret = avformat_find_stream_info(ic, opts);
4532 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
4533 avformat_close_input(&ic);
4537 timestamp = o->start_time;
4538 /* add the stream start time */
4539 if (ic->start_time != AV_NOPTS_VALUE)
4540 timestamp += ic->start_time;
4542 /* if seeking requested, we execute it */
4543 if (o->start_time != 0) {
4544 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
4546 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
4547 filename, (double)timestamp / AV_TIME_BASE);
4551 /* update the current parameters so that they match the one of the input stream */
4552 add_input_streams(o, ic);
4554 /* dump the file content */
4555 av_dump_format(ic, nb_input_files, filename, 0);
4557 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
4558 if (!(input_files[nb_input_files - 1] = av_mallocz(sizeof(*input_files[0]))))
4561 input_files[nb_input_files - 1]->ctx = ic;
4562 input_files[nb_input_files - 1]->ist_index = nb_input_streams - ic->nb_streams;
4563 input_files[nb_input_files - 1]->ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
4564 input_files[nb_input_files - 1]->nb_streams = ic->nb_streams;
4565 input_files[nb_input_files - 1]->rate_emu = o->rate_emu;
4567 for (i = 0; i < o->nb_dump_attachment; i++) {
4570 for (j = 0; j < ic->nb_streams; j++) {
4571 AVStream *st = ic->streams[j];
4573 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
4574 dump_attachment(st, o->dump_attachment[i].u.str);
4578 for (i = 0; i < orig_nb_streams; i++)
4579 av_dict_free(&opts[i]);
4582 reset_options(o, 1);
4586 static uint8_t *get_line(AVIOContext *s)
4592 if (avio_open_dyn_buf(&line) < 0) {
4593 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
4597 while ((c = avio_r8(s)) && c != '\n')
4600 avio_close_dyn_buf(line, &buf);
4605 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
4608 char filename[1000];
4609 const char *base[3] = { getenv("AVCONV_DATADIR"),
4614 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
4618 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
4619 i != 1 ? "" : "/.avconv", codec_name, preset_name);
4620 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4623 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
4624 i != 1 ? "" : "/.avconv", preset_name);
4625 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
4631 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
4633 char *codec_name = NULL;
4635 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
4637 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
4638 NULL, ost->st->codec->codec_type);
4639 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
4640 } else if (!strcmp(codec_name, "copy"))
4641 ost->stream_copy = 1;
4643 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
4644 ost->st->codec->codec_id = ost->enc->id;
4648 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type, int source_index)
4651 AVStream *st = avformat_new_stream(oc, NULL);
4652 int idx = oc->nb_streams - 1, ret = 0;
4653 char *bsf = NULL, *next, *codec_tag = NULL;
4654 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
4656 char *buf = NULL, *arg = NULL, *preset = NULL;
4657 AVIOContext *s = NULL;
4660 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
4664 if (oc->nb_streams - 1 < o->nb_streamid_map)
4665 st->id = o->streamid_map[oc->nb_streams - 1];
4667 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
4668 nb_output_streams + 1);
4669 if (!(ost = av_mallocz(sizeof(*ost))))
4671 output_streams[nb_output_streams - 1] = ost;
4673 ost->file_index = nb_output_files;
4676 st->codec->codec_type = type;
4677 choose_encoder(o, oc, ost);
4679 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st, ost->enc);
4682 avcodec_get_context_defaults3(st->codec, ost->enc);
4683 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
4685 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
4686 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
4689 if (!buf[0] || buf[0] == '#') {
4693 if (!(arg = strchr(buf, '='))) {
4694 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
4698 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
4700 } while (!s->eof_reached);
4704 av_log(NULL, AV_LOG_FATAL,
4705 "Preset %s specified for stream %d:%d, but could not be opened.\n",
4706 preset, ost->file_index, ost->index);
4710 ost->max_frames = INT64_MAX;
4711 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
4713 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
4715 if (next = strchr(bsf, ','))
4717 if (!(bsfc = av_bitstream_filter_init(bsf))) {
4718 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
4722 bsfc_prev->next = bsfc;
4724 ost->bitstream_filters = bsfc;
4730 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
4732 uint32_t tag = strtol(codec_tag, &next, 0);
4734 tag = AV_RL32(codec_tag);
4735 st->codec->codec_tag = tag;
4738 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
4739 if (qscale >= 0 || same_quant) {
4740 st->codec->flags |= CODEC_FLAG_QSCALE;
4741 st->codec->global_quality = FF_QP2LAMBDA * qscale;
4744 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
4745 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
4747 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
4748 av_opt_get_int (swr_opts, "dither_method", 0, &ost->swr_dither_method);
4749 av_opt_get_double(swr_opts, "dither_scale" , 0, &ost->swr_dither_scale);
4751 ost->source_index = source_index;
4752 if (source_index >= 0) {
4753 ost->sync_ist = input_streams[source_index];
4754 input_streams[source_index]->discard = 0;
4755 input_streams[source_index]->st->discard = AVDISCARD_NONE;
4761 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4764 const char *p = str;
4771 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4778 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4782 AVCodecContext *video_enc;
4783 char *frame_rate = NULL;
4785 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO, source_index);
4787 video_enc = st->codec;
4789 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
4790 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
4791 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
4795 if (!ost->stream_copy) {
4796 const char *p = NULL;
4797 char *frame_size = NULL;
4798 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
4799 char *intra_matrix = NULL, *inter_matrix = NULL;
4800 const char *filters = "null";
4803 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
4804 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
4805 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
4809 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
4810 if (frame_aspect_ratio) {
4812 if (av_parse_ratio(&q, frame_aspect_ratio, 255, 0, NULL) < 0 ||
4813 q.num <= 0 || q.den <= 0) {
4814 av_log(NULL, AV_LOG_FATAL, "Invalid aspect ratio: %s\n", frame_aspect_ratio);
4817 ost->frame_aspect_ratio = av_q2d(q);
4820 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
4821 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
4822 if (frame_pix_fmt && *frame_pix_fmt == '+') {
4823 ost->keep_pix_fmt = 1;
4824 if (!*++frame_pix_fmt)
4825 frame_pix_fmt = NULL;
4827 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
4828 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
4831 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
4834 video_enc->gop_size = 0;
4835 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
4837 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
4838 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
4841 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
4843 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
4845 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
4846 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
4849 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
4852 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
4853 for (i = 0; p; i++) {
4855 int e = sscanf(p, "%d,%d,%d", &start, &end, &q);
4857 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
4860 /* FIXME realloc failure */
4861 video_enc->rc_override =
4862 av_realloc(video_enc->rc_override,
4863 sizeof(RcOverride) * (i + 1));
4864 video_enc->rc_override[i].start_frame = start;
4865 video_enc->rc_override[i].end_frame = end;
4867 video_enc->rc_override[i].qscale = q;
4868 video_enc->rc_override[i].quality_factor = 1.0;
4871 video_enc->rc_override[i].qscale = 0;
4872 video_enc->rc_override[i].quality_factor = -q/100.0;
4877 video_enc->rc_override_count = i;
4878 if (!video_enc->rc_initial_buffer_occupancy)
4879 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size * 3 / 4;
4880 video_enc->intra_dc_precision = intra_dc_precision - 8;
4883 video_enc->flags|= CODEC_FLAG_PSNR;
4888 video_enc->flags |= CODEC_FLAG_PASS1;
4891 video_enc->flags |= CODEC_FLAG_PASS2;
4895 MATCH_PER_STREAM_OPT(forced_key_frames, str, ost->forced_keyframes, oc, st);
4896 if (ost->forced_keyframes)
4897 ost->forced_keyframes = av_strdup(ost->forced_keyframes);
4899 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
4901 ost->top_field_first = -1;
4902 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
4904 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4905 ost->avfilter = av_strdup(filters);
4907 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
4913 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4918 AVCodecContext *audio_enc;
4920 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO, source_index);
4923 audio_enc = st->codec;
4924 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
4926 if (!ost->stream_copy) {
4927 char *sample_fmt = NULL;
4928 const char *filters = "anull";
4930 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
4932 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
4934 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
4935 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
4939 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
4941 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
4943 av_assert1(filters);
4944 ost->avfilter = av_strdup(filters);
4946 /* check for channel mapping for this audio stream */
4947 for (n = 0; n < o->nb_audio_channel_maps; n++) {
4948 AudioChannelMap *map = &o->audio_channel_maps[n];
4949 InputStream *ist = input_streams[ost->source_index];
4950 if ((map->channel_idx == -1 || (ist->file_index == map->file_idx && ist->st->index == map->stream_idx)) &&
4951 (map->ofile_idx == -1 || ost->file_index == map->ofile_idx) &&
4952 (map->ostream_idx == -1 || ost->st->index == map->ostream_idx)) {
4953 if (ost->audio_channels_mapped < FF_ARRAY_ELEMS(ost->audio_channels_map))
4954 ost->audio_channels_map[ost->audio_channels_mapped++] = map->channel_idx;
4956 av_log(NULL, AV_LOG_FATAL, "Max channel mapping for output %d.%d reached\n",
4957 ost->file_index, ost->st->index);
4965 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4969 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA, source_index);
4970 if (!ost->stream_copy) {
4971 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
4978 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4980 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT, source_index);
4981 ost->stream_copy = 1;
4985 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc, int source_index)
4989 AVCodecContext *subtitle_enc;
4991 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE, source_index);
4993 subtitle_enc = st->codec;
4995 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
4997 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc, st);
5002 /* arg format is "output-stream-index:streamid-value". */
5003 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
5009 av_strlcpy(idx_str, arg, sizeof(idx_str));
5010 p = strchr(idx_str, ':');
5012 av_log(NULL, AV_LOG_FATAL,
5013 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
5018 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
5019 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
5020 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
5024 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
5026 AVFormatContext *is = ifile->ctx;
5027 AVFormatContext *os = ofile->ctx;
5030 for (i = 0; i < is->nb_chapters; i++) {
5031 AVChapter *in_ch = is->chapters[i], *out_ch;
5032 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
5033 AV_TIME_BASE_Q, in_ch->time_base);
5034 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
5035 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
5038 if (in_ch->end < ts_off)
5040 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
5043 out_ch = av_mallocz(sizeof(AVChapter));
5045 return AVERROR(ENOMEM);
5047 out_ch->id = in_ch->id;
5048 out_ch->time_base = in_ch->time_base;
5049 out_ch->start = FFMAX(0, in_ch->start - ts_off);
5050 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
5053 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
5056 os->chapters = av_realloc_f(os->chapters, os->nb_chapters, sizeof(AVChapter));
5058 return AVERROR(ENOMEM);
5059 os->chapters[os->nb_chapters - 1] = out_ch;
5064 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
5067 AVFormatContext *ic = avformat_alloc_context();
5069 ic->interrupt_callback = int_cb;
5070 err = avformat_open_input(&ic, filename, NULL, NULL);
5073 /* copy stream format */
5074 for(i=0;i<ic->nb_streams;i++) {
5078 AVCodecContext *avctx;
5080 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
5081 ost = new_output_stream(o, s, codec->type, -1);
5086 // FIXME: a more elegant solution is needed
5087 memcpy(st, ic->streams[i], sizeof(AVStream));
5089 st->info = av_malloc(sizeof(*st->info));
5090 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
5092 avcodec_copy_context(st->codec, ic->streams[i]->codec);
5094 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
5095 choose_sample_fmt(st, codec);
5096 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
5097 choose_pixel_fmt(st, codec, st->codec->pix_fmt);
5100 avformat_close_input(&ic);
5104 static void init_output_filter(OutputFilter *ofilter, OptionsContext *o,
5105 AVFormatContext *oc)
5109 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5110 ofilter->out_tmp->pad_idx)) {
5111 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc, -1); break;
5112 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc, -1); break;
5114 av_log(NULL, AV_LOG_FATAL, "Only video and audio filters are supported "
5119 ost->source_index = -1;
5120 ost->filter = ofilter;
5124 if (ost->stream_copy) {
5125 av_log(NULL, AV_LOG_ERROR, "Streamcopy requested for output stream %d:%d, "
5126 "which is fed from a complex filtergraph. Filtering and streamcopy "
5127 "cannot be used together.\n", ost->file_index, ost->index);
5130 if (o->recording_time != INT64_MAX)
5131 av_log(NULL, AV_LOG_WARNING,
5132 "-t does not work with -filter_complex (yet).\n");
5134 if (configure_output_filter(ofilter->graph, ofilter, ofilter->out_tmp) < 0) {
5135 av_log(NULL, AV_LOG_FATAL, "Error configuring filter.\n");
5138 avfilter_inout_free(&ofilter->out_tmp);
5141 static void opt_output_file(void *optctx, const char *filename)
5143 OptionsContext *o = optctx;
5144 AVFormatContext *oc;
5146 AVOutputFormat *file_oformat;
5150 if (configure_complex_filters() < 0) {
5151 av_log(NULL, AV_LOG_FATAL, "Error configuring filters.\n");
5155 if (!strcmp(filename, "-"))
5158 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
5160 print_error(filename, err);
5163 file_oformat= oc->oformat;
5164 oc->interrupt_callback = int_cb;
5166 /* create streams for all unlabeled output pads */
5167 for (i = 0; i < nb_filtergraphs; i++) {
5168 FilterGraph *fg = filtergraphs[i];
5169 for (j = 0; j < fg->nb_outputs; j++) {
5170 OutputFilter *ofilter = fg->outputs[j];
5172 if (!ofilter->out_tmp || ofilter->out_tmp->name)
5175 switch (avfilter_pad_get_type(ofilter->out_tmp->filter_ctx->output_pads,
5176 ofilter->out_tmp->pad_idx)) {
5177 case AVMEDIA_TYPE_VIDEO: o->video_disable = 1; break;
5178 case AVMEDIA_TYPE_AUDIO: o->audio_disable = 1; break;
5179 case AVMEDIA_TYPE_SUBTITLE: o->subtitle_disable = 1; break;
5181 init_output_filter(ofilter, o, oc);
5185 if (!strcmp(file_oformat->name, "ffm") &&
5186 av_strstart(filename, "http:", NULL)) {
5188 /* special case for files sent to ffserver: we get the stream
5189 parameters from ffserver */
5190 int err = read_ffserver_streams(o, oc, filename);
5192 print_error(filename, err);
5195 for(j = nb_output_streams - oc->nb_streams; j < nb_output_streams; j++) {
5196 ost = output_streams[j];
5197 for (i = 0; i < nb_input_streams; i++) {
5198 ist = input_streams[i];
5199 if(ist->st->codec->codec_type == ost->st->codec->codec_type){
5201 ost->source_index= i;
5202 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) ost->avfilter = av_strdup("anull");
5203 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) ost->avfilter = av_strdup("null");
5205 ist->st->discard = AVDISCARD_NONE;
5210 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));
5214 } else if (!o->nb_stream_maps) {
5215 /* pick the "best" stream of each type */
5217 /* video: highest resolution */
5218 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
5219 int area = 0, idx = -1;
5220 for (i = 0; i < nb_input_streams; i++) {
5221 ist = input_streams[i];
5222 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
5223 ist->st->codec->width * ist->st->codec->height > area) {
5224 area = ist->st->codec->width * ist->st->codec->height;
5229 new_video_stream(o, oc, idx);
5232 /* audio: most channels */
5233 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
5234 int channels = 0, idx = -1;
5235 for (i = 0; i < nb_input_streams; i++) {
5236 ist = input_streams[i];
5237 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
5238 ist->st->codec->channels > channels) {
5239 channels = ist->st->codec->channels;
5244 new_audio_stream(o, oc, idx);
5247 /* subtitles: pick first */
5248 if (!o->subtitle_disable && (oc->oformat->subtitle_codec != CODEC_ID_NONE || subtitle_codec_name)) {
5249 for (i = 0; i < nb_input_streams; i++)
5250 if (input_streams[i]->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
5251 new_subtitle_stream(o, oc, i);
5255 /* do something with data? */
5257 for (i = 0; i < o->nb_stream_maps; i++) {
5258 StreamMap *map = &o->stream_maps[i];
5259 int src_idx = input_files[map->file_index]->ist_index + map->stream_index;
5264 if (map->linklabel) {
5266 OutputFilter *ofilter = NULL;
5269 for (j = 0; j < nb_filtergraphs; j++) {
5270 fg = filtergraphs[j];
5271 for (k = 0; k < fg->nb_outputs; k++) {
5272 AVFilterInOut *out = fg->outputs[k]->out_tmp;
5273 if (out && !strcmp(out->name, map->linklabel)) {
5274 ofilter = fg->outputs[k];
5281 av_log(NULL, AV_LOG_FATAL, "Output with label '%s' does not exist "
5282 "in any defined filter graph.\n", map->linklabel);
5285 init_output_filter(ofilter, o, oc);
5287 ist = input_streams[input_files[map->file_index]->ist_index + map->stream_index];
5288 if(o->subtitle_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE)
5290 if(o-> audio_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
5292 if(o-> video_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
5294 if(o-> data_disable && ist->st->codec->codec_type == AVMEDIA_TYPE_DATA)
5297 switch (ist->st->codec->codec_type) {
5298 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream (o, oc, src_idx); break;
5299 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream (o, oc, src_idx); break;
5300 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream (o, oc, src_idx); break;
5301 case AVMEDIA_TYPE_DATA: ost = new_data_stream (o, oc, src_idx); break;
5302 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc, src_idx); break;
5304 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
5305 map->file_index, map->stream_index);
5313 for (i = nb_output_streams - oc->nb_streams; i < nb_output_streams; i++) { //for all streams of this output file
5314 AVDictionaryEntry *e;
5315 ost = output_streams[i];
5317 if ( ost->stream_copy
5318 && (e = av_dict_get(codec_opts, "flags", NULL, AV_DICT_IGNORE_SUFFIX))
5319 && (!e->key[5] || check_stream_specifier(oc, ost->st, e->key+6)))
5320 if (av_opt_set(ost->st->codec, "flags", e->value, 0) < 0)
5324 /* handle attached files */
5325 for (i = 0; i < o->nb_attachments; i++) {
5327 uint8_t *attachment;
5331 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
5332 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
5336 if ((len = avio_size(pb)) <= 0) {
5337 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
5341 if (!(attachment = av_malloc(len))) {
5342 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
5346 avio_read(pb, attachment, len);
5348 ost = new_attachment_stream(o, oc, -1);
5349 ost->stream_copy = 0;
5350 ost->attachment_filename = o->attachments[i];
5351 ost->st->codec->extradata = attachment;
5352 ost->st->codec->extradata_size = len;
5354 p = strrchr(o->attachments[i], '/');
5355 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
5359 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
5360 if (!(output_files[nb_output_files - 1] = av_mallocz(sizeof(*output_files[0]))))
5363 output_files[nb_output_files - 1]->ctx = oc;
5364 output_files[nb_output_files - 1]->ost_index = nb_output_streams - oc->nb_streams;
5365 output_files[nb_output_files - 1]->recording_time = o->recording_time;
5366 if (o->recording_time != INT64_MAX)
5367 oc->duration = o->recording_time;
5368 output_files[nb_output_files - 1]->start_time = o->start_time;
5369 output_files[nb_output_files - 1]->limit_filesize = o->limit_filesize;
5370 av_dict_copy(&output_files[nb_output_files - 1]->opts, format_opts, 0);
5372 /* check filename in case of an image number is expected */
5373 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
5374 if (!av_filename_number_test(oc->filename)) {
5375 print_error(oc->filename, AVERROR(EINVAL));
5380 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
5381 /* test if it already exists to avoid losing precious files */
5382 assert_file_overwrite(filename);
5385 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
5386 &oc->interrupt_callback,
5387 &output_files[nb_output_files - 1]->opts)) < 0) {
5388 print_error(filename, err);
5393 if (o->mux_preload) {
5395 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
5396 av_dict_set(&output_files[nb_output_files - 1]->opts, "preload", buf, 0);
5398 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
5401 for (i = 0; i < o->nb_metadata_map; i++) {
5403 int in_file_index = strtol(o->metadata_map[i].u.str, &p, 0);
5405 if (in_file_index >= nb_input_files) {
5406 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d while processing metadata maps\n", in_file_index);
5409 copy_metadata(o->metadata_map[i].specifier, *p ? p + 1 : p, oc, in_file_index >= 0 ? input_files[in_file_index]->ctx : NULL, o);
5413 if (o->chapters_input_file >= nb_input_files) {
5414 if (o->chapters_input_file == INT_MAX) {
5415 /* copy chapters from the first input file that has them*/
5416 o->chapters_input_file = -1;
5417 for (i = 0; i < nb_input_files; i++)
5418 if (input_files[i]->ctx->nb_chapters) {
5419 o->chapters_input_file = i;
5423 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
5424 o->chapters_input_file);
5428 if (o->chapters_input_file >= 0)
5429 copy_chapters(input_files[o->chapters_input_file], output_files[nb_output_files - 1],
5430 !o->metadata_chapters_manual);
5432 /* copy global metadata by default */
5433 if (!o->metadata_global_manual && nb_input_files){
5434 av_dict_copy(&oc->metadata, input_files[0]->ctx->metadata,
5435 AV_DICT_DONT_OVERWRITE);
5436 if(o->recording_time != INT64_MAX)
5437 av_dict_set(&oc->metadata, "duration", NULL, 0);
5438 av_dict_set(&oc->metadata, "creation_time", NULL, 0);
5440 if (!o->metadata_streams_manual)
5441 for (i = output_files[nb_output_files - 1]->ost_index; i < nb_output_streams; i++) {
5443 if (output_streams[i]->source_index < 0) /* this is true e.g. for attached files */
5445 ist = input_streams[output_streams[i]->source_index];
5446 av_dict_copy(&output_streams[i]->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
5449 /* process manually set metadata */
5450 for (i = 0; i < o->nb_metadata; i++) {
5453 const char *stream_spec;
5454 int index = 0, j, ret = 0;
5456 val = strchr(o->metadata[i].u.str, '=');
5458 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
5459 o->metadata[i].u.str);
5464 parse_meta_type(o->metadata[i].specifier, &type, &index, &stream_spec);
5466 for (j = 0; j < oc->nb_streams; j++) {
5467 if ((ret = check_stream_specifier(oc, oc->streams[j], stream_spec)) > 0) {
5468 av_dict_set(&oc->streams[j]->metadata, o->metadata[i].u.str, *val ? val : NULL, 0);
5479 if (index < 0 || index >= oc->nb_chapters) {
5480 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
5483 m = &oc->chapters[index]->metadata;
5486 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
5489 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
5493 reset_options(o, 0);
5496 /* same option as mencoder */
5497 static int opt_pass(const char *opt, const char *arg)
5499 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 3);
5503 static int64_t getmaxrss(void)
5505 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
5506 struct rusage rusage;
5507 getrusage(RUSAGE_SELF, &rusage);
5508 return (int64_t)rusage.ru_maxrss * 1024;
5509 #elif HAVE_GETPROCESSMEMORYINFO
5511 PROCESS_MEMORY_COUNTERS memcounters;
5512 proc = GetCurrentProcess();
5513 memcounters.cb = sizeof(memcounters);
5514 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
5515 return memcounters.PeakPagefileUsage;
5521 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
5523 return parse_option(o, "q:a", arg, options);
5526 static void show_usage(void)
5528 av_log(NULL, AV_LOG_INFO, "Hyper fast Audio and Video encoder\n");
5529 av_log(NULL, AV_LOG_INFO, "usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
5530 av_log(NULL, AV_LOG_INFO, "\n");
5533 static int opt_help(const char *opt, const char *arg)
5535 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
5536 av_log_set_callback(log_callback_help);
5538 show_help_options(options, "Main options:\n",
5539 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
5540 show_help_options(options, "\nAdvanced options:\n",
5541 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
5543 show_help_options(options, "\nVideo options:\n",
5544 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5546 show_help_options(options, "\nAdvanced Video options:\n",
5547 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5548 OPT_VIDEO | OPT_EXPERT);
5549 show_help_options(options, "\nAudio options:\n",
5550 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5552 show_help_options(options, "\nAdvanced Audio options:\n",
5553 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
5554 OPT_AUDIO | OPT_EXPERT);
5555 show_help_options(options, "\nSubtitle options:\n",
5556 OPT_SUBTITLE | OPT_GRAB,
5558 show_help_options(options, "\nAudio/Video grab options:\n",
5562 show_help_children(avcodec_get_class(), flags);
5563 show_help_children(avformat_get_class(), flags);
5564 show_help_children(sws_get_class(), flags);
5565 show_help_children(swr_get_class(), AV_OPT_FLAG_AUDIO_PARAM);
5570 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
5572 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
5573 static const char *const frame_rates[] = { "25", "30000/1001", "24000/1001" };
5575 if (!strncmp(arg, "pal-", 4)) {
5578 } else if (!strncmp(arg, "ntsc-", 5)) {
5581 } else if (!strncmp(arg, "film-", 5)) {
5585 /* Try to determine PAL/NTSC by peeking in the input files */
5586 if (nb_input_files) {
5588 for (j = 0; j < nb_input_files; j++) {
5589 for (i = 0; i < input_files[j]->nb_streams; i++) {
5590 AVCodecContext *c = input_files[j]->ctx->streams[i]->codec;
5591 if (c->codec_type != AVMEDIA_TYPE_VIDEO)
5593 fr = c->time_base.den * 1000 / c->time_base.num;
5597 } else if ((fr == 29970) || (fr == 23976)) {
5602 if (norm != UNKNOWN)
5606 if (norm != UNKNOWN)
5607 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
5610 if (norm == UNKNOWN) {
5611 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
5612 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
5613 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
5617 if (!strcmp(arg, "vcd")) {
5618 opt_video_codec(o, "c:v", "mpeg1video");
5619 opt_audio_codec(o, "c:a", "mp2");
5620 parse_option(o, "f", "vcd", options);
5622 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
5623 parse_option(o, "r", frame_rates[norm], options);
5624 opt_default("g", norm == PAL ? "15" : "18");
5626 opt_default("b:v", "1150000");
5627 opt_default("maxrate", "1150000");
5628 opt_default("minrate", "1150000");
5629 opt_default("bufsize", "327680"); // 40*1024*8;
5631 opt_default("b:a", "224000");
5632 parse_option(o, "ar", "44100", options);
5633 parse_option(o, "ac", "2", options);
5635 opt_default("packetsize", "2324");
5636 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
5638 /* We have to offset the PTS, so that it is consistent with the SCR.
5639 SCR starts at 36000, but the first two packs contain only padding
5640 and the first pack from the other stream, respectively, may also have
5641 been written before.
5642 So the real data starts at SCR 36000+3*1200. */
5643 o->mux_preload = (36000 + 3 * 1200) / 90000.0; // 0.44
5644 } else if (!strcmp(arg, "svcd")) {
5646 opt_video_codec(o, "c:v", "mpeg2video");
5647 opt_audio_codec(o, "c:a", "mp2");
5648 parse_option(o, "f", "svcd", options);
5650 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
5651 parse_option(o, "r", frame_rates[norm], options);
5652 parse_option(o, "pix_fmt", "yuv420p", options);
5653 opt_default("g", norm == PAL ? "15" : "18");
5655 opt_default("b:v", "2040000");
5656 opt_default("maxrate", "2516000");
5657 opt_default("minrate", "0"); // 1145000;
5658 opt_default("bufsize", "1835008"); // 224*1024*8;
5659 opt_default("scan_offset", "1");
5662 opt_default("b:a", "224000");
5663 parse_option(o, "ar", "44100", options);
5665 opt_default("packetsize", "2324");
5667 } else if (!strcmp(arg, "dvd")) {
5669 opt_video_codec(o, "c:v", "mpeg2video");
5670 opt_audio_codec(o, "c:a", "ac3");
5671 parse_option(o, "f", "dvd", options);
5673 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5674 parse_option(o, "r", frame_rates[norm], options);
5675 parse_option(o, "pix_fmt", "yuv420p", options);
5676 opt_default("g", norm == PAL ? "15" : "18");
5678 opt_default("b:v", "6000000");
5679 opt_default("maxrate", "9000000");
5680 opt_default("minrate", "0"); // 1500000;
5681 opt_default("bufsize", "1835008"); // 224*1024*8;
5683 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
5684 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
5686 opt_default("b:a", "448000");
5687 parse_option(o, "ar", "48000", options);
5689 } else if (!strncmp(arg, "dv", 2)) {
5691 parse_option(o, "f", "dv", options);
5693 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
5694 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
5695 norm == PAL ? "yuv420p" : "yuv411p", options);
5696 parse_option(o, "r", frame_rates[norm], options);
5698 parse_option(o, "ar", "48000", options);
5699 parse_option(o, "ac", "2", options);
5702 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
5703 return AVERROR(EINVAL);
5708 static int opt_vstats_file(const char *opt, const char *arg)
5710 av_free (vstats_filename);
5711 vstats_filename = av_strdup (arg);
5715 static int opt_vstats(const char *opt, const char *arg)
5718 time_t today2 = time(NULL);
5719 struct tm *today = localtime(&today2);
5721 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
5723 return opt_vstats_file(opt, filename);
5726 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
5728 return parse_option(o, "frames:v", arg, options);
5731 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
5733 return parse_option(o, "frames:a", arg, options);
5736 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
5738 return parse_option(o, "frames:d", arg, options);
5741 static int opt_preset(OptionsContext *o, const char *opt, const char *arg)
5744 char filename[1000], line[1000], tmp_line[1000];
5745 const char *codec_name = *opt == 'v' ? video_codec_name :
5746 *opt == 'a' ? audio_codec_name :
5747 subtitle_codec_name;
5749 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
5750 if(!strncmp(arg, "libx264-lossless", strlen("libx264-lossless"))){
5751 av_log(NULL, AV_LOG_FATAL, "Please use -preset <speed> -qp 0\n");
5753 av_log(NULL, AV_LOG_FATAL, "File for preset '%s' not found\n", arg);
5757 while (fgets(line, sizeof(line), f)) {
5758 char *key = tmp_line, *value, *endptr;
5760 if (strcspn(line, "#\n\r") == 0)
5762 strcpy(tmp_line, line);
5763 if (!av_strtok(key, "=", &value) ||
5764 !av_strtok(value, "\r\n", &endptr)) {
5765 av_log(NULL, AV_LOG_FATAL, "%s: Invalid syntax: '%s'\n", filename, line);
5768 av_log(NULL, AV_LOG_DEBUG, "ffpreset[%s]: set '%s' = '%s'\n", filename, key, value);
5770 if (!strcmp(key, "acodec")) opt_audio_codec (o, key, value);
5771 else if (!strcmp(key, "vcodec")) opt_video_codec (o, key, value);
5772 else if (!strcmp(key, "scodec")) opt_subtitle_codec(o, key, value);
5773 else if (!strcmp(key, "dcodec")) opt_data_codec (o, key, value);
5774 else if (opt_default(key, value) < 0) {
5775 av_log(NULL, AV_LOG_FATAL, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n",
5776 filename, line, key, value);
5786 static void log_callback_null(void *ptr, int level, const char *fmt, va_list vl)
5790 static int opt_passlogfile(const char *opt, const char *arg)
5792 pass_logfilename_prefix = arg;
5793 #if CONFIG_LIBX264_ENCODER
5794 return opt_default(opt, arg);
5800 static int opt_old2new(OptionsContext *o, const char *opt, const char *arg)
5802 char *s = av_asprintf("%s:%c", opt + 1, *opt);
5803 int ret = parse_option(o, s, arg, options);
5808 static int opt_bitrate(OptionsContext *o, const char *opt, const char *arg)
5810 if(!strcmp(opt, "b")){
5811 av_log(NULL, AV_LOG_WARNING, "Please use -b:a or -b:v, -b is ambiguous\n");
5812 return parse_option(o, "b:v", arg, options);
5814 return opt_default(opt, arg);
5817 static int opt_qscale(OptionsContext *o, const char *opt, const char *arg)
5821 if(!strcmp(opt, "qscale")){
5822 av_log(NULL, AV_LOG_WARNING, "Please use -q:a or -q:v, -qscale is ambiguous\n");
5823 return parse_option(o, "q:v", arg, options);
5825 s = av_asprintf("q%s", opt + 6);
5826 ret = parse_option(o, s, arg, options);
5831 static int opt_profile(OptionsContext *o, const char *opt, const char *arg)
5833 if(!strcmp(opt, "profile")){
5834 av_log(NULL, AV_LOG_WARNING, "Please use -profile:a or -profile:v, -profile is ambiguous\n");
5835 return parse_option(o, "profile:v", arg, options);
5837 return opt_default(opt, arg);
5840 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
5842 return parse_option(o, "filter:v", arg, options);
5845 static int opt_audio_filters(OptionsContext *o, const char *opt, const char *arg)
5847 return parse_option(o, "filter:a", arg, options);
5850 static int opt_vsync(const char *opt, const char *arg)
5852 if (!av_strcasecmp(arg, "cfr")) video_sync_method = VSYNC_CFR;
5853 else if (!av_strcasecmp(arg, "vfr")) video_sync_method = VSYNC_VFR;
5854 else if (!av_strcasecmp(arg, "passthrough")) video_sync_method = VSYNC_PASSTHROUGH;
5855 else if (!av_strcasecmp(arg, "drop")) video_sync_method = VSYNC_DROP;
5857 if (video_sync_method == VSYNC_AUTO)
5858 video_sync_method = parse_number_or_die("vsync", arg, OPT_INT, VSYNC_AUTO, VSYNC_VFR);
5862 static int opt_deinterlace(const char *opt, const char *arg)
5864 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -filter:v yadif instead\n", opt);
5869 static int opt_timecode(OptionsContext *o, const char *opt, const char *arg)
5871 char *tcr = av_asprintf("timecode=%s", arg);
5872 int ret = parse_option(o, "metadata:g", tcr, options);
5874 ret = opt_default("gop_timecode", arg);
5879 static void parse_cpuflags(int argc, char **argv, const OptionDef *options)
5881 int idx = locate_option(argc, argv, options, "cpuflags");
5882 if (idx && argv[idx + 1])
5883 opt_cpuflags("cpuflags", argv[idx + 1]);
5886 static int opt_channel_layout(OptionsContext *o, const char *opt, const char *arg)
5888 char layout_str[32];
5891 int ret, channels, ac_str_size;
5894 layout = av_get_channel_layout(arg);
5896 av_log(NULL, AV_LOG_ERROR, "Unknown channel layout: %s\n", arg);
5897 return AVERROR(EINVAL);
5899 snprintf(layout_str, sizeof(layout_str), "%"PRIu64, layout);
5900 ret = opt_default(opt, layout_str);
5904 /* set 'ac' option based on channel layout */
5905 channels = av_get_channel_layout_nb_channels(layout);
5906 snprintf(layout_str, sizeof(layout_str), "%d", channels);
5907 stream_str = strchr(opt, ':');
5908 ac_str_size = 3 + (stream_str ? strlen(stream_str) : 0);
5909 ac_str = av_mallocz(ac_str_size);
5911 return AVERROR(ENOMEM);
5912 av_strlcpy(ac_str, "ac", 3);
5914 av_strlcat(ac_str, stream_str, ac_str_size);
5915 ret = parse_option(o, ac_str, layout_str, options);
5921 static int opt_filter_complex(const char *opt, const char *arg)
5923 filtergraphs = grow_array(filtergraphs, sizeof(*filtergraphs),
5924 &nb_filtergraphs, nb_filtergraphs + 1);
5925 if (!(filtergraphs[nb_filtergraphs - 1] = av_mallocz(sizeof(*filtergraphs[0]))))
5926 return AVERROR(ENOMEM);
5927 filtergraphs[nb_filtergraphs - 1]->index = nb_filtergraphs - 1;
5928 filtergraphs[nb_filtergraphs - 1]->graph_desc = arg;
5932 static int opt_progress(const char *opt, const char *arg)
5934 AVIOContext *avio = NULL;
5937 if (!strcmp(arg, "-"))
5939 ret = avio_open2(&avio, arg, AVIO_FLAG_WRITE, &int_cb, NULL);
5941 av_log(0, AV_LOG_ERROR, "Failed to open progress URL \"%s\": %s\n",
5942 arg, av_err2str(ret));
5945 progress_avio = avio;
5949 #define OFFSET(x) offsetof(OptionsContext, x)
5950 static const OptionDef options[] = {
5952 #include "cmdutils_common_opts.h"
5953 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
5954 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
5955 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
5956 { "n", OPT_BOOL, {(void*)&no_file_overwrite}, "do not overwrite output files" },
5957 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5958 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
5959 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
5960 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "[-]input_file_id[:stream_specifier][,sync_file_id[:stream_specifier]]" },
5961 { "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]" },
5962 { "map_metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata_map)}, "set metadata information of outfile from infile",
5963 "outfile[,metadata]:infile[,metadata]" },
5964 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
5965 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
5966 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
5967 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
5968 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
5969 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
5970 { "timestamp", HAS_ARG | OPT_FUNC2, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
5971 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
5972 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
5973 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
5974 "add timings for benchmarking" },
5975 { "benchmark_all", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark_all},
5976 "add timings for each task" },
5977 { "progress", HAS_ARG | OPT_EXPERT, {(void*)opt_progress},
5978 "write program-readable progress information", "url" },
5979 { "stdin", OPT_BOOL | OPT_EXPERT, {(void*)&stdin_interaction},
5980 "enable or disable interaction on standard input" },
5981 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
5982 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
5983 "dump each input packet" },
5984 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
5985 "when dumping packets, also dump the payload" },
5986 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
5987 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
5988 { "vsync", HAS_ARG | OPT_EXPERT, {(void*)opt_vsync}, "video sync method", "" },
5989 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
5990 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
5991 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
5992 { "copytb", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying", "mode" },
5993 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
5994 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
5995 { "dts_error_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_error_threshold}, "timestamp error delta threshold", "threshold" },
5996 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
5997 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
5998 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
5999 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
6000 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
6001 { "qscale", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_qscale}, "use fixed quality scale (VBR)", "q" },
6002 { "profile", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_profile}, "set profile", "profile" },
6003 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
6004 { "filter_complex", HAS_ARG | OPT_EXPERT, {(void*)opt_filter_complex}, "create a complex filtergraph", "graph_description" },
6005 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
6006 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
6007 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
6008 { "debug_ts", OPT_BOOL | OPT_EXPERT, {&debug_ts}, "print timestamp debugging info" },
6011 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
6012 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
6013 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
6014 { "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" },
6015 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
6016 { "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" },
6017 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6018 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6019 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6020 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
6021 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6022 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6023 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6024 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
6025 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
6026 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "deprecated use -g 1"},
6027 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
6028 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
6029 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
6030 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
6031 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
6032 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
6033 "use same quantizer as source (implies VBR)" },
6034 { "timecode", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_timecode}, "set initial TimeCode value.", "hh:mm:ss[:;.]ff" },
6035 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
6036 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
6037 { "deinterlace", OPT_EXPERT | OPT_VIDEO, {(void*)opt_deinterlace},
6038 "this option is deprecated, use the yadif filter instead" },
6039 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
6040 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
6041 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
6042 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
6043 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
6044 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
6045 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
6046 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
6047 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_old2new}, "force video tag/fourcc", "fourcc/tag" },
6048 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
6049 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
6050 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
6051 { "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" },
6052 { "b", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_bitrate}, "video bitrate (please use -b:v)", "bitrate" },
6055 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
6056 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
6057 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
6058 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
6059 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
6060 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
6061 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_old2new}, "force audio tag/fourcc", "fourcc/tag" },
6062 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
6063 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
6064 { "channel_layout", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_channel_layout}, "set channel layout", "layout" },
6065 { "af", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_filters}, "audio filters", "filter list" },
6067 /* subtitle options */
6068 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
6069 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
6070 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_old2new}, "force subtitle tag/fourcc", "fourcc/tag" },
6073 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
6074 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
6075 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
6078 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
6079 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
6081 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
6082 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "audio bitstream_filters" },
6083 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_old2new}, "deprecated", "video bitstream_filters" },
6085 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
6086 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
6087 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
6088 { "fpre", HAS_ARG | OPT_EXPERT| OPT_FUNC2, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
6089 /* data codec support */
6090 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
6091 { "dn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(data_disable)}, "disable data" },
6093 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
6097 int main(int argc, char **argv)
6099 OptionsContext o = { 0 };
6102 reset_options(&o, 0);
6104 av_log_set_flags(AV_LOG_SKIP_REPEATED);
6105 parse_loglevel(argc, argv, options);
6107 if(argc>1 && !strcmp(argv[1], "-d")){
6109 av_log_set_callback(log_callback_null);
6114 avcodec_register_all();
6116 avdevice_register_all();
6118 avfilter_register_all();
6120 avformat_network_init();
6122 show_banner(argc, argv, options);
6126 parse_cpuflags(argc, argv, options);
6129 parse_options(&o, argc, argv, options, opt_output_file);
6131 if (nb_output_files <= 0 && nb_input_files == 0) {
6133 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
6137 /* file converter / grab */
6138 if (nb_output_files <= 0) {
6139 av_log(NULL, AV_LOG_FATAL, "At least one output file must be specified\n");
6143 if (nb_input_files == 0) {
6144 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
6148 current_time = ti = getutime();
6149 if (transcode() < 0)
6151 ti = getutime() - ti;
6153 int maxrss = getmaxrss() / 1024;
6154 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);