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"
57 # include "libavfilter/avtool.h"
60 #if HAVE_SYS_RESOURCE_H
61 #include <sys/types.h>
63 #include <sys/resource.h>
64 #elif HAVE_GETPROCESSTIMES
67 #if HAVE_GETPROCESSMEMORYINFO
73 #include <sys/select.h>
78 #include <sys/ioctl.h>
88 #include "libavutil/avassert.h"
90 const char program_name[] = "avconv";
91 const int program_birth_year = 2000;
93 /* select an input stream for an output stream */
94 typedef struct StreamMap {
95 int disabled; /** 1 is this mapping is disabled by a negative map */
99 int sync_stream_index;
103 * select an input file for an output file
105 typedef struct MetadataMap {
106 int file; ///< file index
107 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
108 int index; ///< stream/chapter/program number
111 static const OptionDef options[];
113 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
115 static int frame_bits_per_raw_sample = 0;
116 static int video_discard = 0;
117 static int same_quant = 0;
118 static int do_deinterlace = 0;
119 static int intra_dc_precision = 8;
120 static int qp_hist = 0;
122 static int file_overwrite = 0;
123 static int do_benchmark = 0;
124 static int do_hex_dump = 0;
125 static int do_pkt_dump = 0;
126 static int do_pass = 0;
127 static const char *pass_logfilename_prefix;
128 static int video_sync_method= -1;
129 static int audio_sync_method= 0;
130 static float audio_drift_threshold= 0.1;
131 static int copy_ts= 0;
132 static int copy_tb= 0;
133 static int opt_shortest = 0;
134 static char *vstats_filename;
135 static FILE *vstats_file;
136 static int copy_initial_nonkeyframes = 0;
138 static int audio_volume = 256;
140 static int exit_on_error = 0;
141 static int using_stdin = 0;
142 static int verbose = 1;
143 static int run_as_daemon = 0;
144 static int q_pressed = 0;
145 static int64_t video_size = 0;
146 static int64_t audio_size = 0;
147 static int64_t extra_size = 0;
148 static int nb_frames_dup = 0;
149 static int nb_frames_drop = 0;
150 static int input_sync;
152 static float dts_delta_threshold = 10;
154 static uint8_t *audio_buf;
155 static uint8_t *audio_out;
156 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
158 static short *samples;
160 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
162 typedef struct InputStream {
165 int discard; /* true if stream data should be discarded */
166 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
169 int64_t start; /* time when read started */
170 int64_t next_pts; /* synthetic pts for cases where pkt.pts
172 int64_t pts; /* current pts */
174 int is_start; /* is 1 at the start and after a discontinuity */
175 int showed_multi_packet_warning;
179 typedef struct InputFile {
180 AVFormatContext *ctx;
181 int eof_reached; /* true if eof reached */
182 int ist_index; /* index of first stream in ist_table */
183 int buffer_size; /* current total buffer size */
185 int nb_streams; /* number of stream that avconv is aware of; may be different
186 from ctx.nb_streams if new streams appear during av_read_frame() */
190 typedef struct OutputStream {
191 int file_index; /* file index */
192 int index; /* stream index in the output file */
193 int source_index; /* InputStream index */
194 AVStream *st; /* stream in the output file */
195 int encoding_needed; /* true if encoding needed for this stream */
197 /* input pts and corresponding output pts
199 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
200 struct InputStream *sync_ist; /* input stream to sync against */
201 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
202 AVBitStreamFilterContext *bitstream_filters;
208 AVFrame resample_frame; /* temporary frame for image resampling */
209 struct SwsContext *img_resample_ctx; /* for image resampling */
212 int resample_pix_fmt;
213 AVRational frame_rate;
217 float frame_aspect_ratio;
219 /* forced key frames */
220 int64_t *forced_kf_pts;
226 ReSampleContext *resample; /* for audio resampling */
227 int resample_sample_fmt;
228 int resample_channels;
229 int resample_sample_rate;
231 AVAudioConvert *reformat_ctx;
232 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
236 AVFilterContext *output_video_filter;
237 AVFilterContext *input_video_filter;
238 AVFilterBufferRef *picref;
240 AVFilterGraph *graph;
245 int is_past_recording_time;
250 /* init terminal so that we can grab keys */
251 static struct termios oldtty;
254 typedef struct OutputFile {
255 AVFormatContext *ctx;
257 int ost_index; /* index of the first stream in output_streams */
258 int64_t recording_time; /* desired length of the resulting file in microseconds */
259 int64_t start_time; /* start time in microseconds */
260 uint64_t limit_filesize;
263 static InputStream *input_streams = NULL;
264 static int nb_input_streams = 0;
265 static InputFile *input_files = NULL;
266 static int nb_input_files = 0;
268 static OutputStream *output_streams = NULL;
269 static int nb_output_streams = 0;
270 static OutputFile *output_files = NULL;
271 static int nb_output_files = 0;
273 typedef struct OptionsContext {
274 /* input/output options */
278 SpecifierOpt *codec_names;
280 SpecifierOpt *audio_channels;
281 int nb_audio_channels;
282 SpecifierOpt *audio_sample_rate;
283 int nb_audio_sample_rate;
284 SpecifierOpt *frame_rates;
286 SpecifierOpt *frame_sizes;
288 SpecifierOpt *frame_pix_fmts;
289 int nb_frame_pix_fmts;
292 int64_t input_ts_offset;
295 SpecifierOpt *ts_scale;
299 StreamMap *stream_maps;
301 /* first item specifies output metadata, second is input */
302 MetadataMap (*meta_data_maps)[2];
303 int nb_meta_data_maps;
304 int metadata_global_manual;
305 int metadata_streams_manual;
306 int metadata_chapters_manual;
308 int chapters_input_file;
310 int64_t recording_time;
311 uint64_t limit_filesize;
317 int subtitle_disable;
320 /* indexed by output file stream index */
324 SpecifierOpt *metadata;
326 SpecifierOpt *max_frames;
328 SpecifierOpt *bitstream_filters;
329 int nb_bitstream_filters;
330 SpecifierOpt *codec_tags;
332 SpecifierOpt *sample_fmts;
334 SpecifierOpt *qscale;
336 SpecifierOpt *forced_key_frames;
337 int nb_forced_key_frames;
338 SpecifierOpt *force_fps;
340 SpecifierOpt *frame_aspect_ratios;
341 int nb_frame_aspect_ratios;
342 SpecifierOpt *rc_overrides;
344 SpecifierOpt *intra_matrices;
345 int nb_intra_matrices;
346 SpecifierOpt *inter_matrices;
347 int nb_inter_matrices;
348 SpecifierOpt *top_field_first;
349 int nb_top_field_first;
351 SpecifierOpt *filters;
356 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
359 for (i = 0; i < o->nb_ ## name; i++) {\
360 char *spec = o->name[i].specifier;\
361 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
362 outvar = o->name[i].u.type;\
368 static void reset_options(OptionsContext *o)
370 const OptionDef *po = options;
372 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
374 void *dst = (uint8_t*)o + po->u.off;
376 if (po->flags & OPT_SPEC) {
377 SpecifierOpt **so = dst;
378 int i, *count = (int*)(so + 1);
379 for (i = 0; i < *count; i++) {
380 av_freep(&(*so)[i].specifier);
381 if (po->flags & OPT_STRING)
382 av_freep(&(*so)[i].u.str);
386 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
391 av_freep(&o->stream_maps);
392 av_freep(&o->meta_data_maps);
393 av_freep(&o->streamid_map);
395 memset(o, 0, sizeof(*o));
397 o->mux_preload = 0.5;
398 o->mux_max_delay = 0.7;
399 o->recording_time = INT64_MAX;
400 o->limit_filesize = UINT64_MAX;
401 o->chapters_input_file = INT_MAX;
409 static int configure_video_filters(InputStream *ist, OutputStream *ost)
411 AVFilterContext *last_filter, *filter;
412 /** filter graph containing all filters including input & output */
413 AVCodecContext *codec = ost->st->codec;
414 AVCodecContext *icodec = ist->st->codec;
415 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
416 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
417 AVRational sample_aspect_ratio;
421 ost->graph = avfilter_graph_alloc();
423 if (ist->st->sample_aspect_ratio.num){
424 sample_aspect_ratio = ist->st->sample_aspect_ratio;
426 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
428 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
429 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
430 sample_aspect_ratio.num, sample_aspect_ratio.den);
432 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
433 "src", args, NULL, ost->graph);
436 #if FF_API_OLD_VSINK_API
437 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
438 "out", NULL, pix_fmts, ost->graph);
440 buffersink_params->pixel_fmts = pix_fmts;
441 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
442 "out", NULL, buffersink_params, ost->graph);
444 av_freep(&buffersink_params);
447 last_filter = ost->input_video_filter;
449 if (codec->width != icodec->width || codec->height != icodec->height) {
450 snprintf(args, 255, "%d:%d:flags=0x%X",
454 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
455 NULL, args, NULL, ost->graph)) < 0)
457 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
459 last_filter = filter;
462 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
463 ost->graph->scale_sws_opts = av_strdup(args);
466 AVFilterInOut *outputs = avfilter_inout_alloc();
467 AVFilterInOut *inputs = avfilter_inout_alloc();
469 outputs->name = av_strdup("in");
470 outputs->filter_ctx = last_filter;
471 outputs->pad_idx = 0;
472 outputs->next = NULL;
474 inputs->name = av_strdup("out");
475 inputs->filter_ctx = ost->output_video_filter;
479 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
481 av_freep(&ost->avfilter);
483 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
487 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
490 codec->width = ost->output_video_filter->inputs[0]->w;
491 codec->height = ost->output_video_filter->inputs[0]->h;
492 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
493 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
494 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
495 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
499 #endif /* CONFIG_AVFILTER */
501 static void term_exit(void)
503 av_log(NULL, AV_LOG_QUIET, "%s", "");
506 tcsetattr (0, TCSANOW, &oldtty);
510 static volatile int received_sigterm = 0;
513 sigterm_handler(int sig)
515 received_sigterm = sig;
520 static void term_init(void)
530 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
531 |INLCR|IGNCR|ICRNL|IXON);
532 tty.c_oflag |= OPOST;
533 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
534 tty.c_cflag &= ~(CSIZE|PARENB);
539 tcsetattr (0, TCSANOW, &tty);
540 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
544 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
545 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
547 signal(SIGXCPU, sigterm_handler);
551 /* read a key without blocking */
552 static int read_key(void)
567 n = select(1, &rfds, NULL, NULL, &tv);
582 static int decode_interrupt_cb(void)
584 q_pressed += read_key() == 'q';
585 return q_pressed > 1;
588 void exit_program(int ret)
593 for(i=0;i<nb_output_files;i++) {
594 AVFormatContext *s = output_files[i].ctx;
595 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
597 avformat_free_context(s);
598 av_dict_free(&output_files[i].opts);
600 for(i=0;i<nb_input_files;i++) {
601 av_close_input_file(input_files[i].ctx);
603 for (i = 0; i < nb_input_streams; i++)
604 av_dict_free(&input_streams[i].opts);
608 av_free(vstats_filename);
610 av_freep(&input_streams);
611 av_freep(&input_files);
612 av_freep(&output_streams);
613 av_freep(&output_files);
618 allocated_audio_buf_size= allocated_audio_out_size= 0;
625 if (received_sigterm) {
627 "Received signal %d: terminating.\n",
628 (int) received_sigterm);
632 exit(ret); /* not all OS-es handle main() return value */
635 static void assert_avoptions(AVDictionary *m)
637 AVDictionaryEntry *t;
638 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
639 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
644 static void assert_codec_experimental(AVCodecContext *c, int encoder)
646 const char *codec_string = encoder ? "encoder" : "decoder";
648 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
649 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
650 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
651 "results.\nAdd '-strict experimental' if you want to use it.\n",
652 codec_string, c->codec->name);
653 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
654 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
655 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
656 codec_string, codec->name);
661 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
663 if(codec && codec->sample_fmts){
664 const enum AVSampleFormat *p= codec->sample_fmts;
666 if(*p == st->codec->sample_fmt)
670 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
671 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
672 if(av_get_sample_fmt_name(st->codec->sample_fmt))
673 av_log(NULL, AV_LOG_WARNING,
674 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
675 av_get_sample_fmt_name(st->codec->sample_fmt),
677 av_get_sample_fmt_name(codec->sample_fmts[0]));
678 st->codec->sample_fmt = codec->sample_fmts[0];
683 static void choose_sample_rate(AVStream *st, AVCodec *codec)
685 if(codec && codec->supported_samplerates){
686 const int *p= codec->supported_samplerates;
688 int best_dist=INT_MAX;
690 int dist= abs(st->codec->sample_rate - *p);
691 if(dist < best_dist){
697 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
699 st->codec->sample_rate= best;
703 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
705 if(codec && codec->pix_fmts){
706 const enum PixelFormat *p= codec->pix_fmts;
707 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
708 if(st->codec->codec_id==CODEC_ID_MJPEG){
709 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
710 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
711 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};
715 if(*p == st->codec->pix_fmt)
719 if(st->codec->pix_fmt != PIX_FMT_NONE)
720 av_log(NULL, AV_LOG_WARNING,
721 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
722 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
724 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
725 st->codec->pix_fmt = codec->pix_fmts[0];
731 get_sync_ipts(const OutputStream *ost)
733 const InputStream *ist = ost->sync_ist;
734 OutputFile *of = &output_files[ost->file_index];
735 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
738 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
742 AVPacket new_pkt= *pkt;
743 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
744 &new_pkt.data, &new_pkt.size,
745 pkt->data, pkt->size,
746 pkt->flags & AV_PKT_FLAG_KEY);
749 new_pkt.destruct= av_destruct_packet;
751 fprintf(stderr, "%s failed for stream %d, codec %s",
752 bsfc->filter->name, pkt->stream_index,
753 avctx->codec ? avctx->codec->name : "copy");
763 ret= av_interleaved_write_frame(s, pkt);
765 print_error("av_interleaved_write_frame()", ret);
770 static void do_audio_out(AVFormatContext *s,
773 unsigned char *buf, int size)
776 int64_t audio_out_size, audio_buf_size;
777 int64_t allocated_for_size= size;
779 int size_out, frame_bytes, ret, resample_changed;
780 AVCodecContext *enc= ost->st->codec;
781 AVCodecContext *dec= ist->st->codec;
782 int osize = av_get_bytes_per_sample(enc->sample_fmt);
783 int isize = av_get_bytes_per_sample(dec->sample_fmt);
784 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
787 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
788 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
789 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
790 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
791 audio_buf_size*= osize*enc->channels;
793 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
794 if(coded_bps > 8*osize)
795 audio_out_size= audio_out_size * coded_bps / (8*osize);
796 audio_out_size += FF_MIN_BUFFER_SIZE;
798 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
799 fprintf(stderr, "Buffer sizes too large\n");
803 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
804 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
805 if (!audio_buf || !audio_out){
806 fprintf(stderr, "Out of memory in do_audio_out\n");
810 if (enc->channels != dec->channels)
811 ost->audio_resample = 1;
813 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
814 ost->resample_channels != dec->channels ||
815 ost->resample_sample_rate != dec->sample_rate;
817 if ((ost->audio_resample && !ost->resample) || resample_changed) {
818 if (resample_changed) {
819 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",
820 ist->file_index, ist->st->index,
821 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
822 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
823 ost->resample_sample_fmt = dec->sample_fmt;
824 ost->resample_channels = dec->channels;
825 ost->resample_sample_rate = dec->sample_rate;
827 audio_resample_close(ost->resample);
829 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
830 if (audio_sync_method <= 1 &&
831 ost->resample_sample_fmt == enc->sample_fmt &&
832 ost->resample_channels == enc->channels &&
833 ost->resample_sample_rate == enc->sample_rate) {
834 ost->resample = NULL;
835 ost->audio_resample = 0;
837 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
838 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
839 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
840 enc->sample_rate, dec->sample_rate,
841 enc->sample_fmt, dec->sample_fmt,
843 if (!ost->resample) {
844 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
845 dec->channels, dec->sample_rate,
846 enc->channels, enc->sample_rate);
852 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
853 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
854 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
855 if (ost->reformat_ctx)
856 av_audio_convert_free(ost->reformat_ctx);
857 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
858 dec->sample_fmt, 1, NULL, 0);
859 if (!ost->reformat_ctx) {
860 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
861 av_get_sample_fmt_name(dec->sample_fmt),
862 av_get_sample_fmt_name(enc->sample_fmt));
865 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
868 if(audio_sync_method){
869 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
870 - av_fifo_size(ost->fifo)/(enc->channels * 2);
871 double idelta= delta*dec->sample_rate / enc->sample_rate;
872 int byte_delta= ((int)idelta)*2*dec->channels;
874 //FIXME resample delay
875 if(fabs(delta) > 50){
876 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
878 byte_delta= FFMAX(byte_delta, -size);
882 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
887 static uint8_t *input_tmp= NULL;
888 input_tmp= av_realloc(input_tmp, byte_delta + size);
890 if(byte_delta > allocated_for_size - size){
891 allocated_for_size= byte_delta + (int64_t)size;
896 memset(input_tmp, 0, byte_delta);
897 memcpy(input_tmp + byte_delta, buf, size);
901 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
903 }else if(audio_sync_method>1){
904 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
905 av_assert0(ost->audio_resample);
907 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
908 // 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));
909 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
913 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
914 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
916 if (ost->audio_resample) {
918 size_out = audio_resample(ost->resample,
919 (short *)buftmp, (short *)buf,
920 size / (dec->channels * isize));
921 size_out = size_out * enc->channels * osize;
927 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
928 const void *ibuf[6]= {buftmp};
929 void *obuf[6]= {audio_buf};
930 int istride[6]= {isize};
931 int ostride[6]= {osize};
932 int len= size_out/istride[0];
933 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
934 printf("av_audio_convert() failed\n");
940 size_out = len*osize;
943 /* now encode as many frames as possible */
944 if (enc->frame_size > 1) {
945 /* output resampled raw samples */
946 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
947 fprintf(stderr, "av_fifo_realloc2() failed\n");
950 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
952 frame_bytes = enc->frame_size * osize * enc->channels;
954 while (av_fifo_size(ost->fifo) >= frame_bytes) {
956 av_init_packet(&pkt);
958 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
960 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
962 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
965 fprintf(stderr, "Audio encoding failed\n");
969 pkt.stream_index= ost->index;
972 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
973 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
974 pkt.flags |= AV_PKT_FLAG_KEY;
975 write_frame(s, &pkt, enc, ost->bitstream_filters);
977 ost->sync_opts += enc->frame_size;
981 av_init_packet(&pkt);
983 ost->sync_opts += size_out / (osize * enc->channels);
985 /* output a pcm frame */
986 /* determine the size of the coded buffer */
989 size_out = size_out*coded_bps/8;
991 if(size_out > audio_out_size){
992 fprintf(stderr, "Internal error, buffer size too small\n");
996 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
997 ret = avcodec_encode_audio(enc, audio_out, size_out,
1000 fprintf(stderr, "Audio encoding failed\n");
1004 pkt.stream_index= ost->index;
1005 pkt.data= audio_out;
1007 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1008 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1009 pkt.flags |= AV_PKT_FLAG_KEY;
1010 write_frame(s, &pkt, enc, ost->bitstream_filters);
1014 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1016 AVCodecContext *dec;
1017 AVPicture *picture2;
1018 AVPicture picture_tmp;
1021 dec = ist->st->codec;
1023 /* deinterlace : must be done before any resize */
1024 if (do_deinterlace) {
1027 /* create temporary picture */
1028 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1029 buf = av_malloc(size);
1033 picture2 = &picture_tmp;
1034 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1036 if(avpicture_deinterlace(picture2, picture,
1037 dec->pix_fmt, dec->width, dec->height) < 0) {
1038 /* if error, do not deinterlace */
1039 fprintf(stderr, "Deinterlacing failed\n");
1048 if (picture != picture2)
1049 *picture = *picture2;
1053 static void do_subtitle_out(AVFormatContext *s,
1059 static uint8_t *subtitle_out = NULL;
1060 int subtitle_out_max_size = 1024 * 1024;
1061 int subtitle_out_size, nb, i;
1062 AVCodecContext *enc;
1065 if (pts == AV_NOPTS_VALUE) {
1066 fprintf(stderr, "Subtitle packets must have a pts\n");
1072 enc = ost->st->codec;
1074 if (!subtitle_out) {
1075 subtitle_out = av_malloc(subtitle_out_max_size);
1078 /* Note: DVB subtitle need one packet to draw them and one other
1079 packet to clear them */
1080 /* XXX: signal it in the codec context ? */
1081 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1086 for(i = 0; i < nb; i++) {
1087 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1088 // start_display_time is required to be 0
1089 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1090 sub->end_display_time -= sub->start_display_time;
1091 sub->start_display_time = 0;
1092 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1093 subtitle_out_max_size, sub);
1094 if (subtitle_out_size < 0) {
1095 fprintf(stderr, "Subtitle encoding failed\n");
1099 av_init_packet(&pkt);
1100 pkt.stream_index = ost->index;
1101 pkt.data = subtitle_out;
1102 pkt.size = subtitle_out_size;
1103 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1104 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1105 /* XXX: the pts correction is handled here. Maybe handling
1106 it in the codec would be better */
1108 pkt.pts += 90 * sub->start_display_time;
1110 pkt.pts += 90 * sub->end_display_time;
1112 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1116 static int bit_buffer_size= 1024*256;
1117 static uint8_t *bit_buffer= NULL;
1119 static void do_video_resample(OutputStream *ost,
1121 AVFrame *in_picture,
1122 AVFrame **out_picture)
1124 int resample_changed = 0;
1125 AVCodecContext *dec = ist->st->codec;
1126 AVCodecContext *enc = ost->st->codec;
1127 *out_picture = in_picture;
1129 resample_changed = ost->resample_width != dec->width ||
1130 ost->resample_height != dec->height ||
1131 ost->resample_pix_fmt != dec->pix_fmt;
1133 #if !CONFIG_AVFILTER
1134 if (resample_changed) {
1135 av_log(NULL, AV_LOG_INFO,
1136 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1137 ist->file_index, ist->st->index,
1138 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1139 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1140 ost->resample_width = dec->width;
1141 ost->resample_height = dec->height;
1142 ost->resample_pix_fmt = dec->pix_fmt;
1145 ost->video_resample = dec->width != enc->width ||
1146 dec->height != enc->height ||
1147 dec->pix_fmt != enc->pix_fmt;
1149 if (ost->video_resample) {
1150 *out_picture = &ost->resample_frame;
1151 if (!ost->img_resample_ctx || resample_changed) {
1152 /* initialize the destination picture */
1153 if (!ost->resample_frame.data[0]) {
1154 avcodec_get_frame_defaults(&ost->resample_frame);
1155 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1156 enc->width, enc->height)) {
1157 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1161 /* initialize a new scaler context */
1162 sws_freeContext(ost->img_resample_ctx);
1163 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1164 enc->width, enc->height, enc->pix_fmt,
1165 ost->sws_flags, NULL, NULL, NULL);
1166 if (ost->img_resample_ctx == NULL) {
1167 fprintf(stderr, "Cannot get resampling context\n");
1171 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1172 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1175 if (resample_changed) {
1176 avfilter_graph_free(&ost->graph);
1177 if (configure_video_filters(ist, ost)) {
1178 fprintf(stderr, "Error reinitializing filters!\n");
1183 if (resample_changed) {
1184 ost->resample_width = dec->width;
1185 ost->resample_height = dec->height;
1186 ost->resample_pix_fmt = dec->pix_fmt;
1191 static void do_video_out(AVFormatContext *s,
1194 AVFrame *in_picture,
1195 int *frame_size, float quality)
1197 int nb_frames, i, ret, format_video_sync;
1198 AVFrame *final_picture;
1199 AVCodecContext *enc;
1202 enc = ost->st->codec;
1204 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1206 /* by default, we output a single frame */
1211 format_video_sync = video_sync_method;
1212 if (format_video_sync < 0)
1213 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1215 if (format_video_sync) {
1216 double vdelta = sync_ipts - ost->sync_opts;
1217 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1220 else if (format_video_sync == 2) {
1223 }else if(vdelta>0.6)
1224 ost->sync_opts= lrintf(sync_ipts);
1225 }else if (vdelta > 1.1)
1226 nb_frames = lrintf(vdelta);
1227 //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);
1228 if (nb_frames == 0){
1231 fprintf(stderr, "*** drop!\n");
1232 }else if (nb_frames > 1) {
1233 nb_frames_dup += nb_frames - 1;
1235 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1238 ost->sync_opts= lrintf(sync_ipts);
1240 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1244 do_video_resample(ost, ist, in_picture, &final_picture);
1246 /* duplicates frame if needed */
1247 for(i=0;i<nb_frames;i++) {
1249 av_init_packet(&pkt);
1250 pkt.stream_index= ost->index;
1252 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1253 /* raw pictures are written as AVPicture structure to
1254 avoid any copies. We support temporarily the older
1256 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1257 enc->coded_frame->top_field_first = in_picture->top_field_first;
1258 pkt.data= (uint8_t *)final_picture;
1259 pkt.size= sizeof(AVPicture);
1260 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1261 pkt.flags |= AV_PKT_FLAG_KEY;
1263 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1265 AVFrame big_picture;
1267 big_picture= *final_picture;
1268 /* better than nothing: use input picture interlaced
1270 big_picture.interlaced_frame = in_picture->interlaced_frame;
1271 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1272 if (ost->top_field_first == -1)
1273 big_picture.top_field_first = in_picture->top_field_first;
1275 big_picture.top_field_first = !!ost->top_field_first;
1278 /* handles same_quant here. This is not correct because it may
1279 not be a global option */
1280 big_picture.quality = quality;
1281 if (!enc->me_threshold)
1282 big_picture.pict_type = 0;
1283 // big_picture.pts = AV_NOPTS_VALUE;
1284 big_picture.pts= ost->sync_opts;
1285 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1286 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1287 if (ost->forced_kf_index < ost->forced_kf_count &&
1288 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1289 big_picture.pict_type = AV_PICTURE_TYPE_I;
1290 ost->forced_kf_index++;
1292 ret = avcodec_encode_video(enc,
1293 bit_buffer, bit_buffer_size,
1296 fprintf(stderr, "Video encoding failed\n");
1301 pkt.data= bit_buffer;
1303 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1304 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1305 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1306 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1307 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1309 if(enc->coded_frame->key_frame)
1310 pkt.flags |= AV_PKT_FLAG_KEY;
1311 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1314 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1315 // enc->frame_number-1, ret, enc->pict_type);
1316 /* if two pass, output log */
1317 if (ost->logfile && enc->stats_out) {
1318 fprintf(ost->logfile, "%s", enc->stats_out);
1323 ost->frame_number++;
1327 static double psnr(double d){
1328 return -10.0*log(d)/log(10.0);
1331 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1334 AVCodecContext *enc;
1336 double ti1, bitrate, avg_bitrate;
1338 /* this is executed just the first time do_video_stats is called */
1340 vstats_file = fopen(vstats_filename, "w");
1347 enc = ost->st->codec;
1348 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1349 frame_number = ost->frame_number;
1350 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1351 if (enc->flags&CODEC_FLAG_PSNR)
1352 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1354 fprintf(vstats_file,"f_size= %6d ", frame_size);
1355 /* compute pts value */
1356 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1360 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1361 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1362 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1363 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1364 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1368 static void print_report(OutputFile *output_files,
1369 OutputStream *ost_table, int nb_ostreams,
1370 int is_last_report, int64_t timer_start)
1374 AVFormatContext *oc;
1376 AVCodecContext *enc;
1377 int frame_number, vid, i;
1379 int64_t pts = INT64_MAX;
1380 static int64_t last_time = -1;
1381 static int qp_histogram[52];
1383 if (!is_last_report) {
1385 /* display the report every 0.5 seconds */
1386 cur_time = av_gettime();
1387 if (last_time == -1) {
1388 last_time = cur_time;
1391 if ((cur_time - last_time) < 500000)
1393 last_time = cur_time;
1397 oc = output_files[0].ctx;
1399 total_size = avio_size(oc->pb);
1400 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1401 total_size= avio_tell(oc->pb);
1405 for(i=0;i<nb_ostreams;i++) {
1407 ost = &ost_table[i];
1408 enc = ost->st->codec;
1409 if (!ost->st->stream_copy && enc->coded_frame)
1410 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1411 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1414 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1415 float t = (av_gettime()-timer_start) / 1000000.0;
1417 frame_number = ost->frame_number;
1418 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1419 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1421 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1425 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1428 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1430 if (enc->flags&CODEC_FLAG_PSNR){
1432 double error, error_sum=0;
1433 double scale, scale_sum=0;
1434 char type[3]= {'Y','U','V'};
1435 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1438 error= enc->error[j];
1439 scale= enc->width*enc->height*255.0*255.0*frame_number;
1441 error= enc->coded_frame->error[j];
1442 scale= enc->width*enc->height*255.0*255.0;
1447 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1449 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1453 /* compute min output value */
1454 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1455 ost->st->time_base, AV_TIME_BASE_Q));
1458 if (verbose > 0 || is_last_report) {
1459 int hours, mins, secs, us;
1460 secs = pts / AV_TIME_BASE;
1461 us = pts % AV_TIME_BASE;
1467 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1469 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1470 "size=%8.0fkB time=", total_size / 1024.0);
1471 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1472 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1473 (100 * us) / AV_TIME_BASE);
1474 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1475 "bitrate=%6.1fkbits/s", bitrate);
1477 if (nb_frames_dup || nb_frames_drop)
1478 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1479 nb_frames_dup, nb_frames_drop);
1482 fprintf(stderr, "%s \r", buf);
1487 if (is_last_report && verbose >= 0){
1488 int64_t raw= audio_size + video_size + extra_size;
1489 fprintf(stderr, "\n");
1490 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1494 100.0*(total_size - raw)/raw
1499 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1501 int fill_char = 0x00;
1502 if (sample_fmt == AV_SAMPLE_FMT_U8)
1504 memset(buf, fill_char, size);
1507 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1511 for (i = 0; i < nb_ostreams; i++) {
1512 OutputStream *ost = &ost_table[i];
1513 AVCodecContext *enc = ost->st->codec;
1514 AVFormatContext *os = output_files[ost->file_index].ctx;
1516 if (!ost->encoding_needed)
1519 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1521 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1527 av_init_packet(&pkt);
1528 pkt.stream_index= ost->index;
1530 switch (ost->st->codec->codec_type) {
1531 case AVMEDIA_TYPE_AUDIO:
1532 fifo_bytes = av_fifo_size(ost->fifo);
1534 /* encode any samples remaining in fifo */
1535 if (fifo_bytes > 0) {
1536 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1537 int fs_tmp = enc->frame_size;
1539 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1540 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1541 enc->frame_size = fifo_bytes / (osize * enc->channels);
1543 int frame_bytes = enc->frame_size*osize*enc->channels;
1544 if (allocated_audio_buf_size < frame_bytes)
1546 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1549 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1550 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1551 ost->st->time_base.num, enc->sample_rate);
1552 enc->frame_size = fs_tmp;
1555 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1558 fprintf(stderr, "Audio encoding failed\n");
1562 pkt.flags |= AV_PKT_FLAG_KEY;
1564 case AVMEDIA_TYPE_VIDEO:
1565 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1567 fprintf(stderr, "Video encoding failed\n");
1571 if(enc->coded_frame && enc->coded_frame->key_frame)
1572 pkt.flags |= AV_PKT_FLAG_KEY;
1573 if (ost->logfile && enc->stats_out) {
1574 fprintf(ost->logfile, "%s", enc->stats_out);
1583 pkt.data = bit_buffer;
1585 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1586 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1587 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1592 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1593 static int output_packet(InputStream *ist, int ist_index,
1594 OutputStream *ost_table, int nb_ostreams,
1595 const AVPacket *pkt)
1597 AVFormatContext *os;
1602 void *buffer_to_free = NULL;
1603 static unsigned int samples_size= 0;
1604 AVSubtitle subtitle, *subtitle_to_free;
1605 int64_t pkt_pts = AV_NOPTS_VALUE;
1607 int frame_available;
1612 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1614 if(ist->next_pts == AV_NOPTS_VALUE)
1615 ist->next_pts= ist->pts;
1619 av_init_packet(&avpkt);
1627 if(pkt->dts != AV_NOPTS_VALUE)
1628 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1629 if(pkt->pts != AV_NOPTS_VALUE)
1630 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1632 //while we have more to decode or while the decoder did output something on EOF
1633 while (avpkt.size > 0 || (!pkt && got_output)) {
1634 uint8_t *data_buf, *decoded_data_buf;
1635 int data_size, decoded_data_size;
1637 ist->pts= ist->next_pts;
1639 if(avpkt.size && avpkt.size != pkt->size &&
1640 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1641 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1642 ist->showed_multi_packet_warning=1;
1645 /* decode the packet if needed */
1646 decoded_data_buf = NULL; /* fail safe */
1647 decoded_data_size= 0;
1648 data_buf = avpkt.data;
1649 data_size = avpkt.size;
1650 subtitle_to_free = NULL;
1651 if (ist->decoding_needed) {
1652 switch(ist->st->codec->codec_type) {
1653 case AVMEDIA_TYPE_AUDIO:{
1654 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1655 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1657 samples= av_malloc(samples_size);
1659 decoded_data_size= samples_size;
1660 /* XXX: could avoid copy if PCM 16 bits with same
1661 endianness as CPU */
1662 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1669 got_output = decoded_data_size > 0;
1670 /* Some bug in mpeg audio decoder gives */
1671 /* decoded_data_size < 0, it seems they are overflows */
1673 /* no audio frame */
1676 decoded_data_buf = (uint8_t *)samples;
1677 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1678 (ist->st->codec->sample_rate * ist->st->codec->channels);
1680 case AVMEDIA_TYPE_VIDEO:
1681 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1682 /* XXX: allocate picture correctly */
1683 avcodec_get_frame_defaults(&picture);
1684 avpkt.pts = pkt_pts;
1685 avpkt.dts = ist->pts;
1686 pkt_pts = AV_NOPTS_VALUE;
1688 ret = avcodec_decode_video2(ist->st->codec,
1689 &picture, &got_output, &avpkt);
1690 quality = same_quant ? picture.quality : 0;
1694 /* no picture yet */
1695 goto discard_packet;
1697 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1698 if (ist->st->codec->time_base.num != 0) {
1699 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1700 ist->next_pts += ((int64_t)AV_TIME_BASE *
1701 ist->st->codec->time_base.num * ticks) /
1702 ist->st->codec->time_base.den;
1705 buffer_to_free = NULL;
1706 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1708 case AVMEDIA_TYPE_SUBTITLE:
1709 ret = avcodec_decode_subtitle2(ist->st->codec,
1710 &subtitle, &got_output, &avpkt);
1714 goto discard_packet;
1716 subtitle_to_free = &subtitle;
1723 switch(ist->st->codec->codec_type) {
1724 case AVMEDIA_TYPE_AUDIO:
1725 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1726 ist->st->codec->sample_rate;
1728 case AVMEDIA_TYPE_VIDEO:
1729 if (ist->st->codec->time_base.num != 0) {
1730 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1731 ist->next_pts += ((int64_t)AV_TIME_BASE *
1732 ist->st->codec->time_base.num * ticks) /
1733 ist->st->codec->time_base.den;
1740 // preprocess audio (volume)
1741 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1742 if (audio_volume != 256) {
1745 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1746 int v = ((*volp) * audio_volume + 128) >> 8;
1747 *volp++ = av_clip_int16(v);
1752 /* frame rate emulation */
1753 if (input_files[ist->file_index].rate_emu) {
1754 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1755 int64_t now = av_gettime() - ist->start;
1759 /* if output time reached then transcode raw format,
1760 encode packets and output them */
1761 for (i = 0; i < nb_ostreams; i++) {
1762 OutputFile *of = &output_files[ost_table[i].file_index];
1765 ost = &ost_table[i];
1766 if (ost->source_index != ist_index)
1769 if (of->start_time && ist->pts < of->start_time)
1772 if (of->recording_time != INT64_MAX &&
1773 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1774 (AVRational){1, 1000000}) >= 0) {
1775 ost->is_past_recording_time = 1;
1780 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1781 ost->input_video_filter) {
1782 if (!picture.sample_aspect_ratio.num)
1783 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1784 picture.pts = ist->pts;
1786 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1788 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1789 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1790 while (frame_available) {
1791 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1792 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1793 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1796 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1797 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1801 os = output_files[ost->file_index].ctx;
1803 /* set the input output pts pairs */
1804 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1806 if (ost->encoding_needed) {
1807 av_assert0(ist->decoding_needed);
1808 switch(ost->st->codec->codec_type) {
1809 case AVMEDIA_TYPE_AUDIO:
1810 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1812 case AVMEDIA_TYPE_VIDEO:
1814 if (ost->picref->video && !ost->frame_aspect_ratio)
1815 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1817 do_video_out(os, ost, ist, &picture, &frame_size,
1818 same_quant ? quality : ost->st->codec->global_quality);
1819 if (vstats_filename && frame_size)
1820 do_video_stats(os, ost, frame_size);
1822 case AVMEDIA_TYPE_SUBTITLE:
1823 do_subtitle_out(os, ost, ist, &subtitle,
1830 AVFrame avframe; //FIXME/XXX remove this
1833 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1834 av_init_packet(&opkt);
1836 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1837 #if !CONFIG_AVFILTER
1843 /* no reencoding needed : output the packet directly */
1844 /* force the input stream PTS */
1846 avcodec_get_frame_defaults(&avframe);
1847 ost->st->codec->coded_frame= &avframe;
1848 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1850 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1851 audio_size += data_size;
1852 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1853 video_size += data_size;
1857 opkt.stream_index= ost->index;
1858 if(pkt->pts != AV_NOPTS_VALUE)
1859 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1861 opkt.pts= AV_NOPTS_VALUE;
1863 if (pkt->dts == AV_NOPTS_VALUE)
1864 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1866 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1867 opkt.dts -= ost_tb_start_time;
1869 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1870 opkt.flags= pkt->flags;
1872 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1873 if( ost->st->codec->codec_id != CODEC_ID_H264
1874 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1875 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1877 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1878 opkt.destruct= av_destruct_packet;
1880 opkt.data = data_buf;
1881 opkt.size = data_size;
1884 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1885 /* store AVPicture in AVPacket, as expected by the output format */
1886 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1887 opkt.data = (uint8_t *)&pict;
1888 opkt.size = sizeof(AVPicture);
1889 opkt.flags |= AV_PKT_FLAG_KEY;
1891 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1892 ost->st->codec->frame_number++;
1893 ost->frame_number++;
1894 av_free_packet(&opkt);
1898 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1899 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1901 avfilter_unref_buffer(ost->picref);
1906 av_free(buffer_to_free);
1907 /* XXX: allocate the subtitles in the codec ? */
1908 if (subtitle_to_free) {
1909 avsubtitle_free(subtitle_to_free);
1910 subtitle_to_free = NULL;
1918 static void print_sdp(OutputFile *output_files, int n)
1922 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1926 for (i = 0; i < n; i++)
1927 avc[i] = output_files[i].ctx;
1929 av_sdp_create(avc, n, sdp, sizeof(sdp));
1930 printf("SDP:\n%s\n", sdp);
1935 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1936 char *error, int error_len)
1939 InputStream *ist = &input_streams[ist_index];
1940 if (ist->decoding_needed) {
1941 AVCodec *codec = ist->dec;
1943 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1944 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1945 return AVERROR(EINVAL);
1948 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1949 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1950 ist->file_index, ist->st->index);
1951 return AVERROR(EINVAL);
1953 assert_codec_experimental(ist->st->codec, 0);
1954 assert_avoptions(ist->opts);
1957 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;
1958 ist->next_pts = AV_NOPTS_VALUE;
1964 static int transcode_init(OutputFile *output_files,
1965 int nb_output_files,
1966 InputFile *input_files,
1969 int ret = 0, i, j, k;
1970 AVFormatContext *os;
1971 AVCodecContext *codec, *icodec;
1977 /* init framerate emulation */
1978 for (i = 0; i < nb_input_files; i++) {
1979 InputFile *ifile = &input_files[i];
1980 if (ifile->rate_emu)
1981 for (j = 0; j < ifile->nb_streams; j++)
1982 input_streams[j + ifile->ist_index].start = av_gettime();
1985 /* output stream init */
1986 for(i=0;i<nb_output_files;i++) {
1987 os = output_files[i].ctx;
1988 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1989 av_dump_format(os, i, os->filename, 1);
1990 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1991 return AVERROR(EINVAL);
1995 /* for each output stream, we compute the right encoding parameters */
1996 for (i = 0; i < nb_output_streams; i++) {
1997 ost = &output_streams[i];
1998 os = output_files[ost->file_index].ctx;
1999 ist = &input_streams[ost->source_index];
2001 codec = ost->st->codec;
2002 icodec = ist->st->codec;
2004 ost->st->disposition = ist->st->disposition;
2005 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2006 codec->chroma_sample_location = icodec->chroma_sample_location;
2008 if (ost->st->stream_copy) {
2009 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2011 if (extra_size > INT_MAX) {
2012 return AVERROR(EINVAL);
2015 /* if stream_copy is selected, no need to decode or encode */
2016 codec->codec_id = icodec->codec_id;
2017 codec->codec_type = icodec->codec_type;
2019 if(!codec->codec_tag){
2020 if( !os->oformat->codec_tag
2021 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2022 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2023 codec->codec_tag = icodec->codec_tag;
2026 codec->bit_rate = icodec->bit_rate;
2027 codec->rc_max_rate = icodec->rc_max_rate;
2028 codec->rc_buffer_size = icodec->rc_buffer_size;
2029 codec->extradata= av_mallocz(extra_size);
2030 if (!codec->extradata) {
2031 return AVERROR(ENOMEM);
2033 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2034 codec->extradata_size= icodec->extradata_size;
2036 codec->time_base = ist->st->time_base;
2037 if(!strcmp(os->oformat->name, "avi")) {
2038 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){
2039 codec->time_base = icodec->time_base;
2040 codec->time_base.num *= icodec->ticks_per_frame;
2041 codec->time_base.den *= 2;
2043 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2044 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){
2045 codec->time_base = icodec->time_base;
2046 codec->time_base.num *= icodec->ticks_per_frame;
2049 av_reduce(&codec->time_base.num, &codec->time_base.den,
2050 codec->time_base.num, codec->time_base.den, INT_MAX);
2052 switch(codec->codec_type) {
2053 case AVMEDIA_TYPE_AUDIO:
2054 if(audio_volume != 256) {
2055 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2058 codec->channel_layout = icodec->channel_layout;
2059 codec->sample_rate = icodec->sample_rate;
2060 codec->channels = icodec->channels;
2061 codec->frame_size = icodec->frame_size;
2062 codec->audio_service_type = icodec->audio_service_type;
2063 codec->block_align= icodec->block_align;
2064 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2065 codec->block_align= 0;
2066 if(codec->codec_id == CODEC_ID_AC3)
2067 codec->block_align= 0;
2069 case AVMEDIA_TYPE_VIDEO:
2070 codec->pix_fmt = icodec->pix_fmt;
2071 codec->width = icodec->width;
2072 codec->height = icodec->height;
2073 codec->has_b_frames = icodec->has_b_frames;
2074 if (!codec->sample_aspect_ratio.num) {
2075 codec->sample_aspect_ratio =
2076 ost->st->sample_aspect_ratio =
2077 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2078 ist->st->codec->sample_aspect_ratio.num ?
2079 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2082 case AVMEDIA_TYPE_SUBTITLE:
2083 codec->width = icodec->width;
2084 codec->height = icodec->height;
2086 case AVMEDIA_TYPE_DATA:
2093 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2094 switch(codec->codec_type) {
2095 case AVMEDIA_TYPE_AUDIO:
2096 ost->fifo= av_fifo_alloc(1024);
2098 return AVERROR(ENOMEM);
2100 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2101 if (!codec->sample_rate) {
2102 codec->sample_rate = icodec->sample_rate;
2104 choose_sample_rate(ost->st, ost->enc);
2105 codec->time_base = (AVRational){1, codec->sample_rate};
2106 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2107 codec->sample_fmt = icodec->sample_fmt;
2108 choose_sample_fmt(ost->st, ost->enc);
2109 if (!codec->channels) {
2110 codec->channels = icodec->channels;
2111 codec->channel_layout = icodec->channel_layout;
2113 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2114 codec->channel_layout = 0;
2115 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2116 icodec->request_channels = codec->channels;
2117 ist->decoding_needed = 1;
2118 ost->encoding_needed = 1;
2119 ost->resample_sample_fmt = icodec->sample_fmt;
2120 ost->resample_sample_rate = icodec->sample_rate;
2121 ost->resample_channels = icodec->channels;
2123 case AVMEDIA_TYPE_VIDEO:
2124 if (codec->pix_fmt == PIX_FMT_NONE)
2125 codec->pix_fmt = icodec->pix_fmt;
2126 choose_pixel_fmt(ost->st, ost->enc);
2128 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2129 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2133 if (!codec->width || !codec->height) {
2134 codec->width = icodec->width;
2135 codec->height = icodec->height;
2138 ost->video_resample = codec->width != icodec->width ||
2139 codec->height != icodec->height ||
2140 codec->pix_fmt != icodec->pix_fmt;
2141 if (ost->video_resample) {
2142 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2145 ost->resample_height = icodec->height;
2146 ost->resample_width = icodec->width;
2147 ost->resample_pix_fmt= icodec->pix_fmt;
2148 ost->encoding_needed = 1;
2149 ist->decoding_needed = 1;
2151 if (!ost->frame_rate.num)
2152 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2153 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2154 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2155 ost->frame_rate = ost->enc->supported_framerates[idx];
2157 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2158 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2159 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2160 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2161 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2165 tool_registerInfo(input_files[nb_input_files - 1].ctx->duration, output_files[nb_output_files - 1].recording_time);
2166 if (configure_video_filters(ist, ost)) {
2167 fprintf(stderr, "Error opening filters!\n");
2172 case AVMEDIA_TYPE_SUBTITLE:
2173 ost->encoding_needed = 1;
2174 ist->decoding_needed = 1;
2181 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2182 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2183 char logfilename[1024];
2186 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2187 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2189 if (codec->flags & CODEC_FLAG_PASS1) {
2190 f = fopen(logfilename, "wb");
2192 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2198 size_t logbuffer_size;
2199 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2200 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2203 codec->stats_in = logbuffer;
2207 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2208 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2209 int size= codec->width * codec->height;
2210 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2215 bit_buffer = av_malloc(bit_buffer_size);
2217 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2219 return AVERROR(ENOMEM);
2222 /* open each encoder */
2223 for (i = 0; i < nb_output_streams; i++) {
2224 ost = &output_streams[i];
2225 if (ost->encoding_needed) {
2226 AVCodec *codec = ost->enc;
2227 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2229 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2230 ost->st->codec->codec_id, ost->file_index, ost->index);
2231 ret = AVERROR(EINVAL);
2234 if (dec->subtitle_header) {
2235 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2236 if (!ost->st->codec->subtitle_header) {
2237 ret = AVERROR(ENOMEM);
2240 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2241 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2243 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2244 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2245 ost->file_index, ost->index);
2246 ret = AVERROR(EINVAL);
2249 assert_codec_experimental(ost->st->codec, 1);
2250 assert_avoptions(ost->opts);
2251 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2252 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2253 "It takes bits/s as argument, not kbits/s\n");
2254 extra_size += ost->st->codec->extradata_size;
2256 if (ost->st->codec->me_threshold)
2257 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2261 /* init input streams */
2262 for (i = 0; i < nb_input_streams; i++)
2263 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2266 /* discard unused programs */
2267 for (i = 0; i < nb_input_files; i++) {
2268 InputFile *ifile = &input_files[i];
2269 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2270 AVProgram *p = ifile->ctx->programs[j];
2271 int discard = AVDISCARD_ALL;
2273 for (k = 0; k < p->nb_stream_indexes; k++)
2274 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2275 discard = AVDISCARD_DEFAULT;
2278 p->discard = discard;
2282 /* open files and write file headers */
2283 for (i = 0; i < nb_output_files; i++) {
2284 os = output_files[i].ctx;
2285 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2286 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2287 ret = AVERROR(EINVAL);
2290 // assert_avoptions(output_files[i].opts);
2291 if (strcmp(os->oformat->name, "rtp")) {
2297 /* dump the file output parameters - cannot be done before in case
2299 for(i=0;i<nb_output_files;i++) {
2300 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2303 /* dump the stream mapping */
2305 fprintf(stderr, "Stream mapping:\n");
2306 for (i = 0; i < nb_output_streams;i ++) {
2307 ost = &output_streams[i];
2308 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2309 input_streams[ost->source_index].file_index,
2310 input_streams[ost->source_index].st->index,
2313 if (ost->sync_ist != &input_streams[ost->source_index])
2314 fprintf(stderr, " [sync #%d.%d]",
2315 ost->sync_ist->file_index,
2316 ost->sync_ist->st->index);
2317 if (ost->st->stream_copy)
2318 fprintf(stderr, " (copy)");
2320 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2321 input_streams[ost->source_index].dec->name : "?",
2322 ost->enc ? ost->enc->name : "?");
2323 fprintf(stderr, "\n");
2328 fprintf(stderr, "%s\n", error);
2333 print_sdp(output_files, nb_output_files);
2340 * The following code is the main loop of the file converter
2342 static int transcode(OutputFile *output_files,
2343 int nb_output_files,
2344 InputFile *input_files,
2348 AVFormatContext *is, *os;
2352 int no_packet_count=0;
2353 int64_t timer_start;
2356 if (!(no_packet = av_mallocz(nb_input_files)))
2359 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2365 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2366 avio_set_interrupt_cb(decode_interrupt_cb);
2370 timer_start = av_gettime();
2372 for(; received_sigterm == 0;) {
2373 int file_index, ist_index;
2378 ipts_min = INT64_MAX;
2380 /* if 'q' pressed, exits */
2384 /* read_key() returns 0 on EOF */
2388 if (key == '+') verbose++;
2389 if (key == '-') verbose--;
2390 if (key == 's') qp_hist ^= 1;
2393 do_hex_dump = do_pkt_dump = 0;
2394 } else if(do_pkt_dump){
2398 av_log_set_level(AV_LOG_DEBUG);
2400 if (key == 'd' || key == 'D'){
2403 debug = input_streams[0].st->codec->debug<<1;
2404 if(!debug) debug = 1;
2405 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2408 scanf("%d", &debug);
2409 for(i=0;i<nb_input_streams;i++) {
2410 input_streams[i].st->codec->debug = debug;
2412 for(i=0;i<nb_output_streams;i++) {
2413 ost = &output_streams[i];
2414 ost->st->codec->debug = debug;
2416 if(debug) av_log_set_level(AV_LOG_DEBUG);
2417 fprintf(stderr,"debug=%d\n", debug);
2420 fprintf(stderr, "key function\n"
2421 "? show this help\n"
2422 "+ increase verbosity\n"
2423 "- decrease verbosity\n"
2424 "D cycle through available debug modes\n"
2425 "h dump packets/hex press to cycle through the 3 states\n"
2427 "s Show QP histogram\n"
2432 /* select the stream that we must read now by looking at the
2433 smallest output pts */
2435 for (i = 0; i < nb_output_streams; i++) {
2439 ost = &output_streams[i];
2440 of = &output_files[ost->file_index];
2441 os = output_files[ost->file_index].ctx;
2442 ist = &input_streams[ost->source_index];
2443 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2444 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2446 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2448 if (!input_files[ist->file_index].eof_reached){
2449 if(ipts < ipts_min) {
2451 if(input_sync ) file_index = ist->file_index;
2453 if(opts < opts_min) {
2455 if(!input_sync) file_index = ist->file_index;
2458 if (ost->frame_number >= ost->max_frames) {
2460 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2461 output_streams[j].is_past_recording_time = 1;
2465 /* if none, if is finished */
2466 if (file_index < 0) {
2467 if(no_packet_count){
2469 memset(no_packet, 0, nb_input_files);
2476 /* read a frame from it and output it in the fifo */
2477 is = input_files[file_index].ctx;
2478 ret= av_read_frame(is, &pkt);
2479 if(ret == AVERROR(EAGAIN)){
2480 no_packet[file_index]=1;
2485 input_files[file_index].eof_reached = 1;
2493 memset(no_packet, 0, nb_input_files);
2496 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2497 is->streams[pkt.stream_index]);
2499 /* the following test is needed in case new streams appear
2500 dynamically in stream : we ignore them */
2501 if (pkt.stream_index >= input_files[file_index].nb_streams)
2502 goto discard_packet;
2503 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2504 ist = &input_streams[ist_index];
2506 goto discard_packet;
2508 if (pkt.dts != AV_NOPTS_VALUE)
2509 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2510 if (pkt.pts != AV_NOPTS_VALUE)
2511 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2513 if(pkt.pts != AV_NOPTS_VALUE)
2514 pkt.pts *= ist->ts_scale;
2515 if(pkt.dts != AV_NOPTS_VALUE)
2516 pkt.dts *= ist->ts_scale;
2518 // 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);
2519 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2520 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2521 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2522 int64_t delta= pkt_dts - ist->next_pts;
2523 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2524 input_files[ist->file_index].ts_offset -= delta;
2526 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2527 delta, input_files[ist->file_index].ts_offset);
2528 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2529 if(pkt.pts != AV_NOPTS_VALUE)
2530 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2534 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2535 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2538 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2539 ist->file_index, ist->st->index);
2542 av_free_packet(&pkt);
2547 av_free_packet(&pkt);
2549 /* dump report by using the output first video and audio streams */
2550 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2553 /* at the end of stream, we must flush the decoder buffers */
2554 for (i = 0; i < nb_input_streams; i++) {
2555 ist = &input_streams[i];
2556 if (ist->decoding_needed) {
2557 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2560 flush_encoders(output_streams, nb_output_streams);
2564 /* write the trailer if needed and close file */
2565 for(i=0;i<nb_output_files;i++) {
2566 os = output_files[i].ctx;
2567 av_write_trailer(os);
2570 /* dump report by using the first video and audio streams */
2571 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2573 /* close each encoder */
2574 for (i = 0; i < nb_output_streams; i++) {
2575 ost = &output_streams[i];
2576 if (ost->encoding_needed) {
2577 av_freep(&ost->st->codec->stats_in);
2578 avcodec_close(ost->st->codec);
2581 avfilter_graph_free(&ost->graph);
2585 /* close each decoder */
2586 for (i = 0; i < nb_input_streams; i++) {
2587 ist = &input_streams[i];
2588 if (ist->decoding_needed) {
2589 avcodec_close(ist->st->codec);
2597 av_freep(&bit_buffer);
2598 av_freep(&no_packet);
2600 if (output_streams) {
2601 for (i = 0; i < nb_output_streams; i++) {
2602 ost = &output_streams[i];
2604 if (ost->st->stream_copy)
2605 av_freep(&ost->st->codec->extradata);
2607 fclose(ost->logfile);
2608 ost->logfile = NULL;
2610 av_fifo_free(ost->fifo); /* works even if fifo is not
2611 initialized but set to zero */
2612 av_freep(&ost->st->codec->subtitle_header);
2613 av_free(ost->resample_frame.data[0]);
2614 av_free(ost->forced_kf_pts);
2615 if (ost->video_resample)
2616 sws_freeContext(ost->img_resample_ctx);
2618 audio_resample_close(ost->resample);
2619 if (ost->reformat_ctx)
2620 av_audio_convert_free(ost->reformat_ctx);
2621 av_dict_free(&ost->opts);
2628 static int opt_verbose(const char *opt, const char *arg)
2630 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2634 static double parse_frame_aspect_ratio(const char *arg)
2641 p = strchr(arg, ':');
2643 x = strtol(arg, &end, 10);
2645 y = strtol(end+1, &end, 10);
2647 ar = (double)x / (double)y;
2649 ar = strtod(arg, NULL);
2652 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2658 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2660 return parse_option(o, "codec:a", arg, options);
2663 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2665 return parse_option(o, "codec:v", arg, options);
2668 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2670 return parse_option(o, "codec:s", arg, options);
2673 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2675 return parse_option(o, "codec:d", arg, options);
2678 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2680 StreamMap *m = NULL;
2681 int i, negative = 0, file_idx;
2682 int sync_file_idx = -1, sync_stream_idx;
2690 map = av_strdup(arg);
2692 /* parse sync stream first, just pick first matching stream */
2693 if (sync = strchr(map, ',')) {
2695 sync_file_idx = strtol(sync + 1, &sync, 0);
2696 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2697 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2702 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2703 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2704 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2705 sync_stream_idx = i;
2708 if (i == input_files[sync_file_idx].nb_streams) {
2709 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2710 "match any streams.\n", arg);
2716 file_idx = strtol(map, &p, 0);
2717 if (file_idx >= nb_input_files || file_idx < 0) {
2718 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2722 /* disable some already defined maps */
2723 for (i = 0; i < o->nb_stream_maps; i++) {
2724 m = &o->stream_maps[i];
2725 if (check_stream_specifier(input_files[m->file_index].ctx,
2726 input_files[m->file_index].ctx->streams[m->stream_index],
2727 *p == ':' ? p + 1 : p) > 0)
2731 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2732 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2733 *p == ':' ? p + 1 : p) <= 0)
2735 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2736 &o->nb_stream_maps, o->nb_stream_maps + 1);
2737 m = &o->stream_maps[o->nb_stream_maps - 1];
2739 m->file_index = file_idx;
2740 m->stream_index = i;
2742 if (sync_file_idx >= 0) {
2743 m->sync_file_index = sync_file_idx;
2744 m->sync_stream_index = sync_stream_idx;
2746 m->sync_file_index = file_idx;
2747 m->sync_stream_index = i;
2752 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2760 static void parse_meta_type(char *arg, char *type, int *index)
2770 if (*(++arg) == ':')
2771 *index = strtol(++arg, NULL, 0);
2774 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2781 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2783 MetadataMap *m, *m1;
2786 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2787 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2789 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2790 m->file = strtol(arg, &p, 0);
2791 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2793 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2794 if (p = strchr(opt, ':'))
2795 parse_meta_type(p + 1, &m1->type, &m1->index);
2799 if (m->type == 'g' || m1->type == 'g')
2800 o->metadata_global_manual = 1;
2801 if (m->type == 's' || m1->type == 's')
2802 o->metadata_streams_manual = 1;
2803 if (m->type == 'c' || m1->type == 'c')
2804 o->metadata_chapters_manual = 1;
2809 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2811 const char *codec_string = encoder ? "encoder" : "decoder";
2815 return CODEC_ID_NONE;
2817 avcodec_find_encoder_by_name(name) :
2818 avcodec_find_decoder_by_name(name);
2820 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2823 if(codec->type != type) {
2824 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2830 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2832 char *codec_name = NULL;
2834 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2838 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2839 return avcodec_find_encoder(st->codec->codec_id);
2841 } else if (!strcmp(codec_name, "copy"))
2842 st->stream_copy = 1;
2844 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2845 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2846 avcodec_find_decoder_by_name(codec_name);
2853 * Add all the streams from the given input file to the global
2854 * list of input streams.
2856 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2858 int i, rfps, rfps_base;
2860 for (i = 0; i < ic->nb_streams; i++) {
2861 AVStream *st = ic->streams[i];
2862 AVCodecContext *dec = st->codec;
2866 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2867 ist = &input_streams[nb_input_streams - 1];
2869 ist->file_index = nb_input_files;
2871 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2873 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2874 ist->ts_scale = scale;
2876 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2878 ist->dec = avcodec_find_decoder(dec->codec_id);
2880 switch (dec->codec_type) {
2881 case AVMEDIA_TYPE_AUDIO:
2883 ist->dec = avcodec_find_decoder(dec->codec_id);
2884 if(o->audio_disable)
2885 st->discard= AVDISCARD_ALL;
2887 case AVMEDIA_TYPE_VIDEO:
2889 ist->dec = avcodec_find_decoder(dec->codec_id);
2890 rfps = ic->streams[i]->r_frame_rate.num;
2891 rfps_base = ic->streams[i]->r_frame_rate.den;
2893 dec->flags |= CODEC_FLAG_EMU_EDGE;
2896 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2899 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2900 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2902 (float)rfps / rfps_base, rfps, rfps_base);
2905 if (o->video_disable)
2906 st->discard= AVDISCARD_ALL;
2907 else if(video_discard)
2908 st->discard= video_discard;
2910 case AVMEDIA_TYPE_DATA:
2912 case AVMEDIA_TYPE_SUBTITLE:
2914 ist->dec = avcodec_find_decoder(dec->codec_id);
2915 if(o->subtitle_disable)
2916 st->discard = AVDISCARD_ALL;
2918 case AVMEDIA_TYPE_ATTACHMENT:
2919 case AVMEDIA_TYPE_UNKNOWN:
2927 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2929 AVFormatContext *ic;
2930 AVInputFormat *file_iformat = NULL;
2934 AVDictionary **opts;
2935 int orig_nb_streams; // number of streams before avformat_find_stream_info
2938 if (!(file_iformat = av_find_input_format(o->format))) {
2939 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2944 if (!strcmp(filename, "-"))
2947 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2948 !strcmp(filename, "/dev/stdin");
2950 /* get default parameters from command line */
2951 ic = avformat_alloc_context();
2953 print_error(filename, AVERROR(ENOMEM));
2956 if (o->nb_audio_sample_rate) {
2957 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2958 av_dict_set(&format_opts, "sample_rate", buf, 0);
2960 if (o->nb_audio_channels) {
2961 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2962 av_dict_set(&format_opts, "channels", buf, 0);
2964 if (o->nb_frame_rates) {
2965 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2967 if (o->nb_frame_sizes) {
2968 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2970 if (o->nb_frame_pix_fmts)
2971 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2973 ic->flags |= AVFMT_FLAG_NONBLOCK;
2975 /* open the input file with generic libav function */
2976 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2978 print_error(filename, err);
2981 assert_avoptions(format_opts);
2983 /* apply forced codec ids */
2984 for (i = 0; i < ic->nb_streams; i++)
2985 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2987 /* Set AVCodecContext options for avformat_find_stream_info */
2988 opts = setup_find_stream_info_opts(ic, codec_opts);
2989 orig_nb_streams = ic->nb_streams;
2991 /* If not enough info to get the stream parameters, we decode the
2992 first frames to get it. (used in mpeg case for example) */
2993 ret = avformat_find_stream_info(ic, opts);
2994 if (ret < 0 && verbose >= 0) {
2995 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2996 av_close_input_file(ic);
3000 timestamp = o->start_time;
3001 /* add the stream start time */
3002 if (ic->start_time != AV_NOPTS_VALUE)
3003 timestamp += ic->start_time;
3005 /* if seeking requested, we execute it */
3006 if (o->start_time != 0) {
3007 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3009 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3010 filename, (double)timestamp / AV_TIME_BASE);
3014 /* update the current parameters so that they match the one of the input stream */
3015 add_input_streams(o, ic);
3017 /* dump the file content */
3019 av_dump_format(ic, nb_input_files, filename, 0);
3021 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3022 input_files[nb_input_files - 1].ctx = ic;
3023 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3024 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3025 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3027 for (i = 0; i < orig_nb_streams; i++)
3028 av_dict_free(&opts[i]);
3035 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3036 AVCodecContext *avctx)
3042 for (p = kf; *p; p++)
3045 ost->forced_kf_count = n;
3046 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3047 if (!ost->forced_kf_pts) {
3048 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3051 for (i = 0; i < n; i++) {
3052 p = i ? strchr(p, ',') + 1 : kf;
3053 t = parse_time_or_die("force_key_frames", p, 1);
3054 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3058 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3061 AVStream *st = av_new_stream(oc, oc->nb_streams < o->nb_streamid_map ? o->streamid_map[oc->nb_streams] : 0);
3062 int idx = oc->nb_streams - 1;
3063 int64_t max_frames = INT64_MAX;
3064 char *bsf = NULL, *next, *codec_tag = NULL;
3065 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3069 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3073 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3074 nb_output_streams + 1);
3075 ost = &output_streams[nb_output_streams - 1];
3076 ost->file_index = nb_output_files;
3079 st->codec->codec_type = type;
3080 ost->enc = choose_codec(o, oc, st, type);
3082 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3085 avcodec_get_context_defaults3(st->codec, ost->enc);
3086 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3088 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3089 ost->max_frames = max_frames;
3091 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3093 if (next = strchr(bsf, ','))
3095 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3096 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3100 bsfc_prev->next = bsfc;
3102 ost->bitstream_filters = bsfc;
3108 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3110 uint32_t tag = strtol(codec_tag, &next, 0);
3112 tag = AV_RL32(codec_tag);
3113 st->codec->codec_tag = tag;
3116 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3117 if (qscale >= 0 || same_quant) {
3118 st->codec->flags |= CODEC_FLAG_QSCALE;
3119 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3122 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3126 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3129 const char *p = str;
3136 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3143 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3147 AVCodecContext *video_enc;
3149 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3151 video_enc = st->codec;
3153 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3154 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3157 if (!st->stream_copy) {
3158 const char *p = NULL;
3159 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3160 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3161 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3162 int i, force_fps = 0, top_field_first = -1;
3164 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3165 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3166 av_log(NULL, AV_LOG_ERROR, "Invalid framerate value: %s\n", frame_rate);
3170 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3171 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3172 av_log(NULL, AV_LOG_ERROR, "Invalid frame size: %s.\n", frame_size);
3176 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3177 if (frame_aspect_ratio)
3178 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3180 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3181 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3182 av_log(NULL, AV_LOG_ERROR, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3185 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3187 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3189 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3190 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for intra matrix.\n");
3193 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3195 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3197 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3198 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for inter matrix.\n");
3201 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3204 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3207 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3209 fprintf(stderr, "error parsing rc_override\n");
3212 video_enc->rc_override=
3213 av_realloc(video_enc->rc_override,
3214 sizeof(RcOverride)*(i+1));
3215 video_enc->rc_override[i].start_frame= start;
3216 video_enc->rc_override[i].end_frame = end;
3218 video_enc->rc_override[i].qscale= q;
3219 video_enc->rc_override[i].quality_factor= 1.0;
3222 video_enc->rc_override[i].qscale= 0;
3223 video_enc->rc_override[i].quality_factor= -q/100.0;
3228 video_enc->rc_override_count=i;
3229 if (!video_enc->rc_initial_buffer_occupancy)
3230 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3231 video_enc->intra_dc_precision= intra_dc_precision - 8;
3236 video_enc->flags |= CODEC_FLAG_PASS1;
3238 video_enc->flags |= CODEC_FLAG_PASS2;
3242 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3243 if (forced_key_frames)
3244 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3246 MATCH_PER_STREAM_OPT(force_fps, i, force_fps, oc, st);
3247 ost->force_fps = force_fps;
3249 MATCH_PER_STREAM_OPT(top_field_first, i, top_field_first, oc, st);
3250 ost->top_field_first = top_field_first;
3253 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3255 ost->avfilter = av_strdup(filters);
3262 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3266 AVCodecContext *audio_enc;
3268 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3271 audio_enc = st->codec;
3272 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3274 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3275 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3277 if (!st->stream_copy) {
3278 char *sample_fmt = NULL;
3280 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3282 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3284 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3285 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", sample_fmt);
3289 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3295 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3299 AVCodecContext *data_enc;
3301 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3303 data_enc = st->codec;
3304 if (!st->stream_copy) {
3305 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3309 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3310 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3316 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3320 AVCodecContext *subtitle_enc;
3322 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3324 subtitle_enc = st->codec;
3326 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3328 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3329 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3335 /* arg format is "output-stream-index:streamid-value". */
3336 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3342 av_strlcpy(idx_str, arg, sizeof(idx_str));
3343 p = strchr(idx_str, ':');
3346 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3351 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3352 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3353 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3357 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3359 AVFormatContext *is = ifile->ctx;
3360 AVFormatContext *os = ofile->ctx;
3363 for (i = 0; i < is->nb_chapters; i++) {
3364 AVChapter *in_ch = is->chapters[i], *out_ch;
3365 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3366 AV_TIME_BASE_Q, in_ch->time_base);
3367 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3368 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3371 if (in_ch->end < ts_off)
3373 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3376 out_ch = av_mallocz(sizeof(AVChapter));
3378 return AVERROR(ENOMEM);
3380 out_ch->id = in_ch->id;
3381 out_ch->time_base = in_ch->time_base;
3382 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3383 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3386 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3389 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3391 return AVERROR(ENOMEM);
3392 os->chapters[os->nb_chapters - 1] = out_ch;
3397 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3400 AVFormatContext *ic = NULL;
3402 err = avformat_open_input(&ic, filename, NULL, NULL);
3405 /* copy stream format */
3406 for(i=0;i<ic->nb_streams;i++) {
3411 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3412 ost = new_output_stream(o, s, codec->type);
3415 // FIXME: a more elegant solution is needed
3416 memcpy(st, ic->streams[i], sizeof(AVStream));
3417 st->info = av_malloc(sizeof(*st->info));
3418 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3419 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3421 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3422 choose_sample_fmt(st, codec);
3423 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3424 choose_pixel_fmt(st, codec);
3427 av_close_input_file(ic);
3431 static void opt_output_file(void *optctx, const char *filename)
3433 OptionsContext *o = optctx;
3434 AVFormatContext *oc;
3436 AVOutputFormat *file_oformat;
3440 if (!strcmp(filename, "-"))
3443 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3445 print_error(filename, err);
3449 file_oformat= oc->oformat;
3451 if (!strcmp(file_oformat->name, "ffm") &&
3452 av_strstart(filename, "http:", NULL)) {
3453 /* special case for files sent to ffserver: we get the stream
3454 parameters from ffserver */
3455 int err = read_ffserver_streams(o, oc, filename);
3457 print_error(filename, err);
3460 } else if (!o->nb_stream_maps) {
3461 /* pick the "best" stream of each type */
3462 #define NEW_STREAM(type, index)\
3464 ost = new_ ## type ## _stream(o, oc);\
3465 ost->source_index = index;\
3466 ost->sync_ist = &input_streams[index];\
3467 input_streams[index].discard = 0;\
3470 /* video: highest resolution */
3471 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3472 int area = 0, idx = -1;
3473 for (i = 0; i < nb_input_streams; i++) {
3474 ist = &input_streams[i];
3475 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3476 ist->st->codec->width * ist->st->codec->height > area) {
3477 area = ist->st->codec->width * ist->st->codec->height;
3481 NEW_STREAM(video, idx);
3484 /* audio: most channels */
3485 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3486 int channels = 0, idx = -1;
3487 for (i = 0; i < nb_input_streams; i++) {
3488 ist = &input_streams[i];
3489 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3490 ist->st->codec->channels > channels) {
3491 channels = ist->st->codec->channels;
3495 NEW_STREAM(audio, idx);
3498 /* subtitles: pick first */
3499 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3500 for (i = 0; i < nb_input_streams; i++)
3501 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3502 NEW_STREAM(subtitle, i);
3506 /* do something with data? */
3508 for (i = 0; i < o->nb_stream_maps; i++) {
3509 StreamMap *map = &o->stream_maps[i];
3514 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3515 switch (ist->st->codec->codec_type) {
3516 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3517 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3518 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3519 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3521 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3522 map->file_index, map->stream_index);
3526 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3527 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3528 map->sync_stream_index];
3533 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3534 output_files[nb_output_files - 1].ctx = oc;
3535 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3536 output_files[nb_output_files - 1].recording_time = o->recording_time;
3537 output_files[nb_output_files - 1].start_time = o->start_time;
3538 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3539 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3541 /* check filename in case of an image number is expected */
3542 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3543 if (!av_filename_number_test(oc->filename)) {
3544 print_error(oc->filename, AVERROR(EINVAL));
3549 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3550 /* test if it already exists to avoid loosing precious files */
3551 if (!file_overwrite &&
3552 (strchr(filename, ':') == NULL ||
3553 filename[1] == ':' ||
3554 av_strstart(filename, "file:", NULL))) {
3555 if (avio_check(filename, 0) == 0) {
3557 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3559 if (!read_yesno()) {
3560 fprintf(stderr, "Not overwriting - exiting\n");
3565 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3572 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3573 print_error(filename, err);
3578 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3579 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3582 if (o->chapters_input_file >= nb_input_files) {
3583 if (o->chapters_input_file == INT_MAX) {
3584 /* copy chapters from the first input file that has them*/
3585 o->chapters_input_file = -1;
3586 for (i = 0; i < nb_input_files; i++)
3587 if (input_files[i].ctx->nb_chapters) {
3588 o->chapters_input_file = i;
3592 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3593 o->chapters_input_file);
3597 if (o->chapters_input_file >= 0)
3598 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3599 !o->metadata_chapters_manual);
3602 for (i = 0; i < o->nb_meta_data_maps; i++) {
3603 AVFormatContext *files[2];
3604 AVDictionary **meta[2];
3607 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3608 if ((index) < 0 || (index) >= (nb_elems)) {\
3609 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3614 int in_file_index = o->meta_data_maps[i][1].file;
3615 if (in_file_index < 0)
3617 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3620 files[1] = input_files[in_file_index].ctx;
3622 for (j = 0; j < 2; j++) {
3623 MetadataMap *map = &o->meta_data_maps[i][j];
3625 switch (map->type) {
3627 meta[j] = &files[j]->metadata;
3630 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3631 meta[j] = &files[j]->streams[map->index]->metadata;
3634 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3635 meta[j] = &files[j]->chapters[map->index]->metadata;
3638 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3639 meta[j] = &files[j]->programs[map->index]->metadata;
3644 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3647 /* copy global metadata by default */
3648 if (!o->metadata_global_manual && nb_input_files)
3649 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3650 AV_DICT_DONT_OVERWRITE);
3651 if (!o->metadata_streams_manual)
3652 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3653 InputStream *ist = &input_streams[output_streams[i].source_index];
3654 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3657 /* process manually set metadata */
3658 for (i = 0; i < o->nb_metadata; i++) {
3663 val = strchr(o->metadata[i].u.str, '=');
3665 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3666 o->metadata[i].u.str);
3671 parse_meta_type(o->metadata[i].specifier, &type, &index);
3677 if (index < 0 || index >= oc->nb_streams) {
3678 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3681 m = &oc->streams[index]->metadata;
3684 if (index < 0 || index >= oc->nb_chapters) {
3685 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3688 m = &oc->chapters[index]->metadata;
3691 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3695 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3701 /* same option as mencoder */
3702 static int opt_pass(const char *opt, const char *arg)
3704 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3708 static int64_t getutime(void)
3711 struct rusage rusage;
3713 getrusage(RUSAGE_SELF, &rusage);
3714 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3715 #elif HAVE_GETPROCESSTIMES
3717 FILETIME c, e, k, u;
3718 proc = GetCurrentProcess();
3719 GetProcessTimes(proc, &c, &e, &k, &u);
3720 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3722 return av_gettime();
3726 static int64_t getmaxrss(void)
3728 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3729 struct rusage rusage;
3730 getrusage(RUSAGE_SELF, &rusage);
3731 return (int64_t)rusage.ru_maxrss * 1024;
3732 #elif HAVE_GETPROCESSMEMORYINFO
3734 PROCESS_MEMORY_COUNTERS memcounters;
3735 proc = GetCurrentProcess();
3736 memcounters.cb = sizeof(memcounters);
3737 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3738 return memcounters.PeakPagefileUsage;
3744 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3746 return parse_option(o, "q:a", arg, options);
3749 static void show_usage(void)
3751 printf("Hyper fast Audio and Video encoder\n");
3752 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3756 static int opt_help(const char *opt, const char *arg)
3759 AVOutputFormat *oformat = NULL;
3760 AVInputFormat *iformat = NULL;
3761 const AVClass *class;
3763 av_log_set_callback(log_callback_help);
3765 show_help_options(options, "Main options:\n",
3766 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3767 show_help_options(options, "\nAdvanced options:\n",
3768 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3770 show_help_options(options, "\nVideo options:\n",
3771 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3773 show_help_options(options, "\nAdvanced Video options:\n",
3774 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3775 OPT_VIDEO | OPT_EXPERT);
3776 show_help_options(options, "\nAudio options:\n",
3777 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3779 show_help_options(options, "\nAdvanced Audio options:\n",
3780 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3781 OPT_AUDIO | OPT_EXPERT);
3782 show_help_options(options, "\nSubtitle options:\n",
3783 OPT_SUBTITLE | OPT_GRAB,
3785 show_help_options(options, "\nAudio/Video grab options:\n",
3789 class = avcodec_get_class();
3790 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3793 /* individual codec options */
3795 while ((c = av_codec_next(c))) {
3796 if (c->priv_class) {
3797 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3802 class = avformat_get_class();
3803 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3806 /* individual muxer options */
3807 while ((oformat = av_oformat_next(oformat))) {
3808 if (oformat->priv_class) {
3809 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3814 /* individual demuxer options */
3815 while ((iformat = av_iformat_next(iformat))) {
3816 if (iformat->priv_class) {
3817 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3822 class = sws_get_class();
3823 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3827 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3829 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3830 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3832 if(!strncmp(arg, "pal-", 4)) {
3835 } else if(!strncmp(arg, "ntsc-", 5)) {
3838 } else if(!strncmp(arg, "film-", 5)) {
3842 /* Try to determine PAL/NTSC by peeking in the input files */
3843 if(nb_input_files) {
3845 for (j = 0; j < nb_input_files; j++) {
3846 for (i = 0; i < input_files[j].nb_streams; i++) {
3847 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3848 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3850 fr = c->time_base.den * 1000 / c->time_base.num;
3854 } else if((fr == 29970) || (fr == 23976)) {
3863 if(verbose > 0 && norm != UNKNOWN)
3864 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3867 if(norm == UNKNOWN) {
3868 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3869 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3870 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3874 if(!strcmp(arg, "vcd")) {
3875 opt_video_codec(o, "c:v", "mpeg1video");
3876 opt_audio_codec(o, "c:a", "mp2");
3877 parse_option(o, "f", "vcd", options);
3879 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3880 parse_option(o, "r", frame_rates[norm], options);
3881 opt_default("g", norm == PAL ? "15" : "18");
3883 opt_default("b", "1150000");
3884 opt_default("maxrate", "1150000");
3885 opt_default("minrate", "1150000");
3886 opt_default("bufsize", "327680"); // 40*1024*8;
3888 opt_default("b:a", "224000");
3889 parse_option(o, "ar", "44100", options);
3890 parse_option(o, "ac", "2", options);
3892 opt_default("packetsize", "2324");
3893 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3895 /* We have to offset the PTS, so that it is consistent with the SCR.
3896 SCR starts at 36000, but the first two packs contain only padding
3897 and the first pack from the other stream, respectively, may also have
3898 been written before.
3899 So the real data starts at SCR 36000+3*1200. */
3900 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3901 } else if(!strcmp(arg, "svcd")) {
3903 opt_video_codec(o, "c:v", "mpeg2video");
3904 opt_audio_codec(o, "c:a", "mp2");
3905 parse_option(o, "f", "svcd", options);
3907 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
3908 parse_option(o, "r", frame_rates[norm], options);
3909 opt_default("g", norm == PAL ? "15" : "18");
3911 opt_default("b", "2040000");
3912 opt_default("maxrate", "2516000");
3913 opt_default("minrate", "0"); //1145000;
3914 opt_default("bufsize", "1835008"); //224*1024*8;
3915 opt_default("flags", "+scan_offset");
3918 opt_default("b:a", "224000");
3919 parse_option(o, "ar", "44100", options);
3921 opt_default("packetsize", "2324");
3923 } else if(!strcmp(arg, "dvd")) {
3925 opt_video_codec(o, "c:v", "mpeg2video");
3926 opt_audio_codec(o, "c:a", "ac3");
3927 parse_option(o, "f", "dvd", options);
3929 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3930 parse_option(o, "r", frame_rates[norm], options);
3931 opt_default("g", norm == PAL ? "15" : "18");
3933 opt_default("b", "6000000");
3934 opt_default("maxrate", "9000000");
3935 opt_default("minrate", "0"); //1500000;
3936 opt_default("bufsize", "1835008"); //224*1024*8;
3938 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3939 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3941 opt_default("b:a", "448000");
3942 parse_option(o, "ar", "48000", options);
3944 } else if(!strncmp(arg, "dv", 2)) {
3946 parse_option(o, "f", "dv", options);
3948 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3949 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3950 norm == PAL ? "yuv420p" : "yuv411p", options);
3951 parse_option(o, "r", frame_rates[norm], options);
3953 parse_option(o, "ar", "48000", options);
3954 parse_option(o, "ac", "2", options);
3957 fprintf(stderr, "Unknown target: %s\n", arg);
3958 return AVERROR(EINVAL);
3963 static int opt_vstats_file(const char *opt, const char *arg)
3965 av_free (vstats_filename);
3966 vstats_filename=av_strdup (arg);
3970 static int opt_vstats(const char *opt, const char *arg)
3973 time_t today2 = time(NULL);
3974 struct tm *today = localtime(&today2);
3976 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3978 return opt_vstats_file(opt, filename);
3981 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3983 return parse_option(o, "frames:v", arg, options);
3986 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3988 return parse_option(o, "frames:a", arg, options);
3991 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3993 return parse_option(o, "frames:d", arg, options);
3996 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4000 static int opt_passlogfile(const char *opt, const char *arg)
4002 pass_logfilename_prefix = arg;
4003 #if CONFIG_LIBX264_ENCODER
4004 return opt_default("passlogfile", arg);
4010 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4012 return parse_option(o, "tag:v", arg, options);
4015 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4017 return parse_option(o, "tag:a", arg, options);
4020 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4022 return parse_option(o, "tag:s", arg, options);
4025 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4027 return parse_option(o, "filter:v", arg, options);
4030 #define OFFSET(x) offsetof(OptionsContext, x)
4031 static const OptionDef options[] = {
4033 #include "cmdutils_common_opts.h"
4034 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4035 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4036 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4037 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4038 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4039 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4040 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4041 "outfile[,metadata]:infile[,metadata]" },
4042 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4043 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4044 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4045 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4046 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4047 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4048 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4049 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4050 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4051 "add timings for benchmarking" },
4052 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4053 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4054 "dump each input packet" },
4055 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4056 "when dumping packets, also dump the payload" },
4057 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4058 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4059 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4060 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4061 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4062 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4063 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4064 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4065 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4066 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4067 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4068 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4069 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4070 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4071 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4072 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4074 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4078 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4079 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4080 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4081 { "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" },
4082 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4083 { "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" },
4084 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4085 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4086 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4087 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4088 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4089 "use same quantizer as source (implies VBR)" },
4090 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4091 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4092 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4093 "deinterlace pictures" },
4094 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4095 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4097 // さきゅばすインタフェース互換性維持のため処置 引数を新しいvfでなく古いvfiltersのままとする
4098 { "vfilters", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4100 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4101 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4102 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4103 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4104 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4105 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4106 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4107 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4108 { "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" },
4111 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4112 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4113 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4114 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4115 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4116 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4117 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4118 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4119 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4121 /* subtitle options */
4122 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4123 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4124 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4127 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4130 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4131 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4133 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4135 /* data codec support */
4136 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4138 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4142 int main(int argc, char **argv)
4144 OptionsContext o = { 0 };
4149 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4151 if(argc>1 && !strcmp(argv[1], "-d")){
4154 av_log_set_callback(log_callback_null);
4159 avcodec_register_all();
4161 avdevice_register_all();
4164 avfilter_register_all();
4169 if(isatty(STDIN_FILENO))
4170 avio_set_interrupt_cb(decode_interrupt_cb);
4177 parse_options(&o, argc, argv, options, opt_output_file);
4179 if(nb_output_files <= 0 && nb_input_files == 0) {
4181 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4185 /* file converter / grab */
4186 if (nb_output_files <= 0) {
4187 fprintf(stderr, "At least one output file must be specified\n");
4191 if (nb_input_files == 0) {
4192 fprintf(stderr, "At least one input file must be specified\n");
4197 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4199 ti = getutime() - ti;
4201 int maxrss = getmaxrss() / 1024;
4202 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);