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_STREAMS 1024 /* arbitrary sanity check value */
113 static const char *last_asked_format = NULL;
114 static AVDictionary *ts_scale;
116 static StreamMap *stream_maps = NULL;
117 static int nb_stream_maps;
119 static AVDictionary *codec_names;
121 /* first item specifies output metadata, second is input */
122 static MetadataMap (*meta_data_maps)[2] = NULL;
123 static int nb_meta_data_maps;
124 static int metadata_global_autocopy = 1;
125 static int metadata_streams_autocopy = 1;
126 static int metadata_chapters_autocopy = 1;
128 static int chapters_input_file = INT_MAX;
130 /* indexed by output file stream index */
131 static int *streamid_map = NULL;
132 static int nb_streamid_map = 0;
134 static int frame_width = 0;
135 static int frame_height = 0;
136 static float frame_aspect_ratio = 0;
137 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
138 static int frame_bits_per_raw_sample = 0;
139 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
140 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
141 static AVRational frame_rate;
142 static float video_qscale = 0;
143 static uint16_t *intra_matrix = NULL;
144 static uint16_t *inter_matrix = NULL;
145 static const char *video_rc_override_string=NULL;
146 static int video_disable = 0;
147 static int video_discard = 0;
148 static unsigned int video_codec_tag = 0;
149 static char *video_language = NULL;
150 static int same_quant = 0;
151 static int do_deinterlace = 0;
152 static int top_field_first = -1;
153 static int me_threshold = 0;
154 static int intra_dc_precision = 8;
155 static int loop_input = 0;
156 static int loop_output = AVFMT_NOOUTPUTLOOP;
157 static int qp_hist = 0;
159 static char *vfilters = NULL;
162 static int intra_only = 0;
163 static int audio_sample_rate = 0;
164 #define QSCALE_NONE -99999
165 static float audio_qscale = QSCALE_NONE;
166 static int audio_disable = 0;
167 static int audio_channels = 0;
168 static unsigned int audio_codec_tag = 0;
169 static char *audio_language = NULL;
171 static int subtitle_disable = 0;
172 static char *subtitle_language = NULL;
173 static unsigned int subtitle_codec_tag = 0;
175 static int data_disable = 0;
176 static unsigned int data_codec_tag = 0;
178 static float mux_preload= 0.5;
179 static float mux_max_delay= 0.7;
181 static int64_t recording_time = INT64_MAX;
182 static int64_t start_time = 0;
183 static int64_t input_ts_offset = 0;
184 static int file_overwrite = 0;
185 static AVDictionary *metadata;
186 static int do_benchmark = 0;
187 static int do_hex_dump = 0;
188 static int do_pkt_dump = 0;
189 static int do_psnr = 0;
190 static int do_pass = 0;
191 static const char *pass_logfilename_prefix;
192 static int video_sync_method= -1;
193 static int audio_sync_method= 0;
194 static float audio_drift_threshold= 0.1;
195 static int copy_ts= 0;
196 static int copy_tb= 0;
197 static int opt_shortest = 0;
198 static char *vstats_filename;
199 static FILE *vstats_file;
200 static int opt_programid = 0;
201 static int copy_initial_nonkeyframes = 0;
203 static int rate_emu = 0;
205 static int audio_volume = 256;
207 static int exit_on_error = 0;
208 static int using_stdin = 0;
209 static int verbose = 1;
210 static int run_as_daemon = 0;
211 static int thread_count= 1;
212 static int q_pressed = 0;
213 static int64_t video_size = 0;
214 static int64_t audio_size = 0;
215 static int64_t extra_size = 0;
216 static int nb_frames_dup = 0;
217 static int nb_frames_drop = 0;
218 static int input_sync;
219 static uint64_t limit_filesize = UINT64_MAX;
220 static int force_fps = 0;
221 static char *forced_key_frames = NULL;
223 static float dts_delta_threshold = 10;
225 static uint8_t *audio_buf;
226 static uint8_t *audio_out;
227 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
229 static short *samples;
231 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
232 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
233 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
235 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
237 typedef struct InputStream {
240 int discard; /* true if stream data should be discarded */
241 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
244 int64_t start; /* time when read started */
245 int64_t next_pts; /* synthetic pts for cases where pkt.pts
247 int64_t pts; /* current pts */
249 int is_start; /* is 1 at the start and after a discontinuity */
250 int showed_multi_packet_warning;
254 typedef struct InputFile {
255 AVFormatContext *ctx;
256 int eof_reached; /* true if eof reached */
257 int ist_index; /* index of first stream in ist_table */
258 int buffer_size; /* current total buffer size */
260 int nb_streams; /* number of stream that avconv is aware of; may be different
261 from ctx.nb_streams if new streams appear during av_read_frame() */
264 typedef struct OutputStream {
265 int file_index; /* file index */
266 int index; /* stream index in the output file */
267 int source_index; /* InputStream index */
268 AVStream *st; /* stream in the output file */
269 int encoding_needed; /* true if encoding needed for this stream */
271 /* input pts and corresponding output pts
273 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
274 struct InputStream *sync_ist; /* input stream to sync against */
275 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
276 AVBitStreamFilterContext *bitstream_filters;
281 AVFrame resample_frame; /* temporary frame for image resampling */
282 struct SwsContext *img_resample_ctx; /* for image resampling */
285 int resample_pix_fmt;
286 AVRational frame_rate;
288 float frame_aspect_ratio;
290 /* forced key frames */
291 int64_t *forced_kf_pts;
297 ReSampleContext *resample; /* for audio resampling */
298 int resample_sample_fmt;
299 int resample_channels;
300 int resample_sample_rate;
302 AVAudioConvert *reformat_ctx;
303 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
307 AVFilterContext *output_video_filter;
308 AVFilterContext *input_video_filter;
309 AVFilterBufferRef *picref;
311 AVFilterGraph *graph;
316 int is_past_recording_time;
322 /* init terminal so that we can grab keys */
323 static struct termios oldtty;
326 typedef struct OutputFile {
327 AVFormatContext *ctx;
329 int ost_index; /* index of the first stream in output_streams */
330 int64_t recording_time; /* desired length of the resulting file in microseconds */
331 int64_t start_time; /* start time in microseconds */
332 uint64_t limit_filesize;
335 static InputStream *input_streams = NULL;
336 static int nb_input_streams = 0;
337 static InputFile *input_files = NULL;
338 static int nb_input_files = 0;
340 static OutputStream *output_streams = NULL;
341 static int nb_output_streams = 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 ? // overridden 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_dict_free(&output_files[i].opts);
530 for(i=0;i<nb_input_files;i++) {
531 av_close_input_file(input_files[i].ctx);
533 for (i = 0; i < nb_input_streams; i++)
534 av_dict_free(&input_streams[i].opts);
536 av_free(intra_matrix);
537 av_free(inter_matrix);
541 av_free(vstats_filename);
543 av_free(meta_data_maps);
545 av_freep(&input_streams);
546 av_freep(&input_files);
547 av_freep(&output_streams);
548 av_freep(&output_files);
553 allocated_audio_buf_size= allocated_audio_out_size= 0;
560 if (received_sigterm) {
562 "Received signal %d: terminating.\n",
563 (int) received_sigterm);
567 exit(ret); /* not all OS-es handle main() return value */
571 static void assert_avoptions(AVDictionary *m)
573 AVDictionaryEntry *t;
574 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
575 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
580 static void assert_codec_experimental(AVCodecContext *c, int encoder)
582 const char *codec_string = encoder ? "encoder" : "decoder";
584 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
585 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
586 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
587 "results.\nAdd '-strict experimental' if you want to use it.\n",
588 codec_string, c->codec->name);
589 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
590 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
591 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
592 codec_string, codec->name);
597 /* similar to ff_dynarray_add() and av_fast_realloc() */
598 static void *grow_array(void *array, int elem_size, int *size, int new_size)
600 if (new_size >= INT_MAX / elem_size) {
601 fprintf(stderr, "Array too big.\n");
604 if (*size < new_size) {
605 uint8_t *tmp = av_realloc(array, new_size*elem_size);
607 fprintf(stderr, "Could not alloc buffer.\n");
610 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
617 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
619 if(codec && codec->sample_fmts){
620 const enum AVSampleFormat *p= codec->sample_fmts;
622 if(*p == st->codec->sample_fmt)
626 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
627 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
628 if(av_get_sample_fmt_name(st->codec->sample_fmt))
629 av_log(NULL, AV_LOG_WARNING,
630 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
631 av_get_sample_fmt_name(st->codec->sample_fmt),
633 av_get_sample_fmt_name(codec->sample_fmts[0]));
634 st->codec->sample_fmt = codec->sample_fmts[0];
639 static void choose_sample_rate(AVStream *st, AVCodec *codec)
641 if(codec && codec->supported_samplerates){
642 const int *p= codec->supported_samplerates;
644 int best_dist=INT_MAX;
646 int dist= abs(st->codec->sample_rate - *p);
647 if(dist < best_dist){
653 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
655 st->codec->sample_rate= best;
659 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
661 if(codec && codec->pix_fmts){
662 const enum PixelFormat *p= codec->pix_fmts;
663 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
664 if(st->codec->codec_id==CODEC_ID_MJPEG){
665 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
666 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
667 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};
671 if(*p == st->codec->pix_fmt)
675 if(st->codec->pix_fmt != PIX_FMT_NONE)
676 av_log(NULL, AV_LOG_WARNING,
677 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
678 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
680 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
681 st->codec->pix_fmt = codec->pix_fmts[0];
687 get_sync_ipts(const OutputStream *ost)
689 const InputStream *ist = ost->sync_ist;
690 OutputFile *of = &output_files[ost->file_index];
691 return (double)(ist->pts - of->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 static void do_audio_out(AVFormatContext *s,
729 unsigned char *buf, int size)
732 int64_t audio_out_size, audio_buf_size;
733 int64_t allocated_for_size= size;
735 int size_out, frame_bytes, ret, resample_changed;
736 AVCodecContext *enc= ost->st->codec;
737 AVCodecContext *dec= ist->st->codec;
738 int osize = av_get_bytes_per_sample(enc->sample_fmt);
739 int isize = av_get_bytes_per_sample(dec->sample_fmt);
740 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
743 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
744 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
745 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
746 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
747 audio_buf_size*= osize*enc->channels;
749 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
750 if(coded_bps > 8*osize)
751 audio_out_size= audio_out_size * coded_bps / (8*osize);
752 audio_out_size += FF_MIN_BUFFER_SIZE;
754 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
755 fprintf(stderr, "Buffer sizes too large\n");
759 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
760 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
761 if (!audio_buf || !audio_out){
762 fprintf(stderr, "Out of memory in do_audio_out\n");
766 if (enc->channels != dec->channels)
767 ost->audio_resample = 1;
769 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
770 ost->resample_channels != dec->channels ||
771 ost->resample_sample_rate != dec->sample_rate;
773 if ((ost->audio_resample && !ost->resample) || resample_changed) {
774 if (resample_changed) {
775 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",
776 ist->file_index, ist->st->index,
777 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
778 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
779 ost->resample_sample_fmt = dec->sample_fmt;
780 ost->resample_channels = dec->channels;
781 ost->resample_sample_rate = dec->sample_rate;
783 audio_resample_close(ost->resample);
785 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
786 if (audio_sync_method <= 1 &&
787 ost->resample_sample_fmt == enc->sample_fmt &&
788 ost->resample_channels == enc->channels &&
789 ost->resample_sample_rate == enc->sample_rate) {
790 ost->resample = NULL;
791 ost->audio_resample = 0;
793 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
794 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
795 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
796 enc->sample_rate, dec->sample_rate,
797 enc->sample_fmt, dec->sample_fmt,
799 if (!ost->resample) {
800 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
801 dec->channels, dec->sample_rate,
802 enc->channels, enc->sample_rate);
808 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
809 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
810 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
811 if (ost->reformat_ctx)
812 av_audio_convert_free(ost->reformat_ctx);
813 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
814 dec->sample_fmt, 1, NULL, 0);
815 if (!ost->reformat_ctx) {
816 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
817 av_get_sample_fmt_name(dec->sample_fmt),
818 av_get_sample_fmt_name(enc->sample_fmt));
821 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
824 if(audio_sync_method){
825 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
826 - av_fifo_size(ost->fifo)/(enc->channels * 2);
827 double idelta= delta*dec->sample_rate / enc->sample_rate;
828 int byte_delta= ((int)idelta)*2*dec->channels;
830 //FIXME resample delay
831 if(fabs(delta) > 50){
832 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
834 byte_delta= FFMAX(byte_delta, -size);
838 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
843 static uint8_t *input_tmp= NULL;
844 input_tmp= av_realloc(input_tmp, byte_delta + size);
846 if(byte_delta > allocated_for_size - size){
847 allocated_for_size= byte_delta + (int64_t)size;
852 memset(input_tmp, 0, byte_delta);
853 memcpy(input_tmp + byte_delta, buf, size);
857 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
859 }else if(audio_sync_method>1){
860 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
861 av_assert0(ost->audio_resample);
863 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
864 // 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));
865 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
869 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
870 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
872 if (ost->audio_resample) {
874 size_out = audio_resample(ost->resample,
875 (short *)buftmp, (short *)buf,
876 size / (dec->channels * isize));
877 size_out = size_out * enc->channels * osize;
883 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
884 const void *ibuf[6]= {buftmp};
885 void *obuf[6]= {audio_buf};
886 int istride[6]= {isize};
887 int ostride[6]= {osize};
888 int len= size_out/istride[0];
889 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
890 printf("av_audio_convert() failed\n");
896 size_out = len*osize;
899 /* now encode as many frames as possible */
900 if (enc->frame_size > 1) {
901 /* output resampled raw samples */
902 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
903 fprintf(stderr, "av_fifo_realloc2() failed\n");
906 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
908 frame_bytes = enc->frame_size * osize * enc->channels;
910 while (av_fifo_size(ost->fifo) >= frame_bytes) {
912 av_init_packet(&pkt);
914 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
916 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
918 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
921 fprintf(stderr, "Audio encoding failed\n");
925 pkt.stream_index= ost->index;
928 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
929 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
930 pkt.flags |= AV_PKT_FLAG_KEY;
931 write_frame(s, &pkt, enc, ost->bitstream_filters);
933 ost->sync_opts += enc->frame_size;
937 av_init_packet(&pkt);
939 ost->sync_opts += size_out / (osize * enc->channels);
941 /* output a pcm frame */
942 /* determine the size of the coded buffer */
945 size_out = size_out*coded_bps/8;
947 if(size_out > audio_out_size){
948 fprintf(stderr, "Internal error, buffer size too small\n");
952 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
953 ret = avcodec_encode_audio(enc, audio_out, size_out,
956 fprintf(stderr, "Audio encoding failed\n");
960 pkt.stream_index= ost->index;
963 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
964 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
965 pkt.flags |= AV_PKT_FLAG_KEY;
966 write_frame(s, &pkt, enc, ost->bitstream_filters);
970 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
974 AVPicture picture_tmp;
977 dec = ist->st->codec;
979 /* deinterlace : must be done before any resize */
980 if (do_deinterlace) {
983 /* create temporary picture */
984 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
985 buf = av_malloc(size);
989 picture2 = &picture_tmp;
990 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
992 if(avpicture_deinterlace(picture2, picture,
993 dec->pix_fmt, dec->width, dec->height) < 0) {
994 /* if error, do not deinterlace */
995 fprintf(stderr, "Deinterlacing failed\n");
1004 if (picture != picture2)
1005 *picture = *picture2;
1009 static void do_subtitle_out(AVFormatContext *s,
1015 static uint8_t *subtitle_out = NULL;
1016 int subtitle_out_max_size = 1024 * 1024;
1017 int subtitle_out_size, nb, i;
1018 AVCodecContext *enc;
1021 if (pts == AV_NOPTS_VALUE) {
1022 fprintf(stderr, "Subtitle packets must have a pts\n");
1028 enc = ost->st->codec;
1030 if (!subtitle_out) {
1031 subtitle_out = av_malloc(subtitle_out_max_size);
1034 /* Note: DVB subtitle need one packet to draw them and one other
1035 packet to clear them */
1036 /* XXX: signal it in the codec context ? */
1037 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1042 for(i = 0; i < nb; i++) {
1043 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1044 // start_display_time is required to be 0
1045 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1046 sub->end_display_time -= sub->start_display_time;
1047 sub->start_display_time = 0;
1048 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1049 subtitle_out_max_size, sub);
1050 if (subtitle_out_size < 0) {
1051 fprintf(stderr, "Subtitle encoding failed\n");
1055 av_init_packet(&pkt);
1056 pkt.stream_index = ost->index;
1057 pkt.data = subtitle_out;
1058 pkt.size = subtitle_out_size;
1059 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1060 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1061 /* XXX: the pts correction is handled here. Maybe handling
1062 it in the codec would be better */
1064 pkt.pts += 90 * sub->start_display_time;
1066 pkt.pts += 90 * sub->end_display_time;
1068 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1072 static int bit_buffer_size= 1024*256;
1073 static uint8_t *bit_buffer= NULL;
1075 static void do_video_resample(OutputStream *ost,
1077 AVFrame *in_picture,
1078 AVFrame **out_picture)
1080 int resample_changed = 0;
1081 AVCodecContext *dec = ist->st->codec;
1082 *out_picture = in_picture;
1083 #if !CONFIG_AVFILTER
1084 resample_changed = ost->resample_width != dec->width ||
1085 ost->resample_height != dec->height ||
1086 ost->resample_pix_fmt != dec->pix_fmt;
1088 if (resample_changed) {
1089 av_log(NULL, AV_LOG_INFO,
1090 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1091 ist->file_index, ist->st->index,
1092 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1093 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1094 ost->resample_width = dec->width;
1095 ost->resample_height = dec->height;
1096 ost->resample_pix_fmt = dec->pix_fmt;
1099 ost->video_resample = dec->width != enc->width ||
1100 dec->height != enc->height ||
1101 dec->pix_fmt != enc->pix_fmt;
1103 if (ost->video_resample) {
1104 *out_picture = &ost->resample_frame;
1105 if (!ost->img_resample_ctx || resample_changed) {
1106 /* initialize the destination picture */
1107 if (!ost->resample_frame.data[0]) {
1108 avcodec_get_frame_defaults(&ost->resample_frame);
1109 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1110 enc->width, enc->height)) {
1111 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1115 /* initialize a new scaler context */
1116 sws_freeContext(ost->img_resample_ctx);
1117 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1118 enc->width, enc->height, enc->pix_fmt,
1119 ost->sws_flags, NULL, NULL, NULL);
1120 if (ost->img_resample_ctx == NULL) {
1121 fprintf(stderr, "Cannot get resampling context\n");
1125 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1126 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1132 static void do_video_out(AVFormatContext *s,
1135 AVFrame *in_picture,
1136 int *frame_size, float quality)
1138 int nb_frames, i, ret, format_video_sync;
1139 AVFrame *final_picture;
1140 AVCodecContext *enc;
1143 enc = ost->st->codec;
1145 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1147 /* by default, we output a single frame */
1152 format_video_sync = video_sync_method;
1153 if (format_video_sync < 0)
1154 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1156 if (format_video_sync) {
1157 double vdelta = sync_ipts - ost->sync_opts;
1158 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1161 else if (format_video_sync == 2) {
1164 }else if(vdelta>0.6)
1165 ost->sync_opts= lrintf(sync_ipts);
1166 }else if (vdelta > 1.1)
1167 nb_frames = lrintf(vdelta);
1168 //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);
1169 if (nb_frames == 0){
1172 fprintf(stderr, "*** drop!\n");
1173 }else if (nb_frames > 1) {
1174 nb_frames_dup += nb_frames - 1;
1176 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1179 ost->sync_opts= lrintf(sync_ipts);
1181 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1185 do_video_resample(ost, ist, in_picture, &final_picture);
1187 /* duplicates frame if needed */
1188 for(i=0;i<nb_frames;i++) {
1190 av_init_packet(&pkt);
1191 pkt.stream_index= ost->index;
1193 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1194 /* raw pictures are written as AVPicture structure to
1195 avoid any copies. We support temporarily the older
1197 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1198 enc->coded_frame->top_field_first = in_picture->top_field_first;
1199 pkt.data= (uint8_t *)final_picture;
1200 pkt.size= sizeof(AVPicture);
1201 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1202 pkt.flags |= AV_PKT_FLAG_KEY;
1204 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1206 AVFrame big_picture;
1208 big_picture= *final_picture;
1209 /* better than nothing: use input picture interlaced
1211 big_picture.interlaced_frame = in_picture->interlaced_frame;
1212 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1213 if(top_field_first == -1)
1214 big_picture.top_field_first = in_picture->top_field_first;
1216 big_picture.top_field_first = top_field_first;
1219 /* handles same_quant here. This is not correct because it may
1220 not be a global option */
1221 big_picture.quality = quality;
1223 big_picture.pict_type = 0;
1224 // big_picture.pts = AV_NOPTS_VALUE;
1225 big_picture.pts= ost->sync_opts;
1226 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1227 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1228 if (ost->forced_kf_index < ost->forced_kf_count &&
1229 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1230 big_picture.pict_type = AV_PICTURE_TYPE_I;
1231 ost->forced_kf_index++;
1233 ret = avcodec_encode_video(enc,
1234 bit_buffer, bit_buffer_size,
1237 fprintf(stderr, "Video encoding failed\n");
1242 pkt.data= bit_buffer;
1244 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1245 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1246 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1247 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1248 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1250 if(enc->coded_frame->key_frame)
1251 pkt.flags |= AV_PKT_FLAG_KEY;
1252 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1255 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1256 // enc->frame_number-1, ret, enc->pict_type);
1257 /* if two pass, output log */
1258 if (ost->logfile && enc->stats_out) {
1259 fprintf(ost->logfile, "%s", enc->stats_out);
1264 ost->frame_number++;
1268 static double psnr(double d){
1269 return -10.0*log(d)/log(10.0);
1272 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1275 AVCodecContext *enc;
1277 double ti1, bitrate, avg_bitrate;
1279 /* this is executed just the first time do_video_stats is called */
1281 vstats_file = fopen(vstats_filename, "w");
1288 enc = ost->st->codec;
1289 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1290 frame_number = ost->frame_number;
1291 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1292 if (enc->flags&CODEC_FLAG_PSNR)
1293 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1295 fprintf(vstats_file,"f_size= %6d ", frame_size);
1296 /* compute pts value */
1297 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1301 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1302 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1303 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1304 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1305 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1309 static void print_report(OutputFile *output_files,
1310 OutputStream *ost_table, int nb_ostreams,
1311 int is_last_report, int64_t timer_start)
1315 AVFormatContext *oc;
1317 AVCodecContext *enc;
1318 int frame_number, vid, i;
1320 int64_t pts = INT64_MAX;
1321 static int64_t last_time = -1;
1322 static int qp_histogram[52];
1324 if (!is_last_report) {
1326 /* display the report every 0.5 seconds */
1327 cur_time = av_gettime();
1328 if (last_time == -1) {
1329 last_time = cur_time;
1332 if ((cur_time - last_time) < 500000)
1334 last_time = cur_time;
1338 oc = output_files[0].ctx;
1340 total_size = avio_size(oc->pb);
1341 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1342 total_size= avio_tell(oc->pb);
1346 for(i=0;i<nb_ostreams;i++) {
1348 ost = &ost_table[i];
1349 enc = ost->st->codec;
1350 if (!ost->st->stream_copy && enc->coded_frame)
1351 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1352 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1355 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1356 float t = (av_gettime()-timer_start) / 1000000.0;
1358 frame_number = ost->frame_number;
1359 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1360 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1362 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1366 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1371 if (enc->flags&CODEC_FLAG_PSNR){
1373 double error, error_sum=0;
1374 double scale, scale_sum=0;
1375 char type[3]= {'Y','U','V'};
1376 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1379 error= enc->error[j];
1380 scale= enc->width*enc->height*255.0*255.0*frame_number;
1382 error= enc->coded_frame->error[j];
1383 scale= enc->width*enc->height*255.0*255.0;
1388 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1394 /* compute min output value */
1395 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1396 ost->st->time_base, AV_TIME_BASE_Q));
1399 if (verbose > 0 || is_last_report) {
1400 int hours, mins, secs, us;
1401 secs = pts / AV_TIME_BASE;
1402 us = pts % AV_TIME_BASE;
1408 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1411 "size=%8.0fkB time=", total_size / 1024.0);
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1413 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1414 (100 * us) / AV_TIME_BASE);
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1416 "bitrate=%6.1fkbits/s", bitrate);
1418 if (nb_frames_dup || nb_frames_drop)
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1420 nb_frames_dup, nb_frames_drop);
1423 fprintf(stderr, "%s \r", buf);
1428 if (is_last_report && verbose >= 0){
1429 int64_t raw= audio_size + video_size + extra_size;
1430 fprintf(stderr, "\n");
1431 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1435 100.0*(total_size - raw)/raw
1440 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1442 int fill_char = 0x00;
1443 if (sample_fmt == AV_SAMPLE_FMT_U8)
1445 memset(buf, fill_char, size);
1448 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1452 for (i = 0; i < nb_ostreams; i++) {
1453 OutputStream *ost = &ost_table[i];
1454 AVCodecContext *enc = ost->st->codec;
1455 AVFormatContext *os = output_files[ost->file_index].ctx;
1457 if (!ost->encoding_needed)
1460 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1462 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1468 av_init_packet(&pkt);
1469 pkt.stream_index= ost->index;
1471 switch (ost->st->codec->codec_type) {
1472 case AVMEDIA_TYPE_AUDIO:
1473 fifo_bytes = av_fifo_size(ost->fifo);
1475 /* encode any samples remaining in fifo */
1476 if (fifo_bytes > 0) {
1477 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1478 int fs_tmp = enc->frame_size;
1480 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1481 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1482 enc->frame_size = fifo_bytes / (osize * enc->channels);
1484 int frame_bytes = enc->frame_size*osize*enc->channels;
1485 if (allocated_audio_buf_size < frame_bytes)
1487 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1490 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1491 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1492 ost->st->time_base.num, enc->sample_rate);
1493 enc->frame_size = fs_tmp;
1496 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1499 fprintf(stderr, "Audio encoding failed\n");
1503 pkt.flags |= AV_PKT_FLAG_KEY;
1505 case AVMEDIA_TYPE_VIDEO:
1506 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1508 fprintf(stderr, "Video encoding failed\n");
1512 if(enc->coded_frame && enc->coded_frame->key_frame)
1513 pkt.flags |= AV_PKT_FLAG_KEY;
1514 if (ost->logfile && enc->stats_out) {
1515 fprintf(ost->logfile, "%s", enc->stats_out);
1524 pkt.data = bit_buffer;
1526 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1527 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1528 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1533 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1534 static int output_packet(InputStream *ist, int ist_index,
1535 OutputStream *ost_table, int nb_ostreams,
1536 const AVPacket *pkt)
1538 AVFormatContext *os;
1543 void *buffer_to_free = NULL;
1544 static unsigned int samples_size= 0;
1545 AVSubtitle subtitle, *subtitle_to_free;
1546 int64_t pkt_pts = AV_NOPTS_VALUE;
1548 int frame_available;
1553 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1555 if(ist->next_pts == AV_NOPTS_VALUE)
1556 ist->next_pts= ist->pts;
1560 av_init_packet(&avpkt);
1568 if(pkt->dts != AV_NOPTS_VALUE)
1569 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1570 if(pkt->pts != AV_NOPTS_VALUE)
1571 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1573 //while we have more to decode or while the decoder did output something on EOF
1574 while (avpkt.size > 0 || (!pkt && got_output)) {
1575 uint8_t *data_buf, *decoded_data_buf;
1576 int data_size, decoded_data_size;
1578 ist->pts= ist->next_pts;
1580 if(avpkt.size && avpkt.size != pkt->size &&
1581 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1582 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1583 ist->showed_multi_packet_warning=1;
1586 /* decode the packet if needed */
1587 decoded_data_buf = NULL; /* fail safe */
1588 decoded_data_size= 0;
1589 data_buf = avpkt.data;
1590 data_size = avpkt.size;
1591 subtitle_to_free = NULL;
1592 if (ist->decoding_needed) {
1593 switch(ist->st->codec->codec_type) {
1594 case AVMEDIA_TYPE_AUDIO:{
1595 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1596 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1598 samples= av_malloc(samples_size);
1600 decoded_data_size= samples_size;
1601 /* XXX: could avoid copy if PCM 16 bits with same
1602 endianness as CPU */
1603 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1610 got_output = decoded_data_size > 0;
1611 /* Some bug in mpeg audio decoder gives */
1612 /* decoded_data_size < 0, it seems they are overflows */
1614 /* no audio frame */
1617 decoded_data_buf = (uint8_t *)samples;
1618 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1619 (ist->st->codec->sample_rate * ist->st->codec->channels);
1621 case AVMEDIA_TYPE_VIDEO:
1622 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1623 /* XXX: allocate picture correctly */
1624 avcodec_get_frame_defaults(&picture);
1625 avpkt.pts = pkt_pts;
1626 avpkt.dts = ist->pts;
1627 pkt_pts = AV_NOPTS_VALUE;
1629 ret = avcodec_decode_video2(ist->st->codec,
1630 &picture, &got_output, &avpkt);
1631 quality = same_quant ? picture.quality : 0;
1635 /* no picture yet */
1636 goto discard_packet;
1638 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1639 if (ist->st->codec->time_base.num != 0) {
1640 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1641 ist->next_pts += ((int64_t)AV_TIME_BASE *
1642 ist->st->codec->time_base.num * ticks) /
1643 ist->st->codec->time_base.den;
1646 buffer_to_free = NULL;
1647 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1649 case AVMEDIA_TYPE_SUBTITLE:
1650 ret = avcodec_decode_subtitle2(ist->st->codec,
1651 &subtitle, &got_output, &avpkt);
1655 goto discard_packet;
1657 subtitle_to_free = &subtitle;
1664 switch(ist->st->codec->codec_type) {
1665 case AVMEDIA_TYPE_AUDIO:
1666 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1667 ist->st->codec->sample_rate;
1669 case AVMEDIA_TYPE_VIDEO:
1670 if (ist->st->codec->time_base.num != 0) {
1671 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1672 ist->next_pts += ((int64_t)AV_TIME_BASE *
1673 ist->st->codec->time_base.num * ticks) /
1674 ist->st->codec->time_base.den;
1682 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1683 if (start_time == 0 || ist->pts >= start_time) {
1684 for(i=0;i<nb_ostreams;i++) {
1685 ost = &ost_table[i];
1686 if (ost->input_video_filter && ost->source_index == ist_index) {
1687 if (!picture.sample_aspect_ratio.num)
1688 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1689 picture.pts = ist->pts;
1691 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1697 // preprocess audio (volume)
1698 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1699 if (audio_volume != 256) {
1702 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1703 int v = ((*volp) * audio_volume + 128) >> 8;
1704 *volp++ = av_clip_int16(v);
1709 /* frame rate emulation */
1711 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1712 int64_t now = av_gettime() - ist->start;
1716 /* if output time reached then transcode raw format,
1717 encode packets and output them */
1718 for (i = 0; i < nb_ostreams; i++) {
1719 OutputFile *of = &output_files[ost_table[i].file_index];
1722 ost = &ost_table[i];
1723 if (ost->source_index != ist_index)
1726 if (of->start_time && ist->pts < of->start_time)
1729 if (of->recording_time != INT64_MAX &&
1730 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1731 (AVRational){1, 1000000}) >= 0) {
1732 ost->is_past_recording_time = 1;
1737 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1738 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1739 while (frame_available) {
1740 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1741 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1742 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1745 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1746 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1750 os = output_files[ost->file_index].ctx;
1752 /* set the input output pts pairs */
1753 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1755 if (ost->encoding_needed) {
1756 av_assert0(ist->decoding_needed);
1757 switch(ost->st->codec->codec_type) {
1758 case AVMEDIA_TYPE_AUDIO:
1759 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1761 case AVMEDIA_TYPE_VIDEO:
1763 if (ost->picref->video && !ost->frame_aspect_ratio)
1764 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1766 do_video_out(os, ost, ist, &picture, &frame_size,
1767 same_quant ? quality : ost->st->codec->global_quality);
1768 if (vstats_filename && frame_size)
1769 do_video_stats(os, ost, frame_size);
1771 case AVMEDIA_TYPE_SUBTITLE:
1772 do_subtitle_out(os, ost, ist, &subtitle,
1779 AVFrame avframe; //FIXME/XXX remove this
1782 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1783 av_init_packet(&opkt);
1785 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1786 #if !CONFIG_AVFILTER
1792 /* no reencoding needed : output the packet directly */
1793 /* force the input stream PTS */
1795 avcodec_get_frame_defaults(&avframe);
1796 ost->st->codec->coded_frame= &avframe;
1797 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1799 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1800 audio_size += data_size;
1801 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1802 video_size += data_size;
1806 opkt.stream_index= ost->index;
1807 if(pkt->pts != AV_NOPTS_VALUE)
1808 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1810 opkt.pts= AV_NOPTS_VALUE;
1812 if (pkt->dts == AV_NOPTS_VALUE)
1813 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1815 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1816 opkt.dts -= ost_tb_start_time;
1818 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1819 opkt.flags= pkt->flags;
1821 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1822 if( ost->st->codec->codec_id != CODEC_ID_H264
1823 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1824 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1826 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1827 opkt.destruct= av_destruct_packet;
1829 opkt.data = data_buf;
1830 opkt.size = data_size;
1833 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1834 /* store AVPicture in AVPacket, as expected by the output format */
1835 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1836 opkt.data = (uint8_t *)&pict;
1837 opkt.size = sizeof(AVPicture);
1838 opkt.flags |= AV_PKT_FLAG_KEY;
1840 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1841 ost->st->codec->frame_number++;
1842 ost->frame_number++;
1843 av_free_packet(&opkt);
1847 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1848 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1849 avfilter_unref_buffer(ost->picref);
1854 av_free(buffer_to_free);
1855 /* XXX: allocate the subtitles in the codec ? */
1856 if (subtitle_to_free) {
1857 avsubtitle_free(subtitle_to_free);
1858 subtitle_to_free = NULL;
1866 static void print_sdp(OutputFile *output_files, int n)
1870 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1874 for (i = 0; i < n; i++)
1875 avc[i] = output_files[i].ctx;
1877 av_sdp_create(avc, n, sdp, sizeof(sdp));
1878 printf("SDP:\n%s\n", sdp);
1883 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1884 char *error, int error_len)
1887 InputStream *ist = &input_streams[ist_index];
1888 if (ist->decoding_needed) {
1889 AVCodec *codec = ist->dec;
1891 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
1892 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
1893 return AVERROR(EINVAL);
1895 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1896 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
1897 ist->file_index, ist->st->index);
1898 return AVERROR(EINVAL);
1900 assert_codec_experimental(ist->st->codec, 0);
1901 assert_avoptions(ist->opts);
1904 ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
1905 ist->next_pts = AV_NOPTS_VALUE;
1911 static int transcode_init(OutputFile *output_files,
1912 int nb_output_files,
1913 InputFile *input_files,
1917 AVFormatContext *os;
1918 AVCodecContext *codec, *icodec;
1925 for (i = 0; i < nb_input_streams; i++)
1926 input_streams[i].start = av_gettime();
1928 /* output stream init */
1929 for(i=0;i<nb_output_files;i++) {
1930 os = output_files[i].ctx;
1931 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1932 av_dump_format(os, i, os->filename, 1);
1933 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1934 return AVERROR(EINVAL);
1938 /* for each output stream, we compute the right encoding parameters */
1939 for (i = 0; i < nb_output_streams; i++) {
1940 ost = &output_streams[i];
1941 os = output_files[ost->file_index].ctx;
1942 ist = &input_streams[ost->source_index];
1944 codec = ost->st->codec;
1945 icodec = ist->st->codec;
1947 ost->st->disposition = ist->st->disposition;
1948 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1949 codec->chroma_sample_location = icodec->chroma_sample_location;
1951 if (ost->st->stream_copy) {
1952 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1954 if (extra_size > INT_MAX) {
1955 return AVERROR(EINVAL);
1958 /* if stream_copy is selected, no need to decode or encode */
1959 codec->codec_id = icodec->codec_id;
1960 codec->codec_type = icodec->codec_type;
1962 if(!codec->codec_tag){
1963 if( !os->oformat->codec_tag
1964 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1965 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1966 codec->codec_tag = icodec->codec_tag;
1969 codec->bit_rate = icodec->bit_rate;
1970 codec->rc_max_rate = icodec->rc_max_rate;
1971 codec->rc_buffer_size = icodec->rc_buffer_size;
1972 codec->extradata= av_mallocz(extra_size);
1973 if (!codec->extradata) {
1974 return AVERROR(ENOMEM);
1976 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1977 codec->extradata_size= icodec->extradata_size;
1979 codec->time_base = ist->st->time_base;
1980 if(!strcmp(os->oformat->name, "avi")) {
1981 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){
1982 codec->time_base = icodec->time_base;
1983 codec->time_base.num *= icodec->ticks_per_frame;
1984 codec->time_base.den *= 2;
1986 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
1987 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){
1988 codec->time_base = icodec->time_base;
1989 codec->time_base.num *= icodec->ticks_per_frame;
1992 av_reduce(&codec->time_base.num, &codec->time_base.den,
1993 codec->time_base.num, codec->time_base.den, INT_MAX);
1995 switch(codec->codec_type) {
1996 case AVMEDIA_TYPE_AUDIO:
1997 if(audio_volume != 256) {
1998 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2001 codec->channel_layout = icodec->channel_layout;
2002 codec->sample_rate = icodec->sample_rate;
2003 codec->channels = icodec->channels;
2004 codec->frame_size = icodec->frame_size;
2005 codec->audio_service_type = icodec->audio_service_type;
2006 codec->block_align= icodec->block_align;
2007 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2008 codec->block_align= 0;
2009 if(codec->codec_id == CODEC_ID_AC3)
2010 codec->block_align= 0;
2012 case AVMEDIA_TYPE_VIDEO:
2013 codec->pix_fmt = icodec->pix_fmt;
2014 codec->width = icodec->width;
2015 codec->height = icodec->height;
2016 codec->has_b_frames = icodec->has_b_frames;
2017 if (!codec->sample_aspect_ratio.num) {
2018 codec->sample_aspect_ratio =
2019 ost->st->sample_aspect_ratio =
2020 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2021 ist->st->codec->sample_aspect_ratio.num ?
2022 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2025 case AVMEDIA_TYPE_SUBTITLE:
2026 codec->width = icodec->width;
2027 codec->height = icodec->height;
2029 case AVMEDIA_TYPE_DATA:
2036 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2037 switch(codec->codec_type) {
2038 case AVMEDIA_TYPE_AUDIO:
2039 ost->fifo= av_fifo_alloc(1024);
2041 return AVERROR(ENOMEM);
2043 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2044 if (!codec->sample_rate) {
2045 codec->sample_rate = icodec->sample_rate;
2047 choose_sample_rate(ost->st, ost->enc);
2048 codec->time_base = (AVRational){1, codec->sample_rate};
2049 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2050 codec->sample_fmt = icodec->sample_fmt;
2051 choose_sample_fmt(ost->st, ost->enc);
2052 if (!codec->channels) {
2053 codec->channels = icodec->channels;
2054 codec->channel_layout = icodec->channel_layout;
2056 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2057 codec->channel_layout = 0;
2058 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2059 icodec->request_channels = codec->channels;
2060 ist->decoding_needed = 1;
2061 ost->encoding_needed = 1;
2062 ost->resample_sample_fmt = icodec->sample_fmt;
2063 ost->resample_sample_rate = icodec->sample_rate;
2064 ost->resample_channels = icodec->channels;
2066 case AVMEDIA_TYPE_VIDEO:
2067 if (codec->pix_fmt == PIX_FMT_NONE)
2068 codec->pix_fmt = icodec->pix_fmt;
2069 choose_pixel_fmt(ost->st, ost->enc);
2071 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2072 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2076 if (!codec->width || !codec->height) {
2077 codec->width = icodec->width;
2078 codec->height = icodec->height;
2081 ost->video_resample = codec->width != icodec->width ||
2082 codec->height != icodec->height ||
2083 codec->pix_fmt != icodec->pix_fmt;
2084 if (ost->video_resample) {
2085 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2088 ost->resample_height = icodec->height;
2089 ost->resample_width = icodec->width;
2090 ost->resample_pix_fmt= icodec->pix_fmt;
2091 ost->encoding_needed = 1;
2092 ist->decoding_needed = 1;
2094 if (!ost->frame_rate.num)
2095 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2096 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2097 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2098 ost->frame_rate = ost->enc->supported_framerates[idx];
2100 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2101 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2102 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2103 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2104 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2108 if (configure_video_filters(ist, ost)) {
2109 fprintf(stderr, "Error opening filters!\n");
2114 case AVMEDIA_TYPE_SUBTITLE:
2115 ost->encoding_needed = 1;
2116 ist->decoding_needed = 1;
2123 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2124 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2125 char logfilename[1024];
2128 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2129 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2131 if (codec->flags & CODEC_FLAG_PASS1) {
2132 f = fopen(logfilename, "wb");
2134 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2140 size_t logbuffer_size;
2141 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2142 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2145 codec->stats_in = logbuffer;
2149 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2150 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2151 int size= codec->width * codec->height;
2152 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2157 bit_buffer = av_malloc(bit_buffer_size);
2159 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2161 return AVERROR(ENOMEM);
2164 /* open each encoder */
2165 for (i = 0; i < nb_output_streams; i++) {
2166 ost = &output_streams[i];
2167 if (ost->encoding_needed) {
2168 AVCodec *codec = ost->enc;
2169 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2171 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2172 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2173 ret = AVERROR(EINVAL);
2176 if (dec->subtitle_header) {
2177 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2178 if (!ost->st->codec->subtitle_header) {
2179 ret = AVERROR(ENOMEM);
2182 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2183 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2185 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2186 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2187 ost->file_index, ost->index);
2188 ret = AVERROR(EINVAL);
2191 assert_codec_experimental(ost->st->codec, 1);
2192 assert_avoptions(ost->opts);
2193 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2194 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2195 "It takes bits/s as argument, not kbits/s\n");
2196 extra_size += ost->st->codec->extradata_size;
2200 /* init input streams */
2201 for (i = 0; i < nb_input_streams; i++)
2202 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error)) < 0))
2205 /* open files and write file headers */
2206 for (i = 0; i < nb_output_files; i++) {
2207 os = output_files[i].ctx;
2208 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2209 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2210 ret = AVERROR(EINVAL);
2213 // assert_avoptions(output_files[i].opts);
2214 if (strcmp(os->oformat->name, "rtp")) {
2220 /* dump the file output parameters - cannot be done before in case
2222 for(i=0;i<nb_output_files;i++) {
2223 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2226 /* dump the stream mapping */
2228 fprintf(stderr, "Stream mapping:\n");
2229 for (i = 0; i < nb_output_streams;i ++) {
2230 ost = &output_streams[i];
2231 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2232 input_streams[ost->source_index].file_index,
2233 input_streams[ost->source_index].st->index,
2236 if (ost->sync_ist != &input_streams[ost->source_index])
2237 fprintf(stderr, " [sync #%d.%d]",
2238 ost->sync_ist->file_index,
2239 ost->sync_ist->st->index);
2240 if (ost->st->stream_copy)
2241 fprintf(stderr, " (copy)");
2243 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2244 input_streams[ost->source_index].dec->name : "?",
2245 ost->enc ? ost->enc->name : "?");
2246 fprintf(stderr, "\n");
2251 fprintf(stderr, "%s\n", error);
2256 print_sdp(output_files, nb_output_files);
2263 * The following code is the main loop of the file converter
2265 static int transcode(OutputFile *output_files,
2266 int nb_output_files,
2267 InputFile *input_files,
2271 AVFormatContext *is, *os;
2275 int no_packet_count=0;
2276 int64_t timer_start;
2279 if (!(no_packet = av_mallocz(nb_input_files)))
2282 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2288 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2289 avio_set_interrupt_cb(decode_interrupt_cb);
2293 timer_start = av_gettime();
2295 for(; received_sigterm == 0;) {
2296 int file_index, ist_index;
2301 ipts_min= INT64_MAX;
2303 /* if 'q' pressed, exits */
2307 /* read_key() returns 0 on EOF */
2311 if (key == '+') verbose++;
2312 if (key == '-') verbose--;
2313 if (key == 's') qp_hist ^= 1;
2316 do_hex_dump = do_pkt_dump = 0;
2317 } else if(do_pkt_dump){
2321 av_log_set_level(AV_LOG_DEBUG);
2323 if (key == 'c' || key == 'C'){
2324 char ret[4096], target[64], cmd[256], arg[256]={0};
2327 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2329 while((k=read_key()) !='\n' && k!='\r' && i<sizeof(ret)-1)
2330 if(k>0) ret[i++]= k;
2332 if(k>0 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2333 for(i=0;i<nb_output_streams;i++) {
2335 ost = &output_streams[i];
2338 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2339 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2341 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2346 fprintf(stderr, "Parse error\n");
2349 if (key == 'd' || key == 'D'){
2352 debug = input_streams[0].st->codec->debug<<1;
2353 if(!debug) debug = 1;
2354 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2357 scanf("%d", &debug);
2358 for(i=0;i<nb_input_streams;i++) {
2359 input_streams[i].st->codec->debug = debug;
2361 for(i=0;i<nb_output_streams;i++) {
2362 ost = &output_streams[i];
2363 ost->st->codec->debug = debug;
2365 if(debug) av_log_set_level(AV_LOG_DEBUG);
2366 fprintf(stderr,"debug=%d\n", debug);
2369 fprintf(stderr, "key function\n"
2370 "? show this help\n"
2371 "+ increase verbosity\n"
2372 "- decrease verbosity\n"
2373 "c Send command to filtergraph\n"
2374 "D cycle through available debug modes\n"
2375 "h dump packets/hex press to cycle through the 3 states\n"
2377 "s Show QP histogram\n"
2382 /* select the stream that we must read now by looking at the
2383 smallest output pts */
2385 for (i = 0; i < nb_output_streams; i++) {
2389 ost = &output_streams[i];
2390 of = &output_files[ost->file_index];
2391 os = output_files[ost->file_index].ctx;
2392 ist = &input_streams[ost->source_index];
2393 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2394 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2396 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2398 if (!input_files[ist->file_index].eof_reached){
2399 if(ipts < ipts_min) {
2401 if(input_sync ) file_index = ist->file_index;
2403 if(opts < opts_min) {
2405 if(!input_sync) file_index = ist->file_index;
2408 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2413 /* if none, if is finished */
2414 if (file_index < 0) {
2415 if(no_packet_count){
2417 memset(no_packet, 0, nb_input_files);
2424 /* read a frame from it and output it in the fifo */
2425 is = input_files[file_index].ctx;
2426 ret= av_read_frame(is, &pkt);
2427 if(ret == AVERROR(EAGAIN)){
2428 no_packet[file_index]=1;
2433 input_files[file_index].eof_reached = 1;
2441 memset(no_packet, 0, nb_input_files);
2444 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2445 is->streams[pkt.stream_index]);
2447 /* the following test is needed in case new streams appear
2448 dynamically in stream : we ignore them */
2449 if (pkt.stream_index >= input_files[file_index].nb_streams)
2450 goto discard_packet;
2451 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2452 ist = &input_streams[ist_index];
2454 goto discard_packet;
2456 if (pkt.dts != AV_NOPTS_VALUE)
2457 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2458 if (pkt.pts != AV_NOPTS_VALUE)
2459 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2461 if (ist->ts_scale) {
2462 if(pkt.pts != AV_NOPTS_VALUE)
2463 pkt.pts *= ist->ts_scale;
2464 if(pkt.dts != AV_NOPTS_VALUE)
2465 pkt.dts *= ist->ts_scale;
2468 // 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);
2469 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2470 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2471 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2472 int64_t delta= pkt_dts - ist->next_pts;
2473 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2474 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2475 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2476 pkt_dts+1<ist->pts)&& !copy_ts){
2477 input_files[ist->file_index].ts_offset -= delta;
2479 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2480 delta, input_files[ist->file_index].ts_offset);
2481 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2482 if(pkt.pts != AV_NOPTS_VALUE)
2483 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2487 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2488 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2491 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2492 ist->file_index, ist->st->index);
2495 av_free_packet(&pkt);
2500 av_free_packet(&pkt);
2502 /* dump report by using the output first video and audio streams */
2503 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2506 /* at the end of stream, we must flush the decoder buffers */
2507 for (i = 0; i < nb_input_streams; i++) {
2508 ist = &input_streams[i];
2509 if (ist->decoding_needed) {
2510 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2513 flush_encoders(output_streams, nb_output_streams);
2517 /* write the trailer if needed and close file */
2518 for(i=0;i<nb_output_files;i++) {
2519 os = output_files[i].ctx;
2520 av_write_trailer(os);
2523 /* dump report by using the first video and audio streams */
2524 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2526 /* close each encoder */
2527 for (i = 0; i < nb_output_streams; i++) {
2528 ost = &output_streams[i];
2529 if (ost->encoding_needed) {
2530 av_freep(&ost->st->codec->stats_in);
2531 avcodec_close(ost->st->codec);
2534 avfilter_graph_free(&ost->graph);
2538 /* close each decoder */
2539 for (i = 0; i < nb_input_streams; i++) {
2540 ist = &input_streams[i];
2541 if (ist->decoding_needed) {
2542 avcodec_close(ist->st->codec);
2550 av_freep(&bit_buffer);
2551 av_freep(&no_packet);
2553 if (output_streams) {
2554 for (i = 0; i < nb_output_streams; i++) {
2555 ost = &output_streams[i];
2557 if (ost->st->stream_copy)
2558 av_freep(&ost->st->codec->extradata);
2560 fclose(ost->logfile);
2561 ost->logfile = NULL;
2563 av_fifo_free(ost->fifo); /* works even if fifo is not
2564 initialized but set to zero */
2565 av_freep(&ost->st->codec->subtitle_header);
2566 av_free(ost->resample_frame.data[0]);
2567 av_free(ost->forced_kf_pts);
2568 if (ost->video_resample)
2569 sws_freeContext(ost->img_resample_ctx);
2571 audio_resample_close(ost->resample);
2572 if (ost->reformat_ctx)
2573 av_audio_convert_free(ost->reformat_ctx);
2574 av_dict_free(&ost->opts);
2581 static int opt_format(const char *opt, const char *arg)
2583 last_asked_format = arg;
2587 static int opt_video_rc_override_string(const char *opt, const char *arg)
2589 video_rc_override_string = arg;
2593 static int opt_me_threshold(const char *opt, const char *arg)
2595 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2599 static int opt_verbose(const char *opt, const char *arg)
2601 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2605 static int opt_frame_rate(const char *opt, const char *arg)
2607 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2608 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2614 static int opt_frame_crop(const char *opt, const char *arg)
2616 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2617 return AVERROR(EINVAL);
2620 static int opt_frame_size(const char *opt, const char *arg)
2622 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2623 fprintf(stderr, "Incorrect frame size\n");
2624 return AVERROR(EINVAL);
2629 static int opt_pad(const char *opt, const char *arg) {
2630 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2634 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2636 if (strcmp(arg, "list")) {
2637 frame_pix_fmt = av_get_pix_fmt(arg);
2638 if (frame_pix_fmt == PIX_FMT_NONE) {
2639 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2640 return AVERROR(EINVAL);
2643 opt_pix_fmts(NULL, NULL);
2649 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2656 p = strchr(arg, ':');
2658 x = strtol(arg, &end, 10);
2660 y = strtol(end+1, &end, 10);
2662 ar = (double)x / (double)y;
2664 ar = strtod(arg, NULL);
2667 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2668 return AVERROR(EINVAL);
2670 frame_aspect_ratio = ar;
2674 static int opt_metadata(const char *opt, const char *arg)
2676 char *mid= strchr(arg, '=');
2679 fprintf(stderr, "Missing =\n");
2684 av_dict_set(&metadata, arg, mid, 0);
2689 static int opt_qscale(const char *opt, const char *arg)
2691 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2692 if (video_qscale <= 0 || video_qscale > 255) {
2693 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2694 return AVERROR(EINVAL);
2699 static int opt_top_field_first(const char *opt, const char *arg)
2701 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2702 return opt_default(opt, arg);
2705 static int opt_thread_count(const char *opt, const char *arg)
2707 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2710 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2715 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2717 if (strcmp(arg, "list")) {
2718 audio_sample_fmt = av_get_sample_fmt(arg);
2719 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2720 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2721 return AVERROR(EINVAL);
2726 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2727 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2733 static int opt_audio_rate(const char *opt, const char *arg)
2735 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2739 static int opt_audio_channels(const char *opt, const char *arg)
2741 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2745 static int opt_video_channel(const char *opt, const char *arg)
2747 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2748 return opt_default("channel", arg);
2751 static int opt_video_standard(const char *opt, const char *arg)
2753 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2754 return opt_default("standard", arg);
2757 static int opt_codec(const char *opt, const char *arg)
2759 return av_dict_set(&codec_names, opt, arg, 0);
2762 static int opt_audio_codec(const char *opt, const char *arg)
2764 return opt_codec("codec:a", arg);
2767 static int opt_video_codec(const char *opt, const char *arg)
2769 return opt_codec("codec:v", arg);
2772 static int opt_subtitle_codec(const char *opt, const char *arg)
2774 return opt_codec("codec:s", arg);
2777 static int opt_data_codec(const char *opt, const char *arg)
2779 return opt_codec("codec:d", arg);
2782 static int opt_codec_tag(const char *opt, const char *arg)
2785 uint32_t *codec_tag;
2787 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2788 !strcmp(opt, "vtag") ? &video_codec_tag :
2789 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2793 *codec_tag = strtol(arg, &tail, 0);
2795 *codec_tag = AV_RL32(arg);
2800 static int opt_map(const char *opt, const char *arg)
2802 StreamMap *m = NULL;
2803 int i, negative = 0, file_idx;
2804 int sync_file_idx = -1, sync_stream_idx;
2812 map = av_strdup(arg);
2814 /* parse sync stream first, just pick first matching stream */
2815 if (sync = strchr(map, ',')) {
2817 sync_file_idx = strtol(sync + 1, &sync, 0);
2818 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2819 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2824 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2825 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2826 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2827 sync_stream_idx = i;
2830 if (i == input_files[sync_file_idx].nb_streams) {
2831 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2832 "match any streams.\n", arg);
2838 file_idx = strtol(map, &p, 0);
2839 if (file_idx >= nb_input_files || file_idx < 0) {
2840 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2844 /* disable some already defined maps */
2845 for (i = 0; i < nb_stream_maps; i++) {
2846 m = &stream_maps[i];
2847 if (check_stream_specifier(input_files[m->file_index].ctx,
2848 input_files[m->file_index].ctx->streams[m->stream_index],
2849 *p == ':' ? p + 1 : p) > 0)
2853 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2854 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2855 *p == ':' ? p + 1 : p) <= 0)
2857 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2858 m = &stream_maps[nb_stream_maps - 1];
2860 m->file_index = file_idx;
2861 m->stream_index = i;
2863 if (sync_file_idx >= 0) {
2864 m->sync_file_index = sync_file_idx;
2865 m->sync_stream_index = sync_stream_idx;
2867 m->sync_file_index = file_idx;
2868 m->sync_stream_index = i;
2873 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2881 static void parse_meta_type(char *arg, char *type, int *index)
2891 if (*(++arg) == ':')
2892 *index = strtol(++arg, NULL, 0);
2895 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2902 static int opt_map_metadata(const char *opt, const char *arg)
2904 MetadataMap *m, *m1;
2907 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2908 &nb_meta_data_maps, nb_meta_data_maps + 1);
2910 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2911 m->file = strtol(arg, &p, 0);
2912 parse_meta_type(p, &m->type, &m->index);
2914 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2915 if (p = strchr(opt, ':'))
2916 parse_meta_type(p, &m1->type, &m1->index);
2920 if (m->type == 'g' || m1->type == 'g')
2921 metadata_global_autocopy = 0;
2922 if (m->type == 's' || m1->type == 's')
2923 metadata_streams_autocopy = 0;
2924 if (m->type == 'c' || m1->type == 'c')
2925 metadata_chapters_autocopy = 0;
2930 static int opt_map_meta_data(const char *opt, const char *arg)
2932 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2933 "Use -map_metadata instead.\n");
2934 return opt_map_metadata(opt, arg);
2937 static int opt_input_ts_scale(const char *opt, const char *arg)
2939 return av_dict_set(&ts_scale, opt, arg, 0);
2942 static int opt_recording_time(const char *opt, const char *arg)
2944 recording_time = parse_time_or_die(opt, arg, 1);
2948 static int opt_start_time(const char *opt, const char *arg)
2950 start_time = parse_time_or_die(opt, arg, 1);
2954 static int opt_recording_timestamp(const char *opt, const char *arg)
2957 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2958 struct tm time = *gmtime((time_t*)&recording_timestamp);
2959 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2960 opt_metadata("metadata", buf);
2962 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2963 "tag instead.\n", opt);
2967 static int opt_input_ts_offset(const char *opt, const char *arg)
2969 input_ts_offset = parse_time_or_die(opt, arg, 1);
2973 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2975 const char *codec_string = encoder ? "encoder" : "decoder";
2979 return CODEC_ID_NONE;
2981 avcodec_find_encoder_by_name(name) :
2982 avcodec_find_decoder_by_name(name);
2984 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2987 if(codec->type != type) {
2988 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2994 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2996 AVDictionaryEntry *e = NULL;
2997 char *codec_name = NULL;
3000 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
3001 char *p = strchr(e->key, ':');
3003 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
3004 codec_name = e->value;
3011 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
3012 return avcodec_find_encoder(st->codec->codec_id);
3014 } else if (!strcmp(codec_name, "copy"))
3015 st->stream_copy = 1;
3017 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3018 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3019 avcodec_find_decoder_by_name(codec_name);
3026 * Add all the streams from the given input file to the global
3027 * list of input streams.
3029 static void add_input_streams(AVFormatContext *ic)
3031 int i, rfps, rfps_base, ret;
3033 for (i = 0; i < ic->nb_streams; i++) {
3034 AVStream *st = ic->streams[i];
3035 AVCodecContext *dec = st->codec;
3036 AVDictionaryEntry *e = NULL;
3040 dec->thread_count = thread_count;
3042 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3043 ist = &input_streams[nb_input_streams - 1];
3045 ist->file_index = nb_input_files;
3047 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3049 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
3050 char *p = strchr(e->key, ':');
3052 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
3058 ist->ts_scale = strtod(scale, NULL);
3060 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3062 ist->dec = avcodec_find_decoder(dec->codec_id);
3064 switch (dec->codec_type) {
3065 case AVMEDIA_TYPE_AUDIO:
3067 ist->dec = avcodec_find_decoder(dec->codec_id);
3069 st->discard= AVDISCARD_ALL;
3071 case AVMEDIA_TYPE_VIDEO:
3073 ist->dec = avcodec_find_decoder(dec->codec_id);
3074 rfps = ic->streams[i]->r_frame_rate.num;
3075 rfps_base = ic->streams[i]->r_frame_rate.den;
3077 dec->flags |= CODEC_FLAG_EMU_EDGE;
3080 dec->debug |= FF_DEBUG_MV;
3082 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3085 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3086 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3088 (float)rfps / rfps_base, rfps, rfps_base);
3092 st->discard= AVDISCARD_ALL;
3093 else if(video_discard)
3094 st->discard= video_discard;
3096 case AVMEDIA_TYPE_DATA:
3098 case AVMEDIA_TYPE_SUBTITLE:
3100 ist->dec = avcodec_find_decoder(dec->codec_id);
3101 if(subtitle_disable)
3102 st->discard = AVDISCARD_ALL;
3104 case AVMEDIA_TYPE_ATTACHMENT:
3105 case AVMEDIA_TYPE_UNKNOWN:
3113 static int opt_input_file(const char *opt, const char *filename)
3115 AVFormatContext *ic;
3116 AVInputFormat *file_iformat = NULL;
3120 AVDictionary **opts;
3121 int orig_nb_streams; // number of streams before avformat_find_stream_info
3123 if (last_asked_format) {
3124 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3125 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3128 last_asked_format = NULL;
3131 if (!strcmp(filename, "-"))
3134 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3135 !strcmp(filename, "/dev/stdin");
3137 /* get default parameters from command line */
3138 ic = avformat_alloc_context();
3140 print_error(filename, AVERROR(ENOMEM));
3143 if (audio_sample_rate) {
3144 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3145 av_dict_set(&format_opts, "sample_rate", buf, 0);
3147 if (audio_channels) {
3148 snprintf(buf, sizeof(buf), "%d", audio_channels);
3149 av_dict_set(&format_opts, "channels", buf, 0);
3151 if (frame_rate.num) {
3152 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3153 av_dict_set(&format_opts, "framerate", buf, 0);
3155 if (frame_width && frame_height) {
3156 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3157 av_dict_set(&format_opts, "video_size", buf, 0);
3159 if (frame_pix_fmt != PIX_FMT_NONE)
3160 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3162 ic->flags |= AVFMT_FLAG_NONBLOCK;
3165 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3166 ic->loop_input = loop_input;
3169 /* open the input file with generic libav function */
3170 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3172 print_error(filename, err);
3175 assert_avoptions(format_opts);
3180 for(i=0; i<ic->nb_streams; i++){
3181 ic->streams[i]->discard= AVDISCARD_ALL;
3183 for(i=0; i<ic->nb_programs; i++){
3184 AVProgram *p= ic->programs[i];
3185 if(p->id != opt_programid){
3186 p->discard = AVDISCARD_ALL;
3189 for(j=0; j<p->nb_stream_indexes; j++){
3190 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3195 fprintf(stderr, "Specified program id not found\n");
3201 /* apply forced codec ids */
3202 for (i = 0; i < ic->nb_streams; i++)
3203 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3205 /* Set AVCodecContext options for avformat_find_stream_info */
3206 opts = setup_find_stream_info_opts(ic, codec_opts);
3207 orig_nb_streams = ic->nb_streams;
3209 /* If not enough info to get the stream parameters, we decode the
3210 first frames to get it. (used in mpeg case for example) */
3211 ret = avformat_find_stream_info(ic, opts);
3212 if (ret < 0 && verbose >= 0) {
3213 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3214 av_close_input_file(ic);
3218 timestamp = start_time;
3219 /* add the stream start time */
3220 if (ic->start_time != AV_NOPTS_VALUE)
3221 timestamp += ic->start_time;
3223 /* if seeking requested, we execute it */
3224 if (start_time != 0) {
3225 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3227 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3228 filename, (double)timestamp / AV_TIME_BASE);
3230 /* reset seek info */
3234 /* update the current parameters so that they match the one of the input stream */
3235 add_input_streams(ic);
3237 /* dump the file content */
3239 av_dump_format(ic, nb_input_files, filename, 0);
3241 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3242 input_files[nb_input_files - 1].ctx = ic;
3243 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3244 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3245 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3247 top_field_first = -1;
3248 frame_rate = (AVRational){0, 0};
3249 frame_pix_fmt = PIX_FMT_NONE;
3252 audio_sample_rate = 0;
3254 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3255 av_dict_free(&ts_scale);
3256 input_ts_offset = 0;
3258 for (i = 0; i < orig_nb_streams; i++)
3259 av_dict_free(&opts[i]);
3261 av_dict_free(&codec_names);
3267 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3268 AVCodecContext *avctx)
3274 for (p = kf; *p; p++)
3277 ost->forced_kf_count = n;
3278 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3279 if (!ost->forced_kf_pts) {
3280 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3283 for (i = 0; i < n; i++) {
3284 p = i ? strchr(p, ',') + 1 : kf;
3285 t = parse_time_or_die("force_key_frames", p, 1);
3286 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3290 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3293 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3294 int idx = oc->nb_streams - 1;
3297 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3301 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3302 nb_output_streams + 1);
3303 ost = &output_streams[nb_output_streams - 1];
3304 ost->file_index = nb_output_files;
3307 st->codec->codec_type = type;
3308 ost->enc = choose_codec(oc, st, type, codec_names);
3310 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3313 avcodec_get_context_defaults3(st->codec, ost->enc);
3314 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3316 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3320 static OutputStream *new_video_stream(AVFormatContext *oc)
3324 AVCodecContext *video_enc;
3326 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3328 if (!st->stream_copy) {
3329 ost->frame_aspect_ratio = frame_aspect_ratio;
3330 frame_aspect_ratio = 0;
3332 ost->avfilter = vfilters;
3337 ost->bitstream_filters = video_bitstream_filters;
3338 video_bitstream_filters= NULL;
3340 st->codec->thread_count= thread_count;
3342 video_enc = st->codec;
3345 video_enc->codec_tag= video_codec_tag;
3347 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3348 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3351 if (st->stream_copy) {
3352 video_enc->sample_aspect_ratio =
3353 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3359 ost->frame_rate = frame_rate;
3361 video_enc->width = frame_width;
3362 video_enc->height = frame_height;
3363 video_enc->pix_fmt = frame_pix_fmt;
3364 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3365 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3368 video_enc->gop_size = 0;
3369 if (video_qscale || same_quant) {
3370 video_enc->flags |= CODEC_FLAG_QSCALE;
3371 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3375 video_enc->intra_matrix = intra_matrix;
3377 video_enc->inter_matrix = inter_matrix;
3379 p= video_rc_override_string;
3382 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3384 fprintf(stderr, "error parsing rc_override\n");
3387 video_enc->rc_override=
3388 av_realloc(video_enc->rc_override,
3389 sizeof(RcOverride)*(i+1));
3390 video_enc->rc_override[i].start_frame= start;
3391 video_enc->rc_override[i].end_frame = end;
3393 video_enc->rc_override[i].qscale= q;
3394 video_enc->rc_override[i].quality_factor= 1.0;
3397 video_enc->rc_override[i].qscale= 0;
3398 video_enc->rc_override[i].quality_factor= -q/100.0;
3403 video_enc->rc_override_count=i;
3404 if (!video_enc->rc_initial_buffer_occupancy)
3405 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3406 video_enc->me_threshold= me_threshold;
3407 video_enc->intra_dc_precision= intra_dc_precision - 8;
3410 video_enc->flags|= CODEC_FLAG_PSNR;
3415 video_enc->flags |= CODEC_FLAG_PASS1;
3417 video_enc->flags |= CODEC_FLAG_PASS2;
3421 if (forced_key_frames)
3422 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3424 if (video_language) {
3425 av_dict_set(&st->metadata, "language", video_language, 0);
3426 av_freep(&video_language);
3429 /* reset some key parameters */
3431 av_freep(&forced_key_frames);
3432 frame_pix_fmt = PIX_FMT_NONE;
3436 static OutputStream *new_audio_stream(AVFormatContext *oc)
3440 AVCodecContext *audio_enc;
3442 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3445 ost->bitstream_filters = audio_bitstream_filters;
3446 audio_bitstream_filters= NULL;
3448 st->codec->thread_count= thread_count;
3450 audio_enc = st->codec;
3451 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3454 audio_enc->codec_tag= audio_codec_tag;
3456 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3457 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3459 if (!st->stream_copy) {
3460 if (audio_qscale > QSCALE_NONE) {
3461 audio_enc->flags |= CODEC_FLAG_QSCALE;
3462 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3465 audio_enc->channels = audio_channels;
3466 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3467 audio_enc->sample_fmt = audio_sample_fmt;
3468 if (audio_sample_rate)
3469 audio_enc->sample_rate = audio_sample_rate;
3471 if (audio_language) {
3472 av_dict_set(&st->metadata, "language", audio_language, 0);
3473 av_freep(&audio_language);
3476 /* reset some key parameters */
3482 static OutputStream *new_data_stream(AVFormatContext *oc)
3486 AVCodecContext *data_enc;
3488 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3490 data_enc = st->codec;
3491 if (!st->stream_copy) {
3492 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3497 data_enc->codec_tag= data_codec_tag;
3499 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3500 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3507 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3511 AVCodecContext *subtitle_enc;
3513 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3515 subtitle_enc = st->codec;
3517 ost->bitstream_filters = subtitle_bitstream_filters;
3518 subtitle_bitstream_filters= NULL;
3520 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3522 if(subtitle_codec_tag)
3523 subtitle_enc->codec_tag= subtitle_codec_tag;
3525 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3526 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3529 if (subtitle_language) {
3530 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3531 av_freep(&subtitle_language);
3534 subtitle_disable = 0;
3538 /* arg format is "output-stream-index:streamid-value". */
3539 static int opt_streamid(const char *opt, const char *arg)
3545 av_strlcpy(idx_str, arg, sizeof(idx_str));
3546 p = strchr(idx_str, ':');
3549 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3554 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3555 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3556 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3559 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
3562 AVFormatContext *ic = NULL;
3564 err = avformat_open_input(&ic, filename, NULL, NULL);
3567 /* copy stream format */
3568 for(i=0;i<ic->nb_streams;i++) {
3573 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3574 ost = new_output_stream(s, codec->type);
3577 // FIXME: a more elegant solution is needed
3578 memcpy(st, ic->streams[i], sizeof(AVStream));
3579 st->info = av_malloc(sizeof(*st->info));
3580 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3581 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3583 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3584 choose_sample_fmt(st, codec);
3585 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3586 choose_pixel_fmt(st, codec);
3589 av_close_input_file(ic);
3594 static int copy_chapters(int infile, int outfile)
3596 AVFormatContext *is = input_files[infile].ctx;
3597 AVFormatContext *os = output_files[outfile].ctx;
3600 for (i = 0; i < is->nb_chapters; i++) {
3601 AVChapter *in_ch = is->chapters[i], *out_ch;
3602 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3603 AV_TIME_BASE_Q, in_ch->time_base);
3604 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3605 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3608 if (in_ch->end < ts_off)
3610 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3613 out_ch = av_mallocz(sizeof(AVChapter));
3615 return AVERROR(ENOMEM);
3617 out_ch->id = in_ch->id;
3618 out_ch->time_base = in_ch->time_base;
3619 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3620 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3622 if (metadata_chapters_autocopy)
3623 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3626 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3628 return AVERROR(ENOMEM);
3629 os->chapters[os->nb_chapters - 1] = out_ch;
3634 static int opt_output_file(const char *opt, const char *filename)
3636 AVFormatContext *oc;
3638 AVOutputFormat *file_oformat;
3642 if (!strcmp(filename, "-"))
3645 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3646 last_asked_format = NULL;
3648 print_error(filename, err);
3651 file_oformat= oc->oformat;
3653 if (!strcmp(file_oformat->name, "ffm") &&
3654 av_strstart(filename, "http:", NULL)) {
3655 /* special case for files sent to ffserver: we get the stream
3656 parameters from ffserver */
3657 int err = read_ffserver_streams(oc, filename);
3659 print_error(filename, err);
3662 } else if (!nb_stream_maps) {
3663 /* pick the "best" stream of each type */
3664 #define NEW_STREAM(type, index)\
3666 ost = new_ ## type ## _stream(oc);\
3667 ost->source_index = index;\
3668 ost->sync_ist = &input_streams[index];\
3669 input_streams[index].discard = 0;\
3672 /* video: highest resolution */
3673 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3674 int area = 0, idx = -1;
3675 for (i = 0; i < nb_input_streams; i++) {
3676 ist = &input_streams[i];
3677 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3678 ist->st->codec->width * ist->st->codec->height > area) {
3679 area = ist->st->codec->width * ist->st->codec->height;
3683 NEW_STREAM(video, idx);
3686 /* audio: most channels */
3687 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3688 int channels = 0, idx = -1;
3689 for (i = 0; i < nb_input_streams; i++) {
3690 ist = &input_streams[i];
3691 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3692 ist->st->codec->channels > channels) {
3693 channels = ist->st->codec->channels;
3697 NEW_STREAM(audio, idx);
3700 /* subtitles: pick first */
3701 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3702 for (i = 0; i < nb_input_streams; i++)
3703 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3704 NEW_STREAM(subtitle, i);
3708 /* do something with data? */
3710 for (i = 0; i < nb_stream_maps; i++) {
3711 StreamMap *map = &stream_maps[i];
3716 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3717 switch (ist->st->codec->codec_type) {
3718 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3719 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3720 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3721 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3723 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3724 map->file_index, map->stream_index);
3728 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3729 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3730 map->sync_stream_index];
3735 av_dict_copy(&oc->metadata, metadata, 0);
3736 av_dict_free(&metadata);
3739 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3740 output_files[nb_output_files - 1].ctx = oc;
3741 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3742 output_files[nb_output_files - 1].recording_time = recording_time;
3743 output_files[nb_output_files - 1].start_time = start_time;
3744 output_files[nb_output_files - 1].limit_filesize = limit_filesize;
3745 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3747 /* check filename in case of an image number is expected */
3748 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3749 if (!av_filename_number_test(oc->filename)) {
3750 print_error(oc->filename, AVERROR(EINVAL));
3755 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3756 /* test if it already exists to avoid loosing precious files */
3757 if (!file_overwrite &&
3758 (strchr(filename, ':') == NULL ||
3759 filename[1] == ':' ||
3760 av_strstart(filename, "file:", NULL))) {
3761 if (avio_check(filename, 0) == 0) {
3763 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3765 if (!read_yesno()) {
3766 fprintf(stderr, "Not overwriting - exiting\n");
3771 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3778 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3779 print_error(filename, err);
3784 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3785 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3787 if (loop_output >= 0) {
3788 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3789 oc->loop_output = loop_output;
3793 if (chapters_input_file >= nb_input_files) {
3794 if (chapters_input_file == INT_MAX) {
3795 /* copy chapters from the first input file that has them*/
3796 chapters_input_file = -1;
3797 for (i = 0; i < nb_input_files; i++)
3798 if (input_files[i].ctx->nb_chapters) {
3799 chapters_input_file = i;
3803 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3804 chapters_input_file);
3808 if (chapters_input_file >= 0)
3809 copy_chapters(chapters_input_file, nb_output_files - 1);
3812 for (i = 0; i < nb_meta_data_maps; i++) {
3813 AVFormatContext *files[2];
3814 AVDictionary **meta[2];
3817 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3818 if ((index) < 0 || (index) >= (nb_elems)) {\
3819 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3824 int in_file_index = meta_data_maps[i][1].file;
3825 if (in_file_index < 0)
3827 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3830 files[1] = input_files[in_file_index].ctx;
3832 for (j = 0; j < 2; j++) {
3833 MetadataMap *map = &meta_data_maps[i][j];
3835 switch (map->type) {
3837 meta[j] = &files[j]->metadata;
3840 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3841 meta[j] = &files[j]->streams[map->index]->metadata;
3844 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3845 meta[j] = &files[j]->chapters[map->index]->metadata;
3848 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3849 meta[j] = &files[j]->programs[map->index]->metadata;
3854 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3857 /* copy global metadata by default */
3858 if (metadata_global_autocopy && nb_input_files)
3859 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3860 AV_DICT_DONT_OVERWRITE);
3861 if (metadata_streams_autocopy)
3862 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3863 InputStream *ist = &input_streams[output_streams[i].source_index];
3864 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3867 frame_rate = (AVRational){0, 0};
3870 audio_sample_rate = 0;
3872 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3873 chapters_input_file = INT_MAX;
3874 recording_time = INT64_MAX;
3876 limit_filesize = UINT64_MAX;
3878 av_freep(&meta_data_maps);
3879 nb_meta_data_maps = 0;
3880 metadata_global_autocopy = 1;
3881 metadata_streams_autocopy = 1;
3882 metadata_chapters_autocopy = 1;
3883 av_freep(&stream_maps);
3885 av_freep(&streamid_map);
3886 nb_streamid_map = 0;
3888 av_dict_free(&codec_names);
3890 av_freep(&forced_key_frames);
3896 /* same option as mencoder */
3897 static int opt_pass(const char *opt, const char *arg)
3899 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3903 static int64_t getutime(void)
3906 struct rusage rusage;
3908 getrusage(RUSAGE_SELF, &rusage);
3909 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3910 #elif HAVE_GETPROCESSTIMES
3912 FILETIME c, e, k, u;
3913 proc = GetCurrentProcess();
3914 GetProcessTimes(proc, &c, &e, &k, &u);
3915 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3917 return av_gettime();
3921 static int64_t getmaxrss(void)
3923 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3924 struct rusage rusage;
3925 getrusage(RUSAGE_SELF, &rusage);
3926 return (int64_t)rusage.ru_maxrss * 1024;
3927 #elif HAVE_GETPROCESSMEMORYINFO
3929 PROCESS_MEMORY_COUNTERS memcounters;
3930 proc = GetCurrentProcess();
3931 memcounters.cb = sizeof(memcounters);
3932 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3933 return memcounters.PeakPagefileUsage;
3939 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3942 const char *p = str;
3949 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3956 static int opt_inter_matrix(const char *opt, const char *arg)
3958 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3959 parse_matrix_coeffs(inter_matrix, arg);
3963 static int opt_intra_matrix(const char *opt, const char *arg)
3965 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3966 parse_matrix_coeffs(intra_matrix, arg);
3970 static void show_usage(void)
3972 printf("Hyper fast Audio and Video encoder\n");
3973 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3977 static int opt_help(const char *opt, const char *arg)
3980 AVOutputFormat *oformat = NULL;
3981 AVInputFormat *iformat = NULL;
3983 av_log_set_callback(log_callback_help);
3985 show_help_options(options, "Main options:\n",
3986 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3987 show_help_options(options, "\nAdvanced options:\n",
3988 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3990 show_help_options(options, "\nVideo options:\n",
3991 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3993 show_help_options(options, "\nAdvanced Video options:\n",
3994 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3995 OPT_VIDEO | OPT_EXPERT);
3996 show_help_options(options, "\nAudio options:\n",
3997 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3999 show_help_options(options, "\nAdvanced Audio options:\n",
4000 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4001 OPT_AUDIO | OPT_EXPERT);
4002 show_help_options(options, "\nSubtitle options:\n",
4003 OPT_SUBTITLE | OPT_GRAB,
4005 show_help_options(options, "\nAudio/Video grab options:\n",
4009 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4012 /* individual codec options */
4014 while ((c = av_codec_next(c))) {
4015 if (c->priv_class) {
4016 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4021 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4024 /* individual muxer options */
4025 while ((oformat = av_oformat_next(oformat))) {
4026 if (oformat->priv_class) {
4027 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4032 /* individual demuxer options */
4033 while ((iformat = av_iformat_next(iformat))) {
4034 if (iformat->priv_class) {
4035 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4040 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4044 static int opt_target(const char *opt, const char *arg)
4046 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4047 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4049 if(!strncmp(arg, "pal-", 4)) {
4052 } else if(!strncmp(arg, "ntsc-", 5)) {
4055 } else if(!strncmp(arg, "film-", 5)) {
4060 /* Calculate FR via float to avoid int overflow */
4061 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4064 } else if((fr == 29970) || (fr == 23976)) {
4067 /* Try to determine PAL/NTSC by peeking in the input files */
4068 if(nb_input_files) {
4070 for (j = 0; j < nb_input_files; j++) {
4071 for (i = 0; i < input_files[j].nb_streams; i++) {
4072 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4073 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4075 fr = c->time_base.den * 1000 / c->time_base.num;
4079 } else if((fr == 29970) || (fr == 23976)) {
4089 if(verbose > 0 && norm != UNKNOWN)
4090 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4093 if(norm == UNKNOWN) {
4094 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4095 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4096 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4100 if(!strcmp(arg, "vcd")) {
4101 opt_codec("c:v", "mpeg1video");
4102 opt_codec("c:a", "mp2");
4103 opt_format("f", "vcd");
4105 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4106 opt_frame_rate("r", frame_rates[norm]);
4107 opt_default("g", norm == PAL ? "15" : "18");
4109 opt_default("b", "1150000");
4110 opt_default("maxrate", "1150000");
4111 opt_default("minrate", "1150000");
4112 opt_default("bufsize", "327680"); // 40*1024*8;
4114 opt_default("b:a", "224000");
4115 audio_sample_rate = 44100;
4118 opt_default("packetsize", "2324");
4119 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4121 /* We have to offset the PTS, so that it is consistent with the SCR.
4122 SCR starts at 36000, but the first two packs contain only padding
4123 and the first pack from the other stream, respectively, may also have
4124 been written before.
4125 So the real data starts at SCR 36000+3*1200. */
4126 mux_preload= (36000+3*1200) / 90000.0; //0.44
4127 } else if(!strcmp(arg, "svcd")) {
4129 opt_codec("c:v", "mpeg2video");
4130 opt_codec("c:a", "mp2");
4131 opt_format("f", "svcd");
4133 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4134 opt_frame_rate("r", frame_rates[norm]);
4135 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4136 opt_default("g", norm == PAL ? "15" : "18");
4138 opt_default("b", "2040000");
4139 opt_default("maxrate", "2516000");
4140 opt_default("minrate", "0"); //1145000;
4141 opt_default("bufsize", "1835008"); //224*1024*8;
4142 opt_default("flags", "+scan_offset");
4145 opt_default("b:a", "224000");
4146 audio_sample_rate = 44100;
4148 opt_default("packetsize", "2324");
4150 } else if(!strcmp(arg, "dvd")) {
4152 opt_codec("c:v", "mpeg2video");
4153 opt_codec("c:a", "ac3");
4154 opt_format("f", "dvd");
4156 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4157 opt_frame_rate("r", frame_rates[norm]);
4158 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4159 opt_default("g", norm == PAL ? "15" : "18");
4161 opt_default("b", "6000000");
4162 opt_default("maxrate", "9000000");
4163 opt_default("minrate", "0"); //1500000;
4164 opt_default("bufsize", "1835008"); //224*1024*8;
4166 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4167 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4169 opt_default("b:a", "448000");
4170 audio_sample_rate = 48000;
4172 } else if(!strncmp(arg, "dv", 2)) {
4174 opt_format("f", "dv");
4176 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4177 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4178 norm == PAL ? "yuv420p" : "yuv411p");
4179 opt_frame_rate("r", frame_rates[norm]);
4181 audio_sample_rate = 48000;
4185 fprintf(stderr, "Unknown target: %s\n", arg);
4186 return AVERROR(EINVAL);
4191 static int opt_vstats_file(const char *opt, const char *arg)
4193 av_free (vstats_filename);
4194 vstats_filename=av_strdup (arg);
4198 static int opt_vstats(const char *opt, const char *arg)
4201 time_t today2 = time(NULL);
4202 struct tm *today = localtime(&today2);
4204 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4206 return opt_vstats_file(opt, filename);
4209 static int opt_bsf(const char *opt, const char *arg)
4211 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4212 AVBitStreamFilterContext **bsfp;
4215 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4219 bsfp= *opt == 'v' ? &video_bitstream_filters :
4220 *opt == 'a' ? &audio_bitstream_filters :
4221 &subtitle_bitstream_filters;
4223 bsfp= &(*bsfp)->next;
4230 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4234 static int opt_passlogfile(const char *opt, const char *arg)
4236 pass_logfilename_prefix = arg;
4237 #if CONFIG_LIBX264_ENCODER
4238 return opt_default("passlogfile", arg);
4244 static const OptionDef options[] = {
4246 #include "cmdutils_common_opts.h"
4247 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4248 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4249 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4250 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4251 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4252 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4253 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4254 "outfile[,metadata]:infile[,metadata]" },
4255 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4256 "outfile[,metadata]:infile[,metadata]" },
4257 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4258 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4259 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4260 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4261 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4262 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4263 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4264 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4265 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4266 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4267 "add timings for benchmarking" },
4268 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4269 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4270 "dump each input packet" },
4271 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4272 "when dumping packets, also dump the payload" },
4273 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4274 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4275 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4276 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4277 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4278 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4279 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4280 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4281 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4282 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4283 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4284 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4285 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4286 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4287 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4288 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4291 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4292 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4293 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4294 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4295 { "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" },
4296 { "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" },
4297 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4298 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4299 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4300 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4301 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4302 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4303 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4304 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4305 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4306 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4307 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4308 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4309 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4310 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4311 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4312 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4313 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4314 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4315 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4316 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4317 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4318 "deinterlace pictures" },
4319 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4320 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4321 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4323 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4325 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4326 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4327 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4328 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4329 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4330 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4331 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4332 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4333 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4334 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4337 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4338 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4339 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4340 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4341 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4342 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4343 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4344 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4345 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4346 { "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" },
4348 /* subtitle options */
4349 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4350 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4351 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4352 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4355 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4356 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4357 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4360 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4361 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4363 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4364 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4365 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4367 /* data codec support */
4368 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4370 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4374 int main(int argc, char **argv)
4378 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4380 if(argc>1 && !strcmp(argv[1], "-d")){
4383 av_log_set_callback(log_callback_null);
4388 avcodec_register_all();
4390 avdevice_register_all();
4393 avfilter_register_all();
4398 if(isatty(STDIN_FILENO))
4399 avio_set_interrupt_cb(decode_interrupt_cb);
4408 parse_options(argc, argv, options, opt_output_file);
4410 if(nb_output_files <= 0 && nb_input_files == 0) {
4412 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4416 /* file converter / grab */
4417 if (nb_output_files <= 0) {
4418 fprintf(stderr, "At least one output file must be specified\n");
4422 if (nb_input_files == 0) {
4423 fprintf(stderr, "At least one input file must be specified\n");
4428 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4430 ti = getutime() - ti;
4432 int maxrss = getmaxrss() / 1024;
4433 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4436 return exit_program(0);