3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
49 #include "libavformat/ffm.h" // not public API
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/vsink_buffer.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "ffmpeg";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_FILES 100
113 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 static const char *last_asked_format = NULL;
115 static AVDictionary *ts_scale;
117 static AVFormatContext *output_files[MAX_FILES];
118 static AVDictionary *output_opts[MAX_FILES];
119 static int nb_output_files = 0;
121 static StreamMap *stream_maps = NULL;
122 static int nb_stream_maps;
124 static AVDictionary *codec_names;
126 /* first item specifies output metadata, second is input */
127 static MetadataMap (*meta_data_maps)[2] = NULL;
128 static int nb_meta_data_maps;
129 static int metadata_global_autocopy = 1;
130 static int metadata_streams_autocopy = 1;
131 static int metadata_chapters_autocopy = 1;
133 static int chapters_input_file = INT_MAX;
135 /* indexed by output file stream index */
136 static int *streamid_map = NULL;
137 static int nb_streamid_map = 0;
139 static int frame_width = 0;
140 static int frame_height = 0;
141 static float frame_aspect_ratio = 0;
142 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
143 static int frame_bits_per_raw_sample = 0;
144 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
145 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
146 static AVRational frame_rate;
147 static float video_qscale = 0;
148 static uint16_t *intra_matrix = NULL;
149 static uint16_t *inter_matrix = NULL;
150 static const char *video_rc_override_string=NULL;
151 static int video_disable = 0;
152 static int video_discard = 0;
153 static unsigned int video_codec_tag = 0;
154 static char *video_language = NULL;
155 static int same_quant = 0;
156 static int do_deinterlace = 0;
157 static int top_field_first = -1;
158 static int me_threshold = 0;
159 static int intra_dc_precision = 8;
160 static int loop_input = 0;
161 static int loop_output = AVFMT_NOOUTPUTLOOP;
162 static int qp_hist = 0;
164 static char *vfilters = NULL;
167 static int intra_only = 0;
168 static int audio_sample_rate = 0;
169 #define QSCALE_NONE -99999
170 static float audio_qscale = QSCALE_NONE;
171 static int audio_disable = 0;
172 static int audio_channels = 0;
173 static unsigned int audio_codec_tag = 0;
174 static char *audio_language = NULL;
176 static int subtitle_disable = 0;
177 static char *subtitle_language = NULL;
178 static unsigned int subtitle_codec_tag = 0;
180 static int data_disable = 0;
181 static unsigned int data_codec_tag = 0;
183 static float mux_preload= 0.5;
184 static float mux_max_delay= 0.7;
186 static int64_t recording_time = INT64_MAX;
187 static int64_t start_time = 0;
188 static int64_t input_ts_offset = 0;
189 static int file_overwrite = 0;
190 static AVDictionary *metadata;
191 static int do_benchmark = 0;
192 static int do_hex_dump = 0;
193 static int do_pkt_dump = 0;
194 static int do_psnr = 0;
195 static int do_pass = 0;
196 static const char *pass_logfilename_prefix;
197 static int video_sync_method= -1;
198 static int audio_sync_method= 0;
199 static float audio_drift_threshold= 0.1;
200 static int copy_ts= 0;
201 static int copy_tb= 0;
202 static int opt_shortest = 0;
203 static char *vstats_filename;
204 static FILE *vstats_file;
205 static int opt_programid = 0;
206 static int copy_initial_nonkeyframes = 0;
208 static int rate_emu = 0;
210 static int audio_volume = 256;
212 static int exit_on_error = 0;
213 static int using_stdin = 0;
214 static int verbose = 1;
215 static int run_as_daemon = 0;
216 static int thread_count= 1;
217 static int q_pressed = 0;
218 static int64_t video_size = 0;
219 static int64_t audio_size = 0;
220 static int64_t extra_size = 0;
221 static int nb_frames_dup = 0;
222 static int nb_frames_drop = 0;
223 static int input_sync;
224 static uint64_t limit_filesize = 0;
225 static int force_fps = 0;
226 static char *forced_key_frames = NULL;
228 static float dts_delta_threshold = 10;
230 static int64_t timer_start;
232 static uint8_t *audio_buf;
233 static uint8_t *audio_out;
234 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
236 static short *samples;
238 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
239 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
240 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
242 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
246 typedef struct OutputStream {
247 int file_index; /* file index */
248 int index; /* stream index in the output file */
249 int source_index; /* InputStream index */
250 AVStream *st; /* stream in the output file */
251 int encoding_needed; /* true if encoding needed for this stream */
253 /* input pts and corresponding output pts
255 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
256 struct InputStream *sync_ist; /* input stream to sync against */
257 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
258 AVBitStreamFilterContext *bitstream_filters;
263 AVFrame resample_frame; /* temporary frame for image resampling */
264 struct SwsContext *img_resample_ctx; /* for image resampling */
267 int resample_pix_fmt;
268 AVRational frame_rate;
270 float frame_aspect_ratio;
272 /* forced key frames */
273 int64_t *forced_kf_pts;
279 ReSampleContext *resample; /* for audio resampling */
280 int resample_sample_fmt;
281 int resample_channels;
282 int resample_sample_rate;
284 AVAudioConvert *reformat_ctx;
285 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
289 AVFilterContext *output_video_filter;
290 AVFilterContext *input_video_filter;
291 AVFilterBufferRef *picref;
293 AVFilterGraph *graph;
300 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
301 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
303 typedef struct InputStream {
306 int discard; /* true if stream data should be discarded */
307 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
310 int64_t start; /* time when read started */
311 int64_t next_pts; /* synthetic pts for cases where pkt.pts
313 int64_t pts; /* current pts */
315 int is_start; /* is 1 at the start and after a discontinuity */
316 int showed_multi_packet_warning;
317 int is_past_recording_time;
321 typedef struct InputFile {
322 AVFormatContext *ctx;
323 int eof_reached; /* true if eof reached */
324 int ist_index; /* index of first stream in ist_table */
325 int buffer_size; /* current total buffer size */
332 /* init terminal so that we can grab keys */
333 static struct termios oldtty;
336 static InputStream *input_streams = NULL;
337 static int nb_input_streams = 0;
338 static InputFile *input_files = NULL;
339 static int nb_input_files = 0;
343 static int configure_video_filters(InputStream *ist, OutputStream *ost)
345 AVFilterContext *last_filter, *filter;
346 /** filter graph containing all filters including input & output */
347 AVCodecContext *codec = ost->st->codec;
348 AVCodecContext *icodec = ist->st->codec;
349 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
350 AVRational sample_aspect_ratio;
354 ost->graph = avfilter_graph_alloc();
356 if (ist->st->sample_aspect_ratio.num){
357 sample_aspect_ratio = ist->st->sample_aspect_ratio;
359 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
361 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
362 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
363 sample_aspect_ratio.num, sample_aspect_ratio.den);
365 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
366 "src", args, NULL, ost->graph);
369 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
370 "out", NULL, pix_fmts, ost->graph);
373 last_filter = ost->input_video_filter;
375 if (codec->width != icodec->width || codec->height != icodec->height) {
376 snprintf(args, 255, "%d:%d:flags=0x%X",
380 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
381 NULL, args, NULL, ost->graph)) < 0)
383 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
385 last_filter = filter;
388 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
389 ost->graph->scale_sws_opts = av_strdup(args);
392 AVFilterInOut *outputs = avfilter_inout_alloc();
393 AVFilterInOut *inputs = avfilter_inout_alloc();
395 outputs->name = av_strdup("in");
396 outputs->filter_ctx = last_filter;
397 outputs->pad_idx = 0;
398 outputs->next = NULL;
400 inputs->name = av_strdup("out");
401 inputs->filter_ctx = ost->output_video_filter;
405 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
407 av_freep(&ost->avfilter);
409 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
413 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
416 codec->width = ost->output_video_filter->inputs[0]->w;
417 codec->height = ost->output_video_filter->inputs[0]->h;
418 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
419 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
420 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
421 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
425 #endif /* CONFIG_AVFILTER */
427 static void term_exit(void)
429 av_log(NULL, AV_LOG_QUIET, "%s", "");
432 tcsetattr (0, TCSANOW, &oldtty);
436 static volatile int received_sigterm = 0;
439 sigterm_handler(int sig)
441 received_sigterm = sig;
446 static void term_init(void)
456 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
457 |INLCR|IGNCR|ICRNL|IXON);
458 tty.c_oflag |= OPOST;
459 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
460 tty.c_cflag &= ~(CSIZE|PARENB);
465 tcsetattr (0, TCSANOW, &tty);
466 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
470 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
471 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
473 signal(SIGXCPU, sigterm_handler);
477 /* read a key without blocking */
478 static int read_key(void)
493 n = select(1, &rfds, NULL, NULL, &tv);
508 static int decode_interrupt_cb(void)
510 q_pressed += read_key() == 'q';
511 return q_pressed > 1;
514 static int exit_program(int ret)
519 for(i=0;i<nb_output_files;i++) {
520 AVFormatContext *s = output_files[i];
521 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
523 avformat_free_context(s);
524 av_free(output_streams_for_file[i]);
525 av_dict_free(&output_opts[i]);
527 for(i=0;i<nb_input_files;i++) {
528 av_close_input_file(input_files[i].ctx);
530 for (i = 0; i < nb_input_streams; i++)
531 av_dict_free(&input_streams[i].opts);
533 av_free(intra_matrix);
534 av_free(inter_matrix);
538 av_free(vstats_filename);
540 av_free(streamid_map);
541 av_free(meta_data_maps);
543 av_freep(&input_streams);
544 av_freep(&input_files);
549 allocated_audio_buf_size= allocated_audio_out_size= 0;
556 if (received_sigterm) {
558 "Received signal %d: terminating.\n",
559 (int) received_sigterm);
563 exit(ret); /* not all OS-es handle main() return value */
567 static void assert_avoptions(AVDictionary *m)
569 AVDictionaryEntry *t;
570 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
571 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
576 static void assert_codec_experimental(AVCodecContext *c, int encoder)
578 const char *codec_string = encoder ? "encoder" : "decoder";
580 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
581 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
582 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
583 "results.\nAdd '-strict experimental' if you want to use it.\n",
584 codec_string, c->codec->name);
585 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
586 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
587 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
588 codec_string, codec->name);
593 /* similar to ff_dynarray_add() and av_fast_realloc() */
594 static void *grow_array(void *array, int elem_size, int *size, int new_size)
596 if (new_size >= INT_MAX / elem_size) {
597 fprintf(stderr, "Array too big.\n");
600 if (*size < new_size) {
601 uint8_t *tmp = av_realloc(array, new_size*elem_size);
603 fprintf(stderr, "Could not alloc buffer.\n");
606 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
613 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
615 if(codec && codec->sample_fmts){
616 const enum AVSampleFormat *p= codec->sample_fmts;
618 if(*p == st->codec->sample_fmt)
622 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
623 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
624 if(av_get_sample_fmt_name(st->codec->sample_fmt))
625 av_log(NULL, AV_LOG_WARNING,
626 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
627 av_get_sample_fmt_name(st->codec->sample_fmt),
629 av_get_sample_fmt_name(codec->sample_fmts[0]));
630 st->codec->sample_fmt = codec->sample_fmts[0];
635 static void choose_sample_rate(AVStream *st, AVCodec *codec)
637 if(codec && codec->supported_samplerates){
638 const int *p= codec->supported_samplerates;
640 int best_dist=INT_MAX;
642 int dist= abs(st->codec->sample_rate - *p);
643 if(dist < best_dist){
649 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
651 st->codec->sample_rate= best;
655 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
657 if(codec && codec->pix_fmts){
658 const enum PixelFormat *p= codec->pix_fmts;
659 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
660 if(st->codec->codec_id==CODEC_ID_MJPEG){
661 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
662 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
663 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};
667 if(*p == st->codec->pix_fmt)
671 if(st->codec->pix_fmt != PIX_FMT_NONE)
672 av_log(NULL, AV_LOG_WARNING,
673 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
674 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
676 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
677 st->codec->pix_fmt = codec->pix_fmts[0];
683 get_sync_ipts(const OutputStream *ost)
685 const InputStream *ist = ost->sync_ist;
686 return (double)(ist->pts - start_time)/AV_TIME_BASE;
689 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
693 AVPacket new_pkt= *pkt;
694 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
695 &new_pkt.data, &new_pkt.size,
696 pkt->data, pkt->size,
697 pkt->flags & AV_PKT_FLAG_KEY);
700 new_pkt.destruct= av_destruct_packet;
702 fprintf(stderr, "%s failed for stream %d, codec %s",
703 bsfc->filter->name, pkt->stream_index,
704 avctx->codec ? avctx->codec->name : "copy");
714 ret= av_interleaved_write_frame(s, pkt);
716 print_error("av_interleaved_write_frame()", ret);
721 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
723 static void do_audio_out(AVFormatContext *s,
726 unsigned char *buf, int size)
729 int64_t audio_out_size, audio_buf_size;
730 int64_t allocated_for_size= size;
732 int size_out, frame_bytes, ret, resample_changed;
733 AVCodecContext *enc= ost->st->codec;
734 AVCodecContext *dec= ist->st->codec;
735 int osize = av_get_bytes_per_sample(enc->sample_fmt);
736 int isize = av_get_bytes_per_sample(dec->sample_fmt);
737 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
740 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
741 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
742 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
743 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
744 audio_buf_size*= osize*enc->channels;
746 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
747 if(coded_bps > 8*osize)
748 audio_out_size= audio_out_size * coded_bps / (8*osize);
749 audio_out_size += FF_MIN_BUFFER_SIZE;
751 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
752 fprintf(stderr, "Buffer sizes too large\n");
756 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
757 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
758 if (!audio_buf || !audio_out){
759 fprintf(stderr, "Out of memory in do_audio_out\n");
763 if (enc->channels != dec->channels)
764 ost->audio_resample = 1;
766 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
767 ost->resample_channels != dec->channels ||
768 ost->resample_sample_rate != dec->sample_rate;
770 if ((ost->audio_resample && !ost->resample) || resample_changed) {
771 if (resample_changed) {
772 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",
773 ist->file_index, ist->st->index,
774 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
775 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
776 ost->resample_sample_fmt = dec->sample_fmt;
777 ost->resample_channels = dec->channels;
778 ost->resample_sample_rate = dec->sample_rate;
780 audio_resample_close(ost->resample);
782 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
783 if (audio_sync_method <= 1 &&
784 ost->resample_sample_fmt == enc->sample_fmt &&
785 ost->resample_channels == enc->channels &&
786 ost->resample_sample_rate == enc->sample_rate) {
787 ost->resample = NULL;
788 ost->audio_resample = 0;
790 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
791 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
792 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
793 enc->sample_rate, dec->sample_rate,
794 enc->sample_fmt, dec->sample_fmt,
796 if (!ost->resample) {
797 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
798 dec->channels, dec->sample_rate,
799 enc->channels, enc->sample_rate);
805 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
806 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
807 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
808 if (ost->reformat_ctx)
809 av_audio_convert_free(ost->reformat_ctx);
810 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
811 dec->sample_fmt, 1, NULL, 0);
812 if (!ost->reformat_ctx) {
813 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
814 av_get_sample_fmt_name(dec->sample_fmt),
815 av_get_sample_fmt_name(enc->sample_fmt));
818 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
821 if(audio_sync_method){
822 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
823 - av_fifo_size(ost->fifo)/(enc->channels * 2);
824 double idelta= delta*dec->sample_rate / enc->sample_rate;
825 int byte_delta= ((int)idelta)*2*dec->channels;
827 //FIXME resample delay
828 if(fabs(delta) > 50){
829 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
831 byte_delta= FFMAX(byte_delta, -size);
835 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
840 static uint8_t *input_tmp= NULL;
841 input_tmp= av_realloc(input_tmp, byte_delta + size);
843 if(byte_delta > allocated_for_size - size){
844 allocated_for_size= byte_delta + (int64_t)size;
849 memset(input_tmp, 0, byte_delta);
850 memcpy(input_tmp + byte_delta, buf, size);
854 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
856 }else if(audio_sync_method>1){
857 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
858 av_assert0(ost->audio_resample);
860 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
861 // 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));
862 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
866 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
867 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
869 if (ost->audio_resample) {
871 size_out = audio_resample(ost->resample,
872 (short *)buftmp, (short *)buf,
873 size / (dec->channels * isize));
874 size_out = size_out * enc->channels * osize;
880 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
881 const void *ibuf[6]= {buftmp};
882 void *obuf[6]= {audio_buf};
883 int istride[6]= {isize};
884 int ostride[6]= {osize};
885 int len= size_out/istride[0];
886 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
887 printf("av_audio_convert() failed\n");
893 size_out = len*osize;
896 /* now encode as many frames as possible */
897 if (enc->frame_size > 1) {
898 /* output resampled raw samples */
899 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
900 fprintf(stderr, "av_fifo_realloc2() failed\n");
903 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
905 frame_bytes = enc->frame_size * osize * enc->channels;
907 while (av_fifo_size(ost->fifo) >= frame_bytes) {
909 av_init_packet(&pkt);
911 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
913 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
915 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
918 fprintf(stderr, "Audio encoding failed\n");
922 pkt.stream_index= ost->index;
925 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
926 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
927 pkt.flags |= AV_PKT_FLAG_KEY;
928 write_frame(s, &pkt, enc, ost->bitstream_filters);
930 ost->sync_opts += enc->frame_size;
934 av_init_packet(&pkt);
936 ost->sync_opts += size_out / (osize * enc->channels);
938 /* output a pcm frame */
939 /* determine the size of the coded buffer */
942 size_out = size_out*coded_bps/8;
944 if(size_out > audio_out_size){
945 fprintf(stderr, "Internal error, buffer size too small\n");
949 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
950 ret = avcodec_encode_audio(enc, audio_out, size_out,
953 fprintf(stderr, "Audio encoding failed\n");
957 pkt.stream_index= ost->index;
960 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
961 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
962 pkt.flags |= AV_PKT_FLAG_KEY;
963 write_frame(s, &pkt, enc, ost->bitstream_filters);
967 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
971 AVPicture picture_tmp;
974 dec = ist->st->codec;
976 /* deinterlace : must be done before any resize */
977 if (do_deinterlace) {
980 /* create temporary picture */
981 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
982 buf = av_malloc(size);
986 picture2 = &picture_tmp;
987 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
989 if(avpicture_deinterlace(picture2, picture,
990 dec->pix_fmt, dec->width, dec->height) < 0) {
991 /* if error, do not deinterlace */
992 fprintf(stderr, "Deinterlacing failed\n");
1001 if (picture != picture2)
1002 *picture = *picture2;
1006 /* we begin to correct av delay at this threshold */
1007 #define AV_DELAY_MAX 0.100
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, *dec;
1143 enc = ost->st->codec;
1144 dec = ist->st->codec;
1146 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1148 /* by default, we output a single frame */
1153 format_video_sync = video_sync_method;
1154 if (format_video_sync < 0)
1155 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1157 if (format_video_sync) {
1158 double vdelta = sync_ipts - ost->sync_opts;
1159 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1162 else if (format_video_sync == 2) {
1165 }else if(vdelta>0.6)
1166 ost->sync_opts= lrintf(sync_ipts);
1167 }else if (vdelta > 1.1)
1168 nb_frames = lrintf(vdelta);
1169 //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);
1170 if (nb_frames == 0){
1173 fprintf(stderr, "*** drop!\n");
1174 }else if (nb_frames > 1) {
1175 nb_frames_dup += nb_frames - 1;
1177 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1180 ost->sync_opts= lrintf(sync_ipts);
1182 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1186 do_video_resample(ost, ist, in_picture, &final_picture);
1188 /* duplicates frame if needed */
1189 for(i=0;i<nb_frames;i++) {
1191 av_init_packet(&pkt);
1192 pkt.stream_index= ost->index;
1194 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1195 /* raw pictures are written as AVPicture structure to
1196 avoid any copies. We support temorarily the older
1198 AVFrame* old_frame = enc->coded_frame;
1199 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1200 pkt.data= (uint8_t *)final_picture;
1201 pkt.size= sizeof(AVPicture);
1202 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1203 pkt.flags |= AV_PKT_FLAG_KEY;
1205 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1206 enc->coded_frame = old_frame;
1208 AVFrame big_picture;
1210 big_picture= *final_picture;
1211 /* better than nothing: use input picture interlaced
1213 big_picture.interlaced_frame = in_picture->interlaced_frame;
1214 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1215 if(top_field_first == -1)
1216 big_picture.top_field_first = in_picture->top_field_first;
1218 big_picture.top_field_first = top_field_first;
1221 /* handles same_quant here. This is not correct because it may
1222 not be a global option */
1223 big_picture.quality = quality;
1225 big_picture.pict_type = 0;
1226 // big_picture.pts = AV_NOPTS_VALUE;
1227 big_picture.pts= ost->sync_opts;
1228 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1229 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1230 if (ost->forced_kf_index < ost->forced_kf_count &&
1231 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1232 big_picture.pict_type = AV_PICTURE_TYPE_I;
1233 ost->forced_kf_index++;
1235 ret = avcodec_encode_video(enc,
1236 bit_buffer, bit_buffer_size,
1239 fprintf(stderr, "Video encoding failed\n");
1244 pkt.data= bit_buffer;
1246 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1247 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1248 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1249 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1250 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1252 if(enc->coded_frame->key_frame)
1253 pkt.flags |= AV_PKT_FLAG_KEY;
1254 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1257 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1258 // enc->frame_number-1, ret, enc->pict_type);
1259 /* if two pass, output log */
1260 if (ost->logfile && enc->stats_out) {
1261 fprintf(ost->logfile, "%s", enc->stats_out);
1266 ost->frame_number++;
1270 static double psnr(double d){
1271 return -10.0*log(d)/log(10.0);
1274 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1277 AVCodecContext *enc;
1279 double ti1, bitrate, avg_bitrate;
1281 /* this is executed just the first time do_video_stats is called */
1283 vstats_file = fopen(vstats_filename, "w");
1290 enc = ost->st->codec;
1291 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1292 frame_number = ost->frame_number;
1293 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1294 if (enc->flags&CODEC_FLAG_PSNR)
1295 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1297 fprintf(vstats_file,"f_size= %6d ", frame_size);
1298 /* compute pts value */
1299 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1303 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1304 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1305 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1306 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1307 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1311 static void print_report(AVFormatContext **output_files,
1312 OutputStream **ost_table, int nb_ostreams,
1317 AVFormatContext *oc;
1319 AVCodecContext *enc;
1320 int frame_number, vid, i;
1322 int64_t pts = INT64_MAX;
1323 static int64_t last_time = -1;
1324 static int qp_histogram[52];
1326 if (!is_last_report) {
1328 /* display the report every 0.5 seconds */
1329 cur_time = av_gettime();
1330 if (last_time == -1) {
1331 last_time = cur_time;
1334 if ((cur_time - last_time) < 500000)
1336 last_time = cur_time;
1340 oc = output_files[0];
1342 total_size = avio_size(oc->pb);
1343 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1344 total_size= avio_tell(oc->pb);
1348 for(i=0;i<nb_ostreams;i++) {
1351 enc = ost->st->codec;
1352 if (!ost->st->stream_copy && enc->coded_frame)
1353 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1354 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1355 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1357 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1358 float t = (av_gettime()-timer_start) / 1000000.0;
1360 frame_number = ost->frame_number;
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1362 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1364 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1368 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1371 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1373 if (enc->flags&CODEC_FLAG_PSNR){
1375 double error, error_sum=0;
1376 double scale, scale_sum=0;
1377 char type[3]= {'Y','U','V'};
1378 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1381 error= enc->error[j];
1382 scale= enc->width*enc->height*255.0*255.0*frame_number;
1384 error= enc->coded_frame->error[j];
1385 scale= enc->width*enc->height*255.0*255.0;
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1392 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1396 /* compute min output value */
1397 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1398 ost->st->time_base, AV_TIME_BASE_Q));
1401 if (verbose > 0 || is_last_report) {
1402 int hours, mins, secs, us;
1403 secs = pts / AV_TIME_BASE;
1404 us = pts % AV_TIME_BASE;
1410 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1413 "size=%8.0fkB time=", total_size / 1024.0);
1414 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1415 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1416 (100 * us) / AV_TIME_BASE);
1417 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1418 "bitrate=%6.1fkbits/s", bitrate);
1420 if (nb_frames_dup || nb_frames_drop)
1421 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1422 nb_frames_dup, nb_frames_drop);
1425 fprintf(stderr, "%s \r", buf);
1430 if (is_last_report && verbose >= 0){
1431 int64_t raw= audio_size + video_size + extra_size;
1432 fprintf(stderr, "\n");
1433 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1437 100.0*(total_size - raw)/raw
1442 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1444 int fill_char = 0x00;
1445 if (sample_fmt == AV_SAMPLE_FMT_U8)
1447 memset(buf, fill_char, size);
1450 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1451 static int output_packet(InputStream *ist, int ist_index,
1452 OutputStream **ost_table, int nb_ostreams,
1453 const AVPacket *pkt)
1455 AVFormatContext *os;
1460 void *buffer_to_free = NULL;
1461 static unsigned int samples_size= 0;
1462 AVSubtitle subtitle, *subtitle_to_free;
1463 int64_t pkt_pts = AV_NOPTS_VALUE;
1465 int frame_available;
1470 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1472 if(ist->next_pts == AV_NOPTS_VALUE)
1473 ist->next_pts= ist->pts;
1477 av_init_packet(&avpkt);
1485 if(pkt->dts != AV_NOPTS_VALUE)
1486 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1487 if(pkt->pts != AV_NOPTS_VALUE)
1488 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1490 //while we have more to decode or while the decoder did output something on EOF
1491 while (avpkt.size > 0 || (!pkt && got_output)) {
1492 uint8_t *data_buf, *decoded_data_buf;
1493 int data_size, decoded_data_size;
1495 ist->pts= ist->next_pts;
1497 if(avpkt.size && avpkt.size != pkt->size &&
1498 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1499 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1500 ist->showed_multi_packet_warning=1;
1503 /* decode the packet if needed */
1504 decoded_data_buf = NULL; /* fail safe */
1505 decoded_data_size= 0;
1506 data_buf = avpkt.data;
1507 data_size = avpkt.size;
1508 subtitle_to_free = NULL;
1509 if (ist->decoding_needed) {
1510 switch(ist->st->codec->codec_type) {
1511 case AVMEDIA_TYPE_AUDIO:{
1512 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1513 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1515 samples= av_malloc(samples_size);
1517 decoded_data_size= samples_size;
1518 /* XXX: could avoid copy if PCM 16 bits with same
1519 endianness as CPU */
1520 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1527 got_output = decoded_data_size > 0;
1528 /* Some bug in mpeg audio decoder gives */
1529 /* decoded_data_size < 0, it seems they are overflows */
1531 /* no audio frame */
1534 decoded_data_buf = (uint8_t *)samples;
1535 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1536 (ist->st->codec->sample_rate * ist->st->codec->channels);
1538 case AVMEDIA_TYPE_VIDEO:
1539 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1540 /* XXX: allocate picture correctly */
1541 avcodec_get_frame_defaults(&picture);
1542 avpkt.pts = pkt_pts;
1543 avpkt.dts = ist->pts;
1544 pkt_pts = AV_NOPTS_VALUE;
1546 ret = avcodec_decode_video2(ist->st->codec,
1547 &picture, &got_output, &avpkt);
1548 quality = same_quant ? picture.quality : 0;
1552 /* no picture yet */
1553 goto discard_packet;
1555 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1556 if (ist->st->codec->time_base.num != 0) {
1557 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1558 ist->next_pts += ((int64_t)AV_TIME_BASE *
1559 ist->st->codec->time_base.num * ticks) /
1560 ist->st->codec->time_base.den;
1563 buffer_to_free = NULL;
1564 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1566 case AVMEDIA_TYPE_SUBTITLE:
1567 ret = avcodec_decode_subtitle2(ist->st->codec,
1568 &subtitle, &got_output, &avpkt);
1572 goto discard_packet;
1574 subtitle_to_free = &subtitle;
1581 switch(ist->st->codec->codec_type) {
1582 case AVMEDIA_TYPE_AUDIO:
1583 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1584 ist->st->codec->sample_rate;
1586 case AVMEDIA_TYPE_VIDEO:
1587 if (ist->st->codec->time_base.num != 0) {
1588 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1589 ist->next_pts += ((int64_t)AV_TIME_BASE *
1590 ist->st->codec->time_base.num * ticks) /
1591 ist->st->codec->time_base.den;
1600 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1601 if (start_time == 0 || ist->pts >= start_time) {
1602 for(i=0;i<nb_ostreams;i++) {
1604 if (ost->input_video_filter && ost->source_index == ist_index) {
1605 if (!picture.sample_aspect_ratio.num)
1606 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1607 picture.pts = ist->pts;
1609 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1615 // preprocess audio (volume)
1616 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1617 if (audio_volume != 256) {
1620 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1621 int v = ((*volp) * audio_volume + 128) >> 8;
1622 if (v < -32768) v = -32768;
1623 if (v > 32767) v = 32767;
1629 /* frame rate emulation */
1631 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1632 int64_t now = av_gettime() - ist->start;
1636 /* if output time reached then transcode raw format,
1637 encode packets and output them */
1638 if (start_time == 0 || ist->pts >= start_time)
1639 for(i=0;i<nb_ostreams;i++) {
1644 /* finish if recording time exhausted */
1645 if (recording_time != INT64_MAX &&
1646 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
1648 ist->is_past_recording_time = 1;
1651 if (ost->source_index == ist_index) {
1653 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1654 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1655 while (frame_available) {
1656 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1657 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1658 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1661 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1662 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1666 os = output_files[ost->file_index];
1668 /* set the input output pts pairs */
1669 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1671 if (ost->encoding_needed) {
1672 av_assert0(ist->decoding_needed);
1673 switch(ost->st->codec->codec_type) {
1674 case AVMEDIA_TYPE_AUDIO:
1675 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1677 case AVMEDIA_TYPE_VIDEO:
1679 if (ost->picref->video && !ost->frame_aspect_ratio)
1680 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1682 do_video_out(os, ost, ist, &picture, &frame_size,
1683 same_quant ? quality : ost->st->codec->global_quality);
1684 if (vstats_filename && frame_size)
1685 do_video_stats(os, ost, frame_size);
1687 case AVMEDIA_TYPE_SUBTITLE:
1688 do_subtitle_out(os, ost, ist, &subtitle,
1695 AVFrame avframe; //FIXME/XXX remove this
1698 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1700 av_init_packet(&opkt);
1702 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1703 #if !CONFIG_AVFILTER
1709 /* no reencoding needed : output the packet directly */
1710 /* force the input stream PTS */
1712 avcodec_get_frame_defaults(&avframe);
1713 ost->st->codec->coded_frame= &avframe;
1714 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1716 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1717 audio_size += data_size;
1718 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1719 video_size += data_size;
1723 opkt.stream_index= ost->index;
1724 if(pkt->pts != AV_NOPTS_VALUE)
1725 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1727 opkt.pts= AV_NOPTS_VALUE;
1729 if (pkt->dts == AV_NOPTS_VALUE)
1730 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1732 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1733 opkt.dts -= ost_tb_start_time;
1735 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1736 opkt.flags= pkt->flags;
1738 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1739 if( ost->st->codec->codec_id != CODEC_ID_H264
1740 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1741 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1743 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1744 opkt.destruct= av_destruct_packet;
1746 opkt.data = data_buf;
1747 opkt.size = data_size;
1750 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1751 /* store AVPicture in AVPacket, as expected by the output format */
1752 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1753 opkt.data = (uint8_t *)&pict;
1754 opkt.size = sizeof(AVPicture);
1755 opkt.flags |= AV_PKT_FLAG_KEY;
1757 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1758 ost->st->codec->frame_number++;
1759 ost->frame_number++;
1760 av_free_packet(&opkt);
1764 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1765 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1766 avfilter_unref_buffer(ost->picref);
1772 av_free(buffer_to_free);
1773 /* XXX: allocate the subtitles in the codec ? */
1774 if (subtitle_to_free) {
1775 avsubtitle_free(subtitle_to_free);
1776 subtitle_to_free = NULL;
1783 for(i=0;i<nb_ostreams;i++) {
1785 if (ost->source_index == ist_index) {
1786 AVCodecContext *enc= ost->st->codec;
1787 os = output_files[ost->file_index];
1789 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1791 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1794 if (ost->encoding_needed) {
1798 av_init_packet(&pkt);
1799 pkt.stream_index= ost->index;
1801 switch(ost->st->codec->codec_type) {
1802 case AVMEDIA_TYPE_AUDIO:
1803 fifo_bytes = av_fifo_size(ost->fifo);
1805 /* encode any samples remaining in fifo */
1806 if (fifo_bytes > 0) {
1807 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1808 int fs_tmp = enc->frame_size;
1810 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1811 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1812 enc->frame_size = fifo_bytes / (osize * enc->channels);
1814 int frame_bytes = enc->frame_size*osize*enc->channels;
1815 if (allocated_audio_buf_size < frame_bytes)
1817 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1820 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1821 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1822 ost->st->time_base.num, enc->sample_rate);
1823 enc->frame_size = fs_tmp;
1826 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1829 fprintf(stderr, "Audio encoding failed\n");
1833 pkt.flags |= AV_PKT_FLAG_KEY;
1835 case AVMEDIA_TYPE_VIDEO:
1836 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1838 fprintf(stderr, "Video encoding failed\n");
1842 if(enc->coded_frame && enc->coded_frame->key_frame)
1843 pkt.flags |= AV_PKT_FLAG_KEY;
1844 if (ost->logfile && enc->stats_out) {
1845 fprintf(ost->logfile, "%s", enc->stats_out);
1854 pkt.data= bit_buffer;
1856 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1857 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1858 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1868 static void print_sdp(AVFormatContext **avc, int n)
1872 av_sdp_create(avc, n, sdp, sizeof(sdp));
1873 printf("SDP:\n%s\n", sdp);
1878 * The following code is the main loop of the file converter
1880 static int transcode(AVFormatContext **output_files,
1881 int nb_output_files,
1882 InputFile *input_files,
1885 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
1887 AVFormatContext *is, *os;
1888 AVCodecContext *codec, *icodec;
1889 OutputStream *ost, **ost_table = NULL;
1894 uint8_t no_packet[MAX_FILES]={0};
1895 int no_packet_count=0;
1896 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
1897 int nb_streams[AVMEDIA_TYPE_NB]={0};
1900 for (i = 0; i < nb_input_streams; i++)
1901 input_streams[i].start = av_gettime();
1903 /* output stream init */
1905 for(i=0;i<nb_output_files;i++) {
1906 os = output_files[i];
1907 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1908 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1909 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1910 ret = AVERROR(EINVAL);
1913 nb_ostreams += os->nb_streams;
1916 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
1920 for(k=0;k<nb_output_files;k++) {
1921 os = output_files[k];
1922 for(i=0;i<os->nb_streams;i++,n++) {
1923 nb_streams[os->streams[i]->codec->codec_type]++;
1926 for(step=1<<30; step; step>>=1){
1927 int found_streams[AVMEDIA_TYPE_NB]={0};
1928 for(j=0; j<AVMEDIA_TYPE_NB; j++)
1929 nb_frame_threshold[j] += step;
1931 for(j=0; j<nb_input_streams; j++) {
1933 ist = &input_streams[j];
1936 AVFormatContext *f= input_files[ ist->file_index ].ctx;
1938 for(pi=0; pi<f->nb_programs; pi++){
1939 AVProgram *p= f->programs[pi];
1940 if(p->id == opt_programid)
1941 for(si=0; si<p->nb_stream_indexes; si++){
1942 if(f->streams[ p->stream_index[si] ] == ist->st)
1947 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
1948 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
1949 found_streams[ist->st->codec->codec_type]++;
1952 for(j=0; j<AVMEDIA_TYPE_NB; j++)
1953 if(found_streams[j] < nb_streams[j])
1954 nb_frame_threshold[j] -= step;
1957 for(k=0;k<nb_output_files;k++) {
1958 os = output_files[k];
1959 for (i = 0; i < os->nb_streams; i++, n++)
1960 ost_table[n] = output_streams_for_file[k][i];
1963 /* for each output stream, we compute the right encoding parameters */
1964 for(i=0;i<nb_ostreams;i++) {
1966 os = output_files[ost->file_index];
1967 ist = &input_streams[ost->source_index];
1969 codec = ost->st->codec;
1970 icodec = ist->st->codec;
1972 ost->st->disposition = ist->st->disposition;
1973 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1974 codec->chroma_sample_location = icodec->chroma_sample_location;
1976 if (ost->st->stream_copy) {
1977 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1979 if (extra_size > INT_MAX)
1982 /* if stream_copy is selected, no need to decode or encode */
1983 codec->codec_id = icodec->codec_id;
1984 codec->codec_type = icodec->codec_type;
1986 if(!codec->codec_tag){
1987 if( !os->oformat->codec_tag
1988 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1989 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1990 codec->codec_tag = icodec->codec_tag;
1993 codec->bit_rate = icodec->bit_rate;
1994 codec->rc_max_rate = icodec->rc_max_rate;
1995 codec->rc_buffer_size = icodec->rc_buffer_size;
1996 codec->extradata= av_mallocz(extra_size);
1997 if (!codec->extradata)
1999 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2000 codec->extradata_size= icodec->extradata_size;
2002 codec->time_base = ist->st->time_base;
2003 if(!strcmp(os->oformat->name, "avi")) {
2004 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){
2005 codec->time_base = icodec->time_base;
2006 codec->time_base.num *= icodec->ticks_per_frame;
2007 codec->time_base.den *= 2;
2009 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2010 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){
2011 codec->time_base = icodec->time_base;
2012 codec->time_base.num *= icodec->ticks_per_frame;
2015 av_reduce(&codec->time_base.num, &codec->time_base.den,
2016 codec->time_base.num, codec->time_base.den, INT_MAX);
2018 switch(codec->codec_type) {
2019 case AVMEDIA_TYPE_AUDIO:
2020 if(audio_volume != 256) {
2021 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2024 codec->channel_layout = icodec->channel_layout;
2025 codec->sample_rate = icodec->sample_rate;
2026 codec->channels = icodec->channels;
2027 codec->frame_size = icodec->frame_size;
2028 codec->audio_service_type = icodec->audio_service_type;
2029 codec->block_align= icodec->block_align;
2030 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2031 codec->block_align= 0;
2032 if(codec->codec_id == CODEC_ID_AC3)
2033 codec->block_align= 0;
2035 case AVMEDIA_TYPE_VIDEO:
2036 codec->pix_fmt = icodec->pix_fmt;
2037 codec->width = icodec->width;
2038 codec->height = icodec->height;
2039 codec->has_b_frames = icodec->has_b_frames;
2040 if (!codec->sample_aspect_ratio.num) {
2041 codec->sample_aspect_ratio =
2042 ost->st->sample_aspect_ratio =
2043 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2044 ist->st->codec->sample_aspect_ratio.num ?
2045 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2048 case AVMEDIA_TYPE_SUBTITLE:
2049 codec->width = icodec->width;
2050 codec->height = icodec->height;
2052 case AVMEDIA_TYPE_DATA:
2059 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2060 switch(codec->codec_type) {
2061 case AVMEDIA_TYPE_AUDIO:
2062 ost->fifo= av_fifo_alloc(1024);
2065 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2066 if (!codec->sample_rate) {
2067 codec->sample_rate = icodec->sample_rate;
2069 choose_sample_rate(ost->st, ost->enc);
2070 codec->time_base = (AVRational){1, codec->sample_rate};
2071 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2072 codec->sample_fmt = icodec->sample_fmt;
2073 choose_sample_fmt(ost->st, ost->enc);
2074 if (!codec->channels) {
2075 codec->channels = icodec->channels;
2076 codec->channel_layout = icodec->channel_layout;
2078 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2079 codec->channel_layout = 0;
2080 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2081 icodec->request_channels = codec->channels;
2082 ist->decoding_needed = 1;
2083 ost->encoding_needed = 1;
2084 ost->resample_sample_fmt = icodec->sample_fmt;
2085 ost->resample_sample_rate = icodec->sample_rate;
2086 ost->resample_channels = icodec->channels;
2088 case AVMEDIA_TYPE_VIDEO:
2089 if (codec->pix_fmt == PIX_FMT_NONE)
2090 codec->pix_fmt = icodec->pix_fmt;
2091 choose_pixel_fmt(ost->st, ost->enc);
2093 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2094 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2098 if (!codec->width || !codec->height) {
2099 codec->width = icodec->width;
2100 codec->height = icodec->height;
2103 ost->video_resample = codec->width != icodec->width ||
2104 codec->height != icodec->height ||
2105 codec->pix_fmt != icodec->pix_fmt;
2106 if (ost->video_resample) {
2107 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2110 ost->resample_height = icodec->height;
2111 ost->resample_width = icodec->width;
2112 ost->resample_pix_fmt= icodec->pix_fmt;
2113 ost->encoding_needed = 1;
2114 ist->decoding_needed = 1;
2116 if (!ost->frame_rate.num)
2117 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2118 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2119 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2120 ost->frame_rate = ost->enc->supported_framerates[idx];
2122 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2123 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2124 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2125 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2126 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2130 if (configure_video_filters(ist, ost)) {
2131 fprintf(stderr, "Error opening filters!\n");
2136 case AVMEDIA_TYPE_SUBTITLE:
2137 ost->encoding_needed = 1;
2138 ist->decoding_needed = 1;
2145 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2146 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2147 char logfilename[1024];
2150 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2151 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2153 if (codec->flags & CODEC_FLAG_PASS1) {
2154 f = fopen(logfilename, "wb");
2156 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2162 size_t logbuffer_size;
2163 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2164 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2167 codec->stats_in = logbuffer;
2171 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2172 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2173 int size= codec->width * codec->height;
2174 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2179 bit_buffer = av_malloc(bit_buffer_size);
2181 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2183 ret = AVERROR(ENOMEM);
2187 /* open each encoder */
2188 for(i=0;i<nb_ostreams;i++) {
2190 if (ost->encoding_needed) {
2191 AVCodec *codec = ost->enc;
2192 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2194 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2195 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2196 ret = AVERROR(EINVAL);
2199 if (dec->subtitle_header) {
2200 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2201 if (!ost->st->codec->subtitle_header) {
2202 ret = AVERROR(ENOMEM);
2205 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2206 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2208 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2209 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2210 ost->file_index, ost->index);
2211 ret = AVERROR(EINVAL);
2214 assert_codec_experimental(ost->st->codec, 1);
2215 assert_avoptions(ost->opts);
2216 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2217 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2218 "It takes bits/s as argument, not kbits/s\n");
2219 extra_size += ost->st->codec->extradata_size;
2223 /* open each decoder */
2224 for (i = 0; i < nb_input_streams; i++) {
2225 ist = &input_streams[i];
2226 if (ist->decoding_needed) {
2227 AVCodec *codec = ist->dec;
2229 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2231 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
2232 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2233 ret = AVERROR(EINVAL);
2236 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2237 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2238 ist->file_index, ist->st->index);
2239 ret = AVERROR(EINVAL);
2242 assert_codec_experimental(ist->st->codec, 0);
2243 assert_avoptions(ost->opts);
2248 for (i = 0; i < nb_input_streams; i++) {
2250 ist = &input_streams[i];
2252 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2253 ist->next_pts = AV_NOPTS_VALUE;
2257 /* open files and write file headers */
2258 for(i=0;i<nb_output_files;i++) {
2259 os = output_files[i];
2260 if (avformat_write_header(os, &output_opts[i]) < 0) {
2261 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2262 ret = AVERROR(EINVAL);
2265 // assert_avoptions(output_opts[i]);
2266 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2272 /* dump the file output parameters - cannot be done before in case
2274 for(i=0;i<nb_output_files;i++) {
2275 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2278 /* dump the stream mapping */
2280 fprintf(stderr, "Stream mapping:\n");
2281 for(i=0;i<nb_ostreams;i++) {
2283 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2284 input_streams[ost->source_index].file_index,
2285 input_streams[ost->source_index].st->index,
2288 if (ost->sync_ist != &input_streams[ost->source_index])
2289 fprintf(stderr, " [sync #%d.%d]",
2290 ost->sync_ist->file_index,
2291 ost->sync_ist->st->index);
2292 if(ost->encoding_needed)
2293 fprintf(stderr, ": %s -> %s",
2294 input_streams[ost->source_index].dec ?
2295 input_streams[ost->source_index].dec->name : "?",
2296 ost->enc ? ost->enc->name : "?");
2298 fprintf(stderr, ": copy");
2299 fprintf(stderr, "\n");
2304 fprintf(stderr, "%s\n", error);
2309 print_sdp(output_files, nb_output_files);
2314 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2315 avio_set_interrupt_cb(decode_interrupt_cb);
2319 timer_start = av_gettime();
2321 for(; received_sigterm == 0;) {
2322 int file_index, ist_index;
2328 ipts_min= INT64_MAX;
2330 /* if 'q' pressed, exits */
2334 /* read_key() returns 0 on EOF */
2338 if (key == '+') verbose++;
2339 if (key == '-') verbose--;
2340 if (key == 's') qp_hist ^= 1;
2343 do_hex_dump = do_pkt_dump = 0;
2344 } else if(do_pkt_dump){
2348 av_log_set_level(AV_LOG_DEBUG);
2350 if (key == 'c' || key == 'C'){
2351 char ret[4096], target[64], cmd[256], arg[256]={0};
2353 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2354 if(scanf("%4095[^\n\r]%*c", ret) == 1 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2355 for(i=0;i<nb_ostreams;i++) {
2360 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2361 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2363 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2368 fprintf(stderr, "Parse error\n");
2371 if (key == 'd' || key == 'D'){
2374 debug = input_streams[0].st->codec->debug<<1;
2375 if(!debug) debug = 1;
2376 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2379 scanf("%d", &debug);
2380 for(i=0;i<nb_input_streams;i++) {
2381 input_streams[i].st->codec->debug = debug;
2383 for(i=0;i<nb_ostreams;i++) {
2385 ost->st->codec->debug = debug;
2387 if(debug) av_log_set_level(AV_LOG_DEBUG);
2388 fprintf(stderr,"debug=%d\n", debug);
2391 fprintf(stderr, "key function\n"
2392 "? show this help\n"
2393 "+ increase verbosity\n"
2394 "- decrease verbosity\n"
2395 "c Send command to filtergraph\n"
2396 "D cycle through available debug modes\n"
2397 "h dump packets/hex press to cycle through the 3 states\n"
2399 "s Show QP histogram\n"
2404 /* select the stream that we must read now by looking at the
2405 smallest output pts */
2407 for(i=0;i<nb_ostreams;i++) {
2411 os = output_files[ost->file_index];
2412 ist = &input_streams[ost->source_index];
2413 if(ist->is_past_recording_time || no_packet[ist->file_index])
2415 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2417 if (!input_files[ist->file_index].eof_reached){
2418 if(ipts < ipts_min) {
2420 if(input_sync ) file_index = ist->file_index;
2422 if(opts < opts_min) {
2424 if(!input_sync) file_index = ist->file_index;
2427 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2432 /* if none, if is finished */
2433 if (file_index < 0) {
2434 if(no_packet_count){
2436 memset(no_packet, 0, sizeof(no_packet));
2443 /* finish if limit size exhausted */
2444 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2447 /* read a frame from it and output it in the fifo */
2448 is = input_files[file_index].ctx;
2449 ret= av_read_frame(is, &pkt);
2450 if(ret == AVERROR(EAGAIN)){
2451 no_packet[file_index]=1;
2456 input_files[file_index].eof_reached = 1;
2464 memset(no_packet, 0, sizeof(no_packet));
2467 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2468 is->streams[pkt.stream_index]);
2470 /* the following test is needed in case new streams appear
2471 dynamically in stream : we ignore them */
2472 if (pkt.stream_index >= input_files[file_index].nb_streams)
2473 goto discard_packet;
2474 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2475 ist = &input_streams[ist_index];
2477 goto discard_packet;
2479 if (pkt.dts != AV_NOPTS_VALUE)
2480 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2481 if (pkt.pts != AV_NOPTS_VALUE)
2482 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2484 if (ist->ts_scale) {
2485 if(pkt.pts != AV_NOPTS_VALUE)
2486 pkt.pts *= ist->ts_scale;
2487 if(pkt.dts != AV_NOPTS_VALUE)
2488 pkt.dts *= ist->ts_scale;
2491 // 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);
2492 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2493 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2494 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2495 int64_t delta= pkt_dts - ist->next_pts;
2496 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2497 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2498 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2499 pkt_dts+1<ist->pts)&& !copy_ts){
2500 input_files[ist->file_index].ts_offset -= delta;
2502 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2503 delta, input_files[ist->file_index].ts_offset);
2504 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2505 if(pkt.pts != AV_NOPTS_VALUE)
2506 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2510 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2511 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2514 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2515 ist->file_index, ist->st->index);
2518 av_free_packet(&pkt);
2523 av_free_packet(&pkt);
2525 /* dump report by using the output first video and audio streams */
2526 print_report(output_files, ost_table, nb_ostreams, 0);
2529 /* at the end of stream, we must flush the decoder buffers */
2530 for (i = 0; i < nb_input_streams; i++) {
2531 ist = &input_streams[i];
2532 if (ist->decoding_needed) {
2533 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2539 /* write the trailer if needed and close file */
2540 for(i=0;i<nb_output_files;i++) {
2541 os = output_files[i];
2542 av_write_trailer(os);
2545 /* dump report by using the first video and audio streams */
2546 print_report(output_files, ost_table, nb_ostreams, 1);
2548 /* close each encoder */
2549 for(i=0;i<nb_ostreams;i++) {
2551 if (ost->encoding_needed) {
2552 av_freep(&ost->st->codec->stats_in);
2553 avcodec_close(ost->st->codec);
2556 avfilter_graph_free(&ost->graph);
2560 /* close each decoder */
2561 for (i = 0; i < nb_input_streams; i++) {
2562 ist = &input_streams[i];
2563 if (ist->decoding_needed) {
2564 avcodec_close(ist->st->codec);
2572 av_freep(&bit_buffer);
2575 for(i=0;i<nb_ostreams;i++) {
2578 if (ost->st->stream_copy)
2579 av_freep(&ost->st->codec->extradata);
2581 fclose(ost->logfile);
2582 ost->logfile = NULL;
2584 av_fifo_free(ost->fifo); /* works even if fifo is not
2585 initialized but set to zero */
2586 av_freep(&ost->st->codec->subtitle_header);
2587 av_free(ost->resample_frame.data[0]);
2588 av_free(ost->forced_kf_pts);
2589 if (ost->video_resample)
2590 sws_freeContext(ost->img_resample_ctx);
2592 audio_resample_close(ost->resample);
2593 if (ost->reformat_ctx)
2594 av_audio_convert_free(ost->reformat_ctx);
2595 av_dict_free(&ost->opts);
2604 static int opt_format(const char *opt, const char *arg)
2606 last_asked_format = arg;
2610 static int opt_video_rc_override_string(const char *opt, const char *arg)
2612 video_rc_override_string = arg;
2616 static int opt_me_threshold(const char *opt, const char *arg)
2618 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2622 static int opt_verbose(const char *opt, const char *arg)
2624 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2628 static int opt_frame_rate(const char *opt, const char *arg)
2630 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2631 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2637 static int opt_frame_crop(const char *opt, const char *arg)
2639 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2640 return AVERROR(EINVAL);
2643 static int opt_frame_size(const char *opt, const char *arg)
2645 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2646 fprintf(stderr, "Incorrect frame size\n");
2647 return AVERROR(EINVAL);
2652 static int opt_pad(const char *opt, const char *arg) {
2653 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2657 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2659 if (strcmp(arg, "list")) {
2660 frame_pix_fmt = av_get_pix_fmt(arg);
2661 if (frame_pix_fmt == PIX_FMT_NONE) {
2662 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2663 return AVERROR(EINVAL);
2666 opt_pix_fmts(NULL, NULL);
2672 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2679 p = strchr(arg, ':');
2681 x = strtol(arg, &end, 10);
2683 y = strtol(end+1, &end, 10);
2685 ar = (double)x / (double)y;
2687 ar = strtod(arg, NULL);
2690 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2691 return AVERROR(EINVAL);
2693 frame_aspect_ratio = ar;
2697 static int opt_metadata(const char *opt, const char *arg)
2699 char *mid= strchr(arg, '=');
2702 fprintf(stderr, "Missing =\n");
2707 av_dict_set(&metadata, arg, mid, 0);
2712 static int opt_qscale(const char *opt, const char *arg)
2714 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2715 if (video_qscale <= 0 || video_qscale > 255) {
2716 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2717 return AVERROR(EINVAL);
2722 static int opt_top_field_first(const char *opt, const char *arg)
2724 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2725 return opt_default(opt, arg);
2728 static int opt_thread_count(const char *opt, const char *arg)
2730 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2733 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2738 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2740 if (strcmp(arg, "list")) {
2741 audio_sample_fmt = av_get_sample_fmt(arg);
2742 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2743 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2744 return AVERROR(EINVAL);
2749 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2750 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2756 static int opt_audio_rate(const char *opt, const char *arg)
2758 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2762 static int opt_audio_channels(const char *opt, const char *arg)
2764 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2768 static int opt_video_channel(const char *opt, const char *arg)
2770 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2771 return opt_default("channel", arg);
2774 static int opt_video_standard(const char *opt, const char *arg)
2776 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2777 return opt_default("standard", arg);
2780 static int opt_codec(const char *opt, const char *arg)
2782 return av_dict_set(&codec_names, opt, arg, 0);
2785 static int opt_audio_codec(const char *opt, const char *arg)
2787 return opt_codec("codec:a", arg);
2790 static int opt_video_codec(const char *opt, const char *arg)
2792 return opt_codec("codec:v", arg);
2795 static int opt_subtitle_codec(const char *opt, const char *arg)
2797 return opt_codec("codec:s", arg);
2800 static int opt_data_codec(const char *opt, const char *arg)
2802 return opt_codec("codec:d", arg);
2805 static int opt_codec_tag(const char *opt, const char *arg)
2808 uint32_t *codec_tag;
2810 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2811 !strcmp(opt, "vtag") ? &video_codec_tag :
2812 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2816 *codec_tag = strtol(arg, &tail, 0);
2818 *codec_tag = AV_RL32(arg);
2823 static int opt_map(const char *opt, const char *arg)
2825 StreamMap *m = NULL;
2826 int i, negative = 0, file_idx;
2827 int sync_file_idx = -1, sync_stream_idx;
2835 map = av_strdup(arg);
2837 /* parse sync stream first, just pick first matching stream */
2838 if (sync = strchr(map, ',')) {
2840 sync_file_idx = strtol(sync + 1, &sync, 0);
2841 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2842 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2847 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2848 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2849 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2850 sync_stream_idx = i;
2853 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2854 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2855 "match any streams.\n", arg);
2861 file_idx = strtol(map, &p, 0);
2862 if (file_idx >= nb_input_files || file_idx < 0) {
2863 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2867 /* disable some already defined maps */
2868 for (i = 0; i < nb_stream_maps; i++) {
2869 m = &stream_maps[i];
2870 if (check_stream_specifier(input_files[m->file_index].ctx,
2871 input_files[m->file_index].ctx->streams[m->stream_index],
2872 *p == ':' ? p + 1 : p) > 0)
2876 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2877 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2878 *p == ':' ? p + 1 : p) <= 0)
2880 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2881 m = &stream_maps[nb_stream_maps - 1];
2883 m->file_index = file_idx;
2884 m->stream_index = i;
2886 if (sync_file_idx >= 0) {
2887 m->sync_file_index = sync_file_idx;
2888 m->sync_stream_index = sync_stream_idx;
2890 m->sync_file_index = file_idx;
2891 m->sync_stream_index = i;
2896 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2904 static void parse_meta_type(char *arg, char *type, int *index)
2914 if (*(++arg) == ':')
2915 *index = strtol(++arg, NULL, 0);
2918 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2925 static int opt_map_metadata(const char *opt, const char *arg)
2927 MetadataMap *m, *m1;
2930 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2931 &nb_meta_data_maps, nb_meta_data_maps + 1);
2933 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2934 m->file = strtol(arg, &p, 0);
2935 parse_meta_type(p, &m->type, &m->index);
2937 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2938 if (p = strchr(opt, ':'))
2939 parse_meta_type(p, &m1->type, &m1->index);
2943 if (m->type == 'g' || m1->type == 'g')
2944 metadata_global_autocopy = 0;
2945 if (m->type == 's' || m1->type == 's')
2946 metadata_streams_autocopy = 0;
2947 if (m->type == 'c' || m1->type == 'c')
2948 metadata_chapters_autocopy = 0;
2953 static int opt_map_meta_data(const char *opt, const char *arg)
2955 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2956 "Use -map_metadata instead.\n");
2957 return opt_map_metadata(opt, arg);
2960 static int opt_input_ts_scale(const char *opt, const char *arg)
2962 return av_dict_set(&ts_scale, opt, arg, 0);
2965 static int opt_recording_time(const char *opt, const char *arg)
2967 recording_time = parse_time_or_die(opt, arg, 1);
2971 static int opt_start_time(const char *opt, const char *arg)
2973 start_time = parse_time_or_die(opt, arg, 1);
2977 static int opt_recording_timestamp(const char *opt, const char *arg)
2980 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2981 struct tm time = *gmtime((time_t*)&recording_timestamp);
2982 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2983 opt_metadata("metadata", buf);
2985 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2986 "tag instead.\n", opt);
2990 static int opt_input_ts_offset(const char *opt, const char *arg)
2992 input_ts_offset = parse_time_or_die(opt, arg, 1);
2996 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2998 const char *codec_string = encoder ? "encoder" : "decoder";
3002 return CODEC_ID_NONE;
3004 avcodec_find_encoder_by_name(name) :
3005 avcodec_find_decoder_by_name(name);
3007 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
3010 if(codec->type != type) {
3011 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
3017 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
3019 AVDictionaryEntry *e = NULL;
3020 char *codec_name = NULL;
3023 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
3024 char *p = strchr(e->key, ':');
3026 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
3027 codec_name = e->value;
3034 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
3035 return avcodec_find_encoder(st->codec->codec_id);
3037 } else if (!strcmp(codec_name, "copy"))
3038 st->stream_copy = 1;
3040 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3041 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3042 avcodec_find_decoder_by_name(codec_name);
3049 * Add all the streams from the given input file to the global
3050 * list of input streams.
3052 static void add_input_streams(AVFormatContext *ic)
3054 int i, rfps, rfps_base, ret;
3056 for (i = 0; i < ic->nb_streams; i++) {
3057 AVStream *st = ic->streams[i];
3058 AVCodecContext *dec = st->codec;
3059 AVDictionaryEntry *e = NULL;
3063 dec->thread_count = thread_count;
3065 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3066 ist = &input_streams[nb_input_streams - 1];
3068 ist->file_index = nb_input_files;
3070 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3072 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
3073 char *p = strchr(e->key, ':');
3075 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
3081 ist->ts_scale = strtod(scale, NULL);
3083 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3085 switch (dec->codec_type) {
3086 case AVMEDIA_TYPE_AUDIO:
3088 ist->dec = avcodec_find_decoder(dec->codec_id);
3090 st->discard= AVDISCARD_ALL;
3092 case AVMEDIA_TYPE_VIDEO:
3094 ist->dec = avcodec_find_decoder(dec->codec_id);
3095 rfps = ic->streams[i]->r_frame_rate.num;
3096 rfps_base = ic->streams[i]->r_frame_rate.den;
3098 dec->flags |= CODEC_FLAG_EMU_EDGE;
3101 dec->debug |= FF_DEBUG_MV;
3103 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3106 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3107 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3109 (float)rfps / rfps_base, rfps, rfps_base);
3113 st->discard= AVDISCARD_ALL;
3114 else if(video_discard)
3115 st->discard= video_discard;
3117 case AVMEDIA_TYPE_DATA:
3119 case AVMEDIA_TYPE_SUBTITLE:
3121 ist->dec = avcodec_find_decoder(dec->codec_id);
3122 if(subtitle_disable)
3123 st->discard = AVDISCARD_ALL;
3125 case AVMEDIA_TYPE_ATTACHMENT:
3126 case AVMEDIA_TYPE_UNKNOWN:
3134 static int opt_input_file(const char *opt, const char *filename)
3136 AVFormatContext *ic;
3137 AVInputFormat *file_iformat = NULL;
3141 AVDictionary **opts;
3142 int orig_nb_streams; // number of streams before avformat_find_stream_info
3144 if (last_asked_format) {
3145 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3146 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3149 last_asked_format = NULL;
3152 if (!strcmp(filename, "-"))
3155 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3156 !strcmp(filename, "/dev/stdin");
3158 /* get default parameters from command line */
3159 ic = avformat_alloc_context();
3161 print_error(filename, AVERROR(ENOMEM));
3164 if (audio_sample_rate) {
3165 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3166 av_dict_set(&format_opts, "sample_rate", buf, 0);
3168 if (audio_channels) {
3169 snprintf(buf, sizeof(buf), "%d", audio_channels);
3170 av_dict_set(&format_opts, "channels", buf, 0);
3172 if (frame_rate.num) {
3173 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3174 av_dict_set(&format_opts, "framerate", buf, 0);
3176 if (frame_width && frame_height) {
3177 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3178 av_dict_set(&format_opts, "video_size", buf, 0);
3180 if (frame_pix_fmt != PIX_FMT_NONE)
3181 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3183 ic->flags |= AVFMT_FLAG_NONBLOCK;
3186 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3187 ic->loop_input = loop_input;
3190 /* open the input file with generic libav function */
3191 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3193 print_error(filename, err);
3196 assert_avoptions(format_opts);
3201 for(i=0; i<ic->nb_streams; i++){
3202 ic->streams[i]->discard= AVDISCARD_ALL;
3204 for(i=0; i<ic->nb_programs; i++){
3205 AVProgram *p= ic->programs[i];
3206 if(p->id != opt_programid){
3207 p->discard = AVDISCARD_ALL;
3210 for(j=0; j<p->nb_stream_indexes; j++){
3211 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3216 fprintf(stderr, "Specified program id not found\n");
3222 /* apply forced codec ids */
3223 for (i = 0; i < ic->nb_streams; i++)
3224 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3226 /* Set AVCodecContext options for avformat_find_stream_info */
3227 opts = setup_find_stream_info_opts(ic, codec_opts);
3228 orig_nb_streams = ic->nb_streams;
3230 /* If not enough info to get the stream parameters, we decode the
3231 first frames to get it. (used in mpeg case for example) */
3232 ret = avformat_find_stream_info(ic, opts);
3233 if (ret < 0 && verbose >= 0) {
3234 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3235 av_close_input_file(ic);
3239 timestamp = start_time;
3240 /* add the stream start time */
3241 if (ic->start_time != AV_NOPTS_VALUE)
3242 timestamp += ic->start_time;
3244 /* if seeking requested, we execute it */
3245 if (start_time != 0) {
3246 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3248 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3249 filename, (double)timestamp / AV_TIME_BASE);
3251 /* reset seek info */
3255 /* update the current parameters so that they match the one of the input stream */
3256 add_input_streams(ic);
3258 /* dump the file content */
3260 av_dump_format(ic, nb_input_files, filename, 0);
3262 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3263 input_files[nb_input_files - 1].ctx = ic;
3264 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3265 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3266 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3268 top_field_first = -1;
3269 frame_rate = (AVRational){0, 0};
3270 frame_pix_fmt = PIX_FMT_NONE;
3273 audio_sample_rate = 0;
3275 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3276 av_dict_free(&ts_scale);
3278 for (i = 0; i < orig_nb_streams; i++)
3279 av_dict_free(&opts[i]);
3281 av_dict_free(&codec_names);
3287 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3288 AVCodecContext *avctx)
3294 for (p = kf; *p; p++)
3297 ost->forced_kf_count = n;
3298 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3299 if (!ost->forced_kf_pts) {
3300 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3303 for (i = 0; i < n; i++) {
3304 p = i ? strchr(p, ',') + 1 : kf;
3305 t = parse_time_or_die("force_key_frames", p, 1);
3306 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3310 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3313 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3314 int idx = oc->nb_streams - 1;
3317 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3321 output_streams_for_file[nb_output_files] =
3322 grow_array(output_streams_for_file[nb_output_files],
3323 sizeof(*output_streams_for_file[nb_output_files]),
3324 &nb_output_streams_for_file[nb_output_files],
3326 ost = output_streams_for_file[nb_output_files][idx] =
3327 av_mallocz(sizeof(OutputStream));
3329 fprintf(stderr, "Could not alloc output stream\n");
3332 ost->file_index = nb_output_files;
3335 st->codec->codec_type = type;
3336 ost->enc = choose_codec(oc, st, type, codec_names);
3338 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3341 avcodec_get_context_defaults3(st->codec, ost->enc);
3342 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3344 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3348 static OutputStream *new_video_stream(AVFormatContext *oc)
3352 AVCodecContext *video_enc;
3354 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3356 if (!st->stream_copy) {
3357 ost->frame_aspect_ratio = frame_aspect_ratio;
3358 frame_aspect_ratio = 0;
3360 ost->avfilter = vfilters;
3365 ost->bitstream_filters = video_bitstream_filters;
3366 video_bitstream_filters= NULL;
3368 st->codec->thread_count= thread_count;
3370 video_enc = st->codec;
3373 video_enc->codec_tag= video_codec_tag;
3375 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3376 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3379 if (st->stream_copy) {
3380 video_enc->sample_aspect_ratio =
3381 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3387 ost->frame_rate = frame_rate;
3389 video_enc->width = frame_width;
3390 video_enc->height = frame_height;
3391 video_enc->pix_fmt = frame_pix_fmt;
3392 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3393 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3396 video_enc->gop_size = 0;
3397 if (video_qscale || same_quant) {
3398 video_enc->flags |= CODEC_FLAG_QSCALE;
3399 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3403 video_enc->intra_matrix = intra_matrix;
3405 video_enc->inter_matrix = inter_matrix;
3407 p= video_rc_override_string;
3410 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3412 fprintf(stderr, "error parsing rc_override\n");
3415 video_enc->rc_override=
3416 av_realloc(video_enc->rc_override,
3417 sizeof(RcOverride)*(i+1));
3418 video_enc->rc_override[i].start_frame= start;
3419 video_enc->rc_override[i].end_frame = end;
3421 video_enc->rc_override[i].qscale= q;
3422 video_enc->rc_override[i].quality_factor= 1.0;
3425 video_enc->rc_override[i].qscale= 0;
3426 video_enc->rc_override[i].quality_factor= -q/100.0;
3431 video_enc->rc_override_count=i;
3432 if (!video_enc->rc_initial_buffer_occupancy)
3433 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3434 video_enc->me_threshold= me_threshold;
3435 video_enc->intra_dc_precision= intra_dc_precision - 8;
3438 video_enc->flags|= CODEC_FLAG_PSNR;
3443 video_enc->flags |= CODEC_FLAG_PASS1;
3445 video_enc->flags |= CODEC_FLAG_PASS2;
3449 if (forced_key_frames)
3450 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3452 if (video_language) {
3453 av_dict_set(&st->metadata, "language", video_language, 0);
3454 av_freep(&video_language);
3457 /* reset some key parameters */
3459 av_freep(&forced_key_frames);
3460 frame_pix_fmt = PIX_FMT_NONE;
3464 static OutputStream *new_audio_stream(AVFormatContext *oc)
3468 AVCodecContext *audio_enc;
3470 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3473 ost->bitstream_filters = audio_bitstream_filters;
3474 audio_bitstream_filters= NULL;
3476 st->codec->thread_count= thread_count;
3478 audio_enc = st->codec;
3479 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3482 audio_enc->codec_tag= audio_codec_tag;
3484 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3485 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3487 if (!st->stream_copy) {
3488 if (audio_qscale > QSCALE_NONE) {
3489 audio_enc->flags |= CODEC_FLAG_QSCALE;
3490 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3493 audio_enc->channels = audio_channels;
3494 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3495 audio_enc->sample_fmt = audio_sample_fmt;
3496 if (audio_sample_rate)
3497 audio_enc->sample_rate = audio_sample_rate;
3499 if (audio_language) {
3500 av_dict_set(&st->metadata, "language", audio_language, 0);
3501 av_freep(&audio_language);
3504 /* reset some key parameters */
3510 static OutputStream *new_data_stream(AVFormatContext *oc)
3514 AVCodecContext *data_enc;
3516 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3518 data_enc = st->codec;
3519 if (!st->stream_copy) {
3520 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3525 data_enc->codec_tag= data_codec_tag;
3527 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3528 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3535 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3539 AVCodecContext *subtitle_enc;
3541 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3543 subtitle_enc = st->codec;
3545 ost->bitstream_filters = subtitle_bitstream_filters;
3546 subtitle_bitstream_filters= NULL;
3548 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3550 if(subtitle_codec_tag)
3551 subtitle_enc->codec_tag= subtitle_codec_tag;
3553 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3554 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3557 if (subtitle_language) {
3558 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3559 av_freep(&subtitle_language);
3562 subtitle_disable = 0;
3566 /* arg format is "output-stream-index:streamid-value". */
3567 static int opt_streamid(const char *opt, const char *arg)
3573 av_strlcpy(idx_str, arg, sizeof(idx_str));
3574 p = strchr(idx_str, ':');
3577 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3582 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3583 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3584 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3587 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
3590 AVFormatContext *ic = NULL;
3592 err = avformat_open_input(&ic, filename, NULL, NULL);
3595 /* copy stream format */
3596 for(i=0;i<ic->nb_streams;i++) {
3601 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3602 ost = new_output_stream(s, codec->type);
3605 // FIXME: a more elegant solution is needed
3606 memcpy(st, ic->streams[i], sizeof(AVStream));
3607 st->info = av_malloc(sizeof(*st->info));
3608 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3609 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3611 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3612 choose_sample_fmt(st, codec);
3613 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3614 choose_pixel_fmt(st, codec);
3617 av_close_input_file(ic);
3622 static int copy_chapters(int infile, int outfile)
3624 AVFormatContext *is = input_files[infile].ctx;
3625 AVFormatContext *os = output_files[outfile];
3628 for (i = 0; i < is->nb_chapters; i++) {
3629 AVChapter *in_ch = is->chapters[i], *out_ch;
3630 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3631 AV_TIME_BASE_Q, in_ch->time_base);
3632 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3633 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3636 if (in_ch->end < ts_off)
3638 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3641 out_ch = av_mallocz(sizeof(AVChapter));
3643 return AVERROR(ENOMEM);
3645 out_ch->id = in_ch->id;
3646 out_ch->time_base = in_ch->time_base;
3647 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3648 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3650 if (metadata_chapters_autocopy)
3651 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3654 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3656 return AVERROR(ENOMEM);
3657 os->chapters[os->nb_chapters - 1] = out_ch;
3662 static int opt_output_file(const char *opt, const char *filename)
3664 AVFormatContext *oc;
3666 AVOutputFormat *file_oformat;
3670 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3671 fprintf(stderr, "Too many output files\n");
3675 if (!strcmp(filename, "-"))
3678 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3679 last_asked_format = NULL;
3681 print_error(filename, err);
3684 file_oformat= oc->oformat;
3686 if (!strcmp(file_oformat->name, "ffm") &&
3687 av_strstart(filename, "http:", NULL)) {
3688 /* special case for files sent to ffserver: we get the stream
3689 parameters from ffserver */
3690 int err = read_ffserver_streams(oc, filename);
3692 print_error(filename, err);
3695 } else if (!nb_stream_maps) {
3696 /* pick the "best" stream of each type */
3697 #define NEW_STREAM(type, index)\
3699 ost = new_ ## type ## _stream(oc);\
3700 ost->source_index = index;\
3701 ost->sync_ist = &input_streams[index];\
3702 input_streams[index].discard = 0;\
3705 /* video: highest resolution */
3706 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3707 int area = 0, idx = -1;
3708 for (i = 0; i < nb_input_streams; i++) {
3709 ist = &input_streams[i];
3710 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3711 ist->st->codec->width * ist->st->codec->height > area) {
3712 area = ist->st->codec->width * ist->st->codec->height;
3716 NEW_STREAM(video, idx);
3719 /* audio: most channels */
3720 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3721 int channels = 0, idx = -1;
3722 for (i = 0; i < nb_input_streams; i++) {
3723 ist = &input_streams[i];
3724 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3725 ist->st->codec->channels > channels) {
3726 channels = ist->st->codec->channels;
3730 NEW_STREAM(audio, idx);
3733 /* subtitles: pick first */
3734 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3735 for (i = 0; i < nb_input_streams; i++)
3736 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3737 NEW_STREAM(subtitle, i);
3741 /* do something with data? */
3743 for (i = 0; i < nb_stream_maps; i++) {
3744 StreamMap *map = &stream_maps[i];
3749 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3750 switch (ist->st->codec->codec_type) {
3751 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3752 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3753 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3754 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3756 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3757 map->file_index, map->stream_index);
3761 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3762 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3763 map->sync_stream_index];
3768 av_dict_copy(&oc->metadata, metadata, 0);
3769 av_dict_free(&metadata);
3771 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3772 output_files[nb_output_files++] = oc;
3774 /* check filename in case of an image number is expected */
3775 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3776 if (!av_filename_number_test(oc->filename)) {
3777 print_error(oc->filename, AVERROR(EINVAL));
3782 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3783 /* test if it already exists to avoid loosing precious files */
3784 if (!file_overwrite &&
3785 (strchr(filename, ':') == NULL ||
3786 filename[1] == ':' ||
3787 av_strstart(filename, "file:", NULL))) {
3788 if (avio_check(filename, 0) == 0) {
3790 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3792 if (!read_yesno()) {
3793 fprintf(stderr, "Not overwriting - exiting\n");
3798 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3805 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3806 print_error(filename, err);
3811 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3812 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3814 if (loop_output >= 0) {
3815 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3816 oc->loop_output = loop_output;
3820 if (chapters_input_file >= nb_input_files) {
3821 if (chapters_input_file == INT_MAX) {
3822 /* copy chapters from the first input file that has them*/
3823 chapters_input_file = -1;
3824 for (i = 0; i < nb_input_files; i++)
3825 if (input_files[i].ctx->nb_chapters) {
3826 chapters_input_file = i;
3830 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3831 chapters_input_file);
3835 if (chapters_input_file >= 0)
3836 copy_chapters(chapters_input_file, nb_output_files - 1);
3839 for (i = 0; i < nb_meta_data_maps; i++) {
3840 AVFormatContext *files[2];
3841 AVDictionary **meta[2];
3844 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3845 if ((index) < 0 || (index) >= (nb_elems)) {\
3846 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3851 int in_file_index = meta_data_maps[i][1].file;
3852 if (in_file_index < 0)
3854 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3857 files[1] = input_files[in_file_index].ctx;
3859 for (j = 0; j < 2; j++) {
3860 MetadataMap *map = &meta_data_maps[i][j];
3862 switch (map->type) {
3864 meta[j] = &files[j]->metadata;
3867 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3868 meta[j] = &files[j]->streams[map->index]->metadata;
3871 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3872 meta[j] = &files[j]->chapters[map->index]->metadata;
3875 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3876 meta[j] = &files[j]->programs[map->index]->metadata;
3881 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3884 /* copy global metadata by default */
3885 if (metadata_global_autocopy && nb_input_files)
3886 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3887 AV_DICT_DONT_OVERWRITE);
3888 if (metadata_streams_autocopy)
3889 for (i = 0; i < oc->nb_streams; i++) {
3890 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3891 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3894 frame_rate = (AVRational){0, 0};
3897 audio_sample_rate = 0;
3899 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3900 chapters_input_file = INT_MAX;
3902 av_freep(&meta_data_maps);
3903 nb_meta_data_maps = 0;
3904 metadata_global_autocopy = 1;
3905 metadata_streams_autocopy = 1;
3906 metadata_chapters_autocopy = 1;
3907 av_freep(&stream_maps);
3910 av_dict_free(&codec_names);
3912 av_freep(&forced_key_frames);
3918 /* same option as mencoder */
3919 static int opt_pass(const char *opt, const char *arg)
3921 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3925 static int64_t getutime(void)
3928 struct rusage rusage;
3930 getrusage(RUSAGE_SELF, &rusage);
3931 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3932 #elif HAVE_GETPROCESSTIMES
3934 FILETIME c, e, k, u;
3935 proc = GetCurrentProcess();
3936 GetProcessTimes(proc, &c, &e, &k, &u);
3937 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3939 return av_gettime();
3943 static int64_t getmaxrss(void)
3945 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3946 struct rusage rusage;
3947 getrusage(RUSAGE_SELF, &rusage);
3948 return (int64_t)rusage.ru_maxrss * 1024;
3949 #elif HAVE_GETPROCESSMEMORYINFO
3951 PROCESS_MEMORY_COUNTERS memcounters;
3952 proc = GetCurrentProcess();
3953 memcounters.cb = sizeof(memcounters);
3954 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3955 return memcounters.PeakPagefileUsage;
3961 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3964 const char *p = str;
3971 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3978 static int opt_inter_matrix(const char *opt, const char *arg)
3980 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3981 parse_matrix_coeffs(inter_matrix, arg);
3985 static int opt_intra_matrix(const char *opt, const char *arg)
3987 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3988 parse_matrix_coeffs(intra_matrix, arg);
3992 static void show_usage(void)
3994 printf("Hyper fast Audio and Video encoder\n");
3995 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3999 static int opt_help(const char *opt, const char *arg)
4002 AVOutputFormat *oformat = NULL;
4003 AVInputFormat *iformat = NULL;
4005 av_log_set_callback(log_callback_help);
4007 show_help_options(options, "Main options:\n",
4008 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4009 show_help_options(options, "\nAdvanced options:\n",
4010 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4012 show_help_options(options, "\nVideo options:\n",
4013 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4015 show_help_options(options, "\nAdvanced Video options:\n",
4016 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4017 OPT_VIDEO | OPT_EXPERT);
4018 show_help_options(options, "\nAudio options:\n",
4019 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4021 show_help_options(options, "\nAdvanced Audio options:\n",
4022 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4023 OPT_AUDIO | OPT_EXPERT);
4024 show_help_options(options, "\nSubtitle options:\n",
4025 OPT_SUBTITLE | OPT_GRAB,
4027 show_help_options(options, "\nAudio/Video grab options:\n",
4031 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4034 /* individual codec options */
4036 while ((c = av_codec_next(c))) {
4037 if (c->priv_class) {
4038 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4043 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4046 /* individual muxer options */
4047 while ((oformat = av_oformat_next(oformat))) {
4048 if (oformat->priv_class) {
4049 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4054 /* individual demuxer options */
4055 while ((iformat = av_iformat_next(iformat))) {
4056 if (iformat->priv_class) {
4057 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4062 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4066 static int opt_target(const char *opt, const char *arg)
4068 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4069 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4071 if(!strncmp(arg, "pal-", 4)) {
4074 } else if(!strncmp(arg, "ntsc-", 5)) {
4077 } else if(!strncmp(arg, "film-", 5)) {
4082 /* Calculate FR via float to avoid int overflow */
4083 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4086 } else if((fr == 29970) || (fr == 23976)) {
4089 /* Try to determine PAL/NTSC by peeking in the input files */
4090 if(nb_input_files) {
4092 for (j = 0; j < nb_input_files; j++) {
4093 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4094 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4095 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4097 fr = c->time_base.den * 1000 / c->time_base.num;
4101 } else if((fr == 29970) || (fr == 23976)) {
4111 if(verbose > 0 && norm != UNKNOWN)
4112 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4115 if(norm == UNKNOWN) {
4116 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4117 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4118 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4122 if(!strcmp(arg, "vcd")) {
4123 opt_codec("c:v", "mpeg1video");
4124 opt_codec("c:a", "mp2");
4125 opt_format("f", "vcd");
4127 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4128 opt_frame_rate("r", frame_rates[norm]);
4129 opt_default("g", norm == PAL ? "15" : "18");
4131 opt_default("b", "1150000");
4132 opt_default("maxrate", "1150000");
4133 opt_default("minrate", "1150000");
4134 opt_default("bufsize", "327680"); // 40*1024*8;
4136 opt_default("b:a", "224000");
4137 audio_sample_rate = 44100;
4140 opt_default("packetsize", "2324");
4141 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4143 /* We have to offset the PTS, so that it is consistent with the SCR.
4144 SCR starts at 36000, but the first two packs contain only padding
4145 and the first pack from the other stream, respectively, may also have
4146 been written before.
4147 So the real data starts at SCR 36000+3*1200. */
4148 mux_preload= (36000+3*1200) / 90000.0; //0.44
4149 } else if(!strcmp(arg, "svcd")) {
4151 opt_codec("c:v", "mpeg2video");
4152 opt_codec("c:a", "mp2");
4153 opt_format("f", "svcd");
4155 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4156 opt_frame_rate("r", frame_rates[norm]);
4157 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4158 opt_default("g", norm == PAL ? "15" : "18");
4160 opt_default("b", "2040000");
4161 opt_default("maxrate", "2516000");
4162 opt_default("minrate", "0"); //1145000;
4163 opt_default("bufsize", "1835008"); //224*1024*8;
4164 opt_default("flags", "+scan_offset");
4167 opt_default("b:a", "224000");
4168 audio_sample_rate = 44100;
4170 opt_default("packetsize", "2324");
4172 } else if(!strcmp(arg, "dvd")) {
4174 opt_codec("c:v", "mpeg2video");
4175 opt_codec("c:a", "ac3");
4176 opt_format("f", "dvd");
4178 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4179 opt_frame_rate("r", frame_rates[norm]);
4180 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4181 opt_default("g", norm == PAL ? "15" : "18");
4183 opt_default("b", "6000000");
4184 opt_default("maxrate", "9000000");
4185 opt_default("minrate", "0"); //1500000;
4186 opt_default("bufsize", "1835008"); //224*1024*8;
4188 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4189 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4191 opt_default("b:a", "448000");
4192 audio_sample_rate = 48000;
4194 } else if(!strncmp(arg, "dv", 2)) {
4196 opt_format("f", "dv");
4198 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4199 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4200 norm == PAL ? "yuv420p" : "yuv411p");
4201 opt_frame_rate("r", frame_rates[norm]);
4203 audio_sample_rate = 48000;
4207 fprintf(stderr, "Unknown target: %s\n", arg);
4208 return AVERROR(EINVAL);
4213 static int opt_vstats_file(const char *opt, const char *arg)
4215 av_free (vstats_filename);
4216 vstats_filename=av_strdup (arg);
4220 static int opt_vstats(const char *opt, const char *arg)
4223 time_t today2 = time(NULL);
4224 struct tm *today = localtime(&today2);
4226 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4228 return opt_vstats_file(opt, filename);
4231 static int opt_bsf(const char *opt, const char *arg)
4233 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4234 AVBitStreamFilterContext **bsfp;
4237 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4241 bsfp= *opt == 'v' ? &video_bitstream_filters :
4242 *opt == 'a' ? &audio_bitstream_filters :
4243 &subtitle_bitstream_filters;
4245 bsfp= &(*bsfp)->next;
4252 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4256 static int opt_passlogfile(const char *opt, const char *arg)
4258 pass_logfilename_prefix = arg;
4259 #if CONFIG_LIBX264_ENCODER
4260 return opt_default("passlogfile", arg);
4266 static const OptionDef options[] = {
4268 #include "cmdutils_common_opts.h"
4269 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4270 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4271 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4272 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4273 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4274 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4275 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4276 "outfile[,metadata]:infile[,metadata]" },
4277 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4278 "outfile[,metadata]:infile[,metadata]" },
4279 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4280 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4281 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4282 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4283 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4284 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4285 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4286 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4287 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4288 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4289 "add timings for benchmarking" },
4290 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4291 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4292 "dump each input packet" },
4293 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4294 "when dumping packets, also dump the payload" },
4295 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4296 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4297 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4298 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4299 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4300 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4301 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4302 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4303 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4304 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4305 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4306 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4307 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4308 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4309 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4310 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4313 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4314 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4315 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4316 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4317 { "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" },
4318 { "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" },
4319 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4320 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4321 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4322 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4323 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4324 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4325 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4326 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4327 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4328 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4329 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4330 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4331 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4332 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4333 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4334 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4335 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4336 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4337 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4338 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4339 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4340 "deinterlace pictures" },
4341 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4342 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4343 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4345 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4347 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4348 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4349 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4350 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4351 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4352 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4353 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4354 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4355 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4356 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4359 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4360 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4361 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4362 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4363 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4364 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4365 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4366 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4367 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4368 { "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" },
4370 /* subtitle options */
4371 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4372 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4373 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4374 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4377 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4378 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4379 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4382 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4383 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4385 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4386 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4387 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4389 /* data codec support */
4390 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4392 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4396 int main(int argc, char **argv)
4400 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4402 if(argc>1 && !strcmp(argv[1], "-d")){
4405 av_log_set_callback(log_callback_null);
4410 avcodec_register_all();
4412 avdevice_register_all();
4415 avfilter_register_all();
4420 if(isatty(STDIN_FILENO))
4421 avio_set_interrupt_cb(decode_interrupt_cb);
4430 parse_options(argc, argv, options, opt_output_file);
4432 if(nb_output_files <= 0 && nb_input_files == 0) {
4434 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4438 /* file converter / grab */
4439 if (nb_output_files <= 0) {
4440 fprintf(stderr, "At least one output file must be specified\n");
4444 if (nb_input_files == 0) {
4445 fprintf(stderr, "At least one input file must be specified\n");
4450 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4452 ti = getutime() - ti;
4454 int maxrss = getmaxrss() / 1024;
4455 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4458 return exit_program(0);