3 * Copyright (c) 2000-2011 The libav developers.
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[] = "avconv";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_FILES 100
113 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
114 static const char *last_asked_format = NULL;
115 static double *ts_scale;
116 static int nb_ts_scale;
118 static AVFormatContext *output_files[MAX_FILES];
119 static AVDictionary *output_opts[MAX_FILES];
120 static int nb_output_files = 0;
122 static StreamMap *stream_maps = NULL;
123 static int nb_stream_maps;
125 /* first item specifies output metadata, second is input */
126 static MetadataMap (*meta_data_maps)[2] = NULL;
127 static int nb_meta_data_maps;
128 static int metadata_global_autocopy = 1;
129 static int metadata_streams_autocopy = 1;
130 static int metadata_chapters_autocopy = 1;
132 static int chapters_input_file = INT_MAX;
134 /* indexed by output file stream index */
135 static int *streamid_map = NULL;
136 static int nb_streamid_map = 0;
138 static int frame_width = 0;
139 static int frame_height = 0;
140 static float frame_aspect_ratio = 0;
141 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
142 static int frame_bits_per_raw_sample = 0;
143 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
144 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
145 static AVRational frame_rate;
146 static float video_qscale = 0;
147 static uint16_t *intra_matrix = NULL;
148 static uint16_t *inter_matrix = NULL;
149 static const char *video_rc_override_string=NULL;
150 static int video_disable = 0;
151 static int video_discard = 0;
152 static char *video_codec_name = NULL;
153 static unsigned int video_codec_tag = 0;
154 static char *video_language = NULL;
155 static int same_quality = 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 qp_hist = 0;
162 static char *vfilters = NULL;
165 static int intra_only = 0;
166 static int audio_sample_rate = 0;
167 #define QSCALE_NONE -99999
168 static float audio_qscale = QSCALE_NONE;
169 static int audio_disable = 0;
170 static int audio_channels = 0;
171 static char *audio_codec_name = NULL;
172 static unsigned int audio_codec_tag = 0;
173 static char *audio_language = NULL;
175 static int subtitle_disable = 0;
176 static char *subtitle_codec_name = NULL;
177 static char *subtitle_language = NULL;
178 static unsigned int subtitle_codec_tag = 0;
180 static int data_disable = 0;
181 static char *data_codec_name = NULL;
182 static unsigned int data_codec_tag = 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = INT64_MAX;
188 static int64_t start_time = 0;
189 static int64_t input_ts_offset = 0;
190 static int file_overwrite = 0;
191 static AVDictionary *metadata;
192 static int do_benchmark = 0;
193 static int do_hex_dump = 0;
194 static int do_pkt_dump = 0;
195 static int do_psnr = 0;
196 static int do_pass = 0;
197 static const char *pass_logfilename_prefix;
198 static int audio_stream_copy = 0;
199 static int video_stream_copy = 0;
200 static int subtitle_stream_copy = 0;
201 static int data_stream_copy = 0;
202 static int video_sync_method= -1;
203 static int audio_sync_method= 0;
204 static float audio_drift_threshold= 0.1;
205 static int copy_ts= 0;
206 static int copy_tb= 0;
207 static int opt_shortest = 0;
208 static char *vstats_filename;
209 static FILE *vstats_file;
210 static int opt_programid = 0;
211 static int copy_initial_nonkeyframes = 0;
213 static int rate_emu = 0;
215 static int audio_volume = 256;
217 static int exit_on_error = 0;
218 static int using_stdin = 0;
219 static int verbose = 1;
220 static int run_as_daemon = 0;
221 static int thread_count= 1;
222 static int q_pressed = 0;
223 static int64_t video_size = 0;
224 static int64_t audio_size = 0;
225 static int64_t extra_size = 0;
226 static int nb_frames_dup = 0;
227 static int nb_frames_drop = 0;
228 static int input_sync;
229 static uint64_t limit_filesize = 0;
230 static int force_fps = 0;
231 static char *forced_key_frames = NULL;
233 static float dts_delta_threshold = 10;
235 static int64_t timer_start;
237 static uint8_t *audio_buf;
238 static uint8_t *audio_out;
239 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
241 static short *samples;
243 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
244 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
245 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
247 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
251 typedef struct OutputStream {
252 int file_index; /* file index */
253 int index; /* stream index in the output file */
254 int source_index; /* InputStream index */
255 AVStream *st; /* stream in the output file */
256 int encoding_needed; /* true if encoding needed for this stream */
258 /* input pts and corresponding output pts
260 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
261 struct InputStream *sync_ist; /* input stream to sync against */
262 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
263 AVBitStreamFilterContext *bitstream_filters;
268 AVFrame resample_frame; /* temporary frame for image resampling */
269 struct SwsContext *img_resample_ctx; /* for image resampling */
272 int resample_pix_fmt;
273 AVRational frame_rate;
275 float frame_aspect_ratio;
277 /* forced key frames */
278 int64_t *forced_kf_pts;
284 ReSampleContext *resample; /* for audio resampling */
285 int resample_sample_fmt;
286 int resample_channels;
287 int resample_sample_rate;
289 AVAudioConvert *reformat_ctx;
290 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
294 AVFilterContext *output_video_filter;
295 AVFilterContext *input_video_filter;
296 AVFilterBufferRef *picref;
298 AVFilterGraph *graph;
305 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
306 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
308 typedef struct InputStream {
311 int discard; /* true if stream data should be discarded */
312 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
315 int64_t start; /* time when read started */
316 int64_t next_pts; /* synthetic pts for cases where pkt.pts
318 int64_t pts; /* current pts */
320 int is_start; /* is 1 at the start and after a discontinuity */
321 int showed_multi_packet_warning;
322 int is_past_recording_time;
326 typedef struct InputFile {
327 AVFormatContext *ctx;
328 int eof_reached; /* true if eof reached */
329 int ist_index; /* index of first stream in ist_table */
330 int buffer_size; /* current total buffer size */
337 /* init terminal so that we can grab keys */
338 static struct termios oldtty;
341 static InputStream *input_streams = NULL;
342 static int nb_input_streams = 0;
343 static InputFile *input_files = NULL;
344 static int nb_input_files = 0;
348 static int configure_video_filters(InputStream *ist, OutputStream *ost)
350 AVFilterContext *last_filter, *filter;
351 /** filter graph containing all filters including input & output */
352 AVCodecContext *codec = ost->st->codec;
353 AVCodecContext *icodec = ist->st->codec;
354 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
355 AVRational sample_aspect_ratio;
359 ost->graph = avfilter_graph_alloc();
361 if (ist->st->sample_aspect_ratio.num){
362 sample_aspect_ratio = ist->st->sample_aspect_ratio;
364 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
366 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
367 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
368 sample_aspect_ratio.num, sample_aspect_ratio.den);
370 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
371 "src", args, NULL, ost->graph);
374 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
375 "out", NULL, pix_fmts, ost->graph);
378 last_filter = ost->input_video_filter;
380 if (codec->width != icodec->width || codec->height != icodec->height) {
381 snprintf(args, 255, "%d:%d:flags=0x%X",
385 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
386 NULL, args, NULL, ost->graph)) < 0)
388 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
390 last_filter = filter;
393 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
394 ost->graph->scale_sws_opts = av_strdup(args);
397 AVFilterInOut *outputs = avfilter_inout_alloc();
398 AVFilterInOut *inputs = avfilter_inout_alloc();
400 outputs->name = av_strdup("in");
401 outputs->filter_ctx = last_filter;
402 outputs->pad_idx = 0;
403 outputs->next = NULL;
405 inputs->name = av_strdup("out");
406 inputs->filter_ctx = ost->output_video_filter;
410 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
412 av_freep(&ost->avfilter);
414 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
418 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
421 codec->width = ost->output_video_filter->inputs[0]->w;
422 codec->height = ost->output_video_filter->inputs[0]->h;
423 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
424 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
425 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
426 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
430 #endif /* CONFIG_AVFILTER */
432 static void term_exit(void)
434 av_log(NULL, AV_LOG_QUIET, "%s", "");
437 tcsetattr (0, TCSANOW, &oldtty);
441 static volatile int received_sigterm = 0;
444 sigterm_handler(int sig)
446 received_sigterm = sig;
451 static void term_init(void)
461 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
462 |INLCR|IGNCR|ICRNL|IXON);
463 tty.c_oflag |= OPOST;
464 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
465 tty.c_cflag &= ~(CSIZE|PARENB);
470 tcsetattr (0, TCSANOW, &tty);
471 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
475 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
476 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
478 signal(SIGXCPU, sigterm_handler);
482 /* read a key without blocking */
483 static int read_key(void)
498 n = select(1, &rfds, NULL, NULL, &tv);
513 static int decode_interrupt_cb(void)
515 q_pressed += read_key() == 'q';
516 return q_pressed > 1;
519 static int exit_program(int ret)
524 for(i=0;i<nb_output_files;i++) {
525 AVFormatContext *s = output_files[i];
526 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
528 avformat_free_context(s);
529 av_free(output_streams_for_file[i]);
530 av_dict_free(&output_opts[i]);
532 for(i=0;i<nb_input_files;i++) {
533 av_close_input_file(input_files[i].ctx);
535 for (i = 0; i < nb_input_streams; i++)
536 av_dict_free(&input_streams[i].opts);
538 av_free(intra_matrix);
539 av_free(inter_matrix);
543 av_free(vstats_filename);
545 av_free(streamid_map);
546 av_free(meta_data_maps);
548 av_freep(&input_streams);
549 av_freep(&input_files);
551 av_free(video_codec_name);
552 av_free(audio_codec_name);
553 av_free(subtitle_codec_name);
554 av_free(data_codec_name);
559 allocated_audio_buf_size= allocated_audio_out_size= 0;
566 if (received_sigterm) {
568 "Received signal %d: terminating.\n",
569 (int) received_sigterm);
573 exit(ret); /* not all OS-es handle main() return value */
577 static void assert_avoptions(AVDictionary *m)
579 AVDictionaryEntry *t;
580 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
581 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
586 static void assert_codec_experimental(AVCodecContext *c, int encoder)
588 const char *codec_string = encoder ? "encoder" : "decoder";
590 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
591 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
592 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
593 "results.\nAdd '-strict experimental' if you want to use it.\n",
594 codec_string, c->codec->name);
595 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
596 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
597 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
598 codec_string, codec->name);
603 /* similar to ff_dynarray_add() and av_fast_realloc() */
604 static void *grow_array(void *array, int elem_size, int *size, int new_size)
606 if (new_size >= INT_MAX / elem_size) {
607 fprintf(stderr, "Array too big.\n");
610 if (*size < new_size) {
611 uint8_t *tmp = av_realloc(array, new_size*elem_size);
613 fprintf(stderr, "Could not alloc buffer.\n");
616 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
623 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
625 if(codec && codec->sample_fmts){
626 const enum AVSampleFormat *p= codec->sample_fmts;
628 if(*p == st->codec->sample_fmt)
632 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
633 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
634 if(av_get_sample_fmt_name(st->codec->sample_fmt))
635 av_log(NULL, AV_LOG_WARNING,
636 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
637 av_get_sample_fmt_name(st->codec->sample_fmt),
639 av_get_sample_fmt_name(codec->sample_fmts[0]));
640 st->codec->sample_fmt = codec->sample_fmts[0];
645 static void choose_sample_rate(AVStream *st, AVCodec *codec)
647 if(codec && codec->supported_samplerates){
648 const int *p= codec->supported_samplerates;
650 int best_dist=INT_MAX;
652 int dist= abs(st->codec->sample_rate - *p);
653 if(dist < best_dist){
659 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
661 st->codec->sample_rate= best;
665 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
667 if(codec && codec->pix_fmts){
668 const enum PixelFormat *p= codec->pix_fmts;
669 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
670 if(st->codec->codec_id==CODEC_ID_MJPEG){
671 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
672 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
673 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};
677 if(*p == st->codec->pix_fmt)
681 if(st->codec->pix_fmt != PIX_FMT_NONE)
682 av_log(NULL, AV_LOG_WARNING,
683 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
684 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
686 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
687 st->codec->pix_fmt = codec->pix_fmts[0];
692 static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, AVCodec *codec)
695 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
696 int idx = oc->nb_streams - 1;
699 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
703 output_streams_for_file[file_idx] =
704 grow_array(output_streams_for_file[file_idx],
705 sizeof(*output_streams_for_file[file_idx]),
706 &nb_output_streams_for_file[file_idx],
708 ost = output_streams_for_file[file_idx][idx] =
709 av_mallocz(sizeof(OutputStream));
711 fprintf(stderr, "Could not alloc output stream\n");
714 ost->file_index = file_idx;
719 st->codec->codec_type = codec->type;
720 ost->opts = filter_codec_opts(codec_opts, codec->id, oc, st);
723 avcodec_get_context_defaults3(st->codec, codec);
725 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
729 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
732 AVFormatContext *ic = NULL;
735 err = avformat_open_input(&ic, filename, NULL, NULL);
738 /* copy stream format */
739 for(i=0;i<ic->nb_streams;i++) {
744 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
745 ost = new_output_stream(s, nb_output_files, codec);
748 // FIXME: a more elegant solution is needed
749 memcpy(st, ic->streams[i], sizeof(AVStream));
750 st->info = av_malloc(sizeof(*st->info));
751 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
752 avcodec_copy_context(st->codec, ic->streams[i]->codec);
754 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
755 if (audio_stream_copy) {
758 choose_sample_fmt(st, codec);
759 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
760 if (video_stream_copy) {
763 choose_pixel_fmt(st, codec);
766 if(st->codec->flags & CODEC_FLAG_BITEXACT)
770 av_close_input_file(ic);
775 get_sync_ipts(const OutputStream *ost)
777 const InputStream *ist = ost->sync_ist;
778 return (double)(ist->pts - start_time)/AV_TIME_BASE;
781 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
785 AVPacket new_pkt= *pkt;
786 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
787 &new_pkt.data, &new_pkt.size,
788 pkt->data, pkt->size,
789 pkt->flags & AV_PKT_FLAG_KEY);
792 new_pkt.destruct= av_destruct_packet;
794 fprintf(stderr, "%s failed for stream %d, codec %s",
795 bsfc->filter->name, pkt->stream_index,
796 avctx->codec ? avctx->codec->name : "copy");
806 ret= av_interleaved_write_frame(s, pkt);
808 print_error("av_interleaved_write_frame()", ret);
813 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
815 static void do_audio_out(AVFormatContext *s,
818 unsigned char *buf, int size)
821 int64_t audio_out_size, audio_buf_size;
822 int64_t allocated_for_size= size;
824 int size_out, frame_bytes, ret, resample_changed;
825 AVCodecContext *enc= ost->st->codec;
826 AVCodecContext *dec= ist->st->codec;
827 int osize = av_get_bytes_per_sample(enc->sample_fmt);
828 int isize = av_get_bytes_per_sample(dec->sample_fmt);
829 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
832 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
833 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
834 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
835 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
836 audio_buf_size*= osize*enc->channels;
838 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
839 if(coded_bps > 8*osize)
840 audio_out_size= audio_out_size * coded_bps / (8*osize);
841 audio_out_size += FF_MIN_BUFFER_SIZE;
843 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
844 fprintf(stderr, "Buffer sizes too large\n");
848 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
849 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
850 if (!audio_buf || !audio_out){
851 fprintf(stderr, "Out of memory in do_audio_out\n");
855 if (enc->channels != dec->channels)
856 ost->audio_resample = 1;
858 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
859 ost->resample_channels != dec->channels ||
860 ost->resample_sample_rate != dec->sample_rate;
862 if ((ost->audio_resample && !ost->resample) || resample_changed) {
863 if (resample_changed) {
864 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",
865 ist->file_index, ist->st->index,
866 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
867 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
868 ost->resample_sample_fmt = dec->sample_fmt;
869 ost->resample_channels = dec->channels;
870 ost->resample_sample_rate = dec->sample_rate;
872 audio_resample_close(ost->resample);
874 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
875 if (audio_sync_method <= 1 &&
876 ost->resample_sample_fmt == enc->sample_fmt &&
877 ost->resample_channels == enc->channels &&
878 ost->resample_sample_rate == enc->sample_rate) {
879 ost->resample = NULL;
880 ost->audio_resample = 0;
882 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
883 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
884 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
885 enc->sample_rate, dec->sample_rate,
886 enc->sample_fmt, dec->sample_fmt,
888 if (!ost->resample) {
889 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
890 dec->channels, dec->sample_rate,
891 enc->channels, enc->sample_rate);
897 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
898 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
899 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
900 if (ost->reformat_ctx)
901 av_audio_convert_free(ost->reformat_ctx);
902 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
903 dec->sample_fmt, 1, NULL, 0);
904 if (!ost->reformat_ctx) {
905 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
906 av_get_sample_fmt_name(dec->sample_fmt),
907 av_get_sample_fmt_name(enc->sample_fmt));
910 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
913 if(audio_sync_method){
914 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
915 - av_fifo_size(ost->fifo)/(enc->channels * 2);
916 double idelta= delta*dec->sample_rate / enc->sample_rate;
917 int byte_delta= ((int)idelta)*2*dec->channels;
919 //FIXME resample delay
920 if(fabs(delta) > 50){
921 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
923 byte_delta= FFMAX(byte_delta, -size);
927 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
932 static uint8_t *input_tmp= NULL;
933 input_tmp= av_realloc(input_tmp, byte_delta + size);
935 if(byte_delta > allocated_for_size - size){
936 allocated_for_size= byte_delta + (int64_t)size;
941 memset(input_tmp, 0, byte_delta);
942 memcpy(input_tmp + byte_delta, buf, size);
946 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
948 }else if(audio_sync_method>1){
949 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
950 av_assert0(ost->audio_resample);
952 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
953 // 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));
954 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
958 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
959 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
961 if (ost->audio_resample) {
963 size_out = audio_resample(ost->resample,
964 (short *)buftmp, (short *)buf,
965 size / (dec->channels * isize));
966 size_out = size_out * enc->channels * osize;
972 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
973 const void *ibuf[6]= {buftmp};
974 void *obuf[6]= {audio_buf};
975 int istride[6]= {isize};
976 int ostride[6]= {osize};
977 int len= size_out/istride[0];
978 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
979 printf("av_audio_convert() failed\n");
985 size_out = len*osize;
988 /* now encode as many frames as possible */
989 if (enc->frame_size > 1) {
990 /* output resampled raw samples */
991 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
992 fprintf(stderr, "av_fifo_realloc2() failed\n");
995 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
997 frame_bytes = enc->frame_size * osize * enc->channels;
999 while (av_fifo_size(ost->fifo) >= frame_bytes) {
1001 av_init_packet(&pkt);
1003 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
1005 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1007 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
1008 (short *)audio_buf);
1010 fprintf(stderr, "Audio encoding failed\n");
1014 pkt.stream_index= ost->index;
1015 pkt.data= audio_out;
1017 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1018 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1019 pkt.flags |= AV_PKT_FLAG_KEY;
1020 write_frame(s, &pkt, enc, ost->bitstream_filters);
1022 ost->sync_opts += enc->frame_size;
1026 av_init_packet(&pkt);
1028 ost->sync_opts += size_out / (osize * enc->channels);
1030 /* output a pcm frame */
1031 /* determine the size of the coded buffer */
1034 size_out = size_out*coded_bps/8;
1036 if(size_out > audio_out_size){
1037 fprintf(stderr, "Internal error, buffer size too small\n");
1041 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1042 ret = avcodec_encode_audio(enc, audio_out, size_out,
1045 fprintf(stderr, "Audio encoding failed\n");
1049 pkt.stream_index= ost->index;
1050 pkt.data= audio_out;
1052 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1053 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1054 pkt.flags |= AV_PKT_FLAG_KEY;
1055 write_frame(s, &pkt, enc, ost->bitstream_filters);
1059 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1061 AVCodecContext *dec;
1062 AVPicture *picture2;
1063 AVPicture picture_tmp;
1066 dec = ist->st->codec;
1068 /* deinterlace : must be done before any resize */
1069 if (do_deinterlace) {
1072 /* create temporary picture */
1073 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1074 buf = av_malloc(size);
1078 picture2 = &picture_tmp;
1079 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1081 if(avpicture_deinterlace(picture2, picture,
1082 dec->pix_fmt, dec->width, dec->height) < 0) {
1083 /* if error, do not deinterlace */
1084 fprintf(stderr, "Deinterlacing failed\n");
1093 if (picture != picture2)
1094 *picture = *picture2;
1098 /* we begin to correct av delay at this threshold */
1099 #define AV_DELAY_MAX 0.100
1101 static void do_subtitle_out(AVFormatContext *s,
1107 static uint8_t *subtitle_out = NULL;
1108 int subtitle_out_max_size = 1024 * 1024;
1109 int subtitle_out_size, nb, i;
1110 AVCodecContext *enc;
1113 if (pts == AV_NOPTS_VALUE) {
1114 fprintf(stderr, "Subtitle packets must have a pts\n");
1120 enc = ost->st->codec;
1122 if (!subtitle_out) {
1123 subtitle_out = av_malloc(subtitle_out_max_size);
1126 /* Note: DVB subtitle need one packet to draw them and one other
1127 packet to clear them */
1128 /* XXX: signal it in the codec context ? */
1129 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1134 for(i = 0; i < nb; i++) {
1135 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1136 // start_display_time is required to be 0
1137 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1138 sub->end_display_time -= sub->start_display_time;
1139 sub->start_display_time = 0;
1140 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1141 subtitle_out_max_size, sub);
1142 if (subtitle_out_size < 0) {
1143 fprintf(stderr, "Subtitle encoding failed\n");
1147 av_init_packet(&pkt);
1148 pkt.stream_index = ost->index;
1149 pkt.data = subtitle_out;
1150 pkt.size = subtitle_out_size;
1151 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1152 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1153 /* XXX: the pts correction is handled here. Maybe handling
1154 it in the codec would be better */
1156 pkt.pts += 90 * sub->start_display_time;
1158 pkt.pts += 90 * sub->end_display_time;
1160 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1164 static int bit_buffer_size= 1024*256;
1165 static uint8_t *bit_buffer= NULL;
1167 static void do_video_out(AVFormatContext *s,
1170 AVFrame *in_picture,
1171 int *frame_size, float quality)
1173 int nb_frames, i, ret, av_unused resample_changed;
1174 AVFrame *final_picture, *formatted_picture;
1175 AVCodecContext *enc, *dec;
1178 enc = ost->st->codec;
1179 dec = ist->st->codec;
1181 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1183 /* by default, we output a single frame */
1188 if(video_sync_method){
1189 double vdelta = sync_ipts - ost->sync_opts;
1190 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1193 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1196 }else if(vdelta>0.6)
1197 ost->sync_opts= lrintf(sync_ipts);
1198 }else if (vdelta > 1.1)
1199 nb_frames = lrintf(vdelta);
1200 //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);
1201 if (nb_frames == 0){
1204 fprintf(stderr, "*** drop!\n");
1205 }else if (nb_frames > 1) {
1206 nb_frames_dup += nb_frames - 1;
1208 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1211 ost->sync_opts= lrintf(sync_ipts);
1213 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1217 formatted_picture = in_picture;
1218 final_picture = formatted_picture;
1220 resample_changed = ost->resample_width != dec->width ||
1221 ost->resample_height != dec->height ||
1222 ost->resample_pix_fmt != dec->pix_fmt;
1224 #if !CONFIG_AVFILTER
1225 if (resample_changed) {
1226 av_log(NULL, AV_LOG_INFO,
1227 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1228 ist->file_index, ist->st->index,
1229 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1230 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1231 ost->resample_width = dec->width;
1232 ost->resample_height = dec->height;
1233 ost->resample_pix_fmt = dec->pix_fmt;
1236 ost->video_resample = dec->width != enc->width ||
1237 dec->height != enc->height ||
1238 dec->pix_fmt != enc->pix_fmt;
1240 if (ost->video_resample) {
1241 final_picture = &ost->resample_frame;
1242 if (!ost->img_resample_ctx || resample_changed) {
1243 /* initialize the destination picture */
1244 if (!ost->resample_frame.data[0]) {
1245 avcodec_get_frame_defaults(&ost->resample_frame);
1246 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1247 enc->width, enc->height)) {
1248 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1252 /* initialize a new scaler context */
1253 sws_freeContext(ost->img_resample_ctx);
1254 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1255 enc->width, enc->height, enc->pix_fmt,
1256 ost->sws_flags, NULL, NULL, NULL);
1257 if (ost->img_resample_ctx == NULL) {
1258 fprintf(stderr, "Cannot get resampling context\n");
1262 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1263 0, ost->resample_height, final_picture->data, final_picture->linesize);
1266 if (resample_changed) {
1267 avfilter_graph_free(&ost->graph);
1268 if (configure_video_filters(ist, ost)) {
1269 fprintf(stderr, "Error reinitialising filters!\n");
1274 if (resample_changed) {
1275 ost->resample_width = dec->width;
1276 ost->resample_height = dec->height;
1277 ost->resample_pix_fmt = dec->pix_fmt;
1280 /* duplicates frame if needed */
1281 for(i=0;i<nb_frames;i++) {
1283 av_init_packet(&pkt);
1284 pkt.stream_index= ost->index;
1286 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1287 /* raw pictures are written as AVPicture structure to
1288 avoid any copies. We support temorarily the older
1290 AVFrame* old_frame = enc->coded_frame;
1291 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1292 pkt.data= (uint8_t *)final_picture;
1293 pkt.size= sizeof(AVPicture);
1294 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1295 pkt.flags |= AV_PKT_FLAG_KEY;
1297 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1298 enc->coded_frame = old_frame;
1300 AVFrame big_picture;
1302 big_picture= *final_picture;
1303 /* better than nothing: use input picture interlaced
1305 big_picture.interlaced_frame = in_picture->interlaced_frame;
1306 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1307 if(top_field_first == -1)
1308 big_picture.top_field_first = in_picture->top_field_first;
1310 big_picture.top_field_first = top_field_first;
1313 /* handles sameq here. This is not correct because it may
1314 not be a global option */
1315 big_picture.quality = quality;
1317 big_picture.pict_type = 0;
1318 // big_picture.pts = AV_NOPTS_VALUE;
1319 big_picture.pts= ost->sync_opts;
1320 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1321 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1322 if (ost->forced_kf_index < ost->forced_kf_count &&
1323 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1324 big_picture.pict_type = AV_PICTURE_TYPE_I;
1325 ost->forced_kf_index++;
1327 ret = avcodec_encode_video(enc,
1328 bit_buffer, bit_buffer_size,
1331 fprintf(stderr, "Video encoding failed\n");
1336 pkt.data= bit_buffer;
1338 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1339 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1340 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1341 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1342 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1344 if(enc->coded_frame->key_frame)
1345 pkt.flags |= AV_PKT_FLAG_KEY;
1346 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1349 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1350 // enc->frame_number-1, ret, enc->pict_type);
1351 /* if two pass, output log */
1352 if (ost->logfile && enc->stats_out) {
1353 fprintf(ost->logfile, "%s", enc->stats_out);
1358 ost->frame_number++;
1362 static double psnr(double d){
1363 return -10.0*log(d)/log(10.0);
1366 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1369 AVCodecContext *enc;
1371 double ti1, bitrate, avg_bitrate;
1373 /* this is executed just the first time do_video_stats is called */
1375 vstats_file = fopen(vstats_filename, "w");
1382 enc = ost->st->codec;
1383 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1384 frame_number = ost->frame_number;
1385 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1386 if (enc->flags&CODEC_FLAG_PSNR)
1387 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1389 fprintf(vstats_file,"f_size= %6d ", frame_size);
1390 /* compute pts value */
1391 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1395 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1396 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1397 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1398 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1399 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1403 static void print_report(AVFormatContext **output_files,
1404 OutputStream **ost_table, int nb_ostreams,
1409 AVFormatContext *oc;
1411 AVCodecContext *enc;
1412 int frame_number, vid, i;
1414 int64_t pts = INT64_MAX;
1415 static int64_t last_time = -1;
1416 static int qp_histogram[52];
1418 if (!is_last_report) {
1420 /* display the report every 0.5 seconds */
1421 cur_time = av_gettime();
1422 if (last_time == -1) {
1423 last_time = cur_time;
1426 if ((cur_time - last_time) < 500000)
1428 last_time = cur_time;
1432 oc = output_files[0];
1434 total_size = avio_size(oc->pb);
1435 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1436 total_size= avio_tell(oc->pb);
1440 for(i=0;i<nb_ostreams;i++) {
1443 enc = ost->st->codec;
1444 if (!ost->st->stream_copy && enc->coded_frame)
1445 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1446 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1447 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1449 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1450 float t = (av_gettime()-timer_start) / 1000000.0;
1452 frame_number = ost->frame_number;
1453 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1454 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1456 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1460 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1463 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1465 if (enc->flags&CODEC_FLAG_PSNR){
1467 double error, error_sum=0;
1468 double scale, scale_sum=0;
1469 char type[3]= {'Y','U','V'};
1470 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1473 error= enc->error[j];
1474 scale= enc->width*enc->height*255.0*255.0*frame_number;
1476 error= enc->coded_frame->error[j];
1477 scale= enc->width*enc->height*255.0*255.0;
1482 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1484 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1488 /* compute min output value */
1489 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1490 ost->st->time_base, AV_TIME_BASE_Q));
1493 if (verbose > 0 || is_last_report) {
1494 int hours, mins, secs, us;
1495 secs = pts / AV_TIME_BASE;
1496 us = pts % AV_TIME_BASE;
1502 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1504 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1505 "size=%8.0fkB time=", total_size / 1024.0);
1506 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1507 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1508 (100 * us) / AV_TIME_BASE);
1509 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1510 "bitrate=%6.1fkbits/s", bitrate);
1512 if (nb_frames_dup || nb_frames_drop)
1513 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1514 nb_frames_dup, nb_frames_drop);
1517 fprintf(stderr, "%s \r", buf);
1522 if (is_last_report && verbose >= 0){
1523 int64_t raw= audio_size + video_size + extra_size;
1524 fprintf(stderr, "\n");
1525 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1529 100.0*(total_size - raw)/raw
1534 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1536 int fill_char = 0x00;
1537 if (sample_fmt == AV_SAMPLE_FMT_U8)
1539 memset(buf, fill_char, size);
1542 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1543 static int output_packet(InputStream *ist, int ist_index,
1544 OutputStream **ost_table, int nb_ostreams,
1545 const AVPacket *pkt)
1547 AVFormatContext *os;
1552 void *buffer_to_free = NULL;
1553 static unsigned int samples_size= 0;
1554 AVSubtitle subtitle, *subtitle_to_free;
1555 int64_t pkt_pts = AV_NOPTS_VALUE;
1557 int frame_available;
1562 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1564 if(ist->next_pts == AV_NOPTS_VALUE)
1565 ist->next_pts= ist->pts;
1569 av_init_packet(&avpkt);
1577 if(pkt->dts != AV_NOPTS_VALUE)
1578 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1579 if(pkt->pts != AV_NOPTS_VALUE)
1580 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1582 //while we have more to decode or while the decoder did output something on EOF
1583 while (avpkt.size > 0 || (!pkt && got_output)) {
1584 uint8_t *data_buf, *decoded_data_buf;
1585 int data_size, decoded_data_size;
1587 ist->pts= ist->next_pts;
1589 if(avpkt.size && avpkt.size != pkt->size &&
1590 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1591 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1592 ist->showed_multi_packet_warning=1;
1595 /* decode the packet if needed */
1596 decoded_data_buf = NULL; /* fail safe */
1597 decoded_data_size= 0;
1598 data_buf = avpkt.data;
1599 data_size = avpkt.size;
1600 subtitle_to_free = NULL;
1601 if (ist->decoding_needed) {
1602 switch(ist->st->codec->codec_type) {
1603 case AVMEDIA_TYPE_AUDIO:{
1604 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1605 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1607 samples= av_malloc(samples_size);
1609 decoded_data_size= samples_size;
1610 /* XXX: could avoid copy if PCM 16 bits with same
1611 endianness as CPU */
1612 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1619 got_output = decoded_data_size > 0;
1620 /* Some bug in mpeg audio decoder gives */
1621 /* decoded_data_size < 0, it seems they are overflows */
1623 /* no audio frame */
1626 decoded_data_buf = (uint8_t *)samples;
1627 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1628 (ist->st->codec->sample_rate * ist->st->codec->channels);
1630 case AVMEDIA_TYPE_VIDEO:
1631 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1632 /* XXX: allocate picture correctly */
1633 avcodec_get_frame_defaults(&picture);
1634 avpkt.pts = pkt_pts;
1635 avpkt.dts = ist->pts;
1636 pkt_pts = AV_NOPTS_VALUE;
1638 ret = avcodec_decode_video2(ist->st->codec,
1639 &picture, &got_output, &avpkt);
1640 quality = same_quality ? picture.quality : 0;
1644 /* no picture yet */
1645 goto discard_packet;
1647 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1648 if (ist->st->codec->time_base.num != 0) {
1649 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1650 ist->next_pts += ((int64_t)AV_TIME_BASE *
1651 ist->st->codec->time_base.num * ticks) /
1652 ist->st->codec->time_base.den;
1655 buffer_to_free = NULL;
1656 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1658 case AVMEDIA_TYPE_SUBTITLE:
1659 ret = avcodec_decode_subtitle2(ist->st->codec,
1660 &subtitle, &got_output, &avpkt);
1664 goto discard_packet;
1666 subtitle_to_free = &subtitle;
1673 switch(ist->st->codec->codec_type) {
1674 case AVMEDIA_TYPE_AUDIO:
1675 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1676 ist->st->codec->sample_rate;
1678 case AVMEDIA_TYPE_VIDEO:
1679 if (ist->st->codec->time_base.num != 0) {
1680 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1681 ist->next_pts += ((int64_t)AV_TIME_BASE *
1682 ist->st->codec->time_base.num * ticks) /
1683 ist->st->codec->time_base.den;
1692 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1693 if (start_time == 0 || ist->pts >= start_time) {
1694 for(i=0;i<nb_ostreams;i++) {
1696 if (ost->input_video_filter && ost->source_index == ist_index) {
1697 if (!picture.sample_aspect_ratio.num)
1698 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1699 picture.pts = ist->pts;
1701 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1707 // preprocess audio (volume)
1708 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1709 if (audio_volume != 256) {
1712 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1713 int v = ((*volp) * audio_volume + 128) >> 8;
1714 if (v < -32768) v = -32768;
1715 if (v > 32767) v = 32767;
1721 /* frame rate emulation */
1723 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1724 int64_t now = av_gettime() - ist->start;
1728 /* if output time reached then transcode raw format,
1729 encode packets and output them */
1730 if (start_time == 0 || ist->pts >= start_time)
1731 for(i=0;i<nb_ostreams;i++) {
1735 if (ost->source_index == ist_index) {
1737 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1738 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1739 while (frame_available) {
1740 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1741 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1742 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1745 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1746 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1750 os = output_files[ost->file_index];
1752 /* set the input output pts pairs */
1753 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1755 if (ost->encoding_needed) {
1756 av_assert0(ist->decoding_needed);
1757 switch(ost->st->codec->codec_type) {
1758 case AVMEDIA_TYPE_AUDIO:
1759 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1761 case AVMEDIA_TYPE_VIDEO:
1763 if (ost->picref->video && !ost->frame_aspect_ratio)
1764 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1766 do_video_out(os, ost, ist, &picture, &frame_size,
1767 same_quality ? quality : ost->st->codec->global_quality);
1768 if (vstats_filename && frame_size)
1769 do_video_stats(os, ost, frame_size);
1771 case AVMEDIA_TYPE_SUBTITLE:
1772 do_subtitle_out(os, ost, ist, &subtitle,
1779 AVFrame avframe; //FIXME/XXX remove this
1782 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1784 av_init_packet(&opkt);
1786 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1787 #if !CONFIG_AVFILTER
1793 /* no reencoding needed : output the packet directly */
1794 /* force the input stream PTS */
1796 avcodec_get_frame_defaults(&avframe);
1797 ost->st->codec->coded_frame= &avframe;
1798 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1800 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1801 audio_size += data_size;
1802 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1803 video_size += data_size;
1807 opkt.stream_index= ost->index;
1808 if(pkt->pts != AV_NOPTS_VALUE)
1809 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1811 opkt.pts= AV_NOPTS_VALUE;
1813 if (pkt->dts == AV_NOPTS_VALUE)
1814 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1816 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1817 opkt.dts -= ost_tb_start_time;
1819 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1820 opkt.flags= pkt->flags;
1822 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1823 if( ost->st->codec->codec_id != CODEC_ID_H264
1824 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1825 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1827 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1828 opkt.destruct= av_destruct_packet;
1830 opkt.data = data_buf;
1831 opkt.size = data_size;
1834 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1835 /* store AVPicture in AVPacket, as expected by the output format */
1836 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1837 opkt.data = (uint8_t *)&pict;
1838 opkt.size = sizeof(AVPicture);
1839 opkt.flags |= AV_PKT_FLAG_KEY;
1841 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1842 ost->st->codec->frame_number++;
1843 ost->frame_number++;
1844 av_free_packet(&opkt);
1848 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1849 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1850 avfilter_unref_buffer(ost->picref);
1856 av_free(buffer_to_free);
1857 /* XXX: allocate the subtitles in the codec ? */
1858 if (subtitle_to_free) {
1859 avsubtitle_free(subtitle_to_free);
1860 subtitle_to_free = NULL;
1867 for(i=0;i<nb_ostreams;i++) {
1869 if (ost->source_index == ist_index) {
1870 AVCodecContext *enc= ost->st->codec;
1871 os = output_files[ost->file_index];
1873 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1875 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1878 if (ost->encoding_needed) {
1882 av_init_packet(&pkt);
1883 pkt.stream_index= ost->index;
1885 switch(ost->st->codec->codec_type) {
1886 case AVMEDIA_TYPE_AUDIO:
1887 fifo_bytes = av_fifo_size(ost->fifo);
1889 /* encode any samples remaining in fifo */
1890 if (fifo_bytes > 0) {
1891 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1892 int fs_tmp = enc->frame_size;
1894 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1895 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1896 enc->frame_size = fifo_bytes / (osize * enc->channels);
1898 int frame_bytes = enc->frame_size*osize*enc->channels;
1899 if (allocated_audio_buf_size < frame_bytes)
1901 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1904 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1905 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1906 ost->st->time_base.num, enc->sample_rate);
1907 enc->frame_size = fs_tmp;
1910 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1913 fprintf(stderr, "Audio encoding failed\n");
1917 pkt.flags |= AV_PKT_FLAG_KEY;
1919 case AVMEDIA_TYPE_VIDEO:
1920 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1922 fprintf(stderr, "Video encoding failed\n");
1926 if(enc->coded_frame && enc->coded_frame->key_frame)
1927 pkt.flags |= AV_PKT_FLAG_KEY;
1928 if (ost->logfile && enc->stats_out) {
1929 fprintf(ost->logfile, "%s", enc->stats_out);
1938 pkt.data= bit_buffer;
1940 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1941 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1942 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1952 static void print_sdp(AVFormatContext **avc, int n)
1956 av_sdp_create(avc, n, sdp, sizeof(sdp));
1957 printf("SDP:\n%s\n", sdp);
1961 static int copy_chapters(int infile, int outfile)
1963 AVFormatContext *is = input_files[infile].ctx;
1964 AVFormatContext *os = output_files[outfile];
1967 for (i = 0; i < is->nb_chapters; i++) {
1968 AVChapter *in_ch = is->chapters[i], *out_ch;
1969 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
1970 AV_TIME_BASE_Q, in_ch->time_base);
1971 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1972 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1975 if (in_ch->end < ts_off)
1977 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1980 out_ch = av_mallocz(sizeof(AVChapter));
1982 return AVERROR(ENOMEM);
1984 out_ch->id = in_ch->id;
1985 out_ch->time_base = in_ch->time_base;
1986 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1987 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1989 if (metadata_chapters_autocopy)
1990 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1993 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1995 return AVERROR(ENOMEM);
1996 os->chapters[os->nb_chapters - 1] = out_ch;
2001 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2002 AVCodecContext *avctx)
2008 for (p = kf; *p; p++)
2011 ost->forced_kf_count = n;
2012 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2013 if (!ost->forced_kf_pts) {
2014 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2017 for (i = 0; i < n; i++) {
2018 p = i ? strchr(p, ',') + 1 : kf;
2019 t = parse_time_or_die("force_key_frames", p, 1);
2020 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2025 * The following code is the main loop of the file converter
2027 static int transcode(AVFormatContext **output_files,
2028 int nb_output_files,
2029 InputFile *input_files,
2032 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2034 AVFormatContext *is, *os;
2035 AVCodecContext *codec, *icodec;
2036 OutputStream *ost, **ost_table = NULL;
2041 uint8_t no_packet[MAX_FILES]={0};
2042 int no_packet_count=0;
2043 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2044 int nb_streams[AVMEDIA_TYPE_NB]={0};
2047 for (i = 0; i < nb_input_streams; i++)
2048 input_streams[i].start = av_gettime();
2050 /* output stream init */
2052 for(i=0;i<nb_output_files;i++) {
2053 os = output_files[i];
2054 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2055 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2056 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2057 ret = AVERROR(EINVAL);
2060 nb_ostreams += os->nb_streams;
2063 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
2067 for(k=0;k<nb_output_files;k++) {
2068 os = output_files[k];
2069 for(i=0;i<os->nb_streams;i++,n++) {
2070 nb_streams[os->streams[i]->codec->codec_type]++;
2073 for(step=1<<30; step; step>>=1){
2074 int found_streams[AVMEDIA_TYPE_NB]={0};
2075 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2076 nb_frame_threshold[j] += step;
2078 for(j=0; j<nb_input_streams; j++) {
2080 ist = &input_streams[j];
2083 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2085 for(pi=0; pi<f->nb_programs; pi++){
2086 AVProgram *p= f->programs[pi];
2087 if(p->id == opt_programid)
2088 for(si=0; si<p->nb_stream_indexes; si++){
2089 if(f->streams[ p->stream_index[si] ] == ist->st)
2094 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2095 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2096 found_streams[ist->st->codec->codec_type]++;
2099 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2100 if(found_streams[j] < nb_streams[j])
2101 nb_frame_threshold[j] -= step;
2104 for(k=0;k<nb_output_files;k++) {
2105 os = output_files[k];
2106 for (i = 0; i < os->nb_streams; i++, n++)
2107 ost_table[n] = output_streams_for_file[k][i];
2110 /* for each output stream, we compute the right encoding parameters */
2111 for(i=0;i<nb_ostreams;i++) {
2113 os = output_files[ost->file_index];
2114 ist = &input_streams[ost->source_index];
2116 codec = ost->st->codec;
2117 icodec = ist->st->codec;
2119 ost->st->disposition = ist->st->disposition;
2120 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2121 codec->chroma_sample_location = icodec->chroma_sample_location;
2123 if (ost->st->stream_copy) {
2124 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2126 if (extra_size > INT_MAX)
2129 /* if stream_copy is selected, no need to decode or encode */
2130 codec->codec_id = icodec->codec_id;
2131 codec->codec_type = icodec->codec_type;
2133 if(!codec->codec_tag){
2134 if( !os->oformat->codec_tag
2135 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2136 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2137 codec->codec_tag = icodec->codec_tag;
2140 codec->bit_rate = icodec->bit_rate;
2141 codec->rc_max_rate = icodec->rc_max_rate;
2142 codec->rc_buffer_size = icodec->rc_buffer_size;
2143 codec->extradata= av_mallocz(extra_size);
2144 if (!codec->extradata)
2146 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2147 codec->extradata_size= icodec->extradata_size;
2149 codec->time_base = ist->st->time_base;
2150 if(!strcmp(os->oformat->name, "avi")) {
2151 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){
2152 codec->time_base = icodec->time_base;
2153 codec->time_base.num *= icodec->ticks_per_frame;
2154 codec->time_base.den *= 2;
2156 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2157 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){
2158 codec->time_base = icodec->time_base;
2159 codec->time_base.num *= icodec->ticks_per_frame;
2162 av_reduce(&codec->time_base.num, &codec->time_base.den,
2163 codec->time_base.num, codec->time_base.den, INT_MAX);
2165 switch(codec->codec_type) {
2166 case AVMEDIA_TYPE_AUDIO:
2167 if(audio_volume != 256) {
2168 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2171 codec->channel_layout = icodec->channel_layout;
2172 codec->sample_rate = icodec->sample_rate;
2173 codec->channels = icodec->channels;
2174 codec->frame_size = icodec->frame_size;
2175 codec->audio_service_type = icodec->audio_service_type;
2176 codec->block_align= icodec->block_align;
2177 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2178 codec->block_align= 0;
2179 if(codec->codec_id == CODEC_ID_AC3)
2180 codec->block_align= 0;
2182 case AVMEDIA_TYPE_VIDEO:
2183 codec->pix_fmt = icodec->pix_fmt;
2184 codec->width = icodec->width;
2185 codec->height = icodec->height;
2186 codec->has_b_frames = icodec->has_b_frames;
2187 if (!codec->sample_aspect_ratio.num) {
2188 codec->sample_aspect_ratio =
2189 ost->st->sample_aspect_ratio =
2190 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2191 ist->st->codec->sample_aspect_ratio.num ?
2192 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2195 case AVMEDIA_TYPE_SUBTITLE:
2196 codec->width = icodec->width;
2197 codec->height = icodec->height;
2199 case AVMEDIA_TYPE_DATA:
2206 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2207 switch(codec->codec_type) {
2208 case AVMEDIA_TYPE_AUDIO:
2209 ost->fifo= av_fifo_alloc(1024);
2212 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2213 if (!codec->sample_rate) {
2214 codec->sample_rate = icodec->sample_rate;
2216 choose_sample_rate(ost->st, ost->enc);
2217 codec->time_base = (AVRational){1, codec->sample_rate};
2218 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2219 codec->sample_fmt = icodec->sample_fmt;
2220 choose_sample_fmt(ost->st, ost->enc);
2221 if (!codec->channels) {
2222 codec->channels = icodec->channels;
2223 codec->channel_layout = icodec->channel_layout;
2225 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2226 codec->channel_layout = 0;
2227 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2228 icodec->request_channels = codec->channels;
2229 ist->decoding_needed = 1;
2230 ost->encoding_needed = 1;
2231 ost->resample_sample_fmt = icodec->sample_fmt;
2232 ost->resample_sample_rate = icodec->sample_rate;
2233 ost->resample_channels = icodec->channels;
2235 case AVMEDIA_TYPE_VIDEO:
2236 if (codec->pix_fmt == PIX_FMT_NONE)
2237 codec->pix_fmt = icodec->pix_fmt;
2238 choose_pixel_fmt(ost->st, ost->enc);
2240 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2241 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2245 if (!codec->width || !codec->height) {
2246 codec->width = icodec->width;
2247 codec->height = icodec->height;
2250 ost->video_resample = codec->width != icodec->width ||
2251 codec->height != icodec->height ||
2252 codec->pix_fmt != icodec->pix_fmt;
2253 if (ost->video_resample) {
2254 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2257 ost->resample_height = icodec->height;
2258 ost->resample_width = icodec->width;
2259 ost->resample_pix_fmt= icodec->pix_fmt;
2260 ost->encoding_needed = 1;
2261 ist->decoding_needed = 1;
2263 if (!ost->frame_rate.num)
2264 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2265 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2266 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2267 ost->frame_rate = ost->enc->supported_framerates[idx];
2269 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2270 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2271 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2272 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2273 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2277 if (configure_video_filters(ist, ost)) {
2278 fprintf(stderr, "Error opening filters!\n");
2283 case AVMEDIA_TYPE_SUBTITLE:
2284 ost->encoding_needed = 1;
2285 ist->decoding_needed = 1;
2292 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2293 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2294 char logfilename[1024];
2297 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2298 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2300 if (codec->flags & CODEC_FLAG_PASS1) {
2301 f = fopen(logfilename, "wb");
2303 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2309 size_t logbuffer_size;
2310 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2311 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2314 codec->stats_in = logbuffer;
2318 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2319 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2320 int size= codec->width * codec->height;
2321 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2326 bit_buffer = av_malloc(bit_buffer_size);
2328 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2330 ret = AVERROR(ENOMEM);
2334 /* open each encoder */
2335 for(i=0;i<nb_ostreams;i++) {
2337 if (ost->encoding_needed) {
2338 AVCodec *codec = ost->enc;
2339 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2341 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2342 ost->st->codec->codec_id, ost->file_index, ost->index);
2343 ret = AVERROR(EINVAL);
2346 if (dec->subtitle_header) {
2347 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2348 if (!ost->st->codec->subtitle_header) {
2349 ret = AVERROR(ENOMEM);
2352 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2353 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2355 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2356 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2357 ost->file_index, ost->index);
2358 ret = AVERROR(EINVAL);
2361 assert_codec_experimental(ost->st->codec, 1);
2362 assert_avoptions(ost->opts);
2363 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2364 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2365 "It takes bits/s as argument, not kbits/s\n");
2366 extra_size += ost->st->codec->extradata_size;
2370 /* open each decoder */
2371 for (i = 0; i < nb_input_streams; i++) {
2372 ist = &input_streams[i];
2373 if (ist->decoding_needed) {
2374 AVCodec *codec = ist->dec;
2376 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2378 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2379 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2380 ret = AVERROR(EINVAL);
2383 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2384 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2385 ist->file_index, ist->st->index);
2386 ret = AVERROR(EINVAL);
2389 assert_codec_experimental(ist->st->codec, 0);
2390 assert_avoptions(ost->opts);
2395 for (i = 0; i < nb_input_streams; i++) {
2397 ist = &input_streams[i];
2399 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2400 ist->next_pts = AV_NOPTS_VALUE;
2404 /* open files and write file headers */
2405 for(i=0;i<nb_output_files;i++) {
2406 os = output_files[i];
2407 if (avformat_write_header(os, &output_opts[i]) < 0) {
2408 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2409 ret = AVERROR(EINVAL);
2412 // assert_avoptions(output_opts[i]);
2413 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2419 /* dump the file output parameters - cannot be done before in case
2421 for(i=0;i<nb_output_files;i++) {
2422 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2425 /* dump the stream mapping */
2427 fprintf(stderr, "Stream mapping:\n");
2428 for(i=0;i<nb_ostreams;i++) {
2430 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2431 input_streams[ost->source_index].file_index,
2432 input_streams[ost->source_index].st->index,
2435 if (ost->sync_ist != &input_streams[ost->source_index])
2436 fprintf(stderr, " [sync #%d.%d]",
2437 ost->sync_ist->file_index,
2438 ost->sync_ist->st->index);
2439 fprintf(stderr, "\n");
2444 fprintf(stderr, "%s\n", error);
2449 print_sdp(output_files, nb_output_files);
2454 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2455 avio_set_interrupt_cb(decode_interrupt_cb);
2459 timer_start = av_gettime();
2461 for(; received_sigterm == 0;) {
2462 int file_index, ist_index;
2470 /* if 'q' pressed, exits */
2474 /* read_key() returns 0 on EOF */
2478 if (key == '+') verbose++;
2479 if (key == '-') verbose--;
2480 if (key == 's') qp_hist ^= 1;
2483 do_hex_dump = do_pkt_dump = 0;
2484 } else if(do_pkt_dump){
2488 av_log_set_level(AV_LOG_DEBUG);
2490 if (key == 'd' || key == 'D'){
2493 debug = input_streams[0].st->codec->debug<<1;
2494 if(!debug) debug = 1;
2495 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2498 scanf("%d", &debug);
2499 for(i=0;i<nb_input_streams;i++) {
2500 input_streams[i].st->codec->debug = debug;
2502 for(i=0;i<nb_ostreams;i++) {
2504 ost->st->codec->debug = debug;
2506 if(debug) av_log_set_level(AV_LOG_DEBUG);
2507 fprintf(stderr,"debug=%d\n", debug);
2510 fprintf(stderr, "key function\n"
2511 "? show this help\n"
2512 "+ increase verbosity\n"
2513 "- decrease verbosity\n"
2514 "D cycle through available debug modes\n"
2515 "h dump packets/hex press to cycle through the 3 states\n"
2517 "s Show QP histogram\n"
2522 /* select the stream that we must read now by looking at the
2523 smallest output pts */
2525 for(i=0;i<nb_ostreams;i++) {
2528 os = output_files[ost->file_index];
2529 ist = &input_streams[ost->source_index];
2530 if(ist->is_past_recording_time || no_packet[ist->file_index])
2532 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2533 ipts = (double)ist->pts;
2534 if (!input_files[ist->file_index].eof_reached){
2535 if(ipts < ipts_min) {
2537 if(input_sync ) file_index = ist->file_index;
2539 if(opts < opts_min) {
2541 if(!input_sync) file_index = ist->file_index;
2544 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2549 /* if none, if is finished */
2550 if (file_index < 0) {
2551 if(no_packet_count){
2553 memset(no_packet, 0, sizeof(no_packet));
2560 /* finish if limit size exhausted */
2561 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2564 /* read a frame from it and output it in the fifo */
2565 is = input_files[file_index].ctx;
2566 ret= av_read_frame(is, &pkt);
2567 if(ret == AVERROR(EAGAIN)){
2568 no_packet[file_index]=1;
2573 input_files[file_index].eof_reached = 1;
2581 memset(no_packet, 0, sizeof(no_packet));
2584 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2585 is->streams[pkt.stream_index]);
2587 /* the following test is needed in case new streams appear
2588 dynamically in stream : we ignore them */
2589 if (pkt.stream_index >= input_files[file_index].nb_streams)
2590 goto discard_packet;
2591 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2592 ist = &input_streams[ist_index];
2594 goto discard_packet;
2596 if (pkt.dts != AV_NOPTS_VALUE)
2597 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2598 if (pkt.pts != AV_NOPTS_VALUE)
2599 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2601 if (ist->ts_scale) {
2602 if(pkt.pts != AV_NOPTS_VALUE)
2603 pkt.pts *= ist->ts_scale;
2604 if(pkt.dts != AV_NOPTS_VALUE)
2605 pkt.dts *= ist->ts_scale;
2608 // 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);
2609 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2610 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2611 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2612 int64_t delta= pkt_dts - ist->next_pts;
2613 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2614 input_files[ist->file_index].ts_offset -= delta;
2616 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2617 delta, input_files[ist->file_index].ts_offset);
2618 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2619 if(pkt.pts != AV_NOPTS_VALUE)
2620 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2624 /* finish if recording time exhausted */
2625 if (recording_time != INT64_MAX &&
2626 (pkt.pts != AV_NOPTS_VALUE ?
2627 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2629 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2631 ist->is_past_recording_time = 1;
2632 goto discard_packet;
2635 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2636 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2639 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2640 ist->file_index, ist->st->index);
2643 av_free_packet(&pkt);
2648 av_free_packet(&pkt);
2650 /* dump report by using the output first video and audio streams */
2651 print_report(output_files, ost_table, nb_ostreams, 0);
2654 /* at the end of stream, we must flush the decoder buffers */
2655 for (i = 0; i < nb_input_streams; i++) {
2656 ist = &input_streams[i];
2657 if (ist->decoding_needed) {
2658 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2664 /* write the trailer if needed and close file */
2665 for(i=0;i<nb_output_files;i++) {
2666 os = output_files[i];
2667 av_write_trailer(os);
2670 /* dump report by using the first video and audio streams */
2671 print_report(output_files, ost_table, nb_ostreams, 1);
2673 /* close each encoder */
2674 for(i=0;i<nb_ostreams;i++) {
2676 if (ost->encoding_needed) {
2677 av_freep(&ost->st->codec->stats_in);
2678 avcodec_close(ost->st->codec);
2681 avfilter_graph_free(&ost->graph);
2685 /* close each decoder */
2686 for (i = 0; i < nb_input_streams; i++) {
2687 ist = &input_streams[i];
2688 if (ist->decoding_needed) {
2689 avcodec_close(ist->st->codec);
2697 av_freep(&bit_buffer);
2700 for(i=0;i<nb_ostreams;i++) {
2703 if (ost->st->stream_copy)
2704 av_freep(&ost->st->codec->extradata);
2706 fclose(ost->logfile);
2707 ost->logfile = NULL;
2709 av_fifo_free(ost->fifo); /* works even if fifo is not
2710 initialized but set to zero */
2711 av_freep(&ost->st->codec->subtitle_header);
2712 av_free(ost->resample_frame.data[0]);
2713 av_free(ost->forced_kf_pts);
2714 if (ost->video_resample)
2715 sws_freeContext(ost->img_resample_ctx);
2717 audio_resample_close(ost->resample);
2718 if (ost->reformat_ctx)
2719 av_audio_convert_free(ost->reformat_ctx);
2720 av_dict_free(&ost->opts);
2729 static int opt_format(const char *opt, const char *arg)
2731 last_asked_format = arg;
2735 static int opt_video_rc_override_string(const char *opt, const char *arg)
2737 video_rc_override_string = arg;
2741 static int opt_me_threshold(const char *opt, const char *arg)
2743 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2747 static int opt_verbose(const char *opt, const char *arg)
2749 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2753 static int opt_frame_rate(const char *opt, const char *arg)
2755 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2756 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2762 static int opt_frame_crop(const char *opt, const char *arg)
2764 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2765 return AVERROR(EINVAL);
2768 static int opt_frame_size(const char *opt, const char *arg)
2770 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2771 fprintf(stderr, "Incorrect frame size\n");
2772 return AVERROR(EINVAL);
2777 static int opt_pad(const char *opt, const char *arg) {
2778 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2782 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2784 if (strcmp(arg, "list")) {
2785 frame_pix_fmt = av_get_pix_fmt(arg);
2786 if (frame_pix_fmt == PIX_FMT_NONE) {
2787 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2788 return AVERROR(EINVAL);
2791 opt_pix_fmts(NULL, NULL);
2797 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2804 p = strchr(arg, ':');
2806 x = strtol(arg, &end, 10);
2808 y = strtol(end+1, &end, 10);
2810 ar = (double)x / (double)y;
2812 ar = strtod(arg, NULL);
2815 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2816 return AVERROR(EINVAL);
2818 frame_aspect_ratio = ar;
2822 static int opt_metadata(const char *opt, const char *arg)
2824 char *mid= strchr(arg, '=');
2827 fprintf(stderr, "Missing =\n");
2832 av_dict_set(&metadata, arg, mid, 0);
2837 static int opt_qscale(const char *opt, const char *arg)
2839 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2840 if (video_qscale <= 0 || video_qscale > 255) {
2841 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2842 return AVERROR(EINVAL);
2847 static int opt_top_field_first(const char *opt, const char *arg)
2849 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2850 return opt_default(opt, arg);
2853 static int opt_thread_count(const char *opt, const char *arg)
2855 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2858 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2863 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2865 if (strcmp(arg, "list")) {
2866 audio_sample_fmt = av_get_sample_fmt(arg);
2867 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2868 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2869 return AVERROR(EINVAL);
2874 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2875 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2881 static int opt_audio_rate(const char *opt, const char *arg)
2883 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2887 static int opt_audio_channels(const char *opt, const char *arg)
2889 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2893 static int opt_codec(const char *opt, const char *arg)
2895 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
2897 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
2898 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
2899 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
2900 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
2902 av_freep(pcodec_name);
2903 if (!strcmp(arg, "copy")) {
2906 *pcodec_name = av_strdup(arg);
2911 static int opt_codec_tag(const char *opt, const char *arg)
2914 uint32_t *codec_tag;
2916 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2917 !strcmp(opt, "vtag") ? &video_codec_tag :
2918 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2922 *codec_tag = strtol(arg, &tail, 0);
2924 *codec_tag = AV_RL32(arg);
2929 static int opt_map(const char *opt, const char *arg)
2931 StreamMap *m = NULL;
2932 int i, negative = 0, file_idx;
2933 int sync_file_idx = -1, sync_stream_idx;
2941 map = av_strdup(arg);
2943 /* parse sync stream first, just pick first matching stream */
2944 if (sync = strchr(map, ',')) {
2946 sync_file_idx = strtol(sync + 1, &sync, 0);
2947 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2948 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2953 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2954 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2955 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2956 sync_stream_idx = i;
2959 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2960 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2961 "match any streams.\n", arg);
2967 file_idx = strtol(map, &p, 0);
2968 if (file_idx >= nb_input_files || file_idx < 0) {
2969 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2973 /* disable some already defined maps */
2974 for (i = 0; i < nb_stream_maps; i++) {
2975 m = &stream_maps[i];
2976 if (check_stream_specifier(input_files[m->file_index].ctx,
2977 input_files[m->file_index].ctx->streams[m->stream_index],
2978 *p == ':' ? p + 1 : p) > 0)
2982 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2983 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2984 *p == ':' ? p + 1 : p) <= 0)
2986 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2987 m = &stream_maps[nb_stream_maps - 1];
2989 m->file_index = file_idx;
2990 m->stream_index = i;
2992 if (sync_file_idx >= 0) {
2993 m->sync_file_index = sync_file_idx;
2994 m->sync_stream_index = sync_stream_idx;
2996 m->sync_file_index = file_idx;
2997 m->sync_stream_index = i;
3002 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
3010 static void parse_meta_type(char *arg, char *type, int *index)
3020 if (*(++arg) == ':')
3021 *index = strtol(++arg, NULL, 0);
3024 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3031 static int opt_map_metadata(const char *opt, const char *arg)
3033 MetadataMap *m, *m1;
3036 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3037 &nb_meta_data_maps, nb_meta_data_maps + 1);
3039 m = &meta_data_maps[nb_meta_data_maps - 1][1];
3040 m->file = strtol(arg, &p, 0);
3041 parse_meta_type(p, &m->type, &m->index);
3043 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
3044 if (p = strchr(opt, ':'))
3045 parse_meta_type(p, &m1->type, &m1->index);
3049 if (m->type == 'g' || m1->type == 'g')
3050 metadata_global_autocopy = 0;
3051 if (m->type == 's' || m1->type == 's')
3052 metadata_streams_autocopy = 0;
3053 if (m->type == 'c' || m1->type == 'c')
3054 metadata_chapters_autocopy = 0;
3059 static int opt_input_ts_scale(const char *opt, const char *arg)
3061 unsigned int stream;
3065 stream = strtol(arg, &p, 0);
3068 scale= strtod(p, &p);
3070 if(stream >= MAX_STREAMS)
3073 ts_scale = grow_array(ts_scale, sizeof(*ts_scale), &nb_ts_scale, stream + 1);
3074 ts_scale[stream] = scale;
3078 static int opt_recording_time(const char *opt, const char *arg)
3080 recording_time = parse_time_or_die(opt, arg, 1);
3084 static int opt_start_time(const char *opt, const char *arg)
3086 start_time = parse_time_or_die(opt, arg, 1);
3090 static int opt_input_ts_offset(const char *opt, const char *arg)
3092 input_ts_offset = parse_time_or_die(opt, arg, 1);
3096 static enum CodecID find_codec_or_die(const char *name, int type, int encoder)
3098 const char *codec_string = encoder ? "encoder" : "decoder";
3102 return CODEC_ID_NONE;
3104 avcodec_find_encoder_by_name(name) :
3105 avcodec_find_decoder_by_name(name);
3107 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3110 if(codec->type != type) {
3111 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3117 static int opt_input_file(const char *opt, const char *filename)
3119 AVFormatContext *ic;
3120 AVInputFormat *file_iformat = NULL;
3121 int err, i, ret, rfps, rfps_base;
3124 AVDictionary **opts;
3125 int orig_nb_streams; // number of streams before avformat_find_stream_info
3127 if (last_asked_format) {
3128 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3129 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3132 last_asked_format = NULL;
3135 if (!strcmp(filename, "-"))
3138 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3139 !strcmp(filename, "/dev/stdin");
3141 /* get default parameters from command line */
3142 ic = avformat_alloc_context();
3144 print_error(filename, AVERROR(ENOMEM));
3147 if (audio_sample_rate) {
3148 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3149 av_dict_set(&format_opts, "sample_rate", buf, 0);
3151 if (audio_channels) {
3152 snprintf(buf, sizeof(buf), "%d", audio_channels);
3153 av_dict_set(&format_opts, "channels", buf, 0);
3155 if (frame_rate.num) {
3156 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3157 av_dict_set(&format_opts, "framerate", buf, 0);
3159 if (frame_width && frame_height) {
3160 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3161 av_dict_set(&format_opts, "video_size", buf, 0);
3163 if (frame_pix_fmt != PIX_FMT_NONE)
3164 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3166 ic->video_codec_id =
3167 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0);
3168 ic->audio_codec_id =
3169 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0);
3170 ic->subtitle_codec_id=
3171 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0);
3172 ic->flags |= AVFMT_FLAG_NONBLOCK;
3174 /* open the input file with generic libav function */
3175 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3177 print_error(filename, err);
3180 assert_avoptions(format_opts);
3185 for(i=0; i<ic->nb_streams; i++){
3186 ic->streams[i]->discard= AVDISCARD_ALL;
3188 for(i=0; i<ic->nb_programs; i++){
3189 AVProgram *p= ic->programs[i];
3190 if(p->id != opt_programid){
3191 p->discard = AVDISCARD_ALL;
3194 for(j=0; j<p->nb_stream_indexes; j++){
3195 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3200 fprintf(stderr, "Specified program id not found\n");
3206 /* Set AVCodecContext options for avformat_find_stream_info */
3207 opts = setup_find_stream_info_opts(ic, codec_opts);
3208 orig_nb_streams = ic->nb_streams;
3210 /* If not enough info to get the stream parameters, we decode the
3211 first frames to get it. (used in mpeg case for example) */
3212 ret = avformat_find_stream_info(ic, opts);
3213 if (ret < 0 && verbose >= 0) {
3214 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3215 av_close_input_file(ic);
3219 timestamp = start_time;
3220 /* add the stream start time */
3221 if (ic->start_time != AV_NOPTS_VALUE)
3222 timestamp += ic->start_time;
3224 /* if seeking requested, we execute it */
3225 if (start_time != 0) {
3226 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3228 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3229 filename, (double)timestamp / AV_TIME_BASE);
3231 /* reset seek info */
3235 /* update the current parameters so that they match the one of the input stream */
3236 for(i=0;i<ic->nb_streams;i++) {
3237 AVStream *st = ic->streams[i];
3238 AVCodecContext *dec = st->codec;
3241 dec->thread_count = thread_count;
3243 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3244 ist = &input_streams[nb_input_streams - 1];
3246 ist->file_index = nb_input_files;
3248 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3250 if (i < nb_ts_scale)
3251 ist->ts_scale = ts_scale[i];
3253 switch (dec->codec_type) {
3254 case AVMEDIA_TYPE_AUDIO:
3255 ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
3257 ist->dec = avcodec_find_decoder(dec->codec_id);
3259 st->discard= AVDISCARD_ALL;
3261 case AVMEDIA_TYPE_VIDEO:
3262 ist->dec= avcodec_find_decoder_by_name(video_codec_name);
3264 ist->dec = avcodec_find_decoder(dec->codec_id);
3265 rfps = ic->streams[i]->r_frame_rate.num;
3266 rfps_base = ic->streams[i]->r_frame_rate.den;
3268 dec->flags |= CODEC_FLAG_EMU_EDGE;
3271 dec->debug |= FF_DEBUG_MV;
3273 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3276 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3277 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3279 (float)rfps / rfps_base, rfps, rfps_base);
3283 st->discard= AVDISCARD_ALL;
3284 else if(video_discard)
3285 st->discard= video_discard;
3287 case AVMEDIA_TYPE_DATA:
3289 case AVMEDIA_TYPE_SUBTITLE:
3290 ist->dec = avcodec_find_decoder_by_name(subtitle_codec_name);
3292 ist->dec = avcodec_find_decoder(dec->codec_id);
3293 if(subtitle_disable)
3294 st->discard = AVDISCARD_ALL;
3296 case AVMEDIA_TYPE_ATTACHMENT:
3297 case AVMEDIA_TYPE_UNKNOWN:
3304 /* dump the file content */
3306 av_dump_format(ic, nb_input_files, filename, 0);
3308 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3309 input_files[nb_input_files - 1].ctx = ic;
3310 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3311 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3312 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3314 top_field_first = -1;
3315 frame_rate = (AVRational){0, 0};
3316 frame_pix_fmt = PIX_FMT_NONE;
3319 audio_sample_rate = 0;
3321 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3322 av_freep(&ts_scale);
3325 for (i = 0; i < orig_nb_streams; i++)
3326 av_dict_free(&opts[i]);
3328 av_freep(&video_codec_name);
3329 av_freep(&audio_codec_name);
3330 av_freep(&subtitle_codec_name);
3336 static OutputStream *new_video_stream(AVFormatContext *oc, int file_idx)
3340 AVCodecContext *video_enc;
3341 enum CodecID codec_id = CODEC_ID_NONE;
3342 AVCodec *codec= NULL;
3344 if(!video_stream_copy){
3345 if (video_codec_name) {
3346 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1);
3347 codec = avcodec_find_encoder_by_name(video_codec_name);
3349 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3350 codec = avcodec_find_encoder(codec_id);
3354 ost = new_output_stream(oc, file_idx, codec);
3356 if (!video_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 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3380 if (video_stream_copy) {
3381 st->stream_copy = 1;
3382 video_enc->sample_aspect_ratio =
3383 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3389 ost->frame_rate = frame_rate;
3390 video_enc->codec_id = codec_id;
3392 video_enc->width = frame_width;
3393 video_enc->height = frame_height;
3394 video_enc->pix_fmt = frame_pix_fmt;
3395 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3396 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3399 video_enc->gop_size = 0;
3400 if (video_qscale || same_quality) {
3401 video_enc->flags |= CODEC_FLAG_QSCALE;
3402 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3406 video_enc->intra_matrix = intra_matrix;
3408 video_enc->inter_matrix = inter_matrix;
3410 p= video_rc_override_string;
3413 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3415 fprintf(stderr, "error parsing rc_override\n");
3418 video_enc->rc_override=
3419 av_realloc(video_enc->rc_override,
3420 sizeof(RcOverride)*(i+1));
3421 video_enc->rc_override[i].start_frame= start;
3422 video_enc->rc_override[i].end_frame = end;
3424 video_enc->rc_override[i].qscale= q;
3425 video_enc->rc_override[i].quality_factor= 1.0;
3428 video_enc->rc_override[i].qscale= 0;
3429 video_enc->rc_override[i].quality_factor= -q/100.0;
3434 video_enc->rc_override_count=i;
3435 if (!video_enc->rc_initial_buffer_occupancy)
3436 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3437 video_enc->me_threshold= me_threshold;
3438 video_enc->intra_dc_precision= intra_dc_precision - 8;
3441 video_enc->flags|= CODEC_FLAG_PSNR;
3446 video_enc->flags |= CODEC_FLAG_PASS1;
3448 video_enc->flags |= CODEC_FLAG_PASS2;
3452 if (forced_key_frames)
3453 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3455 if (video_language) {
3456 av_dict_set(&st->metadata, "language", video_language, 0);
3457 av_freep(&video_language);
3460 /* reset some key parameters */
3462 av_freep(&video_codec_name);
3463 av_freep(&forced_key_frames);
3464 video_stream_copy = 0;
3465 frame_pix_fmt = PIX_FMT_NONE;
3469 static OutputStream *new_audio_stream(AVFormatContext *oc, int file_idx)
3473 AVCodec *codec= NULL;
3474 AVCodecContext *audio_enc;
3475 enum CodecID codec_id = CODEC_ID_NONE;
3477 if(!audio_stream_copy){
3478 if (audio_codec_name) {
3479 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1);
3480 codec = avcodec_find_encoder_by_name(audio_codec_name);
3482 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3483 codec = avcodec_find_encoder(codec_id);
3486 ost = new_output_stream(oc, file_idx, codec);
3489 ost->bitstream_filters = audio_bitstream_filters;
3490 audio_bitstream_filters= NULL;
3492 st->codec->thread_count= thread_count;
3494 audio_enc = st->codec;
3495 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3498 audio_enc->codec_tag= audio_codec_tag;
3500 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3501 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3503 if (audio_stream_copy) {
3504 st->stream_copy = 1;
3506 audio_enc->codec_id = codec_id;
3508 if (audio_qscale > QSCALE_NONE) {
3509 audio_enc->flags |= CODEC_FLAG_QSCALE;
3510 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3513 audio_enc->channels = audio_channels;
3514 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3515 audio_enc->sample_fmt = audio_sample_fmt;
3516 if (audio_sample_rate)
3517 audio_enc->sample_rate = audio_sample_rate;
3519 if (audio_language) {
3520 av_dict_set(&st->metadata, "language", audio_language, 0);
3521 av_freep(&audio_language);
3524 /* reset some key parameters */
3526 av_freep(&audio_codec_name);
3527 audio_stream_copy = 0;
3532 static OutputStream *new_data_stream(AVFormatContext *oc, int file_idx)
3536 AVCodecContext *data_enc;
3538 ost = new_output_stream(oc, file_idx, NULL);
3540 data_enc = st->codec;
3541 if (!data_stream_copy) {
3542 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3546 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3549 data_enc->codec_tag= data_codec_tag;
3551 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3552 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3554 if (data_stream_copy) {
3555 st->stream_copy = 1;
3559 av_freep(&data_codec_name);
3560 data_stream_copy = 0;
3564 static OutputStream *new_subtitle_stream(AVFormatContext *oc, int file_idx)
3568 AVCodec *codec=NULL;
3569 AVCodecContext *subtitle_enc;
3570 enum CodecID codec_id = CODEC_ID_NONE;
3572 if(!subtitle_stream_copy){
3573 if (subtitle_codec_name) {
3574 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1);
3575 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3577 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3578 codec = avcodec_find_encoder(codec_id);
3581 ost = new_output_stream(oc, file_idx, codec);
3583 subtitle_enc = st->codec;
3585 ost->bitstream_filters = subtitle_bitstream_filters;
3586 subtitle_bitstream_filters= NULL;
3588 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3590 if(subtitle_codec_tag)
3591 subtitle_enc->codec_tag= subtitle_codec_tag;
3593 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3594 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3596 if (subtitle_stream_copy) {
3597 st->stream_copy = 1;
3599 subtitle_enc->codec_id = codec_id;
3602 if (subtitle_language) {
3603 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3604 av_freep(&subtitle_language);
3607 subtitle_disable = 0;
3608 av_freep(&subtitle_codec_name);
3609 subtitle_stream_copy = 0;
3613 /* arg format is "output-stream-index:streamid-value". */
3614 static int opt_streamid(const char *opt, const char *arg)
3620 av_strlcpy(idx_str, arg, sizeof(idx_str));
3621 p = strchr(idx_str, ':');
3624 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3629 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3630 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3631 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3635 static int opt_output_file(const char *opt, const char *filename)
3637 AVFormatContext *oc;
3639 AVOutputFormat *file_oformat;
3643 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3644 fprintf(stderr, "Too many output files\n");
3648 if (!strcmp(filename, "-"))
3651 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3652 last_asked_format = NULL;
3654 print_error(filename, err);
3658 file_oformat= oc->oformat;
3660 if (!strcmp(file_oformat->name, "ffm") &&
3661 av_strstart(filename, "http:", NULL)) {
3662 /* special case for files sent to ffserver: we get the stream
3663 parameters from ffserver */
3664 int err = read_ffserver_streams(oc, filename);
3666 print_error(filename, err);
3669 } else if (!nb_stream_maps) {
3670 /* pick the "best" stream of each type */
3671 #define NEW_STREAM(type, index)\
3673 ost = new_ ## type ## _stream(oc, nb_output_files);\
3674 ost->source_index = index;\
3675 ost->sync_ist = &input_streams[index];\
3676 input_streams[index].discard = 0;\
3679 /* video: highest resolution */
3680 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3681 int area = 0, idx = -1;
3682 for (i = 0; i < nb_input_streams; i++) {
3683 ist = &input_streams[i];
3684 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3685 ist->st->codec->width * ist->st->codec->height > area) {
3686 area = ist->st->codec->width * ist->st->codec->height;
3690 NEW_STREAM(video, idx);
3693 /* audio: most channels */
3694 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3695 int channels = 0, idx = -1;
3696 for (i = 0; i < nb_input_streams; i++) {
3697 ist = &input_streams[i];
3698 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3699 ist->st->codec->channels > channels) {
3700 channels = ist->st->codec->channels;
3704 NEW_STREAM(audio, idx);
3707 /* subtitles: pick first */
3708 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3709 for (i = 0; i < nb_input_streams; i++)
3710 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3711 NEW_STREAM(subtitle, i);
3715 /* do something with data? */
3717 for (i = 0; i < nb_stream_maps; i++) {
3718 StreamMap *map = &stream_maps[i];
3723 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3724 switch (ist->st->codec->codec_type) {
3725 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc, nb_output_files); break;
3726 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc, nb_output_files); break;
3727 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc, nb_output_files); break;
3728 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc, nb_output_files); break;
3730 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3731 map->file_index, map->stream_index);
3735 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3736 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3737 map->sync_stream_index];
3742 av_dict_copy(&oc->metadata, metadata, 0);
3743 av_dict_free(&metadata);
3745 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3746 output_files[nb_output_files++] = oc;
3748 /* check filename in case of an image number is expected */
3749 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3750 if (!av_filename_number_test(oc->filename)) {
3751 print_error(oc->filename, AVERROR(EINVAL));
3756 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3757 /* test if it already exists to avoid loosing precious files */
3758 if (!file_overwrite &&
3759 (strchr(filename, ':') == NULL ||
3760 filename[1] == ':' ||
3761 av_strstart(filename, "file:", NULL))) {
3762 if (avio_check(filename, 0) == 0) {
3764 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3766 if (!read_yesno()) {
3767 fprintf(stderr, "Not overwriting - exiting\n");
3772 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3779 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3780 print_error(filename, err);
3785 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3786 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3789 if (chapters_input_file >= nb_input_files) {
3790 if (chapters_input_file == INT_MAX) {
3791 /* copy chapters from the first input file that has them*/
3792 chapters_input_file = -1;
3793 for (i = 0; i < nb_input_files; i++)
3794 if (input_files[i].ctx->nb_chapters) {
3795 chapters_input_file = i;
3799 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3800 chapters_input_file);
3804 if (chapters_input_file >= 0)
3805 copy_chapters(chapters_input_file, nb_output_files - 1);
3808 for (i = 0; i < nb_meta_data_maps; i++) {
3809 AVFormatContext *files[2];
3810 AVDictionary **meta[2];
3813 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3814 if ((index) < 0 || (index) >= (nb_elems)) {\
3815 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3820 int in_file_index = meta_data_maps[i][1].file;
3821 if (in_file_index < 0)
3823 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3826 files[1] = input_files[in_file_index].ctx;
3828 for (j = 0; j < 2; j++) {
3829 MetadataMap *map = &meta_data_maps[i][j];
3831 switch (map->type) {
3833 meta[j] = &files[j]->metadata;
3836 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3837 meta[j] = &files[j]->streams[map->index]->metadata;
3840 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3841 meta[j] = &files[j]->chapters[map->index]->metadata;
3844 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3845 meta[j] = &files[j]->programs[map->index]->metadata;
3850 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3853 /* copy global metadata by default */
3854 if (metadata_global_autocopy)
3855 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3856 AV_DICT_DONT_OVERWRITE);
3857 if (metadata_streams_autocopy)
3858 for (i = 0; i < oc->nb_streams; i++) {
3859 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3860 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3863 frame_rate = (AVRational){0, 0};
3866 audio_sample_rate = 0;
3868 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3869 chapters_input_file = INT_MAX;
3871 av_freep(&meta_data_maps);
3872 nb_meta_data_maps = 0;
3873 metadata_global_autocopy = 1;
3874 metadata_streams_autocopy = 1;
3875 metadata_chapters_autocopy = 1;
3876 av_freep(&stream_maps);
3879 av_freep(&forced_key_frames);
3885 /* same option as mencoder */
3886 static int opt_pass(const char *opt, const char *arg)
3888 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3892 static int64_t getutime(void)
3895 struct rusage rusage;
3897 getrusage(RUSAGE_SELF, &rusage);
3898 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3899 #elif HAVE_GETPROCESSTIMES
3901 FILETIME c, e, k, u;
3902 proc = GetCurrentProcess();
3903 GetProcessTimes(proc, &c, &e, &k, &u);
3904 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3906 return av_gettime();
3910 static int64_t getmaxrss(void)
3912 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3913 struct rusage rusage;
3914 getrusage(RUSAGE_SELF, &rusage);
3915 return (int64_t)rusage.ru_maxrss * 1024;
3916 #elif HAVE_GETPROCESSMEMORYINFO
3918 PROCESS_MEMORY_COUNTERS memcounters;
3919 proc = GetCurrentProcess();
3920 memcounters.cb = sizeof(memcounters);
3921 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3922 return memcounters.PeakPagefileUsage;
3928 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3931 const char *p = str;
3938 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3945 static int opt_inter_matrix(const char *opt, const char *arg)
3947 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3948 parse_matrix_coeffs(inter_matrix, arg);
3952 static int opt_intra_matrix(const char *opt, const char *arg)
3954 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3955 parse_matrix_coeffs(intra_matrix, arg);
3959 static void show_usage(void)
3961 printf("Hyper fast Audio and Video encoder\n");
3962 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3966 static int opt_help(const char *opt, const char *arg)
3969 AVOutputFormat *oformat = NULL;
3970 AVInputFormat *iformat = NULL;
3972 av_log_set_callback(log_callback_help);
3974 show_help_options(options, "Main options:\n",
3975 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3976 show_help_options(options, "\nAdvanced options:\n",
3977 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3979 show_help_options(options, "\nVideo options:\n",
3980 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3982 show_help_options(options, "\nAdvanced Video options:\n",
3983 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3984 OPT_VIDEO | OPT_EXPERT);
3985 show_help_options(options, "\nAudio options:\n",
3986 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3988 show_help_options(options, "\nAdvanced Audio options:\n",
3989 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3990 OPT_AUDIO | OPT_EXPERT);
3991 show_help_options(options, "\nSubtitle options:\n",
3992 OPT_SUBTITLE | OPT_GRAB,
3994 show_help_options(options, "\nAudio/Video grab options:\n",
3998 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4001 /* individual codec options */
4003 while ((c = av_codec_next(c))) {
4004 if (c->priv_class) {
4005 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4010 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4013 /* individual muxer options */
4014 while ((oformat = av_oformat_next(oformat))) {
4015 if (oformat->priv_class) {
4016 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4021 /* individual demuxer options */
4022 while ((iformat = av_iformat_next(iformat))) {
4023 if (iformat->priv_class) {
4024 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4029 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4033 static int opt_target(const char *opt, const char *arg)
4035 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4036 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4038 if(!strncmp(arg, "pal-", 4)) {
4041 } else if(!strncmp(arg, "ntsc-", 5)) {
4044 } else if(!strncmp(arg, "film-", 5)) {
4049 /* Calculate FR via float to avoid int overflow */
4050 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4053 } else if((fr == 29970) || (fr == 23976)) {
4056 /* Try to determine PAL/NTSC by peeking in the input files */
4057 if(nb_input_files) {
4059 for (j = 0; j < nb_input_files; j++) {
4060 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4061 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4062 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4064 fr = c->time_base.den * 1000 / c->time_base.num;
4068 } else if((fr == 29970) || (fr == 23976)) {
4078 if(verbose > 0 && norm != UNKNOWN)
4079 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4082 if(norm == UNKNOWN) {
4083 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4084 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4085 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4089 if(!strcmp(arg, "vcd")) {
4090 opt_codec("vcodec", "mpeg1video");
4091 opt_codec("acodec", "mp2");
4092 opt_format("f", "vcd");
4094 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4095 opt_frame_rate("r", frame_rates[norm]);
4096 opt_default("g", norm == PAL ? "15" : "18");
4098 opt_default("b", "1150000");
4099 opt_default("maxrate", "1150000");
4100 opt_default("minrate", "1150000");
4101 opt_default("bufsize", "327680"); // 40*1024*8;
4103 opt_default("ab", "224000");
4104 audio_sample_rate = 44100;
4107 opt_default("packetsize", "2324");
4108 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4110 /* We have to offset the PTS, so that it is consistent with the SCR.
4111 SCR starts at 36000, but the first two packs contain only padding
4112 and the first pack from the other stream, respectively, may also have
4113 been written before.
4114 So the real data starts at SCR 36000+3*1200. */
4115 mux_preload= (36000+3*1200) / 90000.0; //0.44
4116 } else if(!strcmp(arg, "svcd")) {
4118 opt_codec("vcodec", "mpeg2video");
4119 opt_codec("acodec", "mp2");
4120 opt_format("f", "svcd");
4122 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4123 opt_frame_rate("r", frame_rates[norm]);
4124 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4125 opt_default("g", norm == PAL ? "15" : "18");
4127 opt_default("b", "2040000");
4128 opt_default("maxrate", "2516000");
4129 opt_default("minrate", "0"); //1145000;
4130 opt_default("bufsize", "1835008"); //224*1024*8;
4131 opt_default("flags", "+scan_offset");
4134 opt_default("ab", "224000");
4135 audio_sample_rate = 44100;
4137 opt_default("packetsize", "2324");
4139 } else if(!strcmp(arg, "dvd")) {
4141 opt_codec("vcodec", "mpeg2video");
4142 opt_codec("acodec", "ac3");
4143 opt_format("f", "dvd");
4145 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4146 opt_frame_rate("r", frame_rates[norm]);
4147 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4148 opt_default("g", norm == PAL ? "15" : "18");
4150 opt_default("b", "6000000");
4151 opt_default("maxrate", "9000000");
4152 opt_default("minrate", "0"); //1500000;
4153 opt_default("bufsize", "1835008"); //224*1024*8;
4155 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4156 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4158 opt_default("ab", "448000");
4159 audio_sample_rate = 48000;
4161 } else if(!strncmp(arg, "dv", 2)) {
4163 opt_format("f", "dv");
4165 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4166 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4167 norm == PAL ? "yuv420p" : "yuv411p");
4168 opt_frame_rate("r", frame_rates[norm]);
4170 audio_sample_rate = 48000;
4174 fprintf(stderr, "Unknown target: %s\n", arg);
4175 return AVERROR(EINVAL);
4180 static int opt_vstats_file(const char *opt, const char *arg)
4182 av_free (vstats_filename);
4183 vstats_filename=av_strdup (arg);
4187 static int opt_vstats(const char *opt, const char *arg)
4190 time_t today2 = time(NULL);
4191 struct tm *today = localtime(&today2);
4193 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4195 return opt_vstats_file(opt, filename);
4198 static int opt_bsf(const char *opt, const char *arg)
4200 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4201 AVBitStreamFilterContext **bsfp;
4204 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4208 bsfp= *opt == 'v' ? &video_bitstream_filters :
4209 *opt == 'a' ? &audio_bitstream_filters :
4210 &subtitle_bitstream_filters;
4212 bsfp= &(*bsfp)->next;
4219 static int opt_preset(const char *opt, const char *arg)
4222 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4223 char *codec_name = *opt == 'v' ? video_codec_name :
4224 *opt == 'a' ? audio_codec_name :
4225 subtitle_codec_name;
4227 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4228 fprintf(stderr, "File for preset '%s' not found\n", arg);
4233 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4234 if(line[0] == '#' && !e)
4236 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4238 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4241 if (!strcmp(tmp, "acodec") ||
4242 !strcmp(tmp, "vcodec") ||
4243 !strcmp(tmp, "scodec") ||
4244 !strcmp(tmp, "dcodec")) {
4245 opt_codec(tmp, tmp2);
4246 }else if(opt_default(tmp, tmp2) < 0){
4247 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4257 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4261 static int opt_passlogfile(const char *opt, const char *arg)
4263 pass_logfilename_prefix = arg;
4264 #if CONFIG_LIBX264_ENCODER
4265 return opt_default("passlogfile", arg);
4271 static const OptionDef options[] = {
4273 #include "cmdutils_common_opts.h"
4274 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4275 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4276 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4277 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4278 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4279 "outfile[,metadata]:infile[,metadata]" },
4280 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4281 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4282 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4283 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4284 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4285 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
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 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4297 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4298 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4299 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4300 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4301 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4302 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4303 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4304 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4305 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4306 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4307 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4308 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4311 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4312 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4313 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4314 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4315 { "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" },
4316 { "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" },
4317 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4318 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4319 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4320 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4321 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4322 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4323 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4324 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4325 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4326 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4327 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4328 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4329 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4330 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4331 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4332 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4333 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4334 "use same quantizer as source (implies VBR)" },
4335 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4336 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4337 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4338 "deinterlace pictures" },
4339 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4340 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4341 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4343 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4345 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4346 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4347 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4348 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4349 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4350 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4351 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4352 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4353 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4354 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4357 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4358 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4359 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4360 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4361 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4362 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4363 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4364 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4365 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4366 { "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" },
4368 /* subtitle options */
4369 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4370 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4371 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4372 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4375 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4378 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4379 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4381 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4382 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4383 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4385 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4386 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4387 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4388 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4389 /* data codec support */
4390 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_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);