3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
49 #include "libavformat/ffm.h" // not public API
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/buffersink.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "avconv";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 static int frame_bits_per_raw_sample = 0;
115 static int video_discard = 0;
116 static int same_quant = 0;
117 static int do_deinterlace = 0;
118 static int intra_dc_precision = 8;
119 static int qp_hist = 0;
121 static int file_overwrite = 0;
122 static int do_benchmark = 0;
123 static int do_hex_dump = 0;
124 static int do_pkt_dump = 0;
125 static int do_pass = 0;
126 static const char *pass_logfilename_prefix;
127 static int video_sync_method= -1;
128 static int audio_sync_method= 0;
129 static float audio_drift_threshold= 0.1;
130 static int copy_ts= 0;
131 static int copy_tb= 0;
132 static int opt_shortest = 0;
133 static char *vstats_filename;
134 static FILE *vstats_file;
135 static int copy_initial_nonkeyframes = 0;
137 static int audio_volume = 256;
139 static int exit_on_error = 0;
140 static int using_stdin = 0;
141 static int run_as_daemon = 0;
142 static int q_pressed = 0;
143 static int64_t video_size = 0;
144 static int64_t audio_size = 0;
145 static int64_t extra_size = 0;
146 static int nb_frames_dup = 0;
147 static int nb_frames_drop = 0;
148 static int input_sync;
150 static float dts_delta_threshold = 10;
152 static uint8_t *audio_buf;
153 static uint8_t *audio_out;
154 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
156 static short *samples;
158 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
160 typedef struct InputStream {
163 int discard; /* true if stream data should be discarded */
164 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
167 int64_t start; /* time when read started */
168 int64_t next_pts; /* synthetic pts for cases where pkt.pts
170 int64_t pts; /* current pts */
172 int is_start; /* is 1 at the start and after a discontinuity */
173 int showed_multi_packet_warning;
177 typedef struct InputFile {
178 AVFormatContext *ctx;
179 int eof_reached; /* true if eof reached */
180 int ist_index; /* index of first stream in ist_table */
181 int buffer_size; /* current total buffer size */
183 int nb_streams; /* number of stream that avconv is aware of; may be different
184 from ctx.nb_streams if new streams appear during av_read_frame() */
188 typedef struct OutputStream {
189 int file_index; /* file index */
190 int index; /* stream index in the output file */
191 int source_index; /* InputStream index */
192 AVStream *st; /* stream in the output file */
193 int encoding_needed; /* true if encoding needed for this stream */
195 /* input pts and corresponding output pts
197 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
198 struct InputStream *sync_ist; /* input stream to sync against */
199 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
200 AVBitStreamFilterContext *bitstream_filters;
206 AVFrame resample_frame; /* temporary frame for image resampling */
207 struct SwsContext *img_resample_ctx; /* for image resampling */
210 int resample_pix_fmt;
211 AVRational frame_rate;
215 float frame_aspect_ratio;
217 /* forced key frames */
218 int64_t *forced_kf_pts;
224 ReSampleContext *resample; /* for audio resampling */
225 int resample_sample_fmt;
226 int resample_channels;
227 int resample_sample_rate;
229 AVAudioConvert *reformat_ctx;
230 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
234 AVFilterContext *output_video_filter;
235 AVFilterContext *input_video_filter;
236 AVFilterBufferRef *picref;
238 AVFilterGraph *graph;
243 int is_past_recording_time;
248 /* init terminal so that we can grab keys */
249 static struct termios oldtty;
252 typedef struct OutputFile {
253 AVFormatContext *ctx;
255 int ost_index; /* index of the first stream in output_streams */
256 int64_t recording_time; /* desired length of the resulting file in microseconds */
257 int64_t start_time; /* start time in microseconds */
258 uint64_t limit_filesize;
261 static InputStream *input_streams = NULL;
262 static int nb_input_streams = 0;
263 static InputFile *input_files = NULL;
264 static int nb_input_files = 0;
266 static OutputStream *output_streams = NULL;
267 static int nb_output_streams = 0;
268 static OutputFile *output_files = NULL;
269 static int nb_output_files = 0;
271 typedef struct OptionsContext {
272 /* input/output options */
276 SpecifierOpt *codec_names;
278 SpecifierOpt *audio_channels;
279 int nb_audio_channels;
280 SpecifierOpt *audio_sample_rate;
281 int nb_audio_sample_rate;
282 SpecifierOpt *frame_rates;
284 SpecifierOpt *frame_sizes;
286 SpecifierOpt *frame_pix_fmts;
287 int nb_frame_pix_fmts;
290 int64_t input_ts_offset;
293 SpecifierOpt *ts_scale;
297 StreamMap *stream_maps;
299 /* first item specifies output metadata, second is input */
300 MetadataMap (*meta_data_maps)[2];
301 int nb_meta_data_maps;
302 int metadata_global_manual;
303 int metadata_streams_manual;
304 int metadata_chapters_manual;
306 int chapters_input_file;
308 int64_t recording_time;
309 uint64_t limit_filesize;
315 int subtitle_disable;
318 /* indexed by output file stream index */
322 SpecifierOpt *metadata;
324 SpecifierOpt *max_frames;
326 SpecifierOpt *bitstream_filters;
327 int nb_bitstream_filters;
328 SpecifierOpt *codec_tags;
330 SpecifierOpt *sample_fmts;
332 SpecifierOpt *qscale;
334 SpecifierOpt *forced_key_frames;
335 int nb_forced_key_frames;
336 SpecifierOpt *force_fps;
338 SpecifierOpt *frame_aspect_ratios;
339 int nb_frame_aspect_ratios;
340 SpecifierOpt *rc_overrides;
342 SpecifierOpt *intra_matrices;
343 int nb_intra_matrices;
344 SpecifierOpt *inter_matrices;
345 int nb_inter_matrices;
346 SpecifierOpt *top_field_first;
347 int nb_top_field_first;
349 SpecifierOpt *filters;
354 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
357 for (i = 0; i < o->nb_ ## name; i++) {\
358 char *spec = o->name[i].specifier;\
359 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
360 outvar = o->name[i].u.type;\
366 static void reset_options(OptionsContext *o)
368 const OptionDef *po = options;
370 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
372 void *dst = (uint8_t*)o + po->u.off;
374 if (po->flags & OPT_SPEC) {
375 SpecifierOpt **so = dst;
376 int i, *count = (int*)(so + 1);
377 for (i = 0; i < *count; i++) {
378 av_freep(&(*so)[i].specifier);
379 if (po->flags & OPT_STRING)
380 av_freep(&(*so)[i].u.str);
384 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
389 av_freep(&o->stream_maps);
390 av_freep(&o->meta_data_maps);
391 av_freep(&o->streamid_map);
393 memset(o, 0, sizeof(*o));
395 o->mux_preload = 0.5;
396 o->mux_max_delay = 0.7;
397 o->recording_time = INT64_MAX;
398 o->limit_filesize = UINT64_MAX;
399 o->chapters_input_file = INT_MAX;
407 static int configure_video_filters(InputStream *ist, OutputStream *ost)
409 AVFilterContext *last_filter, *filter;
410 /** filter graph containing all filters including input & output */
411 AVCodecContext *codec = ost->st->codec;
412 AVCodecContext *icodec = ist->st->codec;
413 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
414 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
415 AVRational sample_aspect_ratio;
419 ost->graph = avfilter_graph_alloc();
421 if (ist->st->sample_aspect_ratio.num){
422 sample_aspect_ratio = ist->st->sample_aspect_ratio;
424 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
426 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
427 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
428 sample_aspect_ratio.num, sample_aspect_ratio.den);
430 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
431 "src", args, NULL, ost->graph);
434 #if FF_API_OLD_VSINK_API
435 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
436 "out", NULL, pix_fmts, ost->graph);
438 buffersink_params->pixel_fmts = pix_fmts;
439 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
440 "out", NULL, buffersink_params, ost->graph);
442 av_freep(&buffersink_params);
445 last_filter = ost->input_video_filter;
447 if (codec->width != icodec->width || codec->height != icodec->height) {
448 snprintf(args, 255, "%d:%d:flags=0x%X",
452 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
453 NULL, args, NULL, ost->graph)) < 0)
455 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
457 last_filter = filter;
460 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
461 ost->graph->scale_sws_opts = av_strdup(args);
464 AVFilterInOut *outputs = avfilter_inout_alloc();
465 AVFilterInOut *inputs = avfilter_inout_alloc();
467 outputs->name = av_strdup("in");
468 outputs->filter_ctx = last_filter;
469 outputs->pad_idx = 0;
470 outputs->next = NULL;
472 inputs->name = av_strdup("out");
473 inputs->filter_ctx = ost->output_video_filter;
477 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
479 av_freep(&ost->avfilter);
481 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
485 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
488 codec->width = ost->output_video_filter->inputs[0]->w;
489 codec->height = ost->output_video_filter->inputs[0]->h;
490 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
491 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
492 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
493 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
497 #endif /* CONFIG_AVFILTER */
499 static void term_exit(void)
501 av_log(NULL, AV_LOG_QUIET, "%s", "");
504 tcsetattr (0, TCSANOW, &oldtty);
508 static volatile int received_sigterm = 0;
511 sigterm_handler(int sig)
513 received_sigterm = sig;
518 static void term_init(void)
528 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
529 |INLCR|IGNCR|ICRNL|IXON);
530 tty.c_oflag |= OPOST;
531 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
532 tty.c_cflag &= ~(CSIZE|PARENB);
537 tcsetattr (0, TCSANOW, &tty);
538 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
542 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
543 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
545 signal(SIGXCPU, sigterm_handler);
549 /* read a key without blocking */
550 static int read_key(void)
565 n = select(1, &rfds, NULL, NULL, &tv);
580 static int decode_interrupt_cb(void)
582 q_pressed += read_key() == 'q';
583 return q_pressed > 1;
586 void exit_program(int ret)
591 for(i=0;i<nb_output_files;i++) {
592 AVFormatContext *s = output_files[i].ctx;
593 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
595 avformat_free_context(s);
596 av_dict_free(&output_files[i].opts);
598 for(i=0;i<nb_input_files;i++) {
599 av_close_input_file(input_files[i].ctx);
601 for (i = 0; i < nb_input_streams; i++)
602 av_dict_free(&input_streams[i].opts);
606 av_free(vstats_filename);
608 av_freep(&input_streams);
609 av_freep(&input_files);
610 av_freep(&output_streams);
611 av_freep(&output_files);
616 allocated_audio_buf_size= allocated_audio_out_size= 0;
623 if (received_sigterm) {
624 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
625 (int) received_sigterm);
629 exit(ret); /* not all OS-es handle main() return value */
632 static void assert_avoptions(AVDictionary *m)
634 AVDictionaryEntry *t;
635 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
636 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
641 static void assert_codec_experimental(AVCodecContext *c, int encoder)
643 const char *codec_string = encoder ? "encoder" : "decoder";
645 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
646 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
647 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
648 "results.\nAdd '-strict experimental' if you want to use it.\n",
649 codec_string, c->codec->name);
650 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
651 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
652 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
653 codec_string, codec->name);
658 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
660 if(codec && codec->sample_fmts){
661 const enum AVSampleFormat *p= codec->sample_fmts;
663 if(*p == st->codec->sample_fmt)
667 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
668 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
669 if(av_get_sample_fmt_name(st->codec->sample_fmt))
670 av_log(NULL, AV_LOG_WARNING,
671 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
672 av_get_sample_fmt_name(st->codec->sample_fmt),
674 av_get_sample_fmt_name(codec->sample_fmts[0]));
675 st->codec->sample_fmt = codec->sample_fmts[0];
680 static void choose_sample_rate(AVStream *st, AVCodec *codec)
682 if(codec && codec->supported_samplerates){
683 const int *p= codec->supported_samplerates;
685 int best_dist=INT_MAX;
687 int dist= abs(st->codec->sample_rate - *p);
688 if(dist < best_dist){
694 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
696 st->codec->sample_rate= best;
700 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
702 if(codec && codec->pix_fmts){
703 const enum PixelFormat *p= codec->pix_fmts;
704 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
705 if(st->codec->codec_id==CODEC_ID_MJPEG){
706 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
707 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
708 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
712 if(*p == st->codec->pix_fmt)
716 if(st->codec->pix_fmt != PIX_FMT_NONE)
717 av_log(NULL, AV_LOG_WARNING,
718 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
719 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
721 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
722 st->codec->pix_fmt = codec->pix_fmts[0];
728 get_sync_ipts(const OutputStream *ost)
730 const InputStream *ist = ost->sync_ist;
731 OutputFile *of = &output_files[ost->file_index];
732 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
735 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
739 AVPacket new_pkt= *pkt;
740 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
741 &new_pkt.data, &new_pkt.size,
742 pkt->data, pkt->size,
743 pkt->flags & AV_PKT_FLAG_KEY);
746 new_pkt.destruct= av_destruct_packet;
748 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
749 bsfc->filter->name, pkt->stream_index,
750 avctx->codec ? avctx->codec->name : "copy");
760 ret= av_interleaved_write_frame(s, pkt);
762 print_error("av_interleaved_write_frame()", ret);
767 static void do_audio_out(AVFormatContext *s,
770 unsigned char *buf, int size)
773 int64_t audio_out_size, audio_buf_size;
774 int64_t allocated_for_size= size;
776 int size_out, frame_bytes, ret, resample_changed;
777 AVCodecContext *enc= ost->st->codec;
778 AVCodecContext *dec= ist->st->codec;
779 int osize = av_get_bytes_per_sample(enc->sample_fmt);
780 int isize = av_get_bytes_per_sample(dec->sample_fmt);
781 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
784 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
785 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
786 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
787 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
788 audio_buf_size*= osize*enc->channels;
790 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
791 if(coded_bps > 8*osize)
792 audio_out_size= audio_out_size * coded_bps / (8*osize);
793 audio_out_size += FF_MIN_BUFFER_SIZE;
795 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
796 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
800 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
801 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
802 if (!audio_buf || !audio_out){
803 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
807 if (enc->channels != dec->channels)
808 ost->audio_resample = 1;
810 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
811 ost->resample_channels != dec->channels ||
812 ost->resample_sample_rate != dec->sample_rate;
814 if ((ost->audio_resample && !ost->resample) || resample_changed) {
815 if (resample_changed) {
816 av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
817 ist->file_index, ist->st->index,
818 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
819 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
820 ost->resample_sample_fmt = dec->sample_fmt;
821 ost->resample_channels = dec->channels;
822 ost->resample_sample_rate = dec->sample_rate;
824 audio_resample_close(ost->resample);
826 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
827 if (audio_sync_method <= 1 &&
828 ost->resample_sample_fmt == enc->sample_fmt &&
829 ost->resample_channels == enc->channels &&
830 ost->resample_sample_rate == enc->sample_rate) {
831 ost->resample = NULL;
832 ost->audio_resample = 0;
834 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
835 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
836 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
837 enc->sample_rate, dec->sample_rate,
838 enc->sample_fmt, dec->sample_fmt,
840 if (!ost->resample) {
841 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
842 dec->channels, dec->sample_rate,
843 enc->channels, enc->sample_rate);
849 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
850 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
851 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
852 if (ost->reformat_ctx)
853 av_audio_convert_free(ost->reformat_ctx);
854 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
855 dec->sample_fmt, 1, NULL, 0);
856 if (!ost->reformat_ctx) {
857 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
858 av_get_sample_fmt_name(dec->sample_fmt),
859 av_get_sample_fmt_name(enc->sample_fmt));
862 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
865 if(audio_sync_method){
866 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
867 - av_fifo_size(ost->fifo)/(enc->channels * 2);
868 double idelta= delta*dec->sample_rate / enc->sample_rate;
869 int byte_delta= ((int)idelta)*2*dec->channels;
871 //FIXME resample delay
872 if(fabs(delta) > 50){
873 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
875 byte_delta= FFMAX(byte_delta, -size);
878 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
883 static uint8_t *input_tmp= NULL;
884 input_tmp= av_realloc(input_tmp, byte_delta + size);
886 if(byte_delta > allocated_for_size - size){
887 allocated_for_size= byte_delta + (int64_t)size;
892 memset(input_tmp, 0, byte_delta);
893 memcpy(input_tmp + byte_delta, buf, size);
896 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
898 }else if(audio_sync_method>1){
899 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
900 av_assert0(ost->audio_resample);
901 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
902 delta, comp, enc->sample_rate);
903 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
904 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
908 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
909 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
911 if (ost->audio_resample) {
913 size_out = audio_resample(ost->resample,
914 (short *)buftmp, (short *)buf,
915 size / (dec->channels * isize));
916 size_out = size_out * enc->channels * osize;
922 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
923 const void *ibuf[6]= {buftmp};
924 void *obuf[6]= {audio_buf};
925 int istride[6]= {isize};
926 int ostride[6]= {osize};
927 int len= size_out/istride[0];
928 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
929 printf("av_audio_convert() failed\n");
935 size_out = len*osize;
938 /* now encode as many frames as possible */
939 if (enc->frame_size > 1) {
940 /* output resampled raw samples */
941 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
942 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
945 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
947 frame_bytes = enc->frame_size * osize * enc->channels;
949 while (av_fifo_size(ost->fifo) >= frame_bytes) {
951 av_init_packet(&pkt);
953 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
955 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
957 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
960 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
964 pkt.stream_index= ost->index;
967 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
968 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
969 pkt.flags |= AV_PKT_FLAG_KEY;
970 write_frame(s, &pkt, enc, ost->bitstream_filters);
972 ost->sync_opts += enc->frame_size;
976 av_init_packet(&pkt);
978 ost->sync_opts += size_out / (osize * enc->channels);
980 /* output a pcm frame */
981 /* determine the size of the coded buffer */
984 size_out = size_out*coded_bps/8;
986 if(size_out > audio_out_size){
987 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
991 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
992 ret = avcodec_encode_audio(enc, audio_out, size_out,
995 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
999 pkt.stream_index= ost->index;
1000 pkt.data= audio_out;
1002 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1003 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1004 pkt.flags |= AV_PKT_FLAG_KEY;
1005 write_frame(s, &pkt, enc, ost->bitstream_filters);
1009 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1011 AVCodecContext *dec;
1012 AVPicture *picture2;
1013 AVPicture picture_tmp;
1016 dec = ist->st->codec;
1018 /* deinterlace : must be done before any resize */
1019 if (do_deinterlace) {
1022 /* create temporary picture */
1023 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1024 buf = av_malloc(size);
1028 picture2 = &picture_tmp;
1029 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1031 if(avpicture_deinterlace(picture2, picture,
1032 dec->pix_fmt, dec->width, dec->height) < 0) {
1033 /* if error, do not deinterlace */
1034 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1043 if (picture != picture2)
1044 *picture = *picture2;
1048 static void do_subtitle_out(AVFormatContext *s,
1054 static uint8_t *subtitle_out = NULL;
1055 int subtitle_out_max_size = 1024 * 1024;
1056 int subtitle_out_size, nb, i;
1057 AVCodecContext *enc;
1060 if (pts == AV_NOPTS_VALUE) {
1061 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1067 enc = ost->st->codec;
1069 if (!subtitle_out) {
1070 subtitle_out = av_malloc(subtitle_out_max_size);
1073 /* Note: DVB subtitle need one packet to draw them and one other
1074 packet to clear them */
1075 /* XXX: signal it in the codec context ? */
1076 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1081 for(i = 0; i < nb; i++) {
1082 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1083 // start_display_time is required to be 0
1084 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1085 sub->end_display_time -= sub->start_display_time;
1086 sub->start_display_time = 0;
1087 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1088 subtitle_out_max_size, sub);
1089 if (subtitle_out_size < 0) {
1090 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1094 av_init_packet(&pkt);
1095 pkt.stream_index = ost->index;
1096 pkt.data = subtitle_out;
1097 pkt.size = subtitle_out_size;
1098 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1099 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1100 /* XXX: the pts correction is handled here. Maybe handling
1101 it in the codec would be better */
1103 pkt.pts += 90 * sub->start_display_time;
1105 pkt.pts += 90 * sub->end_display_time;
1107 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1111 static int bit_buffer_size= 1024*256;
1112 static uint8_t *bit_buffer= NULL;
1114 static void do_video_resample(OutputStream *ost,
1116 AVFrame *in_picture,
1117 AVFrame **out_picture)
1119 int resample_changed = 0;
1120 AVCodecContext *dec = ist->st->codec;
1121 AVCodecContext *enc = ost->st->codec;
1122 *out_picture = in_picture;
1124 resample_changed = ost->resample_width != dec->width ||
1125 ost->resample_height != dec->height ||
1126 ost->resample_pix_fmt != dec->pix_fmt;
1128 #if !CONFIG_AVFILTER
1129 if (resample_changed) {
1130 av_log(NULL, AV_LOG_INFO,
1131 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1132 ist->file_index, ist->st->index,
1133 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1134 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1135 ost->resample_width = dec->width;
1136 ost->resample_height = dec->height;
1137 ost->resample_pix_fmt = dec->pix_fmt;
1140 ost->video_resample = dec->width != enc->width ||
1141 dec->height != enc->height ||
1142 dec->pix_fmt != enc->pix_fmt;
1144 if (ost->video_resample) {
1145 *out_picture = &ost->resample_frame;
1146 if (!ost->img_resample_ctx || resample_changed) {
1147 /* initialize the destination picture */
1148 if (!ost->resample_frame.data[0]) {
1149 avcodec_get_frame_defaults(&ost->resample_frame);
1150 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1151 enc->width, enc->height)) {
1152 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1156 /* initialize a new scaler context */
1157 sws_freeContext(ost->img_resample_ctx);
1158 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1159 enc->width, enc->height, enc->pix_fmt,
1160 ost->sws_flags, NULL, NULL, NULL);
1161 if (ost->img_resample_ctx == NULL) {
1162 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1166 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1167 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1170 if (resample_changed) {
1171 avfilter_graph_free(&ost->graph);
1172 if (configure_video_filters(ist, ost)) {
1173 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1178 if (resample_changed) {
1179 ost->resample_width = dec->width;
1180 ost->resample_height = dec->height;
1181 ost->resample_pix_fmt = dec->pix_fmt;
1186 static void do_video_out(AVFormatContext *s,
1189 AVFrame *in_picture,
1190 int *frame_size, float quality)
1192 int nb_frames, i, ret, format_video_sync;
1193 AVFrame *final_picture;
1194 AVCodecContext *enc;
1197 enc = ost->st->codec;
1199 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1201 /* by default, we output a single frame */
1206 format_video_sync = video_sync_method;
1207 if (format_video_sync < 0)
1208 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1210 if (format_video_sync) {
1211 double vdelta = sync_ipts - ost->sync_opts;
1212 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1215 else if (format_video_sync == 2) {
1218 }else if(vdelta>0.6)
1219 ost->sync_opts= lrintf(sync_ipts);
1220 }else if (vdelta > 1.1)
1221 nb_frames = lrintf(vdelta);
1222 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1223 if (nb_frames == 0){
1225 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1226 }else if (nb_frames > 1) {
1227 nb_frames_dup += nb_frames - 1;
1228 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1231 ost->sync_opts= lrintf(sync_ipts);
1233 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1237 do_video_resample(ost, ist, in_picture, &final_picture);
1239 /* duplicates frame if needed */
1240 for(i=0;i<nb_frames;i++) {
1242 av_init_packet(&pkt);
1243 pkt.stream_index= ost->index;
1245 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1246 /* raw pictures are written as AVPicture structure to
1247 avoid any copies. We support temporarily the older
1249 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1250 enc->coded_frame->top_field_first = in_picture->top_field_first;
1251 pkt.data= (uint8_t *)final_picture;
1252 pkt.size= sizeof(AVPicture);
1253 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1254 pkt.flags |= AV_PKT_FLAG_KEY;
1256 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1258 AVFrame big_picture;
1260 big_picture= *final_picture;
1261 /* better than nothing: use input picture interlaced
1263 big_picture.interlaced_frame = in_picture->interlaced_frame;
1264 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1265 if (ost->top_field_first == -1)
1266 big_picture.top_field_first = in_picture->top_field_first;
1268 big_picture.top_field_first = !!ost->top_field_first;
1271 /* handles same_quant here. This is not correct because it may
1272 not be a global option */
1273 big_picture.quality = quality;
1274 if (!enc->me_threshold)
1275 big_picture.pict_type = 0;
1276 // big_picture.pts = AV_NOPTS_VALUE;
1277 big_picture.pts= ost->sync_opts;
1278 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1279 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1280 if (ost->forced_kf_index < ost->forced_kf_count &&
1281 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1282 big_picture.pict_type = AV_PICTURE_TYPE_I;
1283 ost->forced_kf_index++;
1285 ret = avcodec_encode_video(enc,
1286 bit_buffer, bit_buffer_size,
1289 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1294 pkt.data= bit_buffer;
1296 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1297 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1298 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1299 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1300 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1302 if(enc->coded_frame->key_frame)
1303 pkt.flags |= AV_PKT_FLAG_KEY;
1304 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1307 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1308 // enc->frame_number-1, ret, enc->pict_type);
1309 /* if two pass, output log */
1310 if (ost->logfile && enc->stats_out) {
1311 fprintf(ost->logfile, "%s", enc->stats_out);
1316 ost->frame_number++;
1320 static double psnr(double d){
1321 return -10.0*log(d)/log(10.0);
1324 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1327 AVCodecContext *enc;
1329 double ti1, bitrate, avg_bitrate;
1331 /* this is executed just the first time do_video_stats is called */
1333 vstats_file = fopen(vstats_filename, "w");
1340 enc = ost->st->codec;
1341 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1342 frame_number = ost->frame_number;
1343 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1344 if (enc->flags&CODEC_FLAG_PSNR)
1345 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1347 fprintf(vstats_file,"f_size= %6d ", frame_size);
1348 /* compute pts value */
1349 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1353 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1354 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1355 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1356 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1357 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1361 static void print_report(OutputFile *output_files,
1362 OutputStream *ost_table, int nb_ostreams,
1363 int is_last_report, int64_t timer_start)
1367 AVFormatContext *oc;
1369 AVCodecContext *enc;
1370 int frame_number, vid, i;
1372 int64_t pts = INT64_MAX;
1373 static int64_t last_time = -1;
1374 static int qp_histogram[52];
1375 int hours, mins, secs, us;
1377 if (!is_last_report) {
1379 /* display the report every 0.5 seconds */
1380 cur_time = av_gettime();
1381 if (last_time == -1) {
1382 last_time = cur_time;
1385 if ((cur_time - last_time) < 500000)
1387 last_time = cur_time;
1391 oc = output_files[0].ctx;
1393 total_size = avio_size(oc->pb);
1394 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1395 total_size= avio_tell(oc->pb);
1399 for(i=0;i<nb_ostreams;i++) {
1401 ost = &ost_table[i];
1402 enc = ost->st->codec;
1403 if (!ost->st->stream_copy && enc->coded_frame)
1404 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1405 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1406 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1408 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1409 float t = (av_gettime()-timer_start) / 1000000.0;
1411 frame_number = ost->frame_number;
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1413 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1419 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1422 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1424 if (enc->flags&CODEC_FLAG_PSNR){
1426 double error, error_sum=0;
1427 double scale, scale_sum=0;
1428 char type[3]= {'Y','U','V'};
1429 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1432 error= enc->error[j];
1433 scale= enc->width*enc->height*255.0*255.0*frame_number;
1435 error= enc->coded_frame->error[j];
1436 scale= enc->width*enc->height*255.0*255.0;
1441 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1443 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1447 /* compute min output value */
1448 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1449 ost->st->time_base, AV_TIME_BASE_Q));
1452 secs = pts / AV_TIME_BASE;
1453 us = pts % AV_TIME_BASE;
1459 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1461 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1462 "size=%8.0fkB time=", total_size / 1024.0);
1463 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1464 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1465 (100 * us) / AV_TIME_BASE);
1466 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1467 "bitrate=%6.1fkbits/s", bitrate);
1469 if (nb_frames_dup || nb_frames_drop)
1470 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1471 nb_frames_dup, nb_frames_drop);
1473 av_log(NULL, is_last_report ? AV_LOG_WARNING : AV_LOG_INFO, "%s \r", buf);
1477 if (is_last_report) {
1478 int64_t raw= audio_size + video_size + extra_size;
1479 av_log(NULL, AV_LOG_INFO, "\n");
1480 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1484 100.0*(total_size - raw)/raw
1489 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1491 int fill_char = 0x00;
1492 if (sample_fmt == AV_SAMPLE_FMT_U8)
1494 memset(buf, fill_char, size);
1497 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1501 for (i = 0; i < nb_ostreams; i++) {
1502 OutputStream *ost = &ost_table[i];
1503 AVCodecContext *enc = ost->st->codec;
1504 AVFormatContext *os = output_files[ost->file_index].ctx;
1506 if (!ost->encoding_needed)
1509 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1511 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1517 av_init_packet(&pkt);
1518 pkt.stream_index= ost->index;
1520 switch (ost->st->codec->codec_type) {
1521 case AVMEDIA_TYPE_AUDIO:
1522 fifo_bytes = av_fifo_size(ost->fifo);
1524 /* encode any samples remaining in fifo */
1525 if (fifo_bytes > 0) {
1526 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1527 int fs_tmp = enc->frame_size;
1529 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1530 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1531 enc->frame_size = fifo_bytes / (osize * enc->channels);
1533 int frame_bytes = enc->frame_size*osize*enc->channels;
1534 if (allocated_audio_buf_size < frame_bytes)
1536 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1539 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1540 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1541 ost->st->time_base.num, enc->sample_rate);
1542 enc->frame_size = fs_tmp;
1545 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1548 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1552 pkt.flags |= AV_PKT_FLAG_KEY;
1554 case AVMEDIA_TYPE_VIDEO:
1555 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1557 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1561 if(enc->coded_frame && enc->coded_frame->key_frame)
1562 pkt.flags |= AV_PKT_FLAG_KEY;
1563 if (ost->logfile && enc->stats_out) {
1564 fprintf(ost->logfile, "%s", enc->stats_out);
1573 pkt.data = bit_buffer;
1575 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1576 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1577 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1582 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1583 static int output_packet(InputStream *ist, int ist_index,
1584 OutputStream *ost_table, int nb_ostreams,
1585 const AVPacket *pkt)
1587 AVFormatContext *os;
1592 void *buffer_to_free = NULL;
1593 static unsigned int samples_size= 0;
1594 AVSubtitle subtitle, *subtitle_to_free;
1595 int64_t pkt_pts = AV_NOPTS_VALUE;
1597 int frame_available;
1602 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1604 if(ist->next_pts == AV_NOPTS_VALUE)
1605 ist->next_pts= ist->pts;
1609 av_init_packet(&avpkt);
1617 if(pkt->dts != AV_NOPTS_VALUE)
1618 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1619 if(pkt->pts != AV_NOPTS_VALUE)
1620 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1622 //while we have more to decode or while the decoder did output something on EOF
1623 while (avpkt.size > 0 || (!pkt && got_output)) {
1624 uint8_t *data_buf, *decoded_data_buf;
1625 int data_size, decoded_data_size;
1627 ist->pts= ist->next_pts;
1629 if(avpkt.size && avpkt.size != pkt->size)
1630 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1631 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1632 ist->showed_multi_packet_warning=1;
1634 /* decode the packet if needed */
1635 decoded_data_buf = NULL; /* fail safe */
1636 decoded_data_size= 0;
1637 data_buf = avpkt.data;
1638 data_size = avpkt.size;
1639 subtitle_to_free = NULL;
1640 if (ist->decoding_needed) {
1641 switch(ist->st->codec->codec_type) {
1642 case AVMEDIA_TYPE_AUDIO:{
1643 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1644 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1646 samples= av_malloc(samples_size);
1648 decoded_data_size= samples_size;
1649 /* XXX: could avoid copy if PCM 16 bits with same
1650 endianness as CPU */
1651 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1658 got_output = decoded_data_size > 0;
1659 /* Some bug in mpeg audio decoder gives */
1660 /* decoded_data_size < 0, it seems they are overflows */
1662 /* no audio frame */
1665 decoded_data_buf = (uint8_t *)samples;
1666 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1667 (ist->st->codec->sample_rate * ist->st->codec->channels);
1669 case AVMEDIA_TYPE_VIDEO:
1670 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1671 /* XXX: allocate picture correctly */
1672 avcodec_get_frame_defaults(&picture);
1673 avpkt.pts = pkt_pts;
1674 avpkt.dts = ist->pts;
1675 pkt_pts = AV_NOPTS_VALUE;
1677 ret = avcodec_decode_video2(ist->st->codec,
1678 &picture, &got_output, &avpkt);
1679 quality = same_quant ? picture.quality : 0;
1683 /* no picture yet */
1684 goto discard_packet;
1686 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1687 if (ist->st->codec->time_base.num != 0) {
1688 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1689 ist->next_pts += ((int64_t)AV_TIME_BASE *
1690 ist->st->codec->time_base.num * ticks) /
1691 ist->st->codec->time_base.den;
1694 buffer_to_free = NULL;
1695 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1697 case AVMEDIA_TYPE_SUBTITLE:
1698 ret = avcodec_decode_subtitle2(ist->st->codec,
1699 &subtitle, &got_output, &avpkt);
1703 goto discard_packet;
1705 subtitle_to_free = &subtitle;
1712 switch(ist->st->codec->codec_type) {
1713 case AVMEDIA_TYPE_AUDIO:
1714 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1715 ist->st->codec->sample_rate;
1717 case AVMEDIA_TYPE_VIDEO:
1718 if (ist->st->codec->time_base.num != 0) {
1719 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1720 ist->next_pts += ((int64_t)AV_TIME_BASE *
1721 ist->st->codec->time_base.num * ticks) /
1722 ist->st->codec->time_base.den;
1729 // preprocess audio (volume)
1730 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1731 if (audio_volume != 256) {
1734 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1735 int v = ((*volp) * audio_volume + 128) >> 8;
1736 *volp++ = av_clip_int16(v);
1741 /* frame rate emulation */
1742 if (input_files[ist->file_index].rate_emu) {
1743 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1744 int64_t now = av_gettime() - ist->start;
1748 /* if output time reached then transcode raw format,
1749 encode packets and output them */
1750 for (i = 0; i < nb_ostreams; i++) {
1751 OutputFile *of = &output_files[ost_table[i].file_index];
1754 ost = &ost_table[i];
1755 if (ost->source_index != ist_index)
1758 if (of->start_time && ist->pts < of->start_time)
1761 if (of->recording_time != INT64_MAX &&
1762 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1763 (AVRational){1, 1000000}) >= 0) {
1764 ost->is_past_recording_time = 1;
1769 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1770 ost->input_video_filter) {
1771 if (!picture.sample_aspect_ratio.num)
1772 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1773 picture.pts = ist->pts;
1775 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1777 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1778 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1779 while (frame_available) {
1780 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1781 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1782 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1785 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1786 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1790 os = output_files[ost->file_index].ctx;
1792 /* set the input output pts pairs */
1793 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1795 if (ost->encoding_needed) {
1796 av_assert0(ist->decoding_needed);
1797 switch(ost->st->codec->codec_type) {
1798 case AVMEDIA_TYPE_AUDIO:
1799 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1801 case AVMEDIA_TYPE_VIDEO:
1803 if (ost->picref->video && !ost->frame_aspect_ratio)
1804 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1806 do_video_out(os, ost, ist, &picture, &frame_size,
1807 same_quant ? quality : ost->st->codec->global_quality);
1808 if (vstats_filename && frame_size)
1809 do_video_stats(os, ost, frame_size);
1811 case AVMEDIA_TYPE_SUBTITLE:
1812 do_subtitle_out(os, ost, ist, &subtitle,
1821 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1822 av_init_packet(&opkt);
1824 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1825 #if !CONFIG_AVFILTER
1831 /* no reencoding needed : output the packet directly */
1832 /* force the input stream PTS */
1834 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1835 audio_size += data_size;
1836 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1837 video_size += data_size;
1841 opkt.stream_index= ost->index;
1842 if(pkt->pts != AV_NOPTS_VALUE)
1843 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1845 opkt.pts= AV_NOPTS_VALUE;
1847 if (pkt->dts == AV_NOPTS_VALUE)
1848 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1850 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1851 opkt.dts -= ost_tb_start_time;
1853 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1854 opkt.flags= pkt->flags;
1856 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1857 if( ost->st->codec->codec_id != CODEC_ID_H264
1858 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1859 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1861 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1862 opkt.destruct= av_destruct_packet;
1864 opkt.data = data_buf;
1865 opkt.size = data_size;
1868 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1869 /* store AVPicture in AVPacket, as expected by the output format */
1870 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1871 opkt.data = (uint8_t *)&pict;
1872 opkt.size = sizeof(AVPicture);
1873 opkt.flags |= AV_PKT_FLAG_KEY;
1875 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1876 ost->st->codec->frame_number++;
1877 ost->frame_number++;
1878 av_free_packet(&opkt);
1882 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1883 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1885 avfilter_unref_buffer(ost->picref);
1890 av_free(buffer_to_free);
1891 /* XXX: allocate the subtitles in the codec ? */
1892 if (subtitle_to_free) {
1893 avsubtitle_free(subtitle_to_free);
1894 subtitle_to_free = NULL;
1902 static void print_sdp(OutputFile *output_files, int n)
1906 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1910 for (i = 0; i < n; i++)
1911 avc[i] = output_files[i].ctx;
1913 av_sdp_create(avc, n, sdp, sizeof(sdp));
1914 printf("SDP:\n%s\n", sdp);
1919 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1920 char *error, int error_len)
1923 InputStream *ist = &input_streams[ist_index];
1924 if (ist->decoding_needed) {
1925 AVCodec *codec = ist->dec;
1927 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1928 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1929 return AVERROR(EINVAL);
1932 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1933 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1934 ist->file_index, ist->st->index);
1935 return AVERROR(EINVAL);
1937 assert_codec_experimental(ist->st->codec, 0);
1938 assert_avoptions(ist->opts);
1941 ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
1942 ist->next_pts = AV_NOPTS_VALUE;
1948 static int transcode_init(OutputFile *output_files,
1949 int nb_output_files,
1950 InputFile *input_files,
1953 int ret = 0, i, j, k;
1954 AVFormatContext *os;
1955 AVCodecContext *codec, *icodec;
1961 /* init framerate emulation */
1962 for (i = 0; i < nb_input_files; i++) {
1963 InputFile *ifile = &input_files[i];
1964 if (ifile->rate_emu)
1965 for (j = 0; j < ifile->nb_streams; j++)
1966 input_streams[j + ifile->ist_index].start = av_gettime();
1969 /* output stream init */
1970 for(i=0;i<nb_output_files;i++) {
1971 os = output_files[i].ctx;
1972 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1973 av_dump_format(os, i, os->filename, 1);
1974 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
1975 return AVERROR(EINVAL);
1979 /* for each output stream, we compute the right encoding parameters */
1980 for (i = 0; i < nb_output_streams; i++) {
1981 ost = &output_streams[i];
1982 os = output_files[ost->file_index].ctx;
1983 ist = &input_streams[ost->source_index];
1985 codec = ost->st->codec;
1986 icodec = ist->st->codec;
1988 ost->st->disposition = ist->st->disposition;
1989 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1990 codec->chroma_sample_location = icodec->chroma_sample_location;
1992 if (ost->st->stream_copy) {
1993 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1995 if (extra_size > INT_MAX) {
1996 return AVERROR(EINVAL);
1999 /* if stream_copy is selected, no need to decode or encode */
2000 codec->codec_id = icodec->codec_id;
2001 codec->codec_type = icodec->codec_type;
2003 if(!codec->codec_tag){
2004 if( !os->oformat->codec_tag
2005 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2006 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2007 codec->codec_tag = icodec->codec_tag;
2010 codec->bit_rate = icodec->bit_rate;
2011 codec->rc_max_rate = icodec->rc_max_rate;
2012 codec->rc_buffer_size = icodec->rc_buffer_size;
2013 codec->extradata= av_mallocz(extra_size);
2014 if (!codec->extradata) {
2015 return AVERROR(ENOMEM);
2017 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2018 codec->extradata_size= icodec->extradata_size;
2020 codec->time_base = ist->st->time_base;
2021 if(!strcmp(os->oformat->name, "avi")) {
2022 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2023 codec->time_base = icodec->time_base;
2024 codec->time_base.num *= icodec->ticks_per_frame;
2025 codec->time_base.den *= 2;
2027 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2028 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2029 codec->time_base = icodec->time_base;
2030 codec->time_base.num *= icodec->ticks_per_frame;
2033 av_reduce(&codec->time_base.num, &codec->time_base.den,
2034 codec->time_base.num, codec->time_base.den, INT_MAX);
2036 switch(codec->codec_type) {
2037 case AVMEDIA_TYPE_AUDIO:
2038 if(audio_volume != 256) {
2039 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2042 codec->channel_layout = icodec->channel_layout;
2043 codec->sample_rate = icodec->sample_rate;
2044 codec->channels = icodec->channels;
2045 codec->frame_size = icodec->frame_size;
2046 codec->audio_service_type = icodec->audio_service_type;
2047 codec->block_align= icodec->block_align;
2048 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2049 codec->block_align= 0;
2050 if(codec->codec_id == CODEC_ID_AC3)
2051 codec->block_align= 0;
2053 case AVMEDIA_TYPE_VIDEO:
2054 codec->pix_fmt = icodec->pix_fmt;
2055 codec->width = icodec->width;
2056 codec->height = icodec->height;
2057 codec->has_b_frames = icodec->has_b_frames;
2058 if (!codec->sample_aspect_ratio.num) {
2059 codec->sample_aspect_ratio =
2060 ost->st->sample_aspect_ratio =
2061 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2062 ist->st->codec->sample_aspect_ratio.num ?
2063 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2066 case AVMEDIA_TYPE_SUBTITLE:
2067 codec->width = icodec->width;
2068 codec->height = icodec->height;
2070 case AVMEDIA_TYPE_DATA:
2077 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2078 switch(codec->codec_type) {
2079 case AVMEDIA_TYPE_AUDIO:
2080 ost->fifo= av_fifo_alloc(1024);
2082 return AVERROR(ENOMEM);
2084 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2085 if (!codec->sample_rate) {
2086 codec->sample_rate = icodec->sample_rate;
2088 choose_sample_rate(ost->st, ost->enc);
2089 codec->time_base = (AVRational){1, codec->sample_rate};
2090 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2091 codec->sample_fmt = icodec->sample_fmt;
2092 choose_sample_fmt(ost->st, ost->enc);
2093 if (!codec->channels) {
2094 codec->channels = icodec->channels;
2095 codec->channel_layout = icodec->channel_layout;
2097 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2098 codec->channel_layout = 0;
2099 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2100 icodec->request_channels = codec->channels;
2101 ist->decoding_needed = 1;
2102 ost->encoding_needed = 1;
2103 ost->resample_sample_fmt = icodec->sample_fmt;
2104 ost->resample_sample_rate = icodec->sample_rate;
2105 ost->resample_channels = icodec->channels;
2107 case AVMEDIA_TYPE_VIDEO:
2108 if (codec->pix_fmt == PIX_FMT_NONE)
2109 codec->pix_fmt = icodec->pix_fmt;
2110 choose_pixel_fmt(ost->st, ost->enc);
2112 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2113 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2117 if (!codec->width || !codec->height) {
2118 codec->width = icodec->width;
2119 codec->height = icodec->height;
2122 ost->video_resample = codec->width != icodec->width ||
2123 codec->height != icodec->height ||
2124 codec->pix_fmt != icodec->pix_fmt;
2125 if (ost->video_resample) {
2126 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2129 ost->resample_height = icodec->height;
2130 ost->resample_width = icodec->width;
2131 ost->resample_pix_fmt= icodec->pix_fmt;
2132 ost->encoding_needed = 1;
2133 ist->decoding_needed = 1;
2135 if (!ost->frame_rate.num)
2136 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2137 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2138 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2139 ost->frame_rate = ost->enc->supported_framerates[idx];
2141 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2142 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2143 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2144 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2145 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2149 if (configure_video_filters(ist, ost)) {
2150 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2155 case AVMEDIA_TYPE_SUBTITLE:
2156 ost->encoding_needed = 1;
2157 ist->decoding_needed = 1;
2164 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2165 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2166 char logfilename[1024];
2169 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2170 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2172 if (codec->flags & CODEC_FLAG_PASS1) {
2173 f = fopen(logfilename, "wb");
2175 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2176 logfilename, strerror(errno));
2182 size_t logbuffer_size;
2183 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2184 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2188 codec->stats_in = logbuffer;
2192 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2193 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2194 int size= codec->width * codec->height;
2195 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2200 bit_buffer = av_malloc(bit_buffer_size);
2202 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2204 return AVERROR(ENOMEM);
2207 /* open each encoder */
2208 for (i = 0; i < nb_output_streams; i++) {
2209 ost = &output_streams[i];
2210 if (ost->encoding_needed) {
2211 AVCodec *codec = ost->enc;
2212 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2214 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2215 ost->st->codec->codec_id, ost->file_index, ost->index);
2216 ret = AVERROR(EINVAL);
2219 if (dec->subtitle_header) {
2220 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2221 if (!ost->st->codec->subtitle_header) {
2222 ret = AVERROR(ENOMEM);
2225 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2226 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2228 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2229 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2230 ost->file_index, ost->index);
2231 ret = AVERROR(EINVAL);
2234 assert_codec_experimental(ost->st->codec, 1);
2235 assert_avoptions(ost->opts);
2236 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2237 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2238 "It takes bits/s as argument, not kbits/s\n");
2239 extra_size += ost->st->codec->extradata_size;
2241 if (ost->st->codec->me_threshold)
2242 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2246 /* init input streams */
2247 for (i = 0; i < nb_input_streams; i++)
2248 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2251 /* discard unused programs */
2252 for (i = 0; i < nb_input_files; i++) {
2253 InputFile *ifile = &input_files[i];
2254 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2255 AVProgram *p = ifile->ctx->programs[j];
2256 int discard = AVDISCARD_ALL;
2258 for (k = 0; k < p->nb_stream_indexes; k++)
2259 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2260 discard = AVDISCARD_DEFAULT;
2263 p->discard = discard;
2267 /* open files and write file headers */
2268 for (i = 0; i < nb_output_files; i++) {
2269 os = output_files[i].ctx;
2270 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2271 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2272 ret = AVERROR(EINVAL);
2275 // assert_avoptions(output_files[i].opts);
2276 if (strcmp(os->oformat->name, "rtp")) {
2282 /* dump the file output parameters - cannot be done before in case
2284 for(i=0;i<nb_output_files;i++) {
2285 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2288 /* dump the stream mapping */
2289 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2290 for (i = 0; i < nb_output_streams; i++) {
2291 ost = &output_streams[i];
2292 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d -> #%d.%d",
2293 input_streams[ost->source_index].file_index,
2294 input_streams[ost->source_index].st->index,
2297 if (ost->sync_ist != &input_streams[ost->source_index])
2298 av_log(NULL, AV_LOG_INFO, " [sync #%d.%d]",
2299 ost->sync_ist->file_index,
2300 ost->sync_ist->st->index);
2301 if (ost->st->stream_copy)
2302 av_log(NULL, AV_LOG_INFO, " (copy)");
2304 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2305 input_streams[ost->source_index].dec->name : "?",
2306 ost->enc ? ost->enc->name : "?");
2307 av_log(NULL, AV_LOG_INFO, "\n");
2311 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2316 print_sdp(output_files, nb_output_files);
2323 * The following code is the main loop of the file converter
2325 static int transcode(OutputFile *output_files,
2326 int nb_output_files,
2327 InputFile *input_files,
2331 AVFormatContext *is, *os;
2335 int no_packet_count=0;
2336 int64_t timer_start;
2339 if (!(no_packet = av_mallocz(nb_input_files)))
2342 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2347 av_log(NULL, AV_LOG_INFO, "Press [q] to stop, [?] for help\n");
2348 avio_set_interrupt_cb(decode_interrupt_cb);
2352 timer_start = av_gettime();
2354 for(; received_sigterm == 0;) {
2355 int file_index, ist_index;
2360 ipts_min = INT64_MAX;
2362 /* if 'q' pressed, exits */
2366 /* read_key() returns 0 on EOF */
2370 if (key == '+') av_log_set_level(av_log_get_level()+10);
2371 if (key == '-') av_log_set_level(av_log_get_level()-10);
2372 if (key == 's') qp_hist ^= 1;
2375 do_hex_dump = do_pkt_dump = 0;
2376 } else if(do_pkt_dump){
2380 av_log_set_level(AV_LOG_DEBUG);
2382 if (key == 'd' || key == 'D'){
2385 debug = input_streams[0].st->codec->debug<<1;
2386 if(!debug) debug = 1;
2387 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2390 scanf("%d", &debug);
2391 for(i=0;i<nb_input_streams;i++) {
2392 input_streams[i].st->codec->debug = debug;
2394 for(i=0;i<nb_output_streams;i++) {
2395 ost = &output_streams[i];
2396 ost->st->codec->debug = debug;
2398 if(debug) av_log_set_level(AV_LOG_DEBUG);
2399 fprintf(stderr,"debug=%d\n", debug);
2402 fprintf(stderr, "key function\n"
2403 "? show this help\n"
2404 "+ increase verbosity\n"
2405 "- decrease verbosity\n"
2406 "D cycle through available debug modes\n"
2407 "h dump packets/hex press to cycle through the 3 states\n"
2409 "s Show QP histogram\n"
2414 /* select the stream that we must read now by looking at the
2415 smallest output pts */
2417 for (i = 0; i < nb_output_streams; i++) {
2421 ost = &output_streams[i];
2422 of = &output_files[ost->file_index];
2423 os = output_files[ost->file_index].ctx;
2424 ist = &input_streams[ost->source_index];
2425 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2426 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2428 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2430 if (!input_files[ist->file_index].eof_reached){
2431 if(ipts < ipts_min) {
2433 if(input_sync ) file_index = ist->file_index;
2435 if(opts < opts_min) {
2437 if(!input_sync) file_index = ist->file_index;
2440 if (ost->frame_number >= ost->max_frames) {
2442 for (j = 0; j < of->ctx->nb_streams; j++)
2443 output_streams[of->ost_index + j].is_past_recording_time = 1;
2447 /* if none, if is finished */
2448 if (file_index < 0) {
2449 if(no_packet_count){
2451 memset(no_packet, 0, nb_input_files);
2458 /* read a frame from it and output it in the fifo */
2459 is = input_files[file_index].ctx;
2460 ret= av_read_frame(is, &pkt);
2461 if(ret == AVERROR(EAGAIN)){
2462 no_packet[file_index]=1;
2467 input_files[file_index].eof_reached = 1;
2475 memset(no_packet, 0, nb_input_files);
2478 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2479 is->streams[pkt.stream_index]);
2481 /* the following test is needed in case new streams appear
2482 dynamically in stream : we ignore them */
2483 if (pkt.stream_index >= input_files[file_index].nb_streams)
2484 goto discard_packet;
2485 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2486 ist = &input_streams[ist_index];
2488 goto discard_packet;
2490 if (pkt.dts != AV_NOPTS_VALUE)
2491 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2492 if (pkt.pts != AV_NOPTS_VALUE)
2493 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2495 if(pkt.pts != AV_NOPTS_VALUE)
2496 pkt.pts *= ist->ts_scale;
2497 if(pkt.dts != AV_NOPTS_VALUE)
2498 pkt.dts *= ist->ts_scale;
2500 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2501 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2502 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2503 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2504 int64_t delta= pkt_dts - ist->next_pts;
2505 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2506 input_files[ist->file_index].ts_offset -= delta;
2507 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2508 delta, input_files[ist->file_index].ts_offset);
2509 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2510 if(pkt.pts != AV_NOPTS_VALUE)
2511 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2515 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2516 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2518 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d.%d\n",
2519 ist->file_index, ist->st->index);
2522 av_free_packet(&pkt);
2527 av_free_packet(&pkt);
2529 /* dump report by using the output first video and audio streams */
2530 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2533 /* at the end of stream, we must flush the decoder buffers */
2534 for (i = 0; i < nb_input_streams; i++) {
2535 ist = &input_streams[i];
2536 if (ist->decoding_needed) {
2537 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2540 flush_encoders(output_streams, nb_output_streams);
2544 /* write the trailer if needed and close file */
2545 for(i=0;i<nb_output_files;i++) {
2546 os = output_files[i].ctx;
2547 av_write_trailer(os);
2550 /* dump report by using the first video and audio streams */
2551 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2553 /* close each encoder */
2554 for (i = 0; i < nb_output_streams; i++) {
2555 ost = &output_streams[i];
2556 if (ost->encoding_needed) {
2557 av_freep(&ost->st->codec->stats_in);
2558 avcodec_close(ost->st->codec);
2561 avfilter_graph_free(&ost->graph);
2565 /* close each decoder */
2566 for (i = 0; i < nb_input_streams; i++) {
2567 ist = &input_streams[i];
2568 if (ist->decoding_needed) {
2569 avcodec_close(ist->st->codec);
2577 av_freep(&bit_buffer);
2578 av_freep(&no_packet);
2580 if (output_streams) {
2581 for (i = 0; i < nb_output_streams; i++) {
2582 ost = &output_streams[i];
2584 if (ost->st->stream_copy)
2585 av_freep(&ost->st->codec->extradata);
2587 fclose(ost->logfile);
2588 ost->logfile = NULL;
2590 av_fifo_free(ost->fifo); /* works even if fifo is not
2591 initialized but set to zero */
2592 av_freep(&ost->st->codec->subtitle_header);
2593 av_free(ost->resample_frame.data[0]);
2594 av_free(ost->forced_kf_pts);
2595 if (ost->video_resample)
2596 sws_freeContext(ost->img_resample_ctx);
2598 audio_resample_close(ost->resample);
2599 if (ost->reformat_ctx)
2600 av_audio_convert_free(ost->reformat_ctx);
2601 av_dict_free(&ost->opts);
2608 static int opt_verbose(const char *opt, const char *arg)
2610 av_log(NULL, AV_LOG_WARNING, "-%s is deprecated, use -loglevel\n", opt);
2614 static double parse_frame_aspect_ratio(const char *arg)
2621 p = strchr(arg, ':');
2623 x = strtol(arg, &end, 10);
2625 y = strtol(end+1, &end, 10);
2627 ar = (double)x / (double)y;
2629 ar = strtod(arg, NULL);
2632 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2638 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2640 return parse_option(o, "codec:a", arg, options);
2643 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2645 return parse_option(o, "codec:v", arg, options);
2648 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2650 return parse_option(o, "codec:s", arg, options);
2653 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2655 return parse_option(o, "codec:d", arg, options);
2658 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2660 StreamMap *m = NULL;
2661 int i, negative = 0, file_idx;
2662 int sync_file_idx = -1, sync_stream_idx;
2670 map = av_strdup(arg);
2672 /* parse sync stream first, just pick first matching stream */
2673 if (sync = strchr(map, ',')) {
2675 sync_file_idx = strtol(sync + 1, &sync, 0);
2676 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2677 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2682 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2683 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2684 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2685 sync_stream_idx = i;
2688 if (i == input_files[sync_file_idx].nb_streams) {
2689 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2690 "match any streams.\n", arg);
2696 file_idx = strtol(map, &p, 0);
2697 if (file_idx >= nb_input_files || file_idx < 0) {
2698 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2702 /* disable some already defined maps */
2703 for (i = 0; i < o->nb_stream_maps; i++) {
2704 m = &o->stream_maps[i];
2705 if (check_stream_specifier(input_files[m->file_index].ctx,
2706 input_files[m->file_index].ctx->streams[m->stream_index],
2707 *p == ':' ? p + 1 : p) > 0)
2711 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2712 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2713 *p == ':' ? p + 1 : p) <= 0)
2715 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2716 &o->nb_stream_maps, o->nb_stream_maps + 1);
2717 m = &o->stream_maps[o->nb_stream_maps - 1];
2719 m->file_index = file_idx;
2720 m->stream_index = i;
2722 if (sync_file_idx >= 0) {
2723 m->sync_file_index = sync_file_idx;
2724 m->sync_stream_index = sync_stream_idx;
2726 m->sync_file_index = file_idx;
2727 m->sync_stream_index = i;
2732 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2740 static void parse_meta_type(char *arg, char *type, int *index)
2750 if (*(++arg) == ':')
2751 *index = strtol(++arg, NULL, 0);
2754 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2761 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2763 MetadataMap *m, *m1;
2766 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2767 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2769 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2770 m->file = strtol(arg, &p, 0);
2771 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2773 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2774 if (p = strchr(opt, ':'))
2775 parse_meta_type(p + 1, &m1->type, &m1->index);
2779 if (m->type == 'g' || m1->type == 'g')
2780 o->metadata_global_manual = 1;
2781 if (m->type == 's' || m1->type == 's')
2782 o->metadata_streams_manual = 1;
2783 if (m->type == 'c' || m1->type == 'c')
2784 o->metadata_chapters_manual = 1;
2789 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2791 const char *codec_string = encoder ? "encoder" : "decoder";
2795 return CODEC_ID_NONE;
2797 avcodec_find_encoder_by_name(name) :
2798 avcodec_find_decoder_by_name(name);
2800 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
2803 if(codec->type != type) {
2804 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
2810 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2812 char *codec_name = NULL;
2814 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2818 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2819 return avcodec_find_encoder(st->codec->codec_id);
2821 } else if (!strcmp(codec_name, "copy"))
2822 st->stream_copy = 1;
2824 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2825 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2826 avcodec_find_decoder_by_name(codec_name);
2833 * Add all the streams from the given input file to the global
2834 * list of input streams.
2836 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2838 int i, rfps, rfps_base;
2840 for (i = 0; i < ic->nb_streams; i++) {
2841 AVStream *st = ic->streams[i];
2842 AVCodecContext *dec = st->codec;
2846 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2847 ist = &input_streams[nb_input_streams - 1];
2849 ist->file_index = nb_input_files;
2851 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2853 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2854 ist->ts_scale = scale;
2856 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2858 ist->dec = avcodec_find_decoder(dec->codec_id);
2860 switch (dec->codec_type) {
2861 case AVMEDIA_TYPE_AUDIO:
2863 ist->dec = avcodec_find_decoder(dec->codec_id);
2864 if(o->audio_disable)
2865 st->discard= AVDISCARD_ALL;
2867 case AVMEDIA_TYPE_VIDEO:
2869 ist->dec = avcodec_find_decoder(dec->codec_id);
2870 rfps = ic->streams[i]->r_frame_rate.num;
2871 rfps_base = ic->streams[i]->r_frame_rate.den;
2873 dec->flags |= CODEC_FLAG_EMU_EDGE;
2876 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2878 av_log(NULL, AV_LOG_INFO,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2879 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2880 (float)rfps / rfps_base, rfps, rfps_base);
2883 if (o->video_disable)
2884 st->discard= AVDISCARD_ALL;
2885 else if(video_discard)
2886 st->discard= video_discard;
2888 case AVMEDIA_TYPE_DATA:
2890 case AVMEDIA_TYPE_SUBTITLE:
2892 ist->dec = avcodec_find_decoder(dec->codec_id);
2893 if(o->subtitle_disable)
2894 st->discard = AVDISCARD_ALL;
2896 case AVMEDIA_TYPE_ATTACHMENT:
2897 case AVMEDIA_TYPE_UNKNOWN:
2905 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2907 AVFormatContext *ic;
2908 AVInputFormat *file_iformat = NULL;
2912 AVDictionary **opts;
2913 int orig_nb_streams; // number of streams before avformat_find_stream_info
2916 if (!(file_iformat = av_find_input_format(o->format))) {
2917 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
2922 if (!strcmp(filename, "-"))
2925 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2926 !strcmp(filename, "/dev/stdin");
2928 /* get default parameters from command line */
2929 ic = avformat_alloc_context();
2931 print_error(filename, AVERROR(ENOMEM));
2934 if (o->nb_audio_sample_rate) {
2935 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2936 av_dict_set(&format_opts, "sample_rate", buf, 0);
2938 if (o->nb_audio_channels) {
2939 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2940 av_dict_set(&format_opts, "channels", buf, 0);
2942 if (o->nb_frame_rates) {
2943 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2945 if (o->nb_frame_sizes) {
2946 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2948 if (o->nb_frame_pix_fmts)
2949 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2951 ic->flags |= AVFMT_FLAG_NONBLOCK;
2953 /* open the input file with generic libav function */
2954 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2956 print_error(filename, err);
2959 assert_avoptions(format_opts);
2961 /* apply forced codec ids */
2962 for (i = 0; i < ic->nb_streams; i++)
2963 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2965 /* Set AVCodecContext options for avformat_find_stream_info */
2966 opts = setup_find_stream_info_opts(ic, codec_opts);
2967 orig_nb_streams = ic->nb_streams;
2969 /* If not enough info to get the stream parameters, we decode the
2970 first frames to get it. (used in mpeg case for example) */
2971 ret = avformat_find_stream_info(ic, opts);
2973 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
2974 av_close_input_file(ic);
2978 timestamp = o->start_time;
2979 /* add the stream start time */
2980 if (ic->start_time != AV_NOPTS_VALUE)
2981 timestamp += ic->start_time;
2983 /* if seeking requested, we execute it */
2984 if (o->start_time != 0) {
2985 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2987 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
2988 filename, (double)timestamp / AV_TIME_BASE);
2992 /* update the current parameters so that they match the one of the input stream */
2993 add_input_streams(o, ic);
2995 /* dump the file content */
2996 av_dump_format(ic, nb_input_files, filename, 0);
2998 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2999 input_files[nb_input_files - 1].ctx = ic;
3000 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3001 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3002 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3003 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3005 for (i = 0; i < orig_nb_streams; i++)
3006 av_dict_free(&opts[i]);
3013 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3014 AVCodecContext *avctx)
3020 for (p = kf; *p; p++)
3023 ost->forced_kf_count = n;
3024 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3025 if (!ost->forced_kf_pts) {
3026 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3029 for (i = 0; i < n; i++) {
3030 p = i ? strchr(p, ',') + 1 : kf;
3031 t = parse_time_or_die("force_key_frames", p, 1);
3032 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3036 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3039 AVStream *st = av_new_stream(oc, oc->nb_streams < o->nb_streamid_map ? o->streamid_map[oc->nb_streams] : 0);
3040 int idx = oc->nb_streams - 1;
3041 int64_t max_frames = INT64_MAX;
3042 char *bsf = NULL, *next, *codec_tag = NULL;
3043 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3047 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3051 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3052 nb_output_streams + 1);
3053 ost = &output_streams[nb_output_streams - 1];
3054 ost->file_index = nb_output_files;
3057 st->codec->codec_type = type;
3058 ost->enc = choose_codec(o, oc, st, type);
3060 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3063 avcodec_get_context_defaults3(st->codec, ost->enc);
3064 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3066 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3067 ost->max_frames = max_frames;
3069 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3071 if (next = strchr(bsf, ','))
3073 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3074 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3078 bsfc_prev->next = bsfc;
3080 ost->bitstream_filters = bsfc;
3086 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3088 uint32_t tag = strtol(codec_tag, &next, 0);
3090 tag = AV_RL32(codec_tag);
3091 st->codec->codec_tag = tag;
3094 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3095 if (qscale >= 0 || same_quant) {
3096 st->codec->flags |= CODEC_FLAG_QSCALE;
3097 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3100 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3104 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3107 const char *p = str;
3114 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3121 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3125 AVCodecContext *video_enc;
3127 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3129 video_enc = st->codec;
3131 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3132 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3135 if (!st->stream_copy) {
3136 const char *p = NULL;
3137 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3138 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3139 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3140 int i, force_fps = 0, top_field_first = -1;
3142 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3143 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3144 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3148 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3149 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3150 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3154 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3155 if (frame_aspect_ratio)
3156 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3158 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3159 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3160 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3163 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3165 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3167 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3168 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3171 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3173 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3175 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3176 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3179 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3182 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3185 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3187 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3190 video_enc->rc_override=
3191 av_realloc(video_enc->rc_override,
3192 sizeof(RcOverride)*(i+1));
3193 video_enc->rc_override[i].start_frame= start;
3194 video_enc->rc_override[i].end_frame = end;
3196 video_enc->rc_override[i].qscale= q;
3197 video_enc->rc_override[i].quality_factor= 1.0;
3200 video_enc->rc_override[i].qscale= 0;
3201 video_enc->rc_override[i].quality_factor= -q/100.0;
3206 video_enc->rc_override_count=i;
3207 if (!video_enc->rc_initial_buffer_occupancy)
3208 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3209 video_enc->intra_dc_precision= intra_dc_precision - 8;
3214 video_enc->flags |= CODEC_FLAG_PASS1;
3216 video_enc->flags |= CODEC_FLAG_PASS2;
3220 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3221 if (forced_key_frames)
3222 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3224 MATCH_PER_STREAM_OPT(force_fps, i, force_fps, oc, st);
3225 ost->force_fps = force_fps;
3227 MATCH_PER_STREAM_OPT(top_field_first, i, top_field_first, oc, st);
3228 ost->top_field_first = top_field_first;
3231 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3233 ost->avfilter = av_strdup(filters);
3240 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3244 AVCodecContext *audio_enc;
3246 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3249 audio_enc = st->codec;
3250 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3252 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3253 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3255 if (!st->stream_copy) {
3256 char *sample_fmt = NULL;
3258 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3260 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3262 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3263 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3267 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3273 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3277 AVCodecContext *data_enc;
3279 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3281 data_enc = st->codec;
3282 if (!st->stream_copy) {
3283 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3287 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3288 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3294 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3298 AVCodecContext *subtitle_enc;
3300 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3302 subtitle_enc = st->codec;
3304 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3306 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3307 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3313 /* arg format is "output-stream-index:streamid-value". */
3314 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3320 av_strlcpy(idx_str, arg, sizeof(idx_str));
3321 p = strchr(idx_str, ':');
3323 av_log(NULL, AV_LOG_FATAL,
3324 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3329 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3330 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3331 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3335 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3337 AVFormatContext *is = ifile->ctx;
3338 AVFormatContext *os = ofile->ctx;
3341 for (i = 0; i < is->nb_chapters; i++) {
3342 AVChapter *in_ch = is->chapters[i], *out_ch;
3343 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3344 AV_TIME_BASE_Q, in_ch->time_base);
3345 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3346 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3349 if (in_ch->end < ts_off)
3351 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3354 out_ch = av_mallocz(sizeof(AVChapter));
3356 return AVERROR(ENOMEM);
3358 out_ch->id = in_ch->id;
3359 out_ch->time_base = in_ch->time_base;
3360 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3361 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3364 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3367 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3369 return AVERROR(ENOMEM);
3370 os->chapters[os->nb_chapters - 1] = out_ch;
3375 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3378 AVFormatContext *ic = NULL;
3380 err = avformat_open_input(&ic, filename, NULL, NULL);
3383 /* copy stream format */
3384 for(i=0;i<ic->nb_streams;i++) {
3389 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3390 ost = new_output_stream(o, s, codec->type);
3393 // FIXME: a more elegant solution is needed
3394 memcpy(st, ic->streams[i], sizeof(AVStream));
3395 st->info = av_malloc(sizeof(*st->info));
3396 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3397 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3399 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3400 choose_sample_fmt(st, codec);
3401 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3402 choose_pixel_fmt(st, codec);
3405 av_close_input_file(ic);
3409 static void opt_output_file(void *optctx, const char *filename)
3411 OptionsContext *o = optctx;
3412 AVFormatContext *oc;
3414 AVOutputFormat *file_oformat;
3418 if (!strcmp(filename, "-"))
3421 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3423 print_error(filename, err);
3427 file_oformat= oc->oformat;
3429 if (!strcmp(file_oformat->name, "ffm") &&
3430 av_strstart(filename, "http:", NULL)) {
3431 /* special case for files sent to ffserver: we get the stream
3432 parameters from ffserver */
3433 int err = read_ffserver_streams(o, oc, filename);
3435 print_error(filename, err);
3438 } else if (!o->nb_stream_maps) {
3439 /* pick the "best" stream of each type */
3440 #define NEW_STREAM(type, index)\
3442 ost = new_ ## type ## _stream(o, oc);\
3443 ost->source_index = index;\
3444 ost->sync_ist = &input_streams[index];\
3445 input_streams[index].discard = 0;\
3448 /* video: highest resolution */
3449 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3450 int area = 0, idx = -1;
3451 for (i = 0; i < nb_input_streams; i++) {
3452 ist = &input_streams[i];
3453 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3454 ist->st->codec->width * ist->st->codec->height > area) {
3455 area = ist->st->codec->width * ist->st->codec->height;
3459 NEW_STREAM(video, idx);
3462 /* audio: most channels */
3463 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3464 int channels = 0, idx = -1;
3465 for (i = 0; i < nb_input_streams; i++) {
3466 ist = &input_streams[i];
3467 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3468 ist->st->codec->channels > channels) {
3469 channels = ist->st->codec->channels;
3473 NEW_STREAM(audio, idx);
3476 /* subtitles: pick first */
3477 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3478 for (i = 0; i < nb_input_streams; i++)
3479 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3480 NEW_STREAM(subtitle, i);
3484 /* do something with data? */
3486 for (i = 0; i < o->nb_stream_maps; i++) {
3487 StreamMap *map = &o->stream_maps[i];
3492 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3493 switch (ist->st->codec->codec_type) {
3494 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3495 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3496 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3497 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3499 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d.%d - unsupported type.\n",
3500 map->file_index, map->stream_index);
3504 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3505 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3506 map->sync_stream_index];
3511 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3512 output_files[nb_output_files - 1].ctx = oc;
3513 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3514 output_files[nb_output_files - 1].recording_time = o->recording_time;
3515 output_files[nb_output_files - 1].start_time = o->start_time;
3516 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3517 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3519 /* check filename in case of an image number is expected */
3520 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3521 if (!av_filename_number_test(oc->filename)) {
3522 print_error(oc->filename, AVERROR(EINVAL));
3527 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3528 /* test if it already exists to avoid loosing precious files */
3529 if (!file_overwrite &&
3530 (strchr(filename, ':') == NULL ||
3531 filename[1] == ':' ||
3532 av_strstart(filename, "file:", NULL))) {
3533 if (avio_check(filename, 0) == 0) {
3535 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3537 if (!read_yesno()) {
3538 fprintf(stderr, "Not overwriting - exiting\n");
3543 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3550 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3551 print_error(filename, err);
3556 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3557 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3560 if (o->chapters_input_file >= nb_input_files) {
3561 if (o->chapters_input_file == INT_MAX) {
3562 /* copy chapters from the first input file that has them*/
3563 o->chapters_input_file = -1;
3564 for (i = 0; i < nb_input_files; i++)
3565 if (input_files[i].ctx->nb_chapters) {
3566 o->chapters_input_file = i;
3570 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3571 o->chapters_input_file);
3575 if (o->chapters_input_file >= 0)
3576 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3577 !o->metadata_chapters_manual);
3580 for (i = 0; i < o->nb_meta_data_maps; i++) {
3581 AVFormatContext *files[2];
3582 AVDictionary **meta[2];
3585 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3586 if ((index) < 0 || (index) >= (nb_elems)) {\
3587 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
3592 int in_file_index = o->meta_data_maps[i][1].file;
3593 if (in_file_index < 0)
3595 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3598 files[1] = input_files[in_file_index].ctx;
3600 for (j = 0; j < 2; j++) {
3601 MetadataMap *map = &o->meta_data_maps[i][j];
3603 switch (map->type) {
3605 meta[j] = &files[j]->metadata;
3608 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3609 meta[j] = &files[j]->streams[map->index]->metadata;
3612 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3613 meta[j] = &files[j]->chapters[map->index]->metadata;
3616 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3617 meta[j] = &files[j]->programs[map->index]->metadata;
3622 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3625 /* copy global metadata by default */
3626 if (!o->metadata_global_manual && nb_input_files)
3627 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3628 AV_DICT_DONT_OVERWRITE);
3629 if (!o->metadata_streams_manual)
3630 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3631 InputStream *ist = &input_streams[output_streams[i].source_index];
3632 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3635 /* process manually set metadata */
3636 for (i = 0; i < o->nb_metadata; i++) {
3641 val = strchr(o->metadata[i].u.str, '=');
3643 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
3644 o->metadata[i].u.str);
3649 parse_meta_type(o->metadata[i].specifier, &type, &index);
3655 if (index < 0 || index >= oc->nb_streams) {
3656 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
3659 m = &oc->streams[index]->metadata;
3662 if (index < 0 || index >= oc->nb_chapters) {
3663 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
3666 m = &oc->chapters[index]->metadata;
3669 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3673 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3679 /* same option as mencoder */
3680 static int opt_pass(const char *opt, const char *arg)
3682 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3686 static int64_t getutime(void)
3689 struct rusage rusage;
3691 getrusage(RUSAGE_SELF, &rusage);
3692 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3693 #elif HAVE_GETPROCESSTIMES
3695 FILETIME c, e, k, u;
3696 proc = GetCurrentProcess();
3697 GetProcessTimes(proc, &c, &e, &k, &u);
3698 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3700 return av_gettime();
3704 static int64_t getmaxrss(void)
3706 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3707 struct rusage rusage;
3708 getrusage(RUSAGE_SELF, &rusage);
3709 return (int64_t)rusage.ru_maxrss * 1024;
3710 #elif HAVE_GETPROCESSMEMORYINFO
3712 PROCESS_MEMORY_COUNTERS memcounters;
3713 proc = GetCurrentProcess();
3714 memcounters.cb = sizeof(memcounters);
3715 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3716 return memcounters.PeakPagefileUsage;
3722 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3724 return parse_option(o, "q:a", arg, options);
3727 static void show_usage(void)
3729 printf("Hyper fast Audio and Video encoder\n");
3730 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3734 static int opt_help(const char *opt, const char *arg)
3737 AVOutputFormat *oformat = NULL;
3738 AVInputFormat *iformat = NULL;
3739 const AVClass *class;
3741 av_log_set_callback(log_callback_help);
3743 show_help_options(options, "Main options:\n",
3744 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3745 show_help_options(options, "\nAdvanced options:\n",
3746 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3748 show_help_options(options, "\nVideo options:\n",
3749 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3751 show_help_options(options, "\nAdvanced Video options:\n",
3752 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3753 OPT_VIDEO | OPT_EXPERT);
3754 show_help_options(options, "\nAudio options:\n",
3755 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3757 show_help_options(options, "\nAdvanced Audio options:\n",
3758 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3759 OPT_AUDIO | OPT_EXPERT);
3760 show_help_options(options, "\nSubtitle options:\n",
3761 OPT_SUBTITLE | OPT_GRAB,
3763 show_help_options(options, "\nAudio/Video grab options:\n",
3767 class = avcodec_get_class();
3768 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3771 /* individual codec options */
3773 while ((c = av_codec_next(c))) {
3774 if (c->priv_class) {
3775 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3780 class = avformat_get_class();
3781 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3784 /* individual muxer options */
3785 while ((oformat = av_oformat_next(oformat))) {
3786 if (oformat->priv_class) {
3787 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3792 /* individual demuxer options */
3793 while ((iformat = av_iformat_next(iformat))) {
3794 if (iformat->priv_class) {
3795 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3800 class = sws_get_class();
3801 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3805 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3807 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3808 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3810 if(!strncmp(arg, "pal-", 4)) {
3813 } else if(!strncmp(arg, "ntsc-", 5)) {
3816 } else if(!strncmp(arg, "film-", 5)) {
3820 /* Try to determine PAL/NTSC by peeking in the input files */
3821 if(nb_input_files) {
3823 for (j = 0; j < nb_input_files; j++) {
3824 for (i = 0; i < input_files[j].nb_streams; i++) {
3825 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3826 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3828 fr = c->time_base.den * 1000 / c->time_base.num;
3832 } else if((fr == 29970) || (fr == 23976)) {
3841 if (norm != UNKNOWN)
3842 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3845 if(norm == UNKNOWN) {
3846 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3847 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3848 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
3852 if(!strcmp(arg, "vcd")) {
3853 opt_video_codec(o, "c:v", "mpeg1video");
3854 opt_audio_codec(o, "c:a", "mp2");
3855 parse_option(o, "f", "vcd", options);
3857 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3858 parse_option(o, "r", frame_rates[norm], options);
3859 opt_default("g", norm == PAL ? "15" : "18");
3861 opt_default("b", "1150000");
3862 opt_default("maxrate", "1150000");
3863 opt_default("minrate", "1150000");
3864 opt_default("bufsize", "327680"); // 40*1024*8;
3866 opt_default("b:a", "224000");
3867 parse_option(o, "ar", "44100", options);
3868 parse_option(o, "ac", "2", options);
3870 opt_default("packetsize", "2324");
3871 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3873 /* We have to offset the PTS, so that it is consistent with the SCR.
3874 SCR starts at 36000, but the first two packs contain only padding
3875 and the first pack from the other stream, respectively, may also have
3876 been written before.
3877 So the real data starts at SCR 36000+3*1200. */
3878 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3879 } else if(!strcmp(arg, "svcd")) {
3881 opt_video_codec(o, "c:v", "mpeg2video");
3882 opt_audio_codec(o, "c:a", "mp2");
3883 parse_option(o, "f", "svcd", options);
3885 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
3886 parse_option(o, "r", frame_rates[norm], options);
3887 opt_default("g", norm == PAL ? "15" : "18");
3889 opt_default("b", "2040000");
3890 opt_default("maxrate", "2516000");
3891 opt_default("minrate", "0"); //1145000;
3892 opt_default("bufsize", "1835008"); //224*1024*8;
3893 opt_default("flags", "+scan_offset");
3896 opt_default("b:a", "224000");
3897 parse_option(o, "ar", "44100", options);
3899 opt_default("packetsize", "2324");
3901 } else if(!strcmp(arg, "dvd")) {
3903 opt_video_codec(o, "c:v", "mpeg2video");
3904 opt_audio_codec(o, "c:a", "ac3");
3905 parse_option(o, "f", "dvd", options);
3907 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3908 parse_option(o, "r", frame_rates[norm], options);
3909 opt_default("g", norm == PAL ? "15" : "18");
3911 opt_default("b", "6000000");
3912 opt_default("maxrate", "9000000");
3913 opt_default("minrate", "0"); //1500000;
3914 opt_default("bufsize", "1835008"); //224*1024*8;
3916 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3917 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3919 opt_default("b:a", "448000");
3920 parse_option(o, "ar", "48000", options);
3922 } else if(!strncmp(arg, "dv", 2)) {
3924 parse_option(o, "f", "dv", options);
3926 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3927 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3928 norm == PAL ? "yuv420p" : "yuv411p", options);
3929 parse_option(o, "r", frame_rates[norm], options);
3931 parse_option(o, "ar", "48000", options);
3932 parse_option(o, "ac", "2", options);
3935 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
3936 return AVERROR(EINVAL);
3941 static int opt_vstats_file(const char *opt, const char *arg)
3943 av_free (vstats_filename);
3944 vstats_filename=av_strdup (arg);
3948 static int opt_vstats(const char *opt, const char *arg)
3951 time_t today2 = time(NULL);
3952 struct tm *today = localtime(&today2);
3954 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3956 return opt_vstats_file(opt, filename);
3959 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3961 return parse_option(o, "frames:v", arg, options);
3964 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3966 return parse_option(o, "frames:a", arg, options);
3969 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3971 return parse_option(o, "frames:d", arg, options);
3974 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
3978 static int opt_passlogfile(const char *opt, const char *arg)
3980 pass_logfilename_prefix = arg;
3981 #if CONFIG_LIBX264_ENCODER
3982 return opt_default("passlogfile", arg);
3988 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
3990 return parse_option(o, "tag:v", arg, options);
3993 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
3995 return parse_option(o, "tag:a", arg, options);
3998 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4000 return parse_option(o, "tag:s", arg, options);
4003 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4005 return parse_option(o, "filter:v", arg, options);
4008 #define OFFSET(x) offsetof(OptionsContext, x)
4009 static const OptionDef options[] = {
4011 #include "cmdutils_common_opts.h"
4012 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4013 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4014 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4015 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4016 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4017 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4018 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4019 "outfile[,metadata]:infile[,metadata]" },
4020 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4021 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4022 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4023 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4024 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4025 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4026 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4027 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4028 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4029 "add timings for benchmarking" },
4030 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4031 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4032 "dump each input packet" },
4033 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4034 "when dumping packets, also dump the payload" },
4035 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4036 { "v", HAS_ARG, {(void*)opt_verbose}, "deprecated, use -loglevel instead", "number" },
4037 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4038 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4039 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4040 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4041 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4042 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4043 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4044 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4045 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4046 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4047 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4048 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4049 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4050 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4052 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4056 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4057 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4058 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4059 { "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" },
4060 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4061 { "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" },
4062 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4063 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4064 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4065 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4066 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4067 "use same quantizer as source (implies VBR)" },
4068 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4069 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4070 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4071 "deinterlace pictures" },
4072 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4073 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4075 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4077 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4078 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4079 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4080 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4081 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4082 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4083 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4084 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4085 { "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" },
4088 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4089 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4090 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4091 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4092 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4093 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4094 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4095 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4096 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4098 /* subtitle options */
4099 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4100 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4101 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4104 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4107 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4108 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4110 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4112 /* data codec support */
4113 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4115 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4119 int main(int argc, char **argv)
4121 OptionsContext o = { 0 };
4126 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4127 parse_loglevel(argc, argv, options);
4129 if(argc>1 && !strcmp(argv[1], "-d")){
4131 av_log_set_callback(log_callback_null);
4136 avcodec_register_all();
4138 avdevice_register_all();
4141 avfilter_register_all();
4146 if(isatty(STDIN_FILENO))
4147 avio_set_interrupt_cb(decode_interrupt_cb);
4153 parse_options(&o, argc, argv, options, opt_output_file);
4155 if(nb_output_files <= 0 && nb_input_files == 0) {
4157 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4161 /* file converter / grab */
4162 if (nb_output_files <= 0) {
4163 fprintf(stderr, "At least one output file must be specified\n");
4167 if (nb_input_files == 0) {
4168 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4173 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4175 ti = getutime() - ti;
4177 int maxrss = getmaxrss() / 1024;
4178 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);