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/vsink_buffer.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "ffmpeg";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_FILES 100
113 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 static const char *last_asked_format = NULL;
115 static AVDictionary *ts_scale;
117 static StreamMap *stream_maps = NULL;
118 static int nb_stream_maps;
120 static AVDictionary *codec_names;
122 /* first item specifies output metadata, second is input */
123 static MetadataMap (*meta_data_maps)[2] = NULL;
124 static int nb_meta_data_maps;
125 static int metadata_global_autocopy = 1;
126 static int metadata_streams_autocopy = 1;
127 static int metadata_chapters_autocopy = 1;
129 static int chapters_input_file = INT_MAX;
131 /* indexed by output file stream index */
132 static int *streamid_map = NULL;
133 static int nb_streamid_map = 0;
135 static int frame_width = 0;
136 static int frame_height = 0;
137 static float frame_aspect_ratio = 0;
138 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
139 static int frame_bits_per_raw_sample = 0;
140 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
141 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
142 static AVRational frame_rate;
143 static float video_qscale = 0;
144 static uint16_t *intra_matrix = NULL;
145 static uint16_t *inter_matrix = NULL;
146 static const char *video_rc_override_string=NULL;
147 static int video_disable = 0;
148 static int video_discard = 0;
149 static unsigned int video_codec_tag = 0;
150 static char *video_language = NULL;
151 static int same_quant = 0;
152 static int do_deinterlace = 0;
153 static int top_field_first = -1;
154 static int me_threshold = 0;
155 static int intra_dc_precision = 8;
156 static int loop_input = 0;
157 static int loop_output = AVFMT_NOOUTPUTLOOP;
158 static int qp_hist = 0;
160 static char *vfilters = NULL;
163 static int intra_only = 0;
164 static int audio_sample_rate = 0;
165 #define QSCALE_NONE -99999
166 static float audio_qscale = QSCALE_NONE;
167 static int audio_disable = 0;
168 static int audio_channels = 0;
169 static unsigned int audio_codec_tag = 0;
170 static char *audio_language = NULL;
172 static int subtitle_disable = 0;
173 static char *subtitle_language = NULL;
174 static unsigned int subtitle_codec_tag = 0;
176 static int data_disable = 0;
177 static unsigned int data_codec_tag = 0;
179 static float mux_preload= 0.5;
180 static float mux_max_delay= 0.7;
182 static int64_t recording_time = INT64_MAX;
183 static int64_t start_time = 0;
184 static int64_t input_ts_offset = 0;
185 static int file_overwrite = 0;
186 static AVDictionary *metadata;
187 static int do_benchmark = 0;
188 static int do_hex_dump = 0;
189 static int do_pkt_dump = 0;
190 static int do_psnr = 0;
191 static int do_pass = 0;
192 static const char *pass_logfilename_prefix;
193 static int video_sync_method= -1;
194 static int audio_sync_method= 0;
195 static float audio_drift_threshold= 0.1;
196 static int copy_ts= 0;
197 static int copy_tb= 0;
198 static int opt_shortest = 0;
199 static char *vstats_filename;
200 static FILE *vstats_file;
201 static int opt_programid = 0;
202 static int copy_initial_nonkeyframes = 0;
204 static int rate_emu = 0;
206 static int audio_volume = 256;
208 static int exit_on_error = 0;
209 static int using_stdin = 0;
210 static int verbose = 1;
211 static int run_as_daemon = 0;
212 static int thread_count= 1;
213 static int q_pressed = 0;
214 static int64_t video_size = 0;
215 static int64_t audio_size = 0;
216 static int64_t extra_size = 0;
217 static int nb_frames_dup = 0;
218 static int nb_frames_drop = 0;
219 static int input_sync;
220 static uint64_t limit_filesize = 0;
221 static int force_fps = 0;
222 static char *forced_key_frames = NULL;
224 static float dts_delta_threshold = 10;
226 static int64_t timer_start;
228 static uint8_t *audio_buf;
229 static uint8_t *audio_out;
230 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
232 static short *samples;
234 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
235 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
236 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
238 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
242 typedef struct OutputStream {
243 int file_index; /* file index */
244 int index; /* stream index in the output file */
245 int source_index; /* InputStream index */
246 AVStream *st; /* stream in the output file */
247 int encoding_needed; /* true if encoding needed for this stream */
249 /* input pts and corresponding output pts
251 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
252 struct InputStream *sync_ist; /* input stream to sync against */
253 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
254 AVBitStreamFilterContext *bitstream_filters;
259 AVFrame resample_frame; /* temporary frame for image resampling */
260 struct SwsContext *img_resample_ctx; /* for image resampling */
263 int resample_pix_fmt;
264 AVRational frame_rate;
266 float frame_aspect_ratio;
268 /* forced key frames */
269 int64_t *forced_kf_pts;
275 ReSampleContext *resample; /* for audio resampling */
276 int resample_sample_fmt;
277 int resample_channels;
278 int resample_sample_rate;
280 AVAudioConvert *reformat_ctx;
281 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
285 AVFilterContext *output_video_filter;
286 AVFilterContext *input_video_filter;
287 AVFilterBufferRef *picref;
289 AVFilterGraph *graph;
296 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
297 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
299 typedef struct InputStream {
302 int discard; /* true if stream data should be discarded */
303 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
306 int64_t start; /* time when read started */
307 int64_t next_pts; /* synthetic pts for cases where pkt.pts
309 int64_t pts; /* current pts */
311 int is_start; /* is 1 at the start and after a discontinuity */
312 int showed_multi_packet_warning;
313 int is_past_recording_time;
317 typedef struct InputFile {
318 AVFormatContext *ctx;
319 int eof_reached; /* true if eof reached */
320 int ist_index; /* index of first stream in ist_table */
321 int buffer_size; /* current total buffer size */
328 /* init terminal so that we can grab keys */
329 static struct termios oldtty;
332 typedef struct OutputFile {
333 AVFormatContext *ctx;
337 static InputStream *input_streams = NULL;
338 static int nb_input_streams = 0;
339 static InputFile *input_files = NULL;
340 static int nb_input_files = 0;
342 static OutputFile *output_files = NULL;
343 static int nb_output_files = 0;
347 static int configure_video_filters(InputStream *ist, OutputStream *ost)
349 AVFilterContext *last_filter, *filter;
350 /** filter graph containing all filters including input & output */
351 AVCodecContext *codec = ost->st->codec;
352 AVCodecContext *icodec = ist->st->codec;
353 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
354 AVRational sample_aspect_ratio;
358 ost->graph = avfilter_graph_alloc();
360 if (ist->st->sample_aspect_ratio.num){
361 sample_aspect_ratio = ist->st->sample_aspect_ratio;
363 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
365 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
366 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
367 sample_aspect_ratio.num, sample_aspect_ratio.den);
369 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
370 "src", args, NULL, ost->graph);
373 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
374 "out", NULL, pix_fmts, ost->graph);
377 last_filter = ost->input_video_filter;
379 if (codec->width != icodec->width || codec->height != icodec->height) {
380 snprintf(args, 255, "%d:%d:flags=0x%X",
384 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
385 NULL, args, NULL, ost->graph)) < 0)
387 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
389 last_filter = filter;
392 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
393 ost->graph->scale_sws_opts = av_strdup(args);
396 AVFilterInOut *outputs = avfilter_inout_alloc();
397 AVFilterInOut *inputs = avfilter_inout_alloc();
399 outputs->name = av_strdup("in");
400 outputs->filter_ctx = last_filter;
401 outputs->pad_idx = 0;
402 outputs->next = NULL;
404 inputs->name = av_strdup("out");
405 inputs->filter_ctx = ost->output_video_filter;
409 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
411 av_freep(&ost->avfilter);
413 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
417 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
420 codec->width = ost->output_video_filter->inputs[0]->w;
421 codec->height = ost->output_video_filter->inputs[0]->h;
422 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
423 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
424 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
425 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
429 #endif /* CONFIG_AVFILTER */
431 static void term_exit(void)
433 av_log(NULL, AV_LOG_QUIET, "%s", "");
436 tcsetattr (0, TCSANOW, &oldtty);
440 static volatile int received_sigterm = 0;
443 sigterm_handler(int sig)
445 received_sigterm = sig;
450 static void term_init(void)
460 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
461 |INLCR|IGNCR|ICRNL|IXON);
462 tty.c_oflag |= OPOST;
463 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
464 tty.c_cflag &= ~(CSIZE|PARENB);
469 tcsetattr (0, TCSANOW, &tty);
470 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
474 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
475 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
477 signal(SIGXCPU, sigterm_handler);
481 /* read a key without blocking */
482 static int read_key(void)
497 n = select(1, &rfds, NULL, NULL, &tv);
512 static int decode_interrupt_cb(void)
514 q_pressed += read_key() == 'q';
515 return q_pressed > 1;
518 static int exit_program(int ret)
523 for(i=0;i<nb_output_files;i++) {
524 AVFormatContext *s = output_files[i].ctx;
525 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
527 avformat_free_context(s);
528 av_free(output_streams_for_file[i]);
529 av_dict_free(&output_files[i].opts);
531 for(i=0;i<nb_input_files;i++) {
532 av_close_input_file(input_files[i].ctx);
534 for (i = 0; i < nb_input_streams; i++)
535 av_dict_free(&input_streams[i].opts);
537 av_free(intra_matrix);
538 av_free(inter_matrix);
542 av_free(vstats_filename);
544 av_free(streamid_map);
545 av_free(meta_data_maps);
547 av_freep(&input_streams);
548 av_freep(&input_files);
549 av_freep(&output_files);
554 allocated_audio_buf_size= allocated_audio_out_size= 0;
561 if (received_sigterm) {
563 "Received signal %d: terminating.\n",
564 (int) received_sigterm);
568 exit(ret); /* not all OS-es handle main() return value */
572 static void assert_avoptions(AVDictionary *m)
574 AVDictionaryEntry *t;
575 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
576 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
581 static void assert_codec_experimental(AVCodecContext *c, int encoder)
583 const char *codec_string = encoder ? "encoder" : "decoder";
585 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
586 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
587 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
588 "results.\nAdd '-strict experimental' if you want to use it.\n",
589 codec_string, c->codec->name);
590 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
591 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
592 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
593 codec_string, codec->name);
598 /* similar to ff_dynarray_add() and av_fast_realloc() */
599 static void *grow_array(void *array, int elem_size, int *size, int new_size)
601 if (new_size >= INT_MAX / elem_size) {
602 fprintf(stderr, "Array too big.\n");
605 if (*size < new_size) {
606 uint8_t *tmp = av_realloc(array, new_size*elem_size);
608 fprintf(stderr, "Could not alloc buffer.\n");
611 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
618 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
620 if(codec && codec->sample_fmts){
621 const enum AVSampleFormat *p= codec->sample_fmts;
623 if(*p == st->codec->sample_fmt)
627 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
628 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
629 if(av_get_sample_fmt_name(st->codec->sample_fmt))
630 av_log(NULL, AV_LOG_WARNING,
631 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
632 av_get_sample_fmt_name(st->codec->sample_fmt),
634 av_get_sample_fmt_name(codec->sample_fmts[0]));
635 st->codec->sample_fmt = codec->sample_fmts[0];
640 static void choose_sample_rate(AVStream *st, AVCodec *codec)
642 if(codec && codec->supported_samplerates){
643 const int *p= codec->supported_samplerates;
645 int best_dist=INT_MAX;
647 int dist= abs(st->codec->sample_rate - *p);
648 if(dist < best_dist){
654 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
656 st->codec->sample_rate= best;
660 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
662 if(codec && codec->pix_fmts){
663 const enum PixelFormat *p= codec->pix_fmts;
664 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
665 if(st->codec->codec_id==CODEC_ID_MJPEG){
666 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
667 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
668 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};
672 if(*p == st->codec->pix_fmt)
676 if(st->codec->pix_fmt != PIX_FMT_NONE)
677 av_log(NULL, AV_LOG_WARNING,
678 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
679 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
681 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
682 st->codec->pix_fmt = codec->pix_fmts[0];
688 get_sync_ipts(const OutputStream *ost)
690 const InputStream *ist = ost->sync_ist;
691 return (double)(ist->pts - start_time)/AV_TIME_BASE;
694 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
698 AVPacket new_pkt= *pkt;
699 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
700 &new_pkt.data, &new_pkt.size,
701 pkt->data, pkt->size,
702 pkt->flags & AV_PKT_FLAG_KEY);
705 new_pkt.destruct= av_destruct_packet;
707 fprintf(stderr, "%s failed for stream %d, codec %s",
708 bsfc->filter->name, pkt->stream_index,
709 avctx->codec ? avctx->codec->name : "copy");
719 ret= av_interleaved_write_frame(s, pkt);
721 print_error("av_interleaved_write_frame()", ret);
726 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
728 static void do_audio_out(AVFormatContext *s,
731 unsigned char *buf, int size)
734 int64_t audio_out_size, audio_buf_size;
735 int64_t allocated_for_size= size;
737 int size_out, frame_bytes, ret, resample_changed;
738 AVCodecContext *enc= ost->st->codec;
739 AVCodecContext *dec= ist->st->codec;
740 int osize = av_get_bytes_per_sample(enc->sample_fmt);
741 int isize = av_get_bytes_per_sample(dec->sample_fmt);
742 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
745 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
746 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
747 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
748 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
749 audio_buf_size*= osize*enc->channels;
751 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
752 if(coded_bps > 8*osize)
753 audio_out_size= audio_out_size * coded_bps / (8*osize);
754 audio_out_size += FF_MIN_BUFFER_SIZE;
756 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
757 fprintf(stderr, "Buffer sizes too large\n");
761 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
762 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
763 if (!audio_buf || !audio_out){
764 fprintf(stderr, "Out of memory in do_audio_out\n");
768 if (enc->channels != dec->channels)
769 ost->audio_resample = 1;
771 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
772 ost->resample_channels != dec->channels ||
773 ost->resample_sample_rate != dec->sample_rate;
775 if ((ost->audio_resample && !ost->resample) || resample_changed) {
776 if (resample_changed) {
777 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",
778 ist->file_index, ist->st->index,
779 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
780 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
781 ost->resample_sample_fmt = dec->sample_fmt;
782 ost->resample_channels = dec->channels;
783 ost->resample_sample_rate = dec->sample_rate;
785 audio_resample_close(ost->resample);
787 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
788 if (audio_sync_method <= 1 &&
789 ost->resample_sample_fmt == enc->sample_fmt &&
790 ost->resample_channels == enc->channels &&
791 ost->resample_sample_rate == enc->sample_rate) {
792 ost->resample = NULL;
793 ost->audio_resample = 0;
795 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
796 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
797 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
798 enc->sample_rate, dec->sample_rate,
799 enc->sample_fmt, dec->sample_fmt,
801 if (!ost->resample) {
802 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
803 dec->channels, dec->sample_rate,
804 enc->channels, enc->sample_rate);
810 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
811 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
812 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
813 if (ost->reformat_ctx)
814 av_audio_convert_free(ost->reformat_ctx);
815 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
816 dec->sample_fmt, 1, NULL, 0);
817 if (!ost->reformat_ctx) {
818 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
819 av_get_sample_fmt_name(dec->sample_fmt),
820 av_get_sample_fmt_name(enc->sample_fmt));
823 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
826 if(audio_sync_method){
827 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
828 - av_fifo_size(ost->fifo)/(enc->channels * 2);
829 double idelta= delta*dec->sample_rate / enc->sample_rate;
830 int byte_delta= ((int)idelta)*2*dec->channels;
832 //FIXME resample delay
833 if(fabs(delta) > 50){
834 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
836 byte_delta= FFMAX(byte_delta, -size);
840 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
845 static uint8_t *input_tmp= NULL;
846 input_tmp= av_realloc(input_tmp, byte_delta + size);
848 if(byte_delta > allocated_for_size - size){
849 allocated_for_size= byte_delta + (int64_t)size;
854 memset(input_tmp, 0, byte_delta);
855 memcpy(input_tmp + byte_delta, buf, size);
859 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
861 }else if(audio_sync_method>1){
862 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
863 av_assert0(ost->audio_resample);
865 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
866 // 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));
867 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
871 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
872 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
874 if (ost->audio_resample) {
876 size_out = audio_resample(ost->resample,
877 (short *)buftmp, (short *)buf,
878 size / (dec->channels * isize));
879 size_out = size_out * enc->channels * osize;
885 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
886 const void *ibuf[6]= {buftmp};
887 void *obuf[6]= {audio_buf};
888 int istride[6]= {isize};
889 int ostride[6]= {osize};
890 int len= size_out/istride[0];
891 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
892 printf("av_audio_convert() failed\n");
898 size_out = len*osize;
901 /* now encode as many frames as possible */
902 if (enc->frame_size > 1) {
903 /* output resampled raw samples */
904 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
905 fprintf(stderr, "av_fifo_realloc2() failed\n");
908 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
910 frame_bytes = enc->frame_size * osize * enc->channels;
912 while (av_fifo_size(ost->fifo) >= frame_bytes) {
914 av_init_packet(&pkt);
916 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
918 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
920 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
923 fprintf(stderr, "Audio encoding failed\n");
927 pkt.stream_index= ost->index;
930 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
931 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
932 pkt.flags |= AV_PKT_FLAG_KEY;
933 write_frame(s, &pkt, enc, ost->bitstream_filters);
935 ost->sync_opts += enc->frame_size;
939 av_init_packet(&pkt);
941 ost->sync_opts += size_out / (osize * enc->channels);
943 /* output a pcm frame */
944 /* determine the size of the coded buffer */
947 size_out = size_out*coded_bps/8;
949 if(size_out > audio_out_size){
950 fprintf(stderr, "Internal error, buffer size too small\n");
954 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
955 ret = avcodec_encode_audio(enc, audio_out, size_out,
958 fprintf(stderr, "Audio encoding failed\n");
962 pkt.stream_index= ost->index;
965 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
966 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
967 pkt.flags |= AV_PKT_FLAG_KEY;
968 write_frame(s, &pkt, enc, ost->bitstream_filters);
972 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
976 AVPicture picture_tmp;
979 dec = ist->st->codec;
981 /* deinterlace : must be done before any resize */
982 if (do_deinterlace) {
985 /* create temporary picture */
986 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
987 buf = av_malloc(size);
991 picture2 = &picture_tmp;
992 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
994 if(avpicture_deinterlace(picture2, picture,
995 dec->pix_fmt, dec->width, dec->height) < 0) {
996 /* if error, do not deinterlace */
997 fprintf(stderr, "Deinterlacing failed\n");
1006 if (picture != picture2)
1007 *picture = *picture2;
1011 /* we begin to correct av delay at this threshold */
1012 #define AV_DELAY_MAX 0.100
1014 static void do_subtitle_out(AVFormatContext *s,
1020 static uint8_t *subtitle_out = NULL;
1021 int subtitle_out_max_size = 1024 * 1024;
1022 int subtitle_out_size, nb, i;
1023 AVCodecContext *enc;
1026 if (pts == AV_NOPTS_VALUE) {
1027 fprintf(stderr, "Subtitle packets must have a pts\n");
1033 enc = ost->st->codec;
1035 if (!subtitle_out) {
1036 subtitle_out = av_malloc(subtitle_out_max_size);
1039 /* Note: DVB subtitle need one packet to draw them and one other
1040 packet to clear them */
1041 /* XXX: signal it in the codec context ? */
1042 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1047 for(i = 0; i < nb; i++) {
1048 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1049 // start_display_time is required to be 0
1050 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1051 sub->end_display_time -= sub->start_display_time;
1052 sub->start_display_time = 0;
1053 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1054 subtitle_out_max_size, sub);
1055 if (subtitle_out_size < 0) {
1056 fprintf(stderr, "Subtitle encoding failed\n");
1060 av_init_packet(&pkt);
1061 pkt.stream_index = ost->index;
1062 pkt.data = subtitle_out;
1063 pkt.size = subtitle_out_size;
1064 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1065 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1066 /* XXX: the pts correction is handled here. Maybe handling
1067 it in the codec would be better */
1069 pkt.pts += 90 * sub->start_display_time;
1071 pkt.pts += 90 * sub->end_display_time;
1073 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1077 static int bit_buffer_size= 1024*256;
1078 static uint8_t *bit_buffer= NULL;
1080 static void do_video_resample(OutputStream *ost,
1082 AVFrame *in_picture,
1083 AVFrame **out_picture)
1085 int resample_changed = 0;
1086 AVCodecContext *dec = ist->st->codec;
1087 *out_picture = in_picture;
1088 #if !CONFIG_AVFILTER
1089 resample_changed = ost->resample_width != dec->width ||
1090 ost->resample_height != dec->height ||
1091 ost->resample_pix_fmt != dec->pix_fmt;
1093 if (resample_changed) {
1094 av_log(NULL, AV_LOG_INFO,
1095 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1096 ist->file_index, ist->st->index,
1097 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1098 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1099 ost->resample_width = dec->width;
1100 ost->resample_height = dec->height;
1101 ost->resample_pix_fmt = dec->pix_fmt;
1104 ost->video_resample = dec->width != enc->width ||
1105 dec->height != enc->height ||
1106 dec->pix_fmt != enc->pix_fmt;
1108 if (ost->video_resample) {
1109 *out_picture = &ost->resample_frame;
1110 if (!ost->img_resample_ctx || resample_changed) {
1111 /* initialize the destination picture */
1112 if (!ost->resample_frame.data[0]) {
1113 avcodec_get_frame_defaults(&ost->resample_frame);
1114 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1115 enc->width, enc->height)) {
1116 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1120 /* initialize a new scaler context */
1121 sws_freeContext(ost->img_resample_ctx);
1122 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1123 enc->width, enc->height, enc->pix_fmt,
1124 ost->sws_flags, NULL, NULL, NULL);
1125 if (ost->img_resample_ctx == NULL) {
1126 fprintf(stderr, "Cannot get resampling context\n");
1130 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1131 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1137 static void do_video_out(AVFormatContext *s,
1140 AVFrame *in_picture,
1141 int *frame_size, float quality)
1143 int nb_frames, i, ret, format_video_sync;
1144 AVFrame *final_picture;
1145 AVCodecContext *enc, *dec;
1148 enc = ost->st->codec;
1149 dec = ist->st->codec;
1151 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1153 /* by default, we output a single frame */
1158 format_video_sync = video_sync_method;
1159 if (format_video_sync < 0)
1160 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1162 if (format_video_sync) {
1163 double vdelta = sync_ipts - ost->sync_opts;
1164 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1167 else if (format_video_sync == 2) {
1170 }else if(vdelta>0.6)
1171 ost->sync_opts= lrintf(sync_ipts);
1172 }else if (vdelta > 1.1)
1173 nb_frames = lrintf(vdelta);
1174 //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);
1175 if (nb_frames == 0){
1178 fprintf(stderr, "*** drop!\n");
1179 }else if (nb_frames > 1) {
1180 nb_frames_dup += nb_frames - 1;
1182 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1185 ost->sync_opts= lrintf(sync_ipts);
1187 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1191 do_video_resample(ost, ist, in_picture, &final_picture);
1193 /* duplicates frame if needed */
1194 for(i=0;i<nb_frames;i++) {
1196 av_init_packet(&pkt);
1197 pkt.stream_index= ost->index;
1199 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1200 /* raw pictures are written as AVPicture structure to
1201 avoid any copies. We support temorarily the older
1203 AVFrame* old_frame = enc->coded_frame;
1204 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1205 pkt.data= (uint8_t *)final_picture;
1206 pkt.size= sizeof(AVPicture);
1207 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1208 pkt.flags |= AV_PKT_FLAG_KEY;
1210 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1211 enc->coded_frame = old_frame;
1213 AVFrame big_picture;
1215 big_picture= *final_picture;
1216 /* better than nothing: use input picture interlaced
1218 big_picture.interlaced_frame = in_picture->interlaced_frame;
1219 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1220 if(top_field_first == -1)
1221 big_picture.top_field_first = in_picture->top_field_first;
1223 big_picture.top_field_first = top_field_first;
1226 /* handles same_quant here. This is not correct because it may
1227 not be a global option */
1228 big_picture.quality = quality;
1230 big_picture.pict_type = 0;
1231 // big_picture.pts = AV_NOPTS_VALUE;
1232 big_picture.pts= ost->sync_opts;
1233 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1234 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1235 if (ost->forced_kf_index < ost->forced_kf_count &&
1236 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1237 big_picture.pict_type = AV_PICTURE_TYPE_I;
1238 ost->forced_kf_index++;
1240 ret = avcodec_encode_video(enc,
1241 bit_buffer, bit_buffer_size,
1244 fprintf(stderr, "Video encoding failed\n");
1249 pkt.data= bit_buffer;
1251 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1252 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1253 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1254 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1255 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1257 if(enc->coded_frame->key_frame)
1258 pkt.flags |= AV_PKT_FLAG_KEY;
1259 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1262 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1263 // enc->frame_number-1, ret, enc->pict_type);
1264 /* if two pass, output log */
1265 if (ost->logfile && enc->stats_out) {
1266 fprintf(ost->logfile, "%s", enc->stats_out);
1271 ost->frame_number++;
1275 static double psnr(double d){
1276 return -10.0*log(d)/log(10.0);
1279 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1282 AVCodecContext *enc;
1284 double ti1, bitrate, avg_bitrate;
1286 /* this is executed just the first time do_video_stats is called */
1288 vstats_file = fopen(vstats_filename, "w");
1295 enc = ost->st->codec;
1296 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1297 frame_number = ost->frame_number;
1298 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1299 if (enc->flags&CODEC_FLAG_PSNR)
1300 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1302 fprintf(vstats_file,"f_size= %6d ", frame_size);
1303 /* compute pts value */
1304 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1308 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1309 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1310 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1311 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1312 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1316 static void print_report(OutputFile *output_files,
1317 OutputStream **ost_table, int nb_ostreams,
1322 AVFormatContext *oc;
1324 AVCodecContext *enc;
1325 int frame_number, vid, i;
1327 int64_t pts = INT64_MAX;
1328 static int64_t last_time = -1;
1329 static int qp_histogram[52];
1331 if (!is_last_report) {
1333 /* display the report every 0.5 seconds */
1334 cur_time = av_gettime();
1335 if (last_time == -1) {
1336 last_time = cur_time;
1339 if ((cur_time - last_time) < 500000)
1341 last_time = cur_time;
1345 oc = output_files[0].ctx;
1347 total_size = avio_size(oc->pb);
1348 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1349 total_size= avio_tell(oc->pb);
1353 for(i=0;i<nb_ostreams;i++) {
1356 enc = ost->st->codec;
1357 if (!ost->st->stream_copy && enc->coded_frame)
1358 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1359 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1360 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1362 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1363 float t = (av_gettime()-timer_start) / 1000000.0;
1365 frame_number = ost->frame_number;
1366 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1367 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1373 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1376 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1378 if (enc->flags&CODEC_FLAG_PSNR){
1380 double error, error_sum=0;
1381 double scale, scale_sum=0;
1382 char type[3]= {'Y','U','V'};
1383 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1386 error= enc->error[j];
1387 scale= enc->width*enc->height*255.0*255.0*frame_number;
1389 error= enc->coded_frame->error[j];
1390 scale= enc->width*enc->height*255.0*255.0;
1395 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1401 /* compute min output value */
1402 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1403 ost->st->time_base, AV_TIME_BASE_Q));
1406 if (verbose > 0 || is_last_report) {
1407 int hours, mins, secs, us;
1408 secs = pts / AV_TIME_BASE;
1409 us = pts % AV_TIME_BASE;
1415 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1417 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1418 "size=%8.0fkB time=", total_size / 1024.0);
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1420 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1421 (100 * us) / AV_TIME_BASE);
1422 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1423 "bitrate=%6.1fkbits/s", bitrate);
1425 if (nb_frames_dup || nb_frames_drop)
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1427 nb_frames_dup, nb_frames_drop);
1430 fprintf(stderr, "%s \r", buf);
1435 if (is_last_report && verbose >= 0){
1436 int64_t raw= audio_size + video_size + extra_size;
1437 fprintf(stderr, "\n");
1438 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1442 100.0*(total_size - raw)/raw
1447 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1449 int fill_char = 0x00;
1450 if (sample_fmt == AV_SAMPLE_FMT_U8)
1452 memset(buf, fill_char, size);
1455 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1456 static int output_packet(InputStream *ist, int ist_index,
1457 OutputStream **ost_table, int nb_ostreams,
1458 const AVPacket *pkt)
1460 AVFormatContext *os;
1465 void *buffer_to_free = NULL;
1466 static unsigned int samples_size= 0;
1467 AVSubtitle subtitle, *subtitle_to_free;
1468 int64_t pkt_pts = AV_NOPTS_VALUE;
1470 int frame_available;
1475 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1477 if(ist->next_pts == AV_NOPTS_VALUE)
1478 ist->next_pts= ist->pts;
1482 av_init_packet(&avpkt);
1490 if(pkt->dts != AV_NOPTS_VALUE)
1491 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1492 if(pkt->pts != AV_NOPTS_VALUE)
1493 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1495 //while we have more to decode or while the decoder did output something on EOF
1496 while (avpkt.size > 0 || (!pkt && got_output)) {
1497 uint8_t *data_buf, *decoded_data_buf;
1498 int data_size, decoded_data_size;
1500 ist->pts= ist->next_pts;
1502 if(avpkt.size && avpkt.size != pkt->size &&
1503 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1504 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1505 ist->showed_multi_packet_warning=1;
1508 /* decode the packet if needed */
1509 decoded_data_buf = NULL; /* fail safe */
1510 decoded_data_size= 0;
1511 data_buf = avpkt.data;
1512 data_size = avpkt.size;
1513 subtitle_to_free = NULL;
1514 if (ist->decoding_needed) {
1515 switch(ist->st->codec->codec_type) {
1516 case AVMEDIA_TYPE_AUDIO:{
1517 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1518 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1520 samples= av_malloc(samples_size);
1522 decoded_data_size= samples_size;
1523 /* XXX: could avoid copy if PCM 16 bits with same
1524 endianness as CPU */
1525 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1532 got_output = decoded_data_size > 0;
1533 /* Some bug in mpeg audio decoder gives */
1534 /* decoded_data_size < 0, it seems they are overflows */
1536 /* no audio frame */
1539 decoded_data_buf = (uint8_t *)samples;
1540 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1541 (ist->st->codec->sample_rate * ist->st->codec->channels);
1543 case AVMEDIA_TYPE_VIDEO:
1544 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1545 /* XXX: allocate picture correctly */
1546 avcodec_get_frame_defaults(&picture);
1547 avpkt.pts = pkt_pts;
1548 avpkt.dts = ist->pts;
1549 pkt_pts = AV_NOPTS_VALUE;
1551 ret = avcodec_decode_video2(ist->st->codec,
1552 &picture, &got_output, &avpkt);
1553 quality = same_quant ? picture.quality : 0;
1557 /* no picture yet */
1558 goto discard_packet;
1560 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1561 if (ist->st->codec->time_base.num != 0) {
1562 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1563 ist->next_pts += ((int64_t)AV_TIME_BASE *
1564 ist->st->codec->time_base.num * ticks) /
1565 ist->st->codec->time_base.den;
1568 buffer_to_free = NULL;
1569 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1571 case AVMEDIA_TYPE_SUBTITLE:
1572 ret = avcodec_decode_subtitle2(ist->st->codec,
1573 &subtitle, &got_output, &avpkt);
1577 goto discard_packet;
1579 subtitle_to_free = &subtitle;
1586 switch(ist->st->codec->codec_type) {
1587 case AVMEDIA_TYPE_AUDIO:
1588 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1589 ist->st->codec->sample_rate;
1591 case AVMEDIA_TYPE_VIDEO:
1592 if (ist->st->codec->time_base.num != 0) {
1593 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1594 ist->next_pts += ((int64_t)AV_TIME_BASE *
1595 ist->st->codec->time_base.num * ticks) /
1596 ist->st->codec->time_base.den;
1605 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1606 if (start_time == 0 || ist->pts >= start_time) {
1607 for(i=0;i<nb_ostreams;i++) {
1609 if (ost->input_video_filter && ost->source_index == ist_index) {
1610 if (!picture.sample_aspect_ratio.num)
1611 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1612 picture.pts = ist->pts;
1614 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1620 // preprocess audio (volume)
1621 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1622 if (audio_volume != 256) {
1625 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1626 int v = ((*volp) * audio_volume + 128) >> 8;
1627 if (v < -32768) v = -32768;
1628 if (v > 32767) v = 32767;
1634 /* frame rate emulation */
1636 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1637 int64_t now = av_gettime() - ist->start;
1641 /* if output time reached then transcode raw format,
1642 encode packets and output them */
1643 if (start_time == 0 || ist->pts >= start_time)
1644 for(i=0;i<nb_ostreams;i++) {
1649 /* finish if recording time exhausted */
1650 if (recording_time != INT64_MAX &&
1651 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
1653 ist->is_past_recording_time = 1;
1656 if (ost->source_index == ist_index) {
1658 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1659 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1660 while (frame_available) {
1661 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1662 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1663 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1666 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1667 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1671 os = output_files[ost->file_index].ctx;
1673 /* set the input output pts pairs */
1674 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1676 if (ost->encoding_needed) {
1677 av_assert0(ist->decoding_needed);
1678 switch(ost->st->codec->codec_type) {
1679 case AVMEDIA_TYPE_AUDIO:
1680 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1682 case AVMEDIA_TYPE_VIDEO:
1684 if (ost->picref->video && !ost->frame_aspect_ratio)
1685 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1687 do_video_out(os, ost, ist, &picture, &frame_size,
1688 same_quant ? quality : ost->st->codec->global_quality);
1689 if (vstats_filename && frame_size)
1690 do_video_stats(os, ost, frame_size);
1692 case AVMEDIA_TYPE_SUBTITLE:
1693 do_subtitle_out(os, ost, ist, &subtitle,
1700 AVFrame avframe; //FIXME/XXX remove this
1703 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1705 av_init_packet(&opkt);
1707 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1708 #if !CONFIG_AVFILTER
1714 /* no reencoding needed : output the packet directly */
1715 /* force the input stream PTS */
1717 avcodec_get_frame_defaults(&avframe);
1718 ost->st->codec->coded_frame= &avframe;
1719 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1721 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1722 audio_size += data_size;
1723 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1724 video_size += data_size;
1728 opkt.stream_index= ost->index;
1729 if(pkt->pts != AV_NOPTS_VALUE)
1730 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1732 opkt.pts= AV_NOPTS_VALUE;
1734 if (pkt->dts == AV_NOPTS_VALUE)
1735 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1737 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1738 opkt.dts -= ost_tb_start_time;
1740 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1741 opkt.flags= pkt->flags;
1743 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1744 if( ost->st->codec->codec_id != CODEC_ID_H264
1745 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1746 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1748 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1749 opkt.destruct= av_destruct_packet;
1751 opkt.data = data_buf;
1752 opkt.size = data_size;
1755 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1756 /* store AVPicture in AVPacket, as expected by the output format */
1757 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1758 opkt.data = (uint8_t *)&pict;
1759 opkt.size = sizeof(AVPicture);
1760 opkt.flags |= AV_PKT_FLAG_KEY;
1762 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1763 ost->st->codec->frame_number++;
1764 ost->frame_number++;
1765 av_free_packet(&opkt);
1769 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1770 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1771 avfilter_unref_buffer(ost->picref);
1777 av_free(buffer_to_free);
1778 /* XXX: allocate the subtitles in the codec ? */
1779 if (subtitle_to_free) {
1780 avsubtitle_free(subtitle_to_free);
1781 subtitle_to_free = NULL;
1788 for(i=0;i<nb_ostreams;i++) {
1790 if (ost->source_index == ist_index) {
1791 AVCodecContext *enc= ost->st->codec;
1792 os = output_files[ost->file_index].ctx;
1794 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1796 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1799 if (ost->encoding_needed) {
1803 av_init_packet(&pkt);
1804 pkt.stream_index= ost->index;
1806 switch(ost->st->codec->codec_type) {
1807 case AVMEDIA_TYPE_AUDIO:
1808 fifo_bytes = av_fifo_size(ost->fifo);
1810 /* encode any samples remaining in fifo */
1811 if (fifo_bytes > 0) {
1812 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1813 int fs_tmp = enc->frame_size;
1815 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1816 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1817 enc->frame_size = fifo_bytes / (osize * enc->channels);
1819 int frame_bytes = enc->frame_size*osize*enc->channels;
1820 if (allocated_audio_buf_size < frame_bytes)
1822 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1825 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1826 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1827 ost->st->time_base.num, enc->sample_rate);
1828 enc->frame_size = fs_tmp;
1831 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1834 fprintf(stderr, "Audio encoding failed\n");
1838 pkt.flags |= AV_PKT_FLAG_KEY;
1840 case AVMEDIA_TYPE_VIDEO:
1841 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1843 fprintf(stderr, "Video encoding failed\n");
1847 if(enc->coded_frame && enc->coded_frame->key_frame)
1848 pkt.flags |= AV_PKT_FLAG_KEY;
1849 if (ost->logfile && enc->stats_out) {
1850 fprintf(ost->logfile, "%s", enc->stats_out);
1859 pkt.data= bit_buffer;
1861 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1862 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1863 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1873 static void print_sdp(OutputFile *output_files, int n)
1877 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1881 for (i = 0; i < n; i++)
1882 avc[i] = output_files[i].ctx;
1884 av_sdp_create(avc, n, sdp, sizeof(sdp));
1885 printf("SDP:\n%s\n", sdp);
1891 * The following code is the main loop of the file converter
1893 static int transcode(OutputFile *output_files,
1894 int nb_output_files,
1895 InputFile *input_files,
1898 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
1900 AVFormatContext *is, *os;
1901 AVCodecContext *codec, *icodec;
1902 OutputStream *ost, **ost_table = NULL;
1907 uint8_t no_packet[MAX_FILES]={0};
1908 int no_packet_count=0;
1909 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
1910 int nb_streams[AVMEDIA_TYPE_NB]={0};
1913 for (i = 0; i < nb_input_streams; i++)
1914 input_streams[i].start = av_gettime();
1916 /* output stream init */
1918 for(i=0;i<nb_output_files;i++) {
1919 os = output_files[i].ctx;
1920 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1921 av_dump_format(os, i, os->filename, 1);
1922 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1923 ret = AVERROR(EINVAL);
1926 nb_ostreams += os->nb_streams;
1929 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
1933 for(k=0;k<nb_output_files;k++) {
1934 os = output_files[k].ctx;
1935 for(i=0;i<os->nb_streams;i++,n++) {
1936 nb_streams[os->streams[i]->codec->codec_type]++;
1939 for(step=1<<30; step; step>>=1){
1940 int found_streams[AVMEDIA_TYPE_NB]={0};
1941 for(j=0; j<AVMEDIA_TYPE_NB; j++)
1942 nb_frame_threshold[j] += step;
1944 for(j=0; j<nb_input_streams; j++) {
1946 ist = &input_streams[j];
1949 AVFormatContext *f= input_files[ ist->file_index ].ctx;
1951 for(pi=0; pi<f->nb_programs; pi++){
1952 AVProgram *p= f->programs[pi];
1953 if(p->id == opt_programid)
1954 for(si=0; si<p->nb_stream_indexes; si++){
1955 if(f->streams[ p->stream_index[si] ] == ist->st)
1960 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
1961 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
1962 found_streams[ist->st->codec->codec_type]++;
1965 for(j=0; j<AVMEDIA_TYPE_NB; j++)
1966 if(found_streams[j] < nb_streams[j])
1967 nb_frame_threshold[j] -= step;
1970 for(k=0;k<nb_output_files;k++) {
1971 os = output_files[k].ctx;
1972 for (i = 0; i < os->nb_streams; i++, n++)
1973 ost_table[n] = output_streams_for_file[k][i];
1976 /* for each output stream, we compute the right encoding parameters */
1977 for(i=0;i<nb_ostreams;i++) {
1979 os = output_files[ost->file_index].ctx;
1980 ist = &input_streams[ost->source_index];
1982 codec = ost->st->codec;
1983 icodec = ist->st->codec;
1985 ost->st->disposition = ist->st->disposition;
1986 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1987 codec->chroma_sample_location = icodec->chroma_sample_location;
1989 if (ost->st->stream_copy) {
1990 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1992 if (extra_size > INT_MAX)
1995 /* if stream_copy is selected, no need to decode or encode */
1996 codec->codec_id = icodec->codec_id;
1997 codec->codec_type = icodec->codec_type;
1999 if(!codec->codec_tag){
2000 if( !os->oformat->codec_tag
2001 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2002 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2003 codec->codec_tag = icodec->codec_tag;
2006 codec->bit_rate = icodec->bit_rate;
2007 codec->rc_max_rate = icodec->rc_max_rate;
2008 codec->rc_buffer_size = icodec->rc_buffer_size;
2009 codec->extradata= av_mallocz(extra_size);
2010 if (!codec->extradata)
2012 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2013 codec->extradata_size= icodec->extradata_size;
2015 codec->time_base = ist->st->time_base;
2016 if(!strcmp(os->oformat->name, "avi")) {
2017 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){
2018 codec->time_base = icodec->time_base;
2019 codec->time_base.num *= icodec->ticks_per_frame;
2020 codec->time_base.den *= 2;
2022 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2023 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){
2024 codec->time_base = icodec->time_base;
2025 codec->time_base.num *= icodec->ticks_per_frame;
2028 av_reduce(&codec->time_base.num, &codec->time_base.den,
2029 codec->time_base.num, codec->time_base.den, INT_MAX);
2031 switch(codec->codec_type) {
2032 case AVMEDIA_TYPE_AUDIO:
2033 if(audio_volume != 256) {
2034 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2037 codec->channel_layout = icodec->channel_layout;
2038 codec->sample_rate = icodec->sample_rate;
2039 codec->channels = icodec->channels;
2040 codec->frame_size = icodec->frame_size;
2041 codec->audio_service_type = icodec->audio_service_type;
2042 codec->block_align= icodec->block_align;
2043 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2044 codec->block_align= 0;
2045 if(codec->codec_id == CODEC_ID_AC3)
2046 codec->block_align= 0;
2048 case AVMEDIA_TYPE_VIDEO:
2049 codec->pix_fmt = icodec->pix_fmt;
2050 codec->width = icodec->width;
2051 codec->height = icodec->height;
2052 codec->has_b_frames = icodec->has_b_frames;
2053 if (!codec->sample_aspect_ratio.num) {
2054 codec->sample_aspect_ratio =
2055 ost->st->sample_aspect_ratio =
2056 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2057 ist->st->codec->sample_aspect_ratio.num ?
2058 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2061 case AVMEDIA_TYPE_SUBTITLE:
2062 codec->width = icodec->width;
2063 codec->height = icodec->height;
2065 case AVMEDIA_TYPE_DATA:
2072 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2073 switch(codec->codec_type) {
2074 case AVMEDIA_TYPE_AUDIO:
2075 ost->fifo= av_fifo_alloc(1024);
2078 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2079 if (!codec->sample_rate) {
2080 codec->sample_rate = icodec->sample_rate;
2082 choose_sample_rate(ost->st, ost->enc);
2083 codec->time_base = (AVRational){1, codec->sample_rate};
2084 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2085 codec->sample_fmt = icodec->sample_fmt;
2086 choose_sample_fmt(ost->st, ost->enc);
2087 if (!codec->channels) {
2088 codec->channels = icodec->channels;
2089 codec->channel_layout = icodec->channel_layout;
2091 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2092 codec->channel_layout = 0;
2093 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2094 icodec->request_channels = codec->channels;
2095 ist->decoding_needed = 1;
2096 ost->encoding_needed = 1;
2097 ost->resample_sample_fmt = icodec->sample_fmt;
2098 ost->resample_sample_rate = icodec->sample_rate;
2099 ost->resample_channels = icodec->channels;
2101 case AVMEDIA_TYPE_VIDEO:
2102 if (codec->pix_fmt == PIX_FMT_NONE)
2103 codec->pix_fmt = icodec->pix_fmt;
2104 choose_pixel_fmt(ost->st, ost->enc);
2106 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2107 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2111 if (!codec->width || !codec->height) {
2112 codec->width = icodec->width;
2113 codec->height = icodec->height;
2116 ost->video_resample = codec->width != icodec->width ||
2117 codec->height != icodec->height ||
2118 codec->pix_fmt != icodec->pix_fmt;
2119 if (ost->video_resample) {
2120 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2123 ost->resample_height = icodec->height;
2124 ost->resample_width = icodec->width;
2125 ost->resample_pix_fmt= icodec->pix_fmt;
2126 ost->encoding_needed = 1;
2127 ist->decoding_needed = 1;
2129 if (!ost->frame_rate.num)
2130 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2131 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2132 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2133 ost->frame_rate = ost->enc->supported_framerates[idx];
2135 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2136 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2137 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2138 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2139 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2143 if (configure_video_filters(ist, ost)) {
2144 fprintf(stderr, "Error opening filters!\n");
2149 case AVMEDIA_TYPE_SUBTITLE:
2150 ost->encoding_needed = 1;
2151 ist->decoding_needed = 1;
2158 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2159 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2160 char logfilename[1024];
2163 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2164 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2166 if (codec->flags & CODEC_FLAG_PASS1) {
2167 f = fopen(logfilename, "wb");
2169 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2175 size_t logbuffer_size;
2176 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2177 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2180 codec->stats_in = logbuffer;
2184 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2185 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2186 int size= codec->width * codec->height;
2187 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2192 bit_buffer = av_malloc(bit_buffer_size);
2194 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2196 ret = AVERROR(ENOMEM);
2200 /* open each encoder */
2201 for(i=0;i<nb_ostreams;i++) {
2203 if (ost->encoding_needed) {
2204 AVCodec *codec = ost->enc;
2205 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2207 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2208 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2209 ret = AVERROR(EINVAL);
2212 if (dec->subtitle_header) {
2213 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2214 if (!ost->st->codec->subtitle_header) {
2215 ret = AVERROR(ENOMEM);
2218 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2219 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2221 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2222 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2223 ost->file_index, ost->index);
2224 ret = AVERROR(EINVAL);
2227 assert_codec_experimental(ost->st->codec, 1);
2228 assert_avoptions(ost->opts);
2229 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2230 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2231 "It takes bits/s as argument, not kbits/s\n");
2232 extra_size += ost->st->codec->extradata_size;
2236 /* open each decoder */
2237 for (i = 0; i < nb_input_streams; i++) {
2238 ist = &input_streams[i];
2239 if (ist->decoding_needed) {
2240 AVCodec *codec = ist->dec;
2242 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2244 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
2245 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2246 ret = AVERROR(EINVAL);
2249 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2250 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2251 ist->file_index, ist->st->index);
2252 ret = AVERROR(EINVAL);
2255 assert_codec_experimental(ist->st->codec, 0);
2256 assert_avoptions(ost->opts);
2261 for (i = 0; i < nb_input_streams; i++) {
2263 ist = &input_streams[i];
2265 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2266 ist->next_pts = AV_NOPTS_VALUE;
2270 /* open files and write file headers */
2271 for (i = 0; i < nb_output_files; i++) {
2272 os = output_files[i].ctx;
2273 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2274 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2275 ret = AVERROR(EINVAL);
2278 // assert_avoptions(output_files[i].opts);
2279 if (strcmp(os->oformat->name, "rtp")) {
2285 /* dump the file output parameters - cannot be done before in case
2287 for(i=0;i<nb_output_files;i++) {
2288 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2291 /* dump the stream mapping */
2293 fprintf(stderr, "Stream mapping:\n");
2294 for(i=0;i<nb_ostreams;i++) {
2296 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2297 input_streams[ost->source_index].file_index,
2298 input_streams[ost->source_index].st->index,
2301 if (ost->sync_ist != &input_streams[ost->source_index])
2302 fprintf(stderr, " [sync #%d.%d]",
2303 ost->sync_ist->file_index,
2304 ost->sync_ist->st->index);
2305 if(ost->encoding_needed)
2306 fprintf(stderr, ": %s -> %s",
2307 input_streams[ost->source_index].dec ?
2308 input_streams[ost->source_index].dec->name : "?",
2309 ost->enc ? ost->enc->name : "?");
2311 fprintf(stderr, ": copy");
2312 fprintf(stderr, "\n");
2317 fprintf(stderr, "%s\n", error);
2322 print_sdp(output_files, nb_output_files);
2327 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2328 avio_set_interrupt_cb(decode_interrupt_cb);
2332 timer_start = av_gettime();
2334 for(; received_sigterm == 0;) {
2335 int file_index, ist_index;
2341 ipts_min= INT64_MAX;
2343 /* if 'q' pressed, exits */
2347 /* read_key() returns 0 on EOF */
2351 if (key == '+') verbose++;
2352 if (key == '-') verbose--;
2353 if (key == 's') qp_hist ^= 1;
2356 do_hex_dump = do_pkt_dump = 0;
2357 } else if(do_pkt_dump){
2361 av_log_set_level(AV_LOG_DEBUG);
2363 if (key == 'c' || key == 'C'){
2364 char ret[4096], target[64], cmd[256], arg[256]={0};
2366 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2367 if(scanf("%4095[^\n\r]%*c", ret) == 1 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2368 for(i=0;i<nb_ostreams;i++) {
2373 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2374 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2376 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2381 fprintf(stderr, "Parse error\n");
2384 if (key == 'd' || key == 'D'){
2387 debug = input_streams[0].st->codec->debug<<1;
2388 if(!debug) debug = 1;
2389 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2392 scanf("%d", &debug);
2393 for(i=0;i<nb_input_streams;i++) {
2394 input_streams[i].st->codec->debug = debug;
2396 for(i=0;i<nb_ostreams;i++) {
2398 ost->st->codec->debug = debug;
2400 if(debug) av_log_set_level(AV_LOG_DEBUG);
2401 fprintf(stderr,"debug=%d\n", debug);
2404 fprintf(stderr, "key function\n"
2405 "? show this help\n"
2406 "+ increase verbosity\n"
2407 "- decrease verbosity\n"
2408 "c Send command to filtergraph\n"
2409 "D cycle through available debug modes\n"
2410 "h dump packets/hex press to cycle through the 3 states\n"
2412 "s Show QP histogram\n"
2417 /* select the stream that we must read now by looking at the
2418 smallest output pts */
2420 for(i=0;i<nb_ostreams;i++) {
2424 os = output_files[ost->file_index].ctx;
2425 ist = &input_streams[ost->source_index];
2426 if(ist->is_past_recording_time || no_packet[ist->file_index])
2428 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2430 if (!input_files[ist->file_index].eof_reached){
2431 if(ipts < ipts_min) {
2433 if(input_sync ) file_index = ist->file_index;
2435 if(opts < opts_min) {
2437 if(!input_sync) file_index = ist->file_index;
2440 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2445 /* if none, if is finished */
2446 if (file_index < 0) {
2447 if(no_packet_count){
2449 memset(no_packet, 0, sizeof(no_packet));
2456 /* finish if limit size exhausted */
2457 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2460 /* read a frame from it and output it in the fifo */
2461 is = input_files[file_index].ctx;
2462 ret= av_read_frame(is, &pkt);
2463 if(ret == AVERROR(EAGAIN)){
2464 no_packet[file_index]=1;
2469 input_files[file_index].eof_reached = 1;
2477 memset(no_packet, 0, sizeof(no_packet));
2480 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2481 is->streams[pkt.stream_index]);
2483 /* the following test is needed in case new streams appear
2484 dynamically in stream : we ignore them */
2485 if (pkt.stream_index >= input_files[file_index].nb_streams)
2486 goto discard_packet;
2487 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2488 ist = &input_streams[ist_index];
2490 goto discard_packet;
2492 if (pkt.dts != AV_NOPTS_VALUE)
2493 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2494 if (pkt.pts != AV_NOPTS_VALUE)
2495 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2497 if (ist->ts_scale) {
2498 if(pkt.pts != AV_NOPTS_VALUE)
2499 pkt.pts *= ist->ts_scale;
2500 if(pkt.dts != AV_NOPTS_VALUE)
2501 pkt.dts *= ist->ts_scale;
2504 // 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);
2505 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2506 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2507 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2508 int64_t delta= pkt_dts - ist->next_pts;
2509 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2510 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2511 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2512 pkt_dts+1<ist->pts)&& !copy_ts){
2513 input_files[ist->file_index].ts_offset -= delta;
2515 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2516 delta, input_files[ist->file_index].ts_offset);
2517 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2518 if(pkt.pts != AV_NOPTS_VALUE)
2519 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2523 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2524 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2527 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2528 ist->file_index, ist->st->index);
2531 av_free_packet(&pkt);
2536 av_free_packet(&pkt);
2538 /* dump report by using the output first video and audio streams */
2539 print_report(output_files, ost_table, nb_ostreams, 0);
2542 /* at the end of stream, we must flush the decoder buffers */
2543 for (i = 0; i < nb_input_streams; i++) {
2544 ist = &input_streams[i];
2545 if (ist->decoding_needed) {
2546 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2552 /* write the trailer if needed and close file */
2553 for(i=0;i<nb_output_files;i++) {
2554 os = output_files[i].ctx;
2555 av_write_trailer(os);
2558 /* dump report by using the first video and audio streams */
2559 print_report(output_files, ost_table, nb_ostreams, 1);
2561 /* close each encoder */
2562 for(i=0;i<nb_ostreams;i++) {
2564 if (ost->encoding_needed) {
2565 av_freep(&ost->st->codec->stats_in);
2566 avcodec_close(ost->st->codec);
2569 avfilter_graph_free(&ost->graph);
2573 /* close each decoder */
2574 for (i = 0; i < nb_input_streams; i++) {
2575 ist = &input_streams[i];
2576 if (ist->decoding_needed) {
2577 avcodec_close(ist->st->codec);
2585 av_freep(&bit_buffer);
2588 for(i=0;i<nb_ostreams;i++) {
2591 if (ost->st->stream_copy)
2592 av_freep(&ost->st->codec->extradata);
2594 fclose(ost->logfile);
2595 ost->logfile = NULL;
2597 av_fifo_free(ost->fifo); /* works even if fifo is not
2598 initialized but set to zero */
2599 av_freep(&ost->st->codec->subtitle_header);
2600 av_free(ost->resample_frame.data[0]);
2601 av_free(ost->forced_kf_pts);
2602 if (ost->video_resample)
2603 sws_freeContext(ost->img_resample_ctx);
2605 audio_resample_close(ost->resample);
2606 if (ost->reformat_ctx)
2607 av_audio_convert_free(ost->reformat_ctx);
2608 av_dict_free(&ost->opts);
2617 static int opt_format(const char *opt, const char *arg)
2619 last_asked_format = arg;
2623 static int opt_video_rc_override_string(const char *opt, const char *arg)
2625 video_rc_override_string = arg;
2629 static int opt_me_threshold(const char *opt, const char *arg)
2631 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2635 static int opt_verbose(const char *opt, const char *arg)
2637 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2641 static int opt_frame_rate(const char *opt, const char *arg)
2643 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2644 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2650 static int opt_frame_crop(const char *opt, const char *arg)
2652 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2653 return AVERROR(EINVAL);
2656 static int opt_frame_size(const char *opt, const char *arg)
2658 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2659 fprintf(stderr, "Incorrect frame size\n");
2660 return AVERROR(EINVAL);
2665 static int opt_pad(const char *opt, const char *arg) {
2666 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2670 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2672 if (strcmp(arg, "list")) {
2673 frame_pix_fmt = av_get_pix_fmt(arg);
2674 if (frame_pix_fmt == PIX_FMT_NONE) {
2675 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2676 return AVERROR(EINVAL);
2679 opt_pix_fmts(NULL, NULL);
2685 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2692 p = strchr(arg, ':');
2694 x = strtol(arg, &end, 10);
2696 y = strtol(end+1, &end, 10);
2698 ar = (double)x / (double)y;
2700 ar = strtod(arg, NULL);
2703 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2704 return AVERROR(EINVAL);
2706 frame_aspect_ratio = ar;
2710 static int opt_metadata(const char *opt, const char *arg)
2712 char *mid= strchr(arg, '=');
2715 fprintf(stderr, "Missing =\n");
2720 av_dict_set(&metadata, arg, mid, 0);
2725 static int opt_qscale(const char *opt, const char *arg)
2727 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2728 if (video_qscale <= 0 || video_qscale > 255) {
2729 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2730 return AVERROR(EINVAL);
2735 static int opt_top_field_first(const char *opt, const char *arg)
2737 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2738 return opt_default(opt, arg);
2741 static int opt_thread_count(const char *opt, const char *arg)
2743 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2746 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2751 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2753 if (strcmp(arg, "list")) {
2754 audio_sample_fmt = av_get_sample_fmt(arg);
2755 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2756 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2757 return AVERROR(EINVAL);
2762 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2763 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2769 static int opt_audio_rate(const char *opt, const char *arg)
2771 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2775 static int opt_audio_channels(const char *opt, const char *arg)
2777 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2781 static int opt_video_channel(const char *opt, const char *arg)
2783 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2784 return opt_default("channel", arg);
2787 static int opt_video_standard(const char *opt, const char *arg)
2789 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2790 return opt_default("standard", arg);
2793 static int opt_codec(const char *opt, const char *arg)
2795 return av_dict_set(&codec_names, opt, arg, 0);
2798 static int opt_audio_codec(const char *opt, const char *arg)
2800 return opt_codec("codec:a", arg);
2803 static int opt_video_codec(const char *opt, const char *arg)
2805 return opt_codec("codec:v", arg);
2808 static int opt_subtitle_codec(const char *opt, const char *arg)
2810 return opt_codec("codec:s", arg);
2813 static int opt_data_codec(const char *opt, const char *arg)
2815 return opt_codec("codec:d", arg);
2818 static int opt_codec_tag(const char *opt, const char *arg)
2821 uint32_t *codec_tag;
2823 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2824 !strcmp(opt, "vtag") ? &video_codec_tag :
2825 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2829 *codec_tag = strtol(arg, &tail, 0);
2831 *codec_tag = AV_RL32(arg);
2836 static int opt_map(const char *opt, const char *arg)
2838 StreamMap *m = NULL;
2839 int i, negative = 0, file_idx;
2840 int sync_file_idx = -1, sync_stream_idx;
2848 map = av_strdup(arg);
2850 /* parse sync stream first, just pick first matching stream */
2851 if (sync = strchr(map, ',')) {
2853 sync_file_idx = strtol(sync + 1, &sync, 0);
2854 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2855 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2860 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2861 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2862 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2863 sync_stream_idx = i;
2866 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2867 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2868 "match any streams.\n", arg);
2874 file_idx = strtol(map, &p, 0);
2875 if (file_idx >= nb_input_files || file_idx < 0) {
2876 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2880 /* disable some already defined maps */
2881 for (i = 0; i < nb_stream_maps; i++) {
2882 m = &stream_maps[i];
2883 if (check_stream_specifier(input_files[m->file_index].ctx,
2884 input_files[m->file_index].ctx->streams[m->stream_index],
2885 *p == ':' ? p + 1 : p) > 0)
2889 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2890 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2891 *p == ':' ? p + 1 : p) <= 0)
2893 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2894 m = &stream_maps[nb_stream_maps - 1];
2896 m->file_index = file_idx;
2897 m->stream_index = i;
2899 if (sync_file_idx >= 0) {
2900 m->sync_file_index = sync_file_idx;
2901 m->sync_stream_index = sync_stream_idx;
2903 m->sync_file_index = file_idx;
2904 m->sync_stream_index = i;
2909 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2917 static void parse_meta_type(char *arg, char *type, int *index)
2927 if (*(++arg) == ':')
2928 *index = strtol(++arg, NULL, 0);
2931 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2938 static int opt_map_metadata(const char *opt, const char *arg)
2940 MetadataMap *m, *m1;
2943 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2944 &nb_meta_data_maps, nb_meta_data_maps + 1);
2946 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2947 m->file = strtol(arg, &p, 0);
2948 parse_meta_type(p, &m->type, &m->index);
2950 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2951 if (p = strchr(opt, ':'))
2952 parse_meta_type(p, &m1->type, &m1->index);
2956 if (m->type == 'g' || m1->type == 'g')
2957 metadata_global_autocopy = 0;
2958 if (m->type == 's' || m1->type == 's')
2959 metadata_streams_autocopy = 0;
2960 if (m->type == 'c' || m1->type == 'c')
2961 metadata_chapters_autocopy = 0;
2966 static int opt_map_meta_data(const char *opt, const char *arg)
2968 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2969 "Use -map_metadata instead.\n");
2970 return opt_map_metadata(opt, arg);
2973 static int opt_input_ts_scale(const char *opt, const char *arg)
2975 return av_dict_set(&ts_scale, opt, arg, 0);
2978 static int opt_recording_time(const char *opt, const char *arg)
2980 recording_time = parse_time_or_die(opt, arg, 1);
2984 static int opt_start_time(const char *opt, const char *arg)
2986 start_time = parse_time_or_die(opt, arg, 1);
2990 static int opt_recording_timestamp(const char *opt, const char *arg)
2993 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2994 struct tm time = *gmtime((time_t*)&recording_timestamp);
2995 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2996 opt_metadata("metadata", buf);
2998 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2999 "tag instead.\n", opt);
3003 static int opt_input_ts_offset(const char *opt, const char *arg)
3005 input_ts_offset = parse_time_or_die(opt, arg, 1);
3009 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
3011 const char *codec_string = encoder ? "encoder" : "decoder";
3015 return CODEC_ID_NONE;
3017 avcodec_find_encoder_by_name(name) :
3018 avcodec_find_decoder_by_name(name);
3020 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
3023 if(codec->type != type) {
3024 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
3030 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
3032 AVDictionaryEntry *e = NULL;
3033 char *codec_name = NULL;
3036 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
3037 char *p = strchr(e->key, ':');
3039 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
3040 codec_name = e->value;
3047 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
3048 return avcodec_find_encoder(st->codec->codec_id);
3050 } else if (!strcmp(codec_name, "copy"))
3051 st->stream_copy = 1;
3053 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3054 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3055 avcodec_find_decoder_by_name(codec_name);
3062 * Add all the streams from the given input file to the global
3063 * list of input streams.
3065 static void add_input_streams(AVFormatContext *ic)
3067 int i, rfps, rfps_base, ret;
3069 for (i = 0; i < ic->nb_streams; i++) {
3070 AVStream *st = ic->streams[i];
3071 AVCodecContext *dec = st->codec;
3072 AVDictionaryEntry *e = NULL;
3076 dec->thread_count = thread_count;
3078 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3079 ist = &input_streams[nb_input_streams - 1];
3081 ist->file_index = nb_input_files;
3083 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3085 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
3086 char *p = strchr(e->key, ':');
3088 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
3094 ist->ts_scale = strtod(scale, NULL);
3096 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3098 switch (dec->codec_type) {
3099 case AVMEDIA_TYPE_AUDIO:
3101 ist->dec = avcodec_find_decoder(dec->codec_id);
3103 st->discard= AVDISCARD_ALL;
3105 case AVMEDIA_TYPE_VIDEO:
3107 ist->dec = avcodec_find_decoder(dec->codec_id);
3108 rfps = ic->streams[i]->r_frame_rate.num;
3109 rfps_base = ic->streams[i]->r_frame_rate.den;
3111 dec->flags |= CODEC_FLAG_EMU_EDGE;
3114 dec->debug |= FF_DEBUG_MV;
3116 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3119 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3120 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3122 (float)rfps / rfps_base, rfps, rfps_base);
3126 st->discard= AVDISCARD_ALL;
3127 else if(video_discard)
3128 st->discard= video_discard;
3130 case AVMEDIA_TYPE_DATA:
3132 case AVMEDIA_TYPE_SUBTITLE:
3134 ist->dec = avcodec_find_decoder(dec->codec_id);
3135 if(subtitle_disable)
3136 st->discard = AVDISCARD_ALL;
3138 case AVMEDIA_TYPE_ATTACHMENT:
3139 case AVMEDIA_TYPE_UNKNOWN:
3147 static int opt_input_file(const char *opt, const char *filename)
3149 AVFormatContext *ic;
3150 AVInputFormat *file_iformat = NULL;
3154 AVDictionary **opts;
3155 int orig_nb_streams; // number of streams before avformat_find_stream_info
3157 if (last_asked_format) {
3158 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3159 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3162 last_asked_format = NULL;
3165 if (!strcmp(filename, "-"))
3168 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3169 !strcmp(filename, "/dev/stdin");
3171 /* get default parameters from command line */
3172 ic = avformat_alloc_context();
3174 print_error(filename, AVERROR(ENOMEM));
3177 if (audio_sample_rate) {
3178 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3179 av_dict_set(&format_opts, "sample_rate", buf, 0);
3181 if (audio_channels) {
3182 snprintf(buf, sizeof(buf), "%d", audio_channels);
3183 av_dict_set(&format_opts, "channels", buf, 0);
3185 if (frame_rate.num) {
3186 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3187 av_dict_set(&format_opts, "framerate", buf, 0);
3189 if (frame_width && frame_height) {
3190 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3191 av_dict_set(&format_opts, "video_size", buf, 0);
3193 if (frame_pix_fmt != PIX_FMT_NONE)
3194 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3196 ic->flags |= AVFMT_FLAG_NONBLOCK;
3199 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3200 ic->loop_input = loop_input;
3203 /* open the input file with generic libav function */
3204 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3206 print_error(filename, err);
3209 assert_avoptions(format_opts);
3214 for(i=0; i<ic->nb_streams; i++){
3215 ic->streams[i]->discard= AVDISCARD_ALL;
3217 for(i=0; i<ic->nb_programs; i++){
3218 AVProgram *p= ic->programs[i];
3219 if(p->id != opt_programid){
3220 p->discard = AVDISCARD_ALL;
3223 for(j=0; j<p->nb_stream_indexes; j++){
3224 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3229 fprintf(stderr, "Specified program id not found\n");
3235 /* apply forced codec ids */
3236 for (i = 0; i < ic->nb_streams; i++)
3237 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3239 /* Set AVCodecContext options for avformat_find_stream_info */
3240 opts = setup_find_stream_info_opts(ic, codec_opts);
3241 orig_nb_streams = ic->nb_streams;
3243 /* If not enough info to get the stream parameters, we decode the
3244 first frames to get it. (used in mpeg case for example) */
3245 ret = avformat_find_stream_info(ic, opts);
3246 if (ret < 0 && verbose >= 0) {
3247 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3248 av_close_input_file(ic);
3252 timestamp = start_time;
3253 /* add the stream start time */
3254 if (ic->start_time != AV_NOPTS_VALUE)
3255 timestamp += ic->start_time;
3257 /* if seeking requested, we execute it */
3258 if (start_time != 0) {
3259 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3261 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3262 filename, (double)timestamp / AV_TIME_BASE);
3264 /* reset seek info */
3268 /* update the current parameters so that they match the one of the input stream */
3269 add_input_streams(ic);
3271 /* dump the file content */
3273 av_dump_format(ic, nb_input_files, filename, 0);
3275 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3276 input_files[nb_input_files - 1].ctx = ic;
3277 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3278 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3279 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3281 top_field_first = -1;
3282 frame_rate = (AVRational){0, 0};
3283 frame_pix_fmt = PIX_FMT_NONE;
3286 audio_sample_rate = 0;
3288 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3289 av_dict_free(&ts_scale);
3291 for (i = 0; i < orig_nb_streams; i++)
3292 av_dict_free(&opts[i]);
3294 av_dict_free(&codec_names);
3300 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3301 AVCodecContext *avctx)
3307 for (p = kf; *p; p++)
3310 ost->forced_kf_count = n;
3311 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3312 if (!ost->forced_kf_pts) {
3313 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3316 for (i = 0; i < n; i++) {
3317 p = i ? strchr(p, ',') + 1 : kf;
3318 t = parse_time_or_die("force_key_frames", p, 1);
3319 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3323 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3326 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3327 int idx = oc->nb_streams - 1;
3330 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3334 output_streams_for_file[nb_output_files] =
3335 grow_array(output_streams_for_file[nb_output_files],
3336 sizeof(*output_streams_for_file[nb_output_files]),
3337 &nb_output_streams_for_file[nb_output_files],
3339 ost = output_streams_for_file[nb_output_files][idx] =
3340 av_mallocz(sizeof(OutputStream));
3342 fprintf(stderr, "Could not alloc output stream\n");
3345 ost->file_index = nb_output_files;
3348 st->codec->codec_type = type;
3349 ost->enc = choose_codec(oc, st, type, codec_names);
3351 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3354 avcodec_get_context_defaults3(st->codec, ost->enc);
3355 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3357 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3361 static OutputStream *new_video_stream(AVFormatContext *oc)
3365 AVCodecContext *video_enc;
3367 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3369 if (!st->stream_copy) {
3370 ost->frame_aspect_ratio = frame_aspect_ratio;
3371 frame_aspect_ratio = 0;
3373 ost->avfilter = vfilters;
3378 ost->bitstream_filters = video_bitstream_filters;
3379 video_bitstream_filters= NULL;
3381 st->codec->thread_count= thread_count;
3383 video_enc = st->codec;
3386 video_enc->codec_tag= video_codec_tag;
3388 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3389 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3392 if (st->stream_copy) {
3393 video_enc->sample_aspect_ratio =
3394 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3400 ost->frame_rate = frame_rate;
3402 video_enc->width = frame_width;
3403 video_enc->height = frame_height;
3404 video_enc->pix_fmt = frame_pix_fmt;
3405 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3406 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3409 video_enc->gop_size = 0;
3410 if (video_qscale || same_quant) {
3411 video_enc->flags |= CODEC_FLAG_QSCALE;
3412 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3416 video_enc->intra_matrix = intra_matrix;
3418 video_enc->inter_matrix = inter_matrix;
3420 p= video_rc_override_string;
3423 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3425 fprintf(stderr, "error parsing rc_override\n");
3428 video_enc->rc_override=
3429 av_realloc(video_enc->rc_override,
3430 sizeof(RcOverride)*(i+1));
3431 video_enc->rc_override[i].start_frame= start;
3432 video_enc->rc_override[i].end_frame = end;
3434 video_enc->rc_override[i].qscale= q;
3435 video_enc->rc_override[i].quality_factor= 1.0;
3438 video_enc->rc_override[i].qscale= 0;
3439 video_enc->rc_override[i].quality_factor= -q/100.0;
3444 video_enc->rc_override_count=i;
3445 if (!video_enc->rc_initial_buffer_occupancy)
3446 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3447 video_enc->me_threshold= me_threshold;
3448 video_enc->intra_dc_precision= intra_dc_precision - 8;
3451 video_enc->flags|= CODEC_FLAG_PSNR;
3456 video_enc->flags |= CODEC_FLAG_PASS1;
3458 video_enc->flags |= CODEC_FLAG_PASS2;
3462 if (forced_key_frames)
3463 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3465 if (video_language) {
3466 av_dict_set(&st->metadata, "language", video_language, 0);
3467 av_freep(&video_language);
3470 /* reset some key parameters */
3472 av_freep(&forced_key_frames);
3473 frame_pix_fmt = PIX_FMT_NONE;
3477 static OutputStream *new_audio_stream(AVFormatContext *oc)
3481 AVCodecContext *audio_enc;
3483 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3486 ost->bitstream_filters = audio_bitstream_filters;
3487 audio_bitstream_filters= NULL;
3489 st->codec->thread_count= thread_count;
3491 audio_enc = st->codec;
3492 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3495 audio_enc->codec_tag= audio_codec_tag;
3497 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3498 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3500 if (!st->stream_copy) {
3501 if (audio_qscale > QSCALE_NONE) {
3502 audio_enc->flags |= CODEC_FLAG_QSCALE;
3503 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3506 audio_enc->channels = audio_channels;
3507 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3508 audio_enc->sample_fmt = audio_sample_fmt;
3509 if (audio_sample_rate)
3510 audio_enc->sample_rate = audio_sample_rate;
3512 if (audio_language) {
3513 av_dict_set(&st->metadata, "language", audio_language, 0);
3514 av_freep(&audio_language);
3517 /* reset some key parameters */
3523 static OutputStream *new_data_stream(AVFormatContext *oc)
3527 AVCodecContext *data_enc;
3529 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3531 data_enc = st->codec;
3532 if (!st->stream_copy) {
3533 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3538 data_enc->codec_tag= data_codec_tag;
3540 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3541 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3548 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3552 AVCodecContext *subtitle_enc;
3554 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3556 subtitle_enc = st->codec;
3558 ost->bitstream_filters = subtitle_bitstream_filters;
3559 subtitle_bitstream_filters= NULL;
3561 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3563 if(subtitle_codec_tag)
3564 subtitle_enc->codec_tag= subtitle_codec_tag;
3566 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3567 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3570 if (subtitle_language) {
3571 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3572 av_freep(&subtitle_language);
3575 subtitle_disable = 0;
3579 /* arg format is "output-stream-index:streamid-value". */
3580 static int opt_streamid(const char *opt, const char *arg)
3586 av_strlcpy(idx_str, arg, sizeof(idx_str));
3587 p = strchr(idx_str, ':');
3590 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3595 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3596 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3597 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3600 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
3603 AVFormatContext *ic = NULL;
3605 err = avformat_open_input(&ic, filename, NULL, NULL);
3608 /* copy stream format */
3609 for(i=0;i<ic->nb_streams;i++) {
3614 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3615 ost = new_output_stream(s, codec->type);
3618 // FIXME: a more elegant solution is needed
3619 memcpy(st, ic->streams[i], sizeof(AVStream));
3620 st->info = av_malloc(sizeof(*st->info));
3621 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3622 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3624 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3625 choose_sample_fmt(st, codec);
3626 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3627 choose_pixel_fmt(st, codec);
3630 av_close_input_file(ic);
3635 static int copy_chapters(int infile, int outfile)
3637 AVFormatContext *is = input_files[infile].ctx;
3638 AVFormatContext *os = output_files[outfile].ctx;
3641 for (i = 0; i < is->nb_chapters; i++) {
3642 AVChapter *in_ch = is->chapters[i], *out_ch;
3643 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3644 AV_TIME_BASE_Q, in_ch->time_base);
3645 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3646 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3649 if (in_ch->end < ts_off)
3651 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3654 out_ch = av_mallocz(sizeof(AVChapter));
3656 return AVERROR(ENOMEM);
3658 out_ch->id = in_ch->id;
3659 out_ch->time_base = in_ch->time_base;
3660 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3661 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3663 if (metadata_chapters_autocopy)
3664 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3667 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3669 return AVERROR(ENOMEM);
3670 os->chapters[os->nb_chapters - 1] = out_ch;
3675 static int opt_output_file(const char *opt, const char *filename)
3677 AVFormatContext *oc;
3679 AVOutputFormat *file_oformat;
3683 if (!strcmp(filename, "-"))
3686 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3687 last_asked_format = NULL;
3689 print_error(filename, err);
3692 file_oformat= oc->oformat;
3694 if (!strcmp(file_oformat->name, "ffm") &&
3695 av_strstart(filename, "http:", NULL)) {
3696 /* special case for files sent to ffserver: we get the stream
3697 parameters from ffserver */
3698 int err = read_ffserver_streams(oc, filename);
3700 print_error(filename, err);
3703 } else if (!nb_stream_maps) {
3704 /* pick the "best" stream of each type */
3705 #define NEW_STREAM(type, index)\
3707 ost = new_ ## type ## _stream(oc);\
3708 ost->source_index = index;\
3709 ost->sync_ist = &input_streams[index];\
3710 input_streams[index].discard = 0;\
3713 /* video: highest resolution */
3714 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3715 int area = 0, idx = -1;
3716 for (i = 0; i < nb_input_streams; i++) {
3717 ist = &input_streams[i];
3718 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3719 ist->st->codec->width * ist->st->codec->height > area) {
3720 area = ist->st->codec->width * ist->st->codec->height;
3724 NEW_STREAM(video, idx);
3727 /* audio: most channels */
3728 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3729 int channels = 0, idx = -1;
3730 for (i = 0; i < nb_input_streams; i++) {
3731 ist = &input_streams[i];
3732 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3733 ist->st->codec->channels > channels) {
3734 channels = ist->st->codec->channels;
3738 NEW_STREAM(audio, idx);
3741 /* subtitles: pick first */
3742 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3743 for (i = 0; i < nb_input_streams; i++)
3744 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3745 NEW_STREAM(subtitle, i);
3749 /* do something with data? */
3751 for (i = 0; i < nb_stream_maps; i++) {
3752 StreamMap *map = &stream_maps[i];
3757 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3758 switch (ist->st->codec->codec_type) {
3759 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3760 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3761 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3762 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3764 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3765 map->file_index, map->stream_index);
3769 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3770 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3771 map->sync_stream_index];
3776 av_dict_copy(&oc->metadata, metadata, 0);
3777 av_dict_free(&metadata);
3780 if (nb_output_files == MAX_FILES)
3781 exit_program(1); /* a temporary hack until all the other MAX_FILES-sized arrays are removed */
3782 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3783 output_files[nb_output_files - 1].ctx = oc;
3784 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3786 /* check filename in case of an image number is expected */
3787 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3788 if (!av_filename_number_test(oc->filename)) {
3789 print_error(oc->filename, AVERROR(EINVAL));
3794 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3795 /* test if it already exists to avoid loosing precious files */
3796 if (!file_overwrite &&
3797 (strchr(filename, ':') == NULL ||
3798 filename[1] == ':' ||
3799 av_strstart(filename, "file:", NULL))) {
3800 if (avio_check(filename, 0) == 0) {
3802 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3804 if (!read_yesno()) {
3805 fprintf(stderr, "Not overwriting - exiting\n");
3810 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3817 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3818 print_error(filename, err);
3823 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3824 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3826 if (loop_output >= 0) {
3827 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3828 oc->loop_output = loop_output;
3832 if (chapters_input_file >= nb_input_files) {
3833 if (chapters_input_file == INT_MAX) {
3834 /* copy chapters from the first input file that has them*/
3835 chapters_input_file = -1;
3836 for (i = 0; i < nb_input_files; i++)
3837 if (input_files[i].ctx->nb_chapters) {
3838 chapters_input_file = i;
3842 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3843 chapters_input_file);
3847 if (chapters_input_file >= 0)
3848 copy_chapters(chapters_input_file, nb_output_files - 1);
3851 for (i = 0; i < nb_meta_data_maps; i++) {
3852 AVFormatContext *files[2];
3853 AVDictionary **meta[2];
3856 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3857 if ((index) < 0 || (index) >= (nb_elems)) {\
3858 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3863 int in_file_index = meta_data_maps[i][1].file;
3864 if (in_file_index < 0)
3866 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3869 files[1] = input_files[in_file_index].ctx;
3871 for (j = 0; j < 2; j++) {
3872 MetadataMap *map = &meta_data_maps[i][j];
3874 switch (map->type) {
3876 meta[j] = &files[j]->metadata;
3879 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3880 meta[j] = &files[j]->streams[map->index]->metadata;
3883 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3884 meta[j] = &files[j]->chapters[map->index]->metadata;
3887 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3888 meta[j] = &files[j]->programs[map->index]->metadata;
3893 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3896 /* copy global metadata by default */
3897 if (metadata_global_autocopy && nb_input_files)
3898 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3899 AV_DICT_DONT_OVERWRITE);
3900 if (metadata_streams_autocopy)
3901 for (i = 0; i < oc->nb_streams; i++) {
3902 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3903 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3906 frame_rate = (AVRational){0, 0};
3909 audio_sample_rate = 0;
3911 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3912 chapters_input_file = INT_MAX;
3914 av_freep(&meta_data_maps);
3915 nb_meta_data_maps = 0;
3916 metadata_global_autocopy = 1;
3917 metadata_streams_autocopy = 1;
3918 metadata_chapters_autocopy = 1;
3919 av_freep(&stream_maps);
3922 av_dict_free(&codec_names);
3924 av_freep(&forced_key_frames);
3930 /* same option as mencoder */
3931 static int opt_pass(const char *opt, const char *arg)
3933 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3937 static int64_t getutime(void)
3940 struct rusage rusage;
3942 getrusage(RUSAGE_SELF, &rusage);
3943 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3944 #elif HAVE_GETPROCESSTIMES
3946 FILETIME c, e, k, u;
3947 proc = GetCurrentProcess();
3948 GetProcessTimes(proc, &c, &e, &k, &u);
3949 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3951 return av_gettime();
3955 static int64_t getmaxrss(void)
3957 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3958 struct rusage rusage;
3959 getrusage(RUSAGE_SELF, &rusage);
3960 return (int64_t)rusage.ru_maxrss * 1024;
3961 #elif HAVE_GETPROCESSMEMORYINFO
3963 PROCESS_MEMORY_COUNTERS memcounters;
3964 proc = GetCurrentProcess();
3965 memcounters.cb = sizeof(memcounters);
3966 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3967 return memcounters.PeakPagefileUsage;
3973 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3976 const char *p = str;
3983 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3990 static int opt_inter_matrix(const char *opt, const char *arg)
3992 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3993 parse_matrix_coeffs(inter_matrix, arg);
3997 static int opt_intra_matrix(const char *opt, const char *arg)
3999 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4000 parse_matrix_coeffs(intra_matrix, arg);
4004 static void show_usage(void)
4006 printf("Hyper fast Audio and Video encoder\n");
4007 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
4011 static int opt_help(const char *opt, const char *arg)
4014 AVOutputFormat *oformat = NULL;
4015 AVInputFormat *iformat = NULL;
4017 av_log_set_callback(log_callback_help);
4019 show_help_options(options, "Main options:\n",
4020 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4021 show_help_options(options, "\nAdvanced options:\n",
4022 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4024 show_help_options(options, "\nVideo options:\n",
4025 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4027 show_help_options(options, "\nAdvanced Video options:\n",
4028 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4029 OPT_VIDEO | OPT_EXPERT);
4030 show_help_options(options, "\nAudio options:\n",
4031 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4033 show_help_options(options, "\nAdvanced Audio options:\n",
4034 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4035 OPT_AUDIO | OPT_EXPERT);
4036 show_help_options(options, "\nSubtitle options:\n",
4037 OPT_SUBTITLE | OPT_GRAB,
4039 show_help_options(options, "\nAudio/Video grab options:\n",
4043 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4046 /* individual codec options */
4048 while ((c = av_codec_next(c))) {
4049 if (c->priv_class) {
4050 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4055 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4058 /* individual muxer options */
4059 while ((oformat = av_oformat_next(oformat))) {
4060 if (oformat->priv_class) {
4061 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4066 /* individual demuxer options */
4067 while ((iformat = av_iformat_next(iformat))) {
4068 if (iformat->priv_class) {
4069 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4074 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4078 static int opt_target(const char *opt, const char *arg)
4080 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4081 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4083 if(!strncmp(arg, "pal-", 4)) {
4086 } else if(!strncmp(arg, "ntsc-", 5)) {
4089 } else if(!strncmp(arg, "film-", 5)) {
4094 /* Calculate FR via float to avoid int overflow */
4095 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4098 } else if((fr == 29970) || (fr == 23976)) {
4101 /* Try to determine PAL/NTSC by peeking in the input files */
4102 if(nb_input_files) {
4104 for (j = 0; j < nb_input_files; j++) {
4105 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4106 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4107 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4109 fr = c->time_base.den * 1000 / c->time_base.num;
4113 } else if((fr == 29970) || (fr == 23976)) {
4123 if(verbose > 0 && norm != UNKNOWN)
4124 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4127 if(norm == UNKNOWN) {
4128 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4129 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4130 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4134 if(!strcmp(arg, "vcd")) {
4135 opt_codec("c:v", "mpeg1video");
4136 opt_codec("c:a", "mp2");
4137 opt_format("f", "vcd");
4139 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4140 opt_frame_rate("r", frame_rates[norm]);
4141 opt_default("g", norm == PAL ? "15" : "18");
4143 opt_default("b", "1150000");
4144 opt_default("maxrate", "1150000");
4145 opt_default("minrate", "1150000");
4146 opt_default("bufsize", "327680"); // 40*1024*8;
4148 opt_default("b:a", "224000");
4149 audio_sample_rate = 44100;
4152 opt_default("packetsize", "2324");
4153 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4155 /* We have to offset the PTS, so that it is consistent with the SCR.
4156 SCR starts at 36000, but the first two packs contain only padding
4157 and the first pack from the other stream, respectively, may also have
4158 been written before.
4159 So the real data starts at SCR 36000+3*1200. */
4160 mux_preload= (36000+3*1200) / 90000.0; //0.44
4161 } else if(!strcmp(arg, "svcd")) {
4163 opt_codec("c:v", "mpeg2video");
4164 opt_codec("c:a", "mp2");
4165 opt_format("f", "svcd");
4167 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4168 opt_frame_rate("r", frame_rates[norm]);
4169 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4170 opt_default("g", norm == PAL ? "15" : "18");
4172 opt_default("b", "2040000");
4173 opt_default("maxrate", "2516000");
4174 opt_default("minrate", "0"); //1145000;
4175 opt_default("bufsize", "1835008"); //224*1024*8;
4176 opt_default("flags", "+scan_offset");
4179 opt_default("b:a", "224000");
4180 audio_sample_rate = 44100;
4182 opt_default("packetsize", "2324");
4184 } else if(!strcmp(arg, "dvd")) {
4186 opt_codec("c:v", "mpeg2video");
4187 opt_codec("c:a", "ac3");
4188 opt_format("f", "dvd");
4190 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4191 opt_frame_rate("r", frame_rates[norm]);
4192 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4193 opt_default("g", norm == PAL ? "15" : "18");
4195 opt_default("b", "6000000");
4196 opt_default("maxrate", "9000000");
4197 opt_default("minrate", "0"); //1500000;
4198 opt_default("bufsize", "1835008"); //224*1024*8;
4200 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4201 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4203 opt_default("b:a", "448000");
4204 audio_sample_rate = 48000;
4206 } else if(!strncmp(arg, "dv", 2)) {
4208 opt_format("f", "dv");
4210 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4211 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4212 norm == PAL ? "yuv420p" : "yuv411p");
4213 opt_frame_rate("r", frame_rates[norm]);
4215 audio_sample_rate = 48000;
4219 fprintf(stderr, "Unknown target: %s\n", arg);
4220 return AVERROR(EINVAL);
4225 static int opt_vstats_file(const char *opt, const char *arg)
4227 av_free (vstats_filename);
4228 vstats_filename=av_strdup (arg);
4232 static int opt_vstats(const char *opt, const char *arg)
4235 time_t today2 = time(NULL);
4236 struct tm *today = localtime(&today2);
4238 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4240 return opt_vstats_file(opt, filename);
4243 static int opt_bsf(const char *opt, const char *arg)
4245 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4246 AVBitStreamFilterContext **bsfp;
4249 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4253 bsfp= *opt == 'v' ? &video_bitstream_filters :
4254 *opt == 'a' ? &audio_bitstream_filters :
4255 &subtitle_bitstream_filters;
4257 bsfp= &(*bsfp)->next;
4264 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4268 static int opt_passlogfile(const char *opt, const char *arg)
4270 pass_logfilename_prefix = arg;
4271 #if CONFIG_LIBX264_ENCODER
4272 return opt_default("passlogfile", arg);
4278 static const OptionDef options[] = {
4280 #include "cmdutils_common_opts.h"
4281 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4282 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4283 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4284 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4285 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4286 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4287 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4288 "outfile[,metadata]:infile[,metadata]" },
4289 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4290 "outfile[,metadata]:infile[,metadata]" },
4291 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4292 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4293 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4294 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4295 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4296 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4297 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4298 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4299 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4300 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4301 "add timings for benchmarking" },
4302 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4303 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4304 "dump each input packet" },
4305 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4306 "when dumping packets, also dump the payload" },
4307 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4308 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4309 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4310 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4311 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4312 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4313 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4314 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4315 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4316 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4317 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4318 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4319 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4320 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4321 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4322 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4325 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4326 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4327 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4328 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4329 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4330 { "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" },
4331 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4332 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4333 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4334 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4335 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4336 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4337 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4338 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4339 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4340 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4341 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4342 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4343 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4344 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4345 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4346 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4347 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4348 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4349 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4350 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4351 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4352 "deinterlace pictures" },
4353 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4354 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4355 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4357 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4359 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4360 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4361 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4362 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4363 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4364 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4365 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4366 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4367 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4368 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4371 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4372 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4373 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4374 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4375 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4376 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4377 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4378 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4379 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4380 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
4382 /* subtitle options */
4383 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4384 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4385 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4386 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4389 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4390 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4391 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4394 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4395 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4397 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4398 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4399 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4401 /* data codec support */
4402 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4404 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4408 int main(int argc, char **argv)
4412 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4414 if(argc>1 && !strcmp(argv[1], "-d")){
4417 av_log_set_callback(log_callback_null);
4422 avcodec_register_all();
4424 avdevice_register_all();
4427 avfilter_register_all();
4432 if(isatty(STDIN_FILENO))
4433 avio_set_interrupt_cb(decode_interrupt_cb);
4442 parse_options(argc, argv, options, opt_output_file);
4444 if(nb_output_files <= 0 && nb_input_files == 0) {
4446 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4450 /* file converter / grab */
4451 if (nb_output_files <= 0) {
4452 fprintf(stderr, "At least one output file must be specified\n");
4456 if (nb_input_files == 0) {
4457 fprintf(stderr, "At least one input file must be specified\n");
4462 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4464 ti = getutime() - ti;
4466 int maxrss = getmaxrss() / 1024;
4467 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4470 return exit_program(0);