3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/avstring.h"
44 #include "libavutil/libm.h"
45 #include "libavformat/os_support.h"
47 #include "libavformat/ffm.h" // not public API
50 # include "libavfilter/avcodec.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "ffmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
116 static const char *last_asked_format = NULL;
117 static AVFormatContext *input_files[MAX_FILES];
118 static int64_t input_files_ts_offset[MAX_FILES];
119 static double *input_files_ts_scale[MAX_FILES] = {NULL};
120 static AVCodec **input_codecs = NULL;
121 static int nb_input_files = 0;
122 static int nb_input_codecs = 0;
123 static int nb_input_files_ts_scale[MAX_FILES] = {0};
125 static AVFormatContext *output_files[MAX_FILES];
126 static AVCodec **output_codecs = NULL;
127 static int nb_output_files = 0;
128 static int nb_output_codecs = 0;
130 static AVStreamMap *stream_maps = NULL;
131 static int nb_stream_maps;
133 /* first item specifies output metadata, second is input */
134 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
135 static int nb_meta_data_maps;
136 static int metadata_global_autocopy = 1;
137 static int metadata_streams_autocopy = 1;
138 static int metadata_chapters_autocopy = 1;
140 static AVChapterMap *chapter_maps = NULL;
141 static int nb_chapter_maps;
143 /* indexed by output file stream index */
144 static int *streamid_map = NULL;
145 static int nb_streamid_map = 0;
147 static int frame_width = 0;
148 static int frame_height = 0;
149 static float frame_aspect_ratio = 0;
150 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
151 static int frame_bits_per_raw_sample = 0;
152 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
153 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
154 static AVRational frame_rate;
155 static float video_qscale = 0;
156 static uint16_t *intra_matrix = NULL;
157 static uint16_t *inter_matrix = NULL;
158 static const char *video_rc_override_string=NULL;
159 static int video_disable = 0;
160 static int video_discard = 0;
161 static char *video_codec_name = NULL;
162 static unsigned int video_codec_tag = 0;
163 static char *video_language = NULL;
164 static int same_quality = 0;
165 static int do_deinterlace = 0;
166 static int top_field_first = -1;
167 static int me_threshold = 0;
168 static int intra_dc_precision = 8;
169 static int loop_input = 0;
170 static int loop_output = AVFMT_NOOUTPUTLOOP;
171 static int qp_hist = 0;
173 static char *vfilters = NULL;
176 static int intra_only = 0;
177 static int audio_sample_rate = 44100;
178 static int64_t channel_layout = 0;
179 #define QSCALE_NONE -99999
180 static float audio_qscale = QSCALE_NONE;
181 static int audio_disable = 0;
182 static int audio_channels = 1;
183 static char *audio_codec_name = NULL;
184 static unsigned int audio_codec_tag = 0;
185 static char *audio_language = NULL;
187 static int subtitle_disable = 0;
188 static char *subtitle_codec_name = NULL;
189 static char *subtitle_language = NULL;
190 static unsigned int subtitle_codec_tag = 0;
192 static int data_disable = 0;
193 static char *data_codec_name = NULL;
194 static unsigned int data_codec_tag = 0;
196 static float mux_preload= 0.5;
197 static float mux_max_delay= 0.7;
199 static int64_t recording_time = INT64_MAX;
200 static int64_t start_time = 0;
201 static int64_t recording_timestamp = 0;
202 static int64_t input_ts_offset = 0;
203 static int file_overwrite = 0;
204 static AVMetadata *metadata;
205 static int do_benchmark = 0;
206 static int do_hex_dump = 0;
207 static int do_pkt_dump = 0;
208 static int do_psnr = 0;
209 static int do_pass = 0;
210 static const char *pass_logfilename_prefix;
211 static int audio_stream_copy = 0;
212 static int video_stream_copy = 0;
213 static int subtitle_stream_copy = 0;
214 static int data_stream_copy = 0;
215 static int video_sync_method= -1;
216 static int audio_sync_method= 0;
217 static float audio_drift_threshold= 0.1;
218 static int copy_ts= 0;
219 static int copy_tb= 0;
220 static int opt_shortest = 0;
221 static int video_global_header = 0;
222 static char *vstats_filename;
223 static FILE *vstats_file;
224 static int opt_programid = 0;
225 static int copy_initial_nonkeyframes = 0;
227 static int rate_emu = 0;
229 static int video_channel = 0;
230 static char *video_standard;
232 static int audio_volume = 256;
234 static int exit_on_error = 0;
235 static int using_stdin = 0;
236 static int verbose = 1;
237 static int run_as_daemon = 0;
238 static int thread_count= 1;
239 static int q_pressed = 0;
240 static int64_t video_size = 0;
241 static int64_t audio_size = 0;
242 static int64_t extra_size = 0;
243 static int nb_frames_dup = 0;
244 static int nb_frames_drop = 0;
245 static int input_sync;
246 static uint64_t limit_filesize = 0;
247 static int force_fps = 0;
248 static char *forced_key_frames = NULL;
250 static float dts_delta_threshold = 10;
252 static int64_t timer_start;
254 static uint8_t *audio_buf;
255 static uint8_t *audio_out;
256 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
258 static short *samples;
260 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
261 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
262 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
264 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
266 struct AVInputStream;
268 typedef struct AVOutputStream {
269 int file_index; /* file index */
270 int index; /* stream index in the output file */
271 int source_index; /* AVInputStream index */
272 AVStream *st; /* stream in the output file */
273 int encoding_needed; /* true if encoding needed for this stream */
275 /* input pts and corresponding output pts
277 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
278 struct AVInputStream *sync_ist; /* input stream to sync against */
279 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
280 AVBitStreamFilterContext *bitstream_filters;
283 AVFrame resample_frame; /* temporary frame for image resampling */
284 struct SwsContext *img_resample_ctx; /* for image resampling */
287 int resample_pix_fmt;
289 float frame_aspect_ratio;
291 /* forced key frames */
292 int64_t *forced_kf_pts;
298 ReSampleContext *resample; /* for audio resampling */
299 int resample_sample_fmt;
300 int resample_channels;
301 int resample_sample_rate;
303 AVAudioConvert *reformat_ctx;
304 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
308 AVFilterContext *output_video_filter;
309 AVFilterContext *input_video_filter;
310 AVFilterBufferRef *picref;
312 AVFilterGraph *graph;
318 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
319 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
321 typedef struct AVInputStream {
325 int discard; /* true if stream data should be discarded */
326 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
327 int64_t sample_index; /* current sample */
329 int64_t start; /* time when read started */
330 int64_t next_pts; /* synthetic pts for cases where pkt.pts
332 int64_t pts; /* current pts */
333 int is_start; /* is 1 at the start and after a discontinuity */
334 int showed_multi_packet_warning;
335 int is_past_recording_time;
337 AVFrame *filter_frame;
338 int has_filter_frame;
342 typedef struct AVInputFile {
343 int eof_reached; /* true if eof reached */
344 int ist_index; /* index of first stream in ist_table */
345 int buffer_size; /* current total buffer size */
346 int nb_streams; /* nb streams we are aware of */
351 /* init terminal so that we can grab keys */
352 static struct termios oldtty;
357 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
359 AVFilterContext *last_filter, *filter;
360 /** filter graph containing all filters including input & output */
361 AVCodecContext *codec = ost->st->codec;
362 AVCodecContext *icodec = ist->st->codec;
363 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
364 AVRational sample_aspect_ratio;
368 ost->graph = avfilter_graph_alloc();
370 if (ist->st->sample_aspect_ratio.num){
371 sample_aspect_ratio = ist->st->sample_aspect_ratio;
373 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
375 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
376 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
377 sample_aspect_ratio.num, sample_aspect_ratio.den);
379 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
380 "src", args, NULL, ost->graph);
383 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
384 "out", NULL, &ffsink_ctx, ost->graph);
387 last_filter = ost->input_video_filter;
389 if (codec->width != icodec->width || codec->height != icodec->height) {
390 snprintf(args, 255, "%d:%d:flags=0x%X",
394 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
395 NULL, args, NULL, ost->graph)) < 0)
397 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
399 last_filter = filter;
402 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
403 ost->graph->scale_sws_opts = av_strdup(args);
406 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
407 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
409 outputs->name = av_strdup("in");
410 outputs->filter_ctx = last_filter;
411 outputs->pad_idx = 0;
412 outputs->next = NULL;
414 inputs->name = av_strdup("out");
415 inputs->filter_ctx = ost->output_video_filter;
419 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
421 av_freep(&ost->avfilter);
423 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
427 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
430 codec->width = ost->output_video_filter->inputs[0]->w;
431 codec->height = ost->output_video_filter->inputs[0]->h;
432 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
433 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
434 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
435 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
439 #endif /* CONFIG_AVFILTER */
441 static void term_exit(void)
443 av_log(NULL, AV_LOG_QUIET, "");
446 tcsetattr (0, TCSANOW, &oldtty);
450 static volatile int received_sigterm = 0;
453 sigterm_handler(int sig)
455 received_sigterm = sig;
460 static void term_init(void)
470 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
471 |INLCR|IGNCR|ICRNL|IXON);
472 tty.c_oflag |= OPOST;
473 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
474 tty.c_cflag &= ~(CSIZE|PARENB);
479 tcsetattr (0, TCSANOW, &tty);
480 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
484 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
485 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
487 signal(SIGXCPU, sigterm_handler);
491 /* read a key without blocking */
492 static int read_key(void)
507 n = select(1, &rfds, NULL, NULL, &tv);
522 static int decode_interrupt_cb(void)
524 q_pressed += read_key() == 'q';
525 return q_pressed > 1;
528 static int ffmpeg_exit(int ret)
533 for(i=0;i<nb_output_files;i++) {
534 AVFormatContext *s = output_files[i];
535 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
537 avformat_free_context(s);
538 av_free(output_streams_for_file[i]);
540 for(i=0;i<nb_input_files;i++) {
541 av_close_input_file(input_files[i]);
542 av_free(input_files_ts_scale[i]);
545 av_free(intra_matrix);
546 av_free(inter_matrix);
550 av_free(vstats_filename);
552 av_free(streamid_map);
553 av_free(input_codecs);
554 av_free(output_codecs);
555 av_free(stream_maps);
556 av_free(meta_data_maps);
558 av_free(video_codec_name);
559 av_free(audio_codec_name);
560 av_free(subtitle_codec_name);
561 av_free(data_codec_name);
563 av_free(video_standard);
568 allocated_audio_buf_size= allocated_audio_out_size= 0;
575 if (received_sigterm) {
577 "Received signal %d: terminating.\n",
578 (int) received_sigterm);
582 exit(ret); /* not all OS-es handle main() return value */
586 /* similar to ff_dynarray_add() and av_fast_realloc() */
587 static void *grow_array(void *array, int elem_size, int *size, int new_size)
589 if (new_size >= INT_MAX / elem_size) {
590 fprintf(stderr, "Array too big.\n");
593 if (*size < new_size) {
594 uint8_t *tmp = av_realloc(array, new_size*elem_size);
596 fprintf(stderr, "Could not alloc buffer.\n");
599 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
606 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
608 if(codec && codec->sample_fmts){
609 const enum AVSampleFormat *p= codec->sample_fmts;
611 if(*p == st->codec->sample_fmt)
615 av_log(NULL, AV_LOG_WARNING,
616 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
617 av_get_sample_fmt_name(st->codec->sample_fmt),
619 av_get_sample_fmt_name(codec->sample_fmts[0]));
620 st->codec->sample_fmt = codec->sample_fmts[0];
625 static void choose_sample_rate(AVStream *st, AVCodec *codec)
627 if(codec && codec->supported_samplerates){
628 const int *p= codec->supported_samplerates;
630 int best_dist=INT_MAX;
632 int dist= abs(st->codec->sample_rate - *p);
633 if(dist < best_dist){
639 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
641 st->codec->sample_rate= best;
645 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
647 if(codec && codec->pix_fmts){
648 const enum PixelFormat *p= codec->pix_fmts;
649 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
650 if(st->codec->codec_id==CODEC_ID_MJPEG){
651 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
652 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
653 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};
657 if(*p == st->codec->pix_fmt)
661 if(st->codec->pix_fmt != PIX_FMT_NONE)
662 av_log(NULL, AV_LOG_WARNING,
663 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
664 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
666 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
667 st->codec->pix_fmt = codec->pix_fmts[0];
672 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
674 int idx = oc->nb_streams - 1;
677 output_streams_for_file[file_idx] =
678 grow_array(output_streams_for_file[file_idx],
679 sizeof(*output_streams_for_file[file_idx]),
680 &nb_output_streams_for_file[file_idx],
682 ost = output_streams_for_file[file_idx][idx] =
683 av_mallocz(sizeof(AVOutputStream));
685 fprintf(stderr, "Could not alloc output stream\n");
688 ost->file_index = file_idx;
691 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
695 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
701 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
704 /* copy stream format */
706 for(i=0;i<ic->nb_streams;i++) {
712 // FIXME: a more elegant solution is needed
713 st = av_mallocz(sizeof(AVStream));
714 memcpy(st, ic->streams[i], sizeof(AVStream));
715 st->codec = avcodec_alloc_context();
717 print_error(filename, AVERROR(ENOMEM));
720 avcodec_copy_context(st->codec, ic->streams[i]->codec);
723 codec = avcodec_find_encoder(st->codec->codec_id);
724 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
725 if (audio_stream_copy) {
728 choose_sample_fmt(st, codec);
729 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
730 if (video_stream_copy) {
733 choose_pixel_fmt(st, codec);
736 if(st->codec->flags & CODEC_FLAG_BITEXACT)
739 new_output_stream(s, nb_output_files);
743 s->timestamp = av_gettime();
745 av_close_input_file(ic);
750 get_sync_ipts(const AVOutputStream *ost)
752 const AVInputStream *ist = ost->sync_ist;
753 return (double)(ist->pts - start_time)/AV_TIME_BASE;
756 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
760 AVPacket new_pkt= *pkt;
761 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
762 &new_pkt.data, &new_pkt.size,
763 pkt->data, pkt->size,
764 pkt->flags & AV_PKT_FLAG_KEY);
767 new_pkt.destruct= av_destruct_packet;
769 fprintf(stderr, "%s failed for stream %d, codec %s",
770 bsfc->filter->name, pkt->stream_index,
771 avctx->codec ? avctx->codec->name : "copy");
781 ret= av_interleaved_write_frame(s, pkt);
783 print_error("av_interleaved_write_frame()", ret);
788 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
790 static void do_audio_out(AVFormatContext *s,
793 unsigned char *buf, int size)
796 int64_t audio_out_size, audio_buf_size;
797 int64_t allocated_for_size= size;
799 int size_out, frame_bytes, ret, resample_changed;
800 AVCodecContext *enc= ost->st->codec;
801 AVCodecContext *dec= ist->st->codec;
802 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
803 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
804 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
807 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
808 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
809 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
810 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
811 audio_buf_size*= osize*enc->channels;
813 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
814 if(coded_bps > 8*osize)
815 audio_out_size= audio_out_size * coded_bps / (8*osize);
816 audio_out_size += FF_MIN_BUFFER_SIZE;
818 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
819 fprintf(stderr, "Buffer sizes too large\n");
823 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
824 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
825 if (!audio_buf || !audio_out){
826 fprintf(stderr, "Out of memory in do_audio_out\n");
830 if (enc->channels != dec->channels)
831 ost->audio_resample = 1;
833 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
834 ost->resample_channels != dec->channels ||
835 ost->resample_sample_rate != dec->sample_rate;
837 if ((ost->audio_resample && !ost->resample) || resample_changed) {
838 if (resample_changed) {
839 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",
840 ist->file_index, ist->index,
841 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
842 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
843 ost->resample_sample_fmt = dec->sample_fmt;
844 ost->resample_channels = dec->channels;
845 ost->resample_sample_rate = dec->sample_rate;
847 audio_resample_close(ost->resample);
849 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
850 if (audio_sync_method <= 1 &&
851 ost->resample_sample_fmt == enc->sample_fmt &&
852 ost->resample_channels == enc->channels &&
853 ost->resample_sample_rate == enc->sample_rate) {
854 ost->resample = NULL;
855 ost->audio_resample = 0;
857 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
858 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
859 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
860 enc->sample_rate, dec->sample_rate,
861 enc->sample_fmt, dec->sample_fmt,
863 if (!ost->resample) {
864 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
865 dec->channels, dec->sample_rate,
866 enc->channels, enc->sample_rate);
872 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
873 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
874 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
875 if (ost->reformat_ctx)
876 av_audio_convert_free(ost->reformat_ctx);
877 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
878 dec->sample_fmt, 1, NULL, 0);
879 if (!ost->reformat_ctx) {
880 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
881 av_get_sample_fmt_name(dec->sample_fmt),
882 av_get_sample_fmt_name(enc->sample_fmt));
885 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
888 if(audio_sync_method){
889 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
890 - av_fifo_size(ost->fifo)/(enc->channels * 2);
891 double idelta= delta*dec->sample_rate / enc->sample_rate;
892 int byte_delta= ((int)idelta)*2*dec->channels;
894 //FIXME resample delay
895 if(fabs(delta) > 50){
896 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
898 byte_delta= FFMAX(byte_delta, -size);
902 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
907 static uint8_t *input_tmp= NULL;
908 input_tmp= av_realloc(input_tmp, byte_delta + size);
910 if(byte_delta > allocated_for_size - size){
911 allocated_for_size= byte_delta + (int64_t)size;
916 memset(input_tmp, 0, byte_delta);
917 memcpy(input_tmp + byte_delta, buf, size);
921 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
923 }else if(audio_sync_method>1){
924 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
925 av_assert0(ost->audio_resample);
927 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
928 // 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));
929 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
933 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
934 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
936 if (ost->audio_resample) {
938 size_out = audio_resample(ost->resample,
939 (short *)buftmp, (short *)buf,
940 size / (dec->channels * isize));
941 size_out = size_out * enc->channels * osize;
947 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
948 const void *ibuf[6]= {buftmp};
949 void *obuf[6]= {audio_buf};
950 int istride[6]= {isize};
951 int ostride[6]= {osize};
952 int len= size_out/istride[0];
953 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
954 printf("av_audio_convert() failed\n");
960 size_out = len*osize;
963 /* now encode as many frames as possible */
964 if (enc->frame_size > 1) {
965 /* output resampled raw samples */
966 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
967 fprintf(stderr, "av_fifo_realloc2() failed\n");
970 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
972 frame_bytes = enc->frame_size * osize * enc->channels;
974 while (av_fifo_size(ost->fifo) >= frame_bytes) {
976 av_init_packet(&pkt);
978 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
980 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
982 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
985 fprintf(stderr, "Audio encoding failed\n");
989 pkt.stream_index= ost->index;
992 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
993 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
994 pkt.flags |= AV_PKT_FLAG_KEY;
995 write_frame(s, &pkt, enc, ost->bitstream_filters);
997 ost->sync_opts += enc->frame_size;
1001 av_init_packet(&pkt);
1003 ost->sync_opts += size_out / (osize * enc->channels);
1005 /* output a pcm frame */
1006 /* determine the size of the coded buffer */
1009 size_out = size_out*coded_bps/8;
1011 if(size_out > audio_out_size){
1012 fprintf(stderr, "Internal error, buffer size too small\n");
1016 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1017 ret = avcodec_encode_audio(enc, audio_out, size_out,
1020 fprintf(stderr, "Audio encoding failed\n");
1024 pkt.stream_index= ost->index;
1025 pkt.data= audio_out;
1027 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1028 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1029 pkt.flags |= AV_PKT_FLAG_KEY;
1030 write_frame(s, &pkt, enc, ost->bitstream_filters);
1034 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1036 AVCodecContext *dec;
1037 AVPicture *picture2;
1038 AVPicture picture_tmp;
1041 dec = ist->st->codec;
1043 /* deinterlace : must be done before any resize */
1044 if (do_deinterlace) {
1047 /* create temporary picture */
1048 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1049 buf = av_malloc(size);
1053 picture2 = &picture_tmp;
1054 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1056 if(avpicture_deinterlace(picture2, picture,
1057 dec->pix_fmt, dec->width, dec->height) < 0) {
1058 /* if error, do not deinterlace */
1059 fprintf(stderr, "Deinterlacing failed\n");
1068 if (picture != picture2)
1069 *picture = *picture2;
1073 /* we begin to correct av delay at this threshold */
1074 #define AV_DELAY_MAX 0.100
1076 static void do_subtitle_out(AVFormatContext *s,
1077 AVOutputStream *ost,
1082 static uint8_t *subtitle_out = NULL;
1083 int subtitle_out_max_size = 1024 * 1024;
1084 int subtitle_out_size, nb, i;
1085 AVCodecContext *enc;
1088 if (pts == AV_NOPTS_VALUE) {
1089 fprintf(stderr, "Subtitle packets must have a pts\n");
1095 enc = ost->st->codec;
1097 if (!subtitle_out) {
1098 subtitle_out = av_malloc(subtitle_out_max_size);
1101 /* Note: DVB subtitle need one packet to draw them and one other
1102 packet to clear them */
1103 /* XXX: signal it in the codec context ? */
1104 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1109 for(i = 0; i < nb; i++) {
1110 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1111 // start_display_time is required to be 0
1112 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1113 sub->end_display_time -= sub->start_display_time;
1114 sub->start_display_time = 0;
1115 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1116 subtitle_out_max_size, sub);
1117 if (subtitle_out_size < 0) {
1118 fprintf(stderr, "Subtitle encoding failed\n");
1122 av_init_packet(&pkt);
1123 pkt.stream_index = ost->index;
1124 pkt.data = subtitle_out;
1125 pkt.size = subtitle_out_size;
1126 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1127 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1128 /* XXX: the pts correction is handled here. Maybe handling
1129 it in the codec would be better */
1131 pkt.pts += 90 * sub->start_display_time;
1133 pkt.pts += 90 * sub->end_display_time;
1135 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1139 static int bit_buffer_size= 1024*256;
1140 static uint8_t *bit_buffer= NULL;
1142 static void do_video_out(AVFormatContext *s,
1143 AVOutputStream *ost,
1145 AVFrame *in_picture,
1148 int nb_frames, i, ret, av_unused resample_changed;
1149 AVFrame *final_picture, *formatted_picture;
1150 AVCodecContext *enc, *dec;
1153 enc = ost->st->codec;
1154 dec = ist->st->codec;
1156 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1158 /* by default, we output a single frame */
1163 if(video_sync_method){
1164 double vdelta = sync_ipts - ost->sync_opts;
1165 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1168 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1171 }else if(vdelta>0.6)
1172 ost->sync_opts= lrintf(sync_ipts);
1173 }else if (vdelta > 1.1)
1174 nb_frames = lrintf(vdelta);
1175 //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);
1176 if (nb_frames == 0){
1179 fprintf(stderr, "*** drop!\n");
1180 }else if (nb_frames > 1) {
1181 nb_frames_dup += nb_frames - 1;
1183 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1186 ost->sync_opts= lrintf(sync_ipts);
1188 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1192 formatted_picture = in_picture;
1193 final_picture = formatted_picture;
1195 #if !CONFIG_AVFILTER
1196 resample_changed = ost->resample_width != dec->width ||
1197 ost->resample_height != dec->height ||
1198 ost->resample_pix_fmt != dec->pix_fmt;
1200 if (resample_changed) {
1201 av_log(NULL, AV_LOG_INFO,
1202 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1203 ist->file_index, ist->index,
1204 ost->resample_width, ost->resample_height, avcodec_get_pix_fmt_name(ost->resample_pix_fmt),
1205 dec->width , dec->height , avcodec_get_pix_fmt_name(dec->pix_fmt));
1206 ost->resample_width = dec->width;
1207 ost->resample_height = dec->height;
1208 ost->resample_pix_fmt = dec->pix_fmt;
1211 ost->video_resample = dec->width != enc->width ||
1212 dec->height != enc->height ||
1213 dec->pix_fmt != enc->pix_fmt;
1215 if (ost->video_resample) {
1216 final_picture = &ost->resample_frame;
1217 if (!ost->img_resample_ctx || resample_changed) {
1218 /* initialize the destination picture */
1219 if (!ost->resample_frame.data[0]) {
1220 avcodec_get_frame_defaults(&ost->resample_frame);
1221 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1222 enc->width, enc->height)) {
1223 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1227 /* initialize a new scaler context */
1228 sws_freeContext(ost->img_resample_ctx);
1229 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1230 enc->width, enc->height, enc->pix_fmt,
1231 ost->sws_flags, NULL, NULL, NULL);
1232 if (ost->img_resample_ctx == NULL) {
1233 fprintf(stderr, "Cannot get resampling context\n");
1237 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1238 0, ost->resample_height, ost->resample_frame.data, ost->resample_frame.linesize);
1242 /* duplicates frame if needed */
1243 for(i=0;i<nb_frames;i++) {
1245 av_init_packet(&pkt);
1246 pkt.stream_index= ost->index;
1248 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1249 /* raw pictures are written as AVPicture structure to
1250 avoid any copies. We support temorarily the older
1252 AVFrame* old_frame = enc->coded_frame;
1253 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1254 pkt.data= (uint8_t *)final_picture;
1255 pkt.size= sizeof(AVPicture);
1256 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1257 pkt.flags |= AV_PKT_FLAG_KEY;
1259 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1260 enc->coded_frame = old_frame;
1262 AVFrame big_picture;
1264 big_picture= *final_picture;
1265 /* better than nothing: use input picture interlaced
1267 big_picture.interlaced_frame = in_picture->interlaced_frame;
1268 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1269 if(top_field_first == -1)
1270 big_picture.top_field_first = in_picture->top_field_first;
1272 big_picture.top_field_first = top_field_first;
1275 /* handles sameq here. This is not correct because it may
1276 not be a global option */
1277 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1279 big_picture.pict_type = 0;
1280 // big_picture.pts = AV_NOPTS_VALUE;
1281 big_picture.pts= ost->sync_opts;
1282 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1283 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1284 if (ost->forced_kf_index < ost->forced_kf_count &&
1285 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1286 big_picture.pict_type = AV_PICTURE_TYPE_I;
1287 ost->forced_kf_index++;
1289 ret = avcodec_encode_video(enc,
1290 bit_buffer, bit_buffer_size,
1293 fprintf(stderr, "Video encoding failed\n");
1298 pkt.data= bit_buffer;
1300 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1301 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1302 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1303 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1304 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1306 if(enc->coded_frame->key_frame)
1307 pkt.flags |= AV_PKT_FLAG_KEY;
1308 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1311 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1312 // enc->frame_number-1, ret, enc->pict_type);
1313 /* if two pass, output log */
1314 if (ost->logfile && enc->stats_out) {
1315 fprintf(ost->logfile, "%s", enc->stats_out);
1320 ost->frame_number++;
1324 static double psnr(double d){
1325 return -10.0*log(d)/log(10.0);
1328 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1331 AVCodecContext *enc;
1333 double ti1, bitrate, avg_bitrate;
1335 /* this is executed just the first time do_video_stats is called */
1337 vstats_file = fopen(vstats_filename, "w");
1344 enc = ost->st->codec;
1345 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1346 frame_number = ost->frame_number;
1347 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1348 if (enc->flags&CODEC_FLAG_PSNR)
1349 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1351 fprintf(vstats_file,"f_size= %6d ", frame_size);
1352 /* compute pts value */
1353 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1357 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1358 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1359 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1360 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1361 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1365 static void print_report(AVFormatContext **output_files,
1366 AVOutputStream **ost_table, int nb_ostreams,
1370 AVOutputStream *ost;
1371 AVFormatContext *oc;
1373 AVCodecContext *enc;
1374 int frame_number, vid, i;
1375 double bitrate, ti1, pts;
1376 static int64_t last_time = -1;
1377 static int qp_histogram[52];
1379 if (!is_last_report) {
1381 /* display the report every 0.5 seconds */
1382 cur_time = av_gettime();
1383 if (last_time == -1) {
1384 last_time = cur_time;
1387 if ((cur_time - last_time) < 500000)
1389 last_time = cur_time;
1393 oc = output_files[0];
1395 total_size = avio_size(oc->pb);
1396 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1397 total_size= avio_tell(oc->pb);
1402 for(i=0;i<nb_ostreams;i++) {
1405 enc = ost->st->codec;
1406 if (!ost->st->stream_copy && enc->coded_frame)
1407 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1408 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1411 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1412 float t = (av_gettime()-timer_start) / 1000000.0;
1414 frame_number = ost->frame_number;
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1416 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1418 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1422 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1425 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1427 if (enc->flags&CODEC_FLAG_PSNR){
1429 double error, error_sum=0;
1430 double scale, scale_sum=0;
1431 char type[3]= {'Y','U','V'};
1432 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1435 error= enc->error[j];
1436 scale= enc->width*enc->height*255.0*255.0*frame_number;
1438 error= enc->coded_frame->error[j];
1439 scale= enc->width*enc->height*255.0*255.0;
1444 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1446 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1450 /* compute min output value */
1451 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1452 if ((pts < ti1) && (pts > 0))
1458 if (verbose > 0 || is_last_report) {
1459 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1461 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1462 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1463 (double)total_size / 1024, ti1, bitrate);
1465 if (nb_frames_dup || nb_frames_drop)
1466 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1467 nb_frames_dup, nb_frames_drop);
1470 fprintf(stderr, "%s \r", buf);
1475 if (is_last_report && verbose >= 0){
1476 int64_t raw= audio_size + video_size + extra_size;
1477 fprintf(stderr, "\n");
1478 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1482 100.0*(total_size - raw)/raw
1487 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1489 int fill_char = 0x00;
1490 if (sample_fmt == AV_SAMPLE_FMT_U8)
1492 memset(buf, fill_char, size);
1495 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1496 static int output_packet(AVInputStream *ist, int ist_index,
1497 AVOutputStream **ost_table, int nb_ostreams,
1498 const AVPacket *pkt)
1500 AVFormatContext *os;
1501 AVOutputStream *ost;
1505 void *buffer_to_free = NULL;
1506 static unsigned int samples_size= 0;
1507 AVSubtitle subtitle, *subtitle_to_free;
1508 int64_t pkt_pts = AV_NOPTS_VALUE;
1510 int frame_available;
1514 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1516 if(ist->next_pts == AV_NOPTS_VALUE)
1517 ist->next_pts= ist->pts;
1521 av_init_packet(&avpkt);
1529 if(pkt->dts != AV_NOPTS_VALUE)
1530 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1531 if(pkt->pts != AV_NOPTS_VALUE)
1532 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1534 //while we have more to decode or while the decoder did output something on EOF
1535 while (avpkt.size > 0 || (!pkt && got_output)) {
1536 uint8_t *data_buf, *decoded_data_buf;
1537 int data_size, decoded_data_size;
1539 ist->pts= ist->next_pts;
1541 if(avpkt.size && avpkt.size != pkt->size &&
1542 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1543 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1544 ist->showed_multi_packet_warning=1;
1547 /* decode the packet if needed */
1548 decoded_data_buf = NULL; /* fail safe */
1549 decoded_data_size= 0;
1550 data_buf = avpkt.data;
1551 data_size = avpkt.size;
1552 subtitle_to_free = NULL;
1553 if (ist->decoding_needed) {
1554 switch(ist->st->codec->codec_type) {
1555 case AVMEDIA_TYPE_AUDIO:{
1556 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1557 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1559 samples= av_malloc(samples_size);
1561 decoded_data_size= samples_size;
1562 /* XXX: could avoid copy if PCM 16 bits with same
1563 endianness as CPU */
1564 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1571 got_output = decoded_data_size > 0;
1572 /* Some bug in mpeg audio decoder gives */
1573 /* decoded_data_size < 0, it seems they are overflows */
1575 /* no audio frame */
1578 decoded_data_buf = (uint8_t *)samples;
1579 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1580 (ist->st->codec->sample_rate * ist->st->codec->channels);
1582 case AVMEDIA_TYPE_VIDEO:
1583 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1584 /* XXX: allocate picture correctly */
1585 avcodec_get_frame_defaults(&picture);
1586 avpkt.pts = pkt_pts;
1587 avpkt.dts = ist->pts;
1588 pkt_pts = AV_NOPTS_VALUE;
1590 ret = avcodec_decode_video2(ist->st->codec,
1591 &picture, &got_output, &avpkt);
1592 ist->st->quality= picture.quality;
1596 /* no picture yet */
1597 goto discard_packet;
1599 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1600 if (ist->st->codec->time_base.num != 0) {
1601 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1602 ist->next_pts += ((int64_t)AV_TIME_BASE *
1603 ist->st->codec->time_base.num * ticks) /
1604 ist->st->codec->time_base.den;
1607 buffer_to_free = NULL;
1608 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1610 case AVMEDIA_TYPE_SUBTITLE:
1611 ret = avcodec_decode_subtitle2(ist->st->codec,
1612 &subtitle, &got_output, &avpkt);
1616 goto discard_packet;
1618 subtitle_to_free = &subtitle;
1625 switch(ist->st->codec->codec_type) {
1626 case AVMEDIA_TYPE_AUDIO:
1627 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1628 ist->st->codec->sample_rate;
1630 case AVMEDIA_TYPE_VIDEO:
1631 if (ist->st->codec->time_base.num != 0) {
1632 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1633 ist->next_pts += ((int64_t)AV_TIME_BASE *
1634 ist->st->codec->time_base.num * ticks) /
1635 ist->st->codec->time_base.den;
1644 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1645 for(i=0;i<nb_ostreams;i++) {
1646 AVFilterBufferRef *picref;
1648 if (ost->input_video_filter && ost->source_index == ist_index) {
1649 if (!picture.sample_aspect_ratio.num)
1650 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1651 picture.pts = ist->pts;
1653 picref = avfilter_get_video_buffer_ref_from_arrays(
1654 picture.data, picture.linesize, AV_PERM_WRITE,
1655 picture.width, picture.height, picture.format);
1656 avfilter_copy_frame_props(picref, &picture);
1657 av_vsrc_buffer_add_video_buffer_ref2(ost->input_video_filter, picref, ""); //TODO user setable params
1658 picref->buf->data[0] = NULL;
1659 avfilter_unref_buffer(picref);
1665 // preprocess audio (volume)
1666 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1667 if (audio_volume != 256) {
1670 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1671 int v = ((*volp) * audio_volume + 128) >> 8;
1672 if (v < -32768) v = -32768;
1673 if (v > 32767) v = 32767;
1679 /* frame rate emulation */
1681 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1682 int64_t now = av_gettime() - ist->start;
1686 /* if output time reached then transcode raw format,
1687 encode packets and output them */
1688 if (start_time == 0 || ist->pts >= start_time)
1689 for(i=0;i<nb_ostreams;i++) {
1693 if (ost->source_index == ist_index) {
1695 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1696 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1697 while (frame_available) {
1698 AVRational ist_pts_tb;
1699 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1700 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1702 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1704 os = output_files[ost->file_index];
1706 /* set the input output pts pairs */
1707 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1709 if (ost->encoding_needed) {
1710 av_assert0(ist->decoding_needed);
1711 switch(ost->st->codec->codec_type) {
1712 case AVMEDIA_TYPE_AUDIO:
1713 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1715 case AVMEDIA_TYPE_VIDEO:
1717 if (ost->picref->video && !ost->frame_aspect_ratio)
1718 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1720 do_video_out(os, ost, ist, &picture, &frame_size);
1721 if (vstats_filename && frame_size)
1722 do_video_stats(os, ost, frame_size);
1724 case AVMEDIA_TYPE_SUBTITLE:
1725 do_subtitle_out(os, ost, ist, &subtitle,
1732 AVFrame avframe; //FIXME/XXX remove this
1734 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1736 av_init_packet(&opkt);
1738 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1739 #if !CONFIG_AVFILTER
1745 /* no reencoding needed : output the packet directly */
1746 /* force the input stream PTS */
1748 avcodec_get_frame_defaults(&avframe);
1749 ost->st->codec->coded_frame= &avframe;
1750 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1752 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1753 audio_size += data_size;
1754 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1755 video_size += data_size;
1759 opkt.stream_index= ost->index;
1760 if(pkt->pts != AV_NOPTS_VALUE)
1761 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1763 opkt.pts= AV_NOPTS_VALUE;
1765 if (pkt->dts == AV_NOPTS_VALUE)
1766 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1768 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1769 opkt.dts -= ost_tb_start_time;
1771 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1772 opkt.flags= pkt->flags;
1774 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1775 if( ost->st->codec->codec_id != CODEC_ID_H264
1776 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1777 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1779 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1780 opkt.destruct= av_destruct_packet;
1782 opkt.data = data_buf;
1783 opkt.size = data_size;
1786 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1787 ost->st->codec->frame_number++;
1788 ost->frame_number++;
1789 av_free_packet(&opkt);
1793 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1794 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1796 avfilter_unref_buffer(ost->picref);
1802 av_free(buffer_to_free);
1803 /* XXX: allocate the subtitles in the codec ? */
1804 if (subtitle_to_free) {
1805 avsubtitle_free(subtitle_to_free);
1806 subtitle_to_free = NULL;
1813 for(i=0;i<nb_ostreams;i++) {
1815 if (ost->source_index == ist_index) {
1816 AVCodecContext *enc= ost->st->codec;
1817 os = output_files[ost->file_index];
1819 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1821 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1824 if (ost->encoding_needed) {
1828 av_init_packet(&pkt);
1829 pkt.stream_index= ost->index;
1831 switch(ost->st->codec->codec_type) {
1832 case AVMEDIA_TYPE_AUDIO:
1833 fifo_bytes = av_fifo_size(ost->fifo);
1835 /* encode any samples remaining in fifo */
1836 if (fifo_bytes > 0) {
1837 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1838 int fs_tmp = enc->frame_size;
1840 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1841 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1842 enc->frame_size = fifo_bytes / (osize * enc->channels);
1844 int frame_bytes = enc->frame_size*osize*enc->channels;
1845 if (allocated_audio_buf_size < frame_bytes)
1847 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1850 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1851 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1852 ost->st->time_base.num, enc->sample_rate);
1853 enc->frame_size = fs_tmp;
1856 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1859 fprintf(stderr, "Audio encoding failed\n");
1863 pkt.flags |= AV_PKT_FLAG_KEY;
1865 case AVMEDIA_TYPE_VIDEO:
1866 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1868 fprintf(stderr, "Video encoding failed\n");
1872 if(enc->coded_frame && enc->coded_frame->key_frame)
1873 pkt.flags |= AV_PKT_FLAG_KEY;
1874 if (ost->logfile && enc->stats_out) {
1875 fprintf(ost->logfile, "%s", enc->stats_out);
1884 pkt.data= bit_buffer;
1886 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1887 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1888 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1900 static void print_sdp(AVFormatContext **avc, int n)
1904 av_sdp_create(avc, n, sdp, sizeof(sdp));
1905 printf("SDP:\n%s\n", sdp);
1909 static int copy_chapters(int infile, int outfile)
1911 AVFormatContext *is = input_files[infile];
1912 AVFormatContext *os = output_files[outfile];
1915 for (i = 0; i < is->nb_chapters; i++) {
1916 AVChapter *in_ch = is->chapters[i], *out_ch;
1917 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1918 AV_TIME_BASE_Q, in_ch->time_base);
1919 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1920 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1923 if (in_ch->end < ts_off)
1925 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1928 out_ch = av_mallocz(sizeof(AVChapter));
1930 return AVERROR(ENOMEM);
1932 out_ch->id = in_ch->id;
1933 out_ch->time_base = in_ch->time_base;
1934 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1935 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1937 if (metadata_chapters_autocopy)
1938 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1941 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1943 return AVERROR(ENOMEM);
1944 os->chapters[os->nb_chapters - 1] = out_ch;
1949 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1950 AVCodecContext *avctx)
1956 for (p = kf; *p; p++)
1959 ost->forced_kf_count = n;
1960 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1961 if (!ost->forced_kf_pts) {
1962 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1965 for (i = 0; i < n; i++) {
1966 p = i ? strchr(p, ',') + 1 : kf;
1967 t = parse_time_or_die("force_key_frames", p, 1);
1968 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1973 * The following code is the main loop of the file converter
1975 static int transcode(AVFormatContext **output_files,
1976 int nb_output_files,
1977 AVFormatContext **input_files,
1979 AVStreamMap *stream_maps, int nb_stream_maps)
1981 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0, step;
1982 AVFormatContext *is, *os;
1983 AVCodecContext *codec, *icodec;
1984 AVOutputStream *ost, **ost_table = NULL;
1985 AVInputStream *ist, **ist_table = NULL;
1986 AVInputFile *file_table;
1990 uint8_t no_packet[MAX_FILES]={0};
1991 int no_packet_count=0;
1992 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
1993 int nb_streams[AVMEDIA_TYPE_NB]={0};
1995 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1999 /* input stream init */
2001 for(i=0;i<nb_input_files;i++) {
2002 is = input_files[i];
2003 file_table[i].ist_index = j;
2004 file_table[i].nb_streams = is->nb_streams;
2005 j += is->nb_streams;
2009 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
2013 for(i=0;i<nb_istreams;i++) {
2014 ist = av_mallocz(sizeof(AVInputStream));
2020 for(i=0;i<nb_input_files;i++) {
2021 is = input_files[i];
2022 for(k=0;k<is->nb_streams;k++) {
2023 ist = ist_table[j++];
2024 ist->st = is->streams[k];
2025 ist->file_index = i;
2027 ist->discard = 1; /* the stream is discarded by default
2031 ist->start = av_gettime();
2036 /* output stream init */
2038 for(i=0;i<nb_output_files;i++) {
2039 os = output_files[i];
2040 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2041 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2042 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2043 ret = AVERROR(EINVAL);
2046 nb_ostreams += os->nb_streams;
2048 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2049 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2050 ret = AVERROR(EINVAL);
2054 /* Sanity check the mapping args -- do the input files & streams exist? */
2055 for(i=0;i<nb_stream_maps;i++) {
2056 int fi = stream_maps[i].file_index;
2057 int si = stream_maps[i].stream_index;
2059 if (fi < 0 || fi > nb_input_files - 1 ||
2060 si < 0 || si > file_table[fi].nb_streams - 1) {
2061 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2062 ret = AVERROR(EINVAL);
2065 fi = stream_maps[i].sync_file_index;
2066 si = stream_maps[i].sync_stream_index;
2067 if (fi < 0 || fi > nb_input_files - 1 ||
2068 si < 0 || si > file_table[fi].nb_streams - 1) {
2069 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2070 ret = AVERROR(EINVAL);
2075 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2079 for(k=0;k<nb_output_files;k++) {
2080 os = output_files[k];
2081 for(i=0;i<os->nb_streams;i++,n++) {
2082 nb_streams[os->streams[i]->codec->codec_type]++;
2085 for(step=1<<30; step; step>>=1){
2086 int found_streams[AVMEDIA_TYPE_NB]={0};
2087 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2088 nb_frame_threshold[j] += step;
2090 for(j=0; j<nb_istreams; j++) {
2095 AVFormatContext *f= input_files[ ist->file_index ];
2097 for(pi=0; pi<f->nb_programs; pi++){
2098 AVProgram *p= f->programs[pi];
2099 if(p->id == opt_programid)
2100 for(si=0; si<p->nb_stream_indexes; si++){
2101 if(f->streams[ p->stream_index[si] ] == ist->st)
2106 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2107 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2108 found_streams[ist->st->codec->codec_type]++;
2111 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2112 if(found_streams[j] < nb_streams[j])
2113 nb_frame_threshold[j] -= step;
2116 for(k=0;k<nb_output_files;k++) {
2117 os = output_files[k];
2118 for(i=0;i<os->nb_streams;i++,n++) {
2120 ost = ost_table[n] = output_streams_for_file[k][i];
2121 ost->st = os->streams[i];
2122 if (nb_stream_maps > 0) {
2123 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2124 stream_maps[n].stream_index;
2126 /* Sanity check that the stream types match */
2127 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2128 int i= ost->file_index;
2129 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2130 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2131 stream_maps[n].file_index, stream_maps[n].stream_index,
2132 ost->file_index, ost->index);
2137 /* get corresponding input stream index : we select the first one with the right type */
2139 for(j=0;j<nb_istreams;j++) {
2144 AVFormatContext *f= input_files[ ist->file_index ];
2146 for(pi=0; pi<f->nb_programs; pi++){
2147 AVProgram *p= f->programs[pi];
2148 if(p->id == opt_programid)
2149 for(si=0; si<p->nb_stream_indexes; si++){
2150 if(f->streams[ p->stream_index[si] ] == ist->st)
2155 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2156 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2157 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2158 ost->source_index = j;
2165 if(! opt_programid) {
2166 /* try again and reuse existing stream */
2167 for(j=0;j<nb_istreams;j++) {
2169 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2170 && ist->st->discard != AVDISCARD_ALL) {
2171 ost->source_index = j;
2177 int i= ost->file_index;
2178 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2179 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2180 ost->file_index, ost->index);
2185 ist = ist_table[ost->source_index];
2187 ost->sync_ist = (nb_stream_maps > 0) ?
2188 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2189 stream_maps[n].sync_stream_index] : ist;
2193 /* for each output stream, we compute the right encoding parameters */
2194 for(i=0;i<nb_ostreams;i++) {
2196 os = output_files[ost->file_index];
2197 ist = ist_table[ost->source_index];
2199 codec = ost->st->codec;
2200 icodec = ist->st->codec;
2202 if (metadata_streams_autocopy)
2203 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2204 AV_METADATA_DONT_OVERWRITE);
2206 ost->st->disposition = ist->st->disposition;
2207 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2208 codec->chroma_sample_location = icodec->chroma_sample_location;
2210 if (ost->st->stream_copy) {
2211 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2213 if (extra_size > INT_MAX)
2216 /* if stream_copy is selected, no need to decode or encode */
2217 codec->codec_id = icodec->codec_id;
2218 codec->codec_type = icodec->codec_type;
2220 if(!codec->codec_tag){
2221 if( !os->oformat->codec_tag
2222 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2223 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2224 codec->codec_tag = icodec->codec_tag;
2227 codec->bit_rate = icodec->bit_rate;
2228 codec->rc_max_rate = icodec->rc_max_rate;
2229 codec->rc_buffer_size = icodec->rc_buffer_size;
2230 codec->extradata= av_mallocz(extra_size);
2231 if (!codec->extradata)
2233 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2234 codec->extradata_size= icodec->extradata_size;
2235 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){
2236 codec->time_base = icodec->time_base;
2237 codec->time_base.num *= icodec->ticks_per_frame;
2238 av_reduce(&codec->time_base.num, &codec->time_base.den,
2239 codec->time_base.num, codec->time_base.den, INT_MAX);
2241 codec->time_base = ist->st->time_base;
2242 switch(codec->codec_type) {
2243 case AVMEDIA_TYPE_AUDIO:
2244 if(audio_volume != 256) {
2245 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2248 codec->channel_layout = icodec->channel_layout;
2249 codec->sample_rate = icodec->sample_rate;
2250 codec->channels = icodec->channels;
2251 codec->frame_size = icodec->frame_size;
2252 codec->audio_service_type = icodec->audio_service_type;
2253 codec->block_align= icodec->block_align;
2254 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2255 codec->block_align= 0;
2256 if(codec->codec_id == CODEC_ID_AC3)
2257 codec->block_align= 0;
2259 case AVMEDIA_TYPE_VIDEO:
2260 codec->pix_fmt = icodec->pix_fmt;
2261 codec->width = icodec->width;
2262 codec->height = icodec->height;
2263 codec->has_b_frames = icodec->has_b_frames;
2264 if (!codec->sample_aspect_ratio.num) {
2265 codec->sample_aspect_ratio =
2266 ost->st->sample_aspect_ratio =
2267 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2268 ist->st->codec->sample_aspect_ratio.num ?
2269 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2272 case AVMEDIA_TYPE_SUBTITLE:
2273 codec->width = icodec->width;
2274 codec->height = icodec->height;
2276 case AVMEDIA_TYPE_DATA:
2282 switch(codec->codec_type) {
2283 case AVMEDIA_TYPE_AUDIO:
2284 ost->fifo= av_fifo_alloc(1024);
2287 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2288 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2289 icodec->request_channels = codec->channels;
2290 ist->decoding_needed = 1;
2291 ost->encoding_needed = 1;
2292 ost->resample_sample_fmt = icodec->sample_fmt;
2293 ost->resample_sample_rate = icodec->sample_rate;
2294 ost->resample_channels = icodec->channels;
2296 case AVMEDIA_TYPE_VIDEO:
2297 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2298 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2301 ost->video_resample = codec->width != icodec->width ||
2302 codec->height != icodec->height ||
2303 codec->pix_fmt != icodec->pix_fmt;
2304 if (ost->video_resample) {
2305 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2307 ost->resample_height = icodec->height;
2308 ost->resample_width = icodec->width;
2309 ost->resample_pix_fmt= icodec->pix_fmt;
2310 ost->encoding_needed = 1;
2311 ist->decoding_needed = 1;
2314 if (configure_video_filters(ist, ost)) {
2315 fprintf(stderr, "Error opening filters!\n");
2320 case AVMEDIA_TYPE_SUBTITLE:
2321 ost->encoding_needed = 1;
2322 ist->decoding_needed = 1;
2329 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2330 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2331 char logfilename[1024];
2334 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2335 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2337 if (codec->flags & CODEC_FLAG_PASS1) {
2338 f = fopen(logfilename, "wb");
2340 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2346 size_t logbuffer_size;
2347 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2348 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2351 codec->stats_in = logbuffer;
2355 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2356 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2357 int size= codec->width * codec->height;
2358 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2363 bit_buffer = av_malloc(bit_buffer_size);
2365 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2367 ret = AVERROR(ENOMEM);
2371 /* open each encoder */
2372 for(i=0;i<nb_ostreams;i++) {
2374 if (ost->encoding_needed) {
2375 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2376 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2378 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2380 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2381 ost->st->codec->codec_id, ost->file_index, ost->index);
2382 ret = AVERROR(EINVAL);
2385 if (dec->subtitle_header) {
2386 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2387 if (!ost->st->codec->subtitle_header) {
2388 ret = AVERROR(ENOMEM);
2391 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2392 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2394 if (avcodec_open(ost->st->codec, codec) < 0) {
2395 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2396 ost->file_index, ost->index);
2397 ret = AVERROR(EINVAL);
2400 extra_size += ost->st->codec->extradata_size;
2404 /* open each decoder */
2405 for(i=0;i<nb_istreams;i++) {
2407 if (ist->decoding_needed) {
2408 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2410 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2412 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2413 ist->st->codec->codec_id, ist->file_index, ist->index);
2414 ret = AVERROR(EINVAL);
2417 if (avcodec_open(ist->st->codec, codec) < 0) {
2418 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2419 ist->file_index, ist->index);
2420 ret = AVERROR(EINVAL);
2423 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2424 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2429 for(i=0;i<nb_istreams;i++) {
2433 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2434 ist->next_pts = AV_NOPTS_VALUE;
2438 /* set meta data information from input file if required */
2439 for (i=0;i<nb_meta_data_maps;i++) {
2440 AVFormatContext *files[2];
2441 AVMetadata **meta[2];
2444 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2445 if ((index) < 0 || (index) >= (nb_elems)) {\
2446 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2448 ret = AVERROR(EINVAL);\
2452 int out_file_index = meta_data_maps[i][0].file;
2453 int in_file_index = meta_data_maps[i][1].file;
2454 if (in_file_index < 0 || out_file_index < 0)
2456 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2457 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2459 files[0] = output_files[out_file_index];
2460 files[1] = input_files[in_file_index];
2462 for (j = 0; j < 2; j++) {
2463 AVMetaDataMap *map = &meta_data_maps[i][j];
2465 switch (map->type) {
2467 meta[j] = &files[j]->metadata;
2470 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2471 meta[j] = &files[j]->streams[map->index]->metadata;
2474 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2475 meta[j] = &files[j]->chapters[map->index]->metadata;
2478 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2479 meta[j] = &files[j]->programs[map->index]->metadata;
2484 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2487 /* copy global metadata by default */
2488 if (metadata_global_autocopy) {
2490 for (i = 0; i < nb_output_files; i++)
2491 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2492 AV_METADATA_DONT_OVERWRITE);
2495 /* copy chapters according to chapter maps */
2496 for (i = 0; i < nb_chapter_maps; i++) {
2497 int infile = chapter_maps[i].in_file;
2498 int outfile = chapter_maps[i].out_file;
2500 if (infile < 0 || outfile < 0)
2502 if (infile >= nb_input_files) {
2503 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2504 ret = AVERROR(EINVAL);
2507 if (outfile >= nb_output_files) {
2508 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2509 ret = AVERROR(EINVAL);
2512 copy_chapters(infile, outfile);
2515 /* copy chapters from the first input file that has them*/
2516 if (!nb_chapter_maps)
2517 for (i = 0; i < nb_input_files; i++) {
2518 if (!input_files[i]->nb_chapters)
2521 for (j = 0; j < nb_output_files; j++)
2522 if ((ret = copy_chapters(i, j)) < 0)
2527 /* open files and write file headers */
2528 for(i=0;i<nb_output_files;i++) {
2529 os = output_files[i];
2530 if (av_write_header(os) < 0) {
2531 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2532 ret = AVERROR(EINVAL);
2535 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2541 /* dump the file output parameters - cannot be done before in case
2543 for(i=0;i<nb_output_files;i++) {
2544 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2547 /* dump the stream mapping */
2549 fprintf(stderr, "Stream mapping:\n");
2550 for(i=0;i<nb_ostreams;i++) {
2552 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2553 ist_table[ost->source_index]->file_index,
2554 ist_table[ost->source_index]->index,
2557 if (ost->sync_ist != ist_table[ost->source_index])
2558 fprintf(stderr, " [sync #%d.%d]",
2559 ost->sync_ist->file_index,
2560 ost->sync_ist->index);
2561 fprintf(stderr, "\n");
2566 fprintf(stderr, "%s\n", error);
2571 print_sdp(output_files, nb_output_files);
2576 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2577 avio_set_interrupt_cb(decode_interrupt_cb);
2581 timer_start = av_gettime();
2583 for(; received_sigterm == 0;) {
2584 int file_index, ist_index;
2592 /* if 'q' pressed, exits */
2596 /* read_key() returns 0 on EOF */
2600 if (key == '+') verbose++;
2601 if (key == '-') verbose--;
2602 if (key == 's') qp_hist ^= 1;
2605 do_hex_dump = do_pkt_dump = 0;
2606 } else if(do_pkt_dump){
2610 av_log_set_level(AV_LOG_DEBUG);
2612 if (key == 'd' || key == 'D'){
2616 debug = ist->st->codec->debug<<1;
2617 if(!debug) debug = 1;
2618 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2621 scanf("%d", &debug);
2622 for(i=0;i<nb_istreams;i++) {
2624 ist->st->codec->debug = debug;
2626 for(i=0;i<nb_ostreams;i++) {
2628 ost->st->codec->debug = debug;
2630 if(debug) av_log_set_level(AV_LOG_DEBUG);
2631 fprintf(stderr,"debug=%d\n", debug);
2634 fprintf(stderr, "key function\n"
2635 "? show this help\n"
2636 "+ increase verbosity\n"
2637 "- decrease verbosity\n"
2638 "D cycle through available debug modes\n"
2639 "h dump packets/hex press to cycle through the 3 states\n"
2641 "s Show QP histogram\n"
2646 /* select the stream that we must read now by looking at the
2647 smallest output pts */
2649 for(i=0;i<nb_ostreams;i++) {
2652 os = output_files[ost->file_index];
2653 ist = ist_table[ost->source_index];
2654 if(ist->is_past_recording_time || no_packet[ist->file_index])
2656 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2657 ipts = (double)ist->pts;
2658 if (!file_table[ist->file_index].eof_reached){
2659 if(ipts < ipts_min) {
2661 if(input_sync ) file_index = ist->file_index;
2663 if(opts < opts_min) {
2665 if(!input_sync) file_index = ist->file_index;
2668 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2673 /* if none, if is finished */
2674 if (file_index < 0) {
2675 if(no_packet_count){
2677 memset(no_packet, 0, sizeof(no_packet));
2684 /* finish if limit size exhausted */
2685 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2688 /* read a frame from it and output it in the fifo */
2689 is = input_files[file_index];
2690 ret= av_read_frame(is, &pkt);
2691 if(ret == AVERROR(EAGAIN)){
2692 no_packet[file_index]=1;
2697 file_table[file_index].eof_reached = 1;
2705 memset(no_packet, 0, sizeof(no_packet));
2708 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2709 is->streams[pkt.stream_index]);
2711 /* the following test is needed in case new streams appear
2712 dynamically in stream : we ignore them */
2713 if (pkt.stream_index >= file_table[file_index].nb_streams)
2714 goto discard_packet;
2715 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2716 ist = ist_table[ist_index];
2718 goto discard_packet;
2720 if (pkt.dts != AV_NOPTS_VALUE)
2721 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2722 if (pkt.pts != AV_NOPTS_VALUE)
2723 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2725 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2726 && input_files_ts_scale[file_index][pkt.stream_index]){
2727 if(pkt.pts != AV_NOPTS_VALUE)
2728 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2729 if(pkt.dts != AV_NOPTS_VALUE)
2730 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2733 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2734 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2735 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2736 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2737 int64_t delta= pkt_dts - ist->next_pts;
2738 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2739 input_files_ts_offset[ist->file_index]-= delta;
2741 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2742 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2743 if(pkt.pts != AV_NOPTS_VALUE)
2744 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2748 /* finish if recording time exhausted */
2749 if (recording_time != INT64_MAX &&
2750 (pkt.pts != AV_NOPTS_VALUE || pkt.dts != AV_NOPTS_VALUE ?
2751 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2753 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2755 ist->is_past_recording_time = 1;
2756 goto discard_packet;
2759 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2760 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2763 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2764 ist->file_index, ist->index);
2767 av_free_packet(&pkt);
2772 av_free_packet(&pkt);
2774 /* dump report by using the output first video and audio streams */
2775 print_report(output_files, ost_table, nb_ostreams, 0);
2778 /* at the end of stream, we must flush the decoder buffers */
2779 for(i=0;i<nb_istreams;i++) {
2781 if (ist->decoding_needed) {
2782 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2788 /* write the trailer if needed and close file */
2789 for(i=0;i<nb_output_files;i++) {
2790 os = output_files[i];
2791 av_write_trailer(os);
2794 /* dump report by using the first video and audio streams */
2795 print_report(output_files, ost_table, nb_ostreams, 1);
2797 /* close each encoder */
2798 for(i=0;i<nb_ostreams;i++) {
2800 if (ost->encoding_needed) {
2801 av_freep(&ost->st->codec->stats_in);
2802 avcodec_close(ost->st->codec);
2805 avfilter_graph_free(&ost->graph);
2809 /* close each decoder */
2810 for(i=0;i<nb_istreams;i++) {
2812 if (ist->decoding_needed) {
2813 avcodec_close(ist->st->codec);
2821 av_freep(&bit_buffer);
2822 av_free(file_table);
2825 for(i=0;i<nb_istreams;i++) {
2832 for(i=0;i<nb_ostreams;i++) {
2835 if (ost->st->stream_copy)
2836 av_freep(&ost->st->codec->extradata);
2838 fclose(ost->logfile);
2839 ost->logfile = NULL;
2841 av_fifo_free(ost->fifo); /* works even if fifo is not
2842 initialized but set to zero */
2843 av_freep(&ost->st->codec->subtitle_header);
2844 av_free(ost->resample_frame.data[0]);
2845 av_free(ost->forced_kf_pts);
2846 if (ost->video_resample)
2847 sws_freeContext(ost->img_resample_ctx);
2849 audio_resample_close(ost->resample);
2850 if (ost->reformat_ctx)
2851 av_audio_convert_free(ost->reformat_ctx);
2860 static void opt_format(const char *arg)
2862 last_asked_format = arg;
2865 static void opt_video_rc_override_string(const char *arg)
2867 video_rc_override_string = arg;
2870 static int opt_me_threshold(const char *opt, const char *arg)
2872 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2876 static int opt_verbose(const char *opt, const char *arg)
2878 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2882 static int opt_frame_rate(const char *opt, const char *arg)
2884 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2885 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2891 static int opt_bitrate(const char *opt, const char *arg)
2893 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2895 opt_default(opt, arg);
2897 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2898 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2903 static int opt_frame_crop(const char *opt, const char *arg)
2905 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2906 return AVERROR(EINVAL);
2909 static void opt_frame_size(const char *arg)
2911 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2912 fprintf(stderr, "Incorrect frame size\n");
2917 static int opt_pad(const char *opt, const char *arg) {
2918 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2922 static void opt_frame_pix_fmt(const char *arg)
2924 if (strcmp(arg, "list")) {
2925 frame_pix_fmt = av_get_pix_fmt(arg);
2926 if (frame_pix_fmt == PIX_FMT_NONE) {
2927 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2936 static void opt_frame_aspect_ratio(const char *arg)
2943 p = strchr(arg, ':');
2945 x = strtol(arg, &end, 10);
2947 y = strtol(end+1, &end, 10);
2949 ar = (double)x / (double)y;
2951 ar = strtod(arg, NULL);
2954 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2957 frame_aspect_ratio = ar;
2960 static int opt_metadata(const char *opt, const char *arg)
2962 char *mid= strchr(arg, '=');
2965 fprintf(stderr, "Missing =\n");
2970 av_metadata_set2(&metadata, arg, mid, 0);
2975 static int opt_qscale(const char *opt, const char *arg)
2977 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2978 if (video_qscale <= 0 || video_qscale > 255) {
2979 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2980 return AVERROR(EINVAL);
2985 static int opt_top_field_first(const char *opt, const char *arg)
2987 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2988 opt_default(opt, arg);
2992 static int opt_thread_count(const char *opt, const char *arg)
2994 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2997 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
3002 static void opt_audio_sample_fmt(const char *arg)
3004 if (strcmp(arg, "list")) {
3005 audio_sample_fmt = av_get_sample_fmt(arg);
3006 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
3007 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
3013 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
3014 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
3019 static int opt_audio_rate(const char *opt, const char *arg)
3021 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3025 static int opt_audio_channels(const char *opt, const char *arg)
3027 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3031 static int opt_video_channel(const char *opt, const char *arg)
3033 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3037 static void opt_video_standard(const char *arg)
3039 video_standard = av_strdup(arg);
3042 static void opt_codec(int *pstream_copy, char **pcodec_name,
3043 int codec_type, const char *arg)
3045 av_freep(pcodec_name);
3046 if (!strcmp(arg, "copy")) {
3049 *pcodec_name = av_strdup(arg);
3053 static void opt_audio_codec(const char *arg)
3055 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
3058 static void opt_video_codec(const char *arg)
3060 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
3063 static void opt_subtitle_codec(const char *arg)
3065 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
3068 static void opt_data_codec(const char *arg)
3070 opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
3073 static int opt_codec_tag(const char *opt, const char *arg)
3076 uint32_t *codec_tag;
3078 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3079 !strcmp(opt, "vtag") ? &video_codec_tag :
3080 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3084 *codec_tag = strtol(arg, &tail, 0);
3086 *codec_tag = AV_RL32(arg);
3091 static void opt_map(const char *arg)
3096 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3097 m = &stream_maps[nb_stream_maps-1];
3099 m->file_index = strtol(arg, &p, 0);
3103 m->stream_index = strtol(p, &p, 0);
3106 m->sync_file_index = strtol(p, &p, 0);
3109 m->sync_stream_index = strtol(p, &p, 0);
3111 m->sync_file_index = m->file_index;
3112 m->sync_stream_index = m->stream_index;
3116 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3127 *index = strtol(++arg, endptr, 0);
3130 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3137 static void opt_map_metadata(const char *arg)
3139 AVMetaDataMap *m, *m1;
3142 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3143 &nb_meta_data_maps, nb_meta_data_maps + 1);
3145 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3146 m->file = strtol(arg, &p, 0);
3147 parse_meta_type(p, &m->type, &m->index, &p);
3151 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3152 m1->file = strtol(p, &p, 0);
3153 parse_meta_type(p, &m1->type, &m1->index, &p);
3155 if (m->type == 'g' || m1->type == 'g')
3156 metadata_global_autocopy = 0;
3157 if (m->type == 's' || m1->type == 's')
3158 metadata_streams_autocopy = 0;
3159 if (m->type == 'c' || m1->type == 'c')
3160 metadata_chapters_autocopy = 0;
3163 static void opt_map_meta_data(const char *arg)
3165 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3166 "Use -map_metadata instead.\n");
3167 opt_map_metadata(arg);
3170 static void opt_map_chapters(const char *arg)
3175 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3176 nb_chapter_maps + 1);
3177 c = &chapter_maps[nb_chapter_maps - 1];
3178 c->out_file = strtol(arg, &p, 0);
3182 c->in_file = strtol(p, &p, 0);
3185 static void opt_input_ts_scale(const char *arg)
3187 unsigned int stream;
3191 stream = strtol(arg, &p, 0);
3194 scale= strtod(p, &p);
3196 if(stream >= MAX_STREAMS)
3199 input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
3200 input_files_ts_scale[nb_input_files][stream]= scale;
3203 static int opt_recording_time(const char *opt, const char *arg)
3205 recording_time = parse_time_or_die(opt, arg, 1);
3209 static int opt_start_time(const char *opt, const char *arg)
3211 start_time = parse_time_or_die(opt, arg, 1);
3215 static int opt_recording_timestamp(const char *opt, const char *arg)
3217 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3221 static int opt_input_ts_offset(const char *opt, const char *arg)
3223 input_ts_offset = parse_time_or_die(opt, arg, 1);
3227 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3229 const char *codec_string = encoder ? "encoder" : "decoder";
3233 return CODEC_ID_NONE;
3235 avcodec_find_encoder_by_name(name) :
3236 avcodec_find_decoder_by_name(name);
3238 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3241 if(codec->type != type) {
3242 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3245 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3246 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3247 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3248 "results.\nAdd '-strict experimental' if you want to use it.\n",
3249 codec_string, codec->name);
3251 avcodec_find_encoder(codec->id) :
3252 avcodec_find_decoder(codec->id);
3253 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3254 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3255 codec_string, codec->name);
3261 static void opt_input_file(const char *filename)
3263 AVFormatContext *ic;
3264 AVFormatParameters params, *ap = ¶ms;
3265 AVInputFormat *file_iformat = NULL;
3266 int err, i, ret, rfps, rfps_base;
3269 if (last_asked_format) {
3270 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3271 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3274 last_asked_format = NULL;
3277 if (!strcmp(filename, "-"))
3280 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3281 !strcmp(filename, "/dev/stdin");
3283 /* get default parameters from command line */
3284 ic = avformat_alloc_context();
3286 print_error(filename, AVERROR(ENOMEM));
3290 memset(ap, 0, sizeof(*ap));
3291 ap->prealloced_context = 1;
3292 ap->sample_rate = audio_sample_rate;
3293 ap->channels = audio_channels;
3294 ap->time_base.den = frame_rate.num;
3295 ap->time_base.num = frame_rate.den;
3296 ap->width = frame_width;
3297 ap->height = frame_height;
3298 ap->pix_fmt = frame_pix_fmt;
3299 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3300 ap->channel = video_channel;
3301 ap->standard = video_standard;
3303 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3305 ic->video_codec_id =
3306 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3307 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3308 ic->audio_codec_id =
3309 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3310 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3311 ic->subtitle_codec_id=
3312 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3313 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3314 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3316 /* open the input file with generic libav function */
3317 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3319 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3320 err = av_demuxer_open(ic, ap);
3322 avformat_free_context(ic);
3325 print_error(filename, err);
3331 for(i=0; i<ic->nb_streams; i++){
3332 ic->streams[i]->discard= AVDISCARD_ALL;
3334 for(i=0; i<ic->nb_programs; i++){
3335 AVProgram *p= ic->programs[i];
3336 if(p->id != opt_programid){
3337 p->discard = AVDISCARD_ALL;
3340 for(j=0; j<p->nb_stream_indexes; j++){
3341 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3346 fprintf(stderr, "Specified program id not found\n");
3352 ic->loop_input = loop_input;
3354 /* If not enough info to get the stream parameters, we decode the
3355 first frames to get it. (used in mpeg case for example) */
3356 ret = av_find_stream_info(ic);
3357 if (ret < 0 && verbose >= 0) {
3358 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3359 av_close_input_file(ic);
3363 timestamp = start_time;
3364 /* add the stream start time */
3365 if (ic->start_time != AV_NOPTS_VALUE)
3366 timestamp += ic->start_time;
3368 /* if seeking requested, we execute it */
3369 if (start_time != 0) {
3370 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3372 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3373 filename, (double)timestamp / AV_TIME_BASE);
3375 /* reset seek info */
3379 /* update the current parameters so that they match the one of the input stream */
3380 for(i=0;i<ic->nb_streams;i++) {
3381 AVStream *st = ic->streams[i];
3382 AVCodecContext *dec = st->codec;
3383 dec->thread_count = thread_count;
3384 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3385 switch (dec->codec_type) {
3386 case AVMEDIA_TYPE_AUDIO:
3387 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3388 if(!input_codecs[nb_input_codecs-1])
3389 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3390 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3391 channel_layout = dec->channel_layout;
3392 audio_channels = dec->channels;
3393 audio_sample_rate = dec->sample_rate;
3394 audio_sample_fmt = dec->sample_fmt;
3396 st->discard= AVDISCARD_ALL;
3397 /* Note that av_find_stream_info can add more streams, and we
3398 * currently have no chance of setting up lowres decoding
3399 * early enough for them. */
3401 audio_sample_rate >>= dec->lowres;
3403 case AVMEDIA_TYPE_VIDEO:
3404 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3405 if(!input_codecs[nb_input_codecs-1])
3406 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3407 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3408 frame_height = dec->height;
3409 frame_width = dec->width;
3410 frame_pix_fmt = dec->pix_fmt;
3411 rfps = ic->streams[i]->r_frame_rate.num;
3412 rfps_base = ic->streams[i]->r_frame_rate.den;
3414 dec->flags |= CODEC_FLAG_EMU_EDGE;
3415 frame_height >>= dec->lowres;
3416 frame_width >>= dec->lowres;
3417 dec->height = frame_height;
3418 dec->width = frame_width;
3421 dec->debug |= FF_DEBUG_MV;
3423 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3426 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3427 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3429 (float)rfps / rfps_base, rfps, rfps_base);
3431 /* update the current frame rate to match the stream frame rate */
3432 frame_rate.num = rfps;
3433 frame_rate.den = rfps_base;
3436 st->discard= AVDISCARD_ALL;
3437 else if(video_discard)
3438 st->discard= video_discard;
3440 case AVMEDIA_TYPE_DATA:
3442 case AVMEDIA_TYPE_SUBTITLE:
3443 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3444 if(!input_codecs[nb_input_codecs-1])
3445 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3446 if(subtitle_disable)
3447 st->discard = AVDISCARD_ALL;
3449 case AVMEDIA_TYPE_ATTACHMENT:
3450 case AVMEDIA_TYPE_UNKNOWN:
3457 input_files[nb_input_files] = ic;
3458 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3459 /* dump the file content */
3461 av_dump_format(ic, nb_input_files, filename, 0);
3466 top_field_first = -1;
3468 av_freep(&video_codec_name);
3469 av_freep(&audio_codec_name);
3470 av_freep(&subtitle_codec_name);
3475 static void check_inputs(int *has_video_ptr,
3477 int *has_subtitle_ptr,
3480 int has_video, has_audio, has_subtitle, has_data, i, j;
3481 AVFormatContext *ic;
3488 for(j=0;j<nb_input_files;j++) {
3489 ic = input_files[j];
3490 for(i=0;i<ic->nb_streams;i++) {
3491 AVCodecContext *enc = ic->streams[i]->codec;
3492 switch(enc->codec_type) {
3493 case AVMEDIA_TYPE_AUDIO:
3496 case AVMEDIA_TYPE_VIDEO:
3499 case AVMEDIA_TYPE_SUBTITLE:
3502 case AVMEDIA_TYPE_DATA:
3503 case AVMEDIA_TYPE_ATTACHMENT:
3504 case AVMEDIA_TYPE_UNKNOWN:
3512 *has_video_ptr = has_video;
3513 *has_audio_ptr = has_audio;
3514 *has_subtitle_ptr = has_subtitle;
3515 *has_data_ptr = has_data;
3518 static void new_video_stream(AVFormatContext *oc, int file_idx)
3521 AVOutputStream *ost;
3522 AVCodecContext *video_enc;
3523 enum CodecID codec_id = CODEC_ID_NONE;
3524 AVCodec *codec= NULL;
3526 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3528 fprintf(stderr, "Could not alloc stream\n");
3531 ost = new_output_stream(oc, file_idx);
3533 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3534 if(!video_stream_copy){
3535 if (video_codec_name) {
3536 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3537 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3538 codec = avcodec_find_encoder_by_name(video_codec_name);
3539 output_codecs[nb_output_codecs-1] = codec;
3541 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3542 codec = avcodec_find_encoder(codec_id);
3544 ost->frame_aspect_ratio = frame_aspect_ratio;
3545 frame_aspect_ratio = 0;
3547 ost->avfilter = vfilters;
3552 avcodec_get_context_defaults3(st->codec, codec);
3553 ost->bitstream_filters = video_bitstream_filters;
3554 video_bitstream_filters= NULL;
3556 st->codec->thread_count= thread_count;
3558 video_enc = st->codec;
3561 video_enc->codec_tag= video_codec_tag;
3563 if( (video_global_header&1)
3564 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3565 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3566 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3568 if(video_global_header&2){
3569 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3570 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3573 if (video_stream_copy) {
3574 st->stream_copy = 1;
3575 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3576 video_enc->sample_aspect_ratio =
3577 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3581 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3583 video_enc->codec_id = codec_id;
3584 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3586 if (codec && codec->supported_framerates && !force_fps)
3587 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3588 video_enc->time_base.den = fps.num;
3589 video_enc->time_base.num = fps.den;
3591 video_enc->width = frame_width;
3592 video_enc->height = frame_height;
3593 video_enc->pix_fmt = frame_pix_fmt;
3594 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3595 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3597 choose_pixel_fmt(st, codec);
3600 video_enc->gop_size = 0;
3601 if (video_qscale || same_quality) {
3602 video_enc->flags |= CODEC_FLAG_QSCALE;
3603 video_enc->global_quality=
3604 st->quality = FF_QP2LAMBDA * video_qscale;
3608 video_enc->intra_matrix = intra_matrix;
3610 video_enc->inter_matrix = inter_matrix;
3612 p= video_rc_override_string;
3615 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3617 fprintf(stderr, "error parsing rc_override\n");
3620 video_enc->rc_override=
3621 av_realloc(video_enc->rc_override,
3622 sizeof(RcOverride)*(i+1));
3623 video_enc->rc_override[i].start_frame= start;
3624 video_enc->rc_override[i].end_frame = end;
3626 video_enc->rc_override[i].qscale= q;
3627 video_enc->rc_override[i].quality_factor= 1.0;
3630 video_enc->rc_override[i].qscale= 0;
3631 video_enc->rc_override[i].quality_factor= -q/100.0;
3636 video_enc->rc_override_count=i;
3637 if (!video_enc->rc_initial_buffer_occupancy)
3638 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3639 video_enc->me_threshold= me_threshold;
3640 video_enc->intra_dc_precision= intra_dc_precision - 8;
3643 video_enc->flags|= CODEC_FLAG_PSNR;
3648 video_enc->flags |= CODEC_FLAG_PASS1;
3650 video_enc->flags |= CODEC_FLAG_PASS2;
3654 if (forced_key_frames)
3655 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3657 if (video_language) {
3658 av_metadata_set2(&st->metadata, "language", video_language, 0);
3659 av_freep(&video_language);
3662 /* reset some key parameters */
3664 av_freep(&video_codec_name);
3665 av_freep(&forced_key_frames);
3666 video_stream_copy = 0;
3667 frame_pix_fmt = PIX_FMT_NONE;
3670 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3673 AVOutputStream *ost;
3674 AVCodec *codec= NULL;
3675 AVCodecContext *audio_enc;
3676 enum CodecID codec_id = CODEC_ID_NONE;
3678 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3680 fprintf(stderr, "Could not alloc stream\n");
3683 ost = new_output_stream(oc, file_idx);
3685 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3686 if(!audio_stream_copy){
3687 if (audio_codec_name) {
3688 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3689 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3690 codec = avcodec_find_encoder_by_name(audio_codec_name);
3691 output_codecs[nb_output_codecs-1] = codec;
3693 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3694 codec = avcodec_find_encoder(codec_id);
3698 avcodec_get_context_defaults3(st->codec, codec);
3700 ost->bitstream_filters = audio_bitstream_filters;
3701 audio_bitstream_filters= NULL;
3703 st->codec->thread_count= thread_count;
3705 audio_enc = st->codec;
3706 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3709 audio_enc->codec_tag= audio_codec_tag;
3711 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3712 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3713 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3715 if (audio_stream_copy) {
3716 st->stream_copy = 1;
3717 audio_enc->channels = audio_channels;
3718 audio_enc->sample_rate = audio_sample_rate;
3720 audio_enc->codec_id = codec_id;
3721 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3723 if (audio_qscale > QSCALE_NONE) {
3724 audio_enc->flags |= CODEC_FLAG_QSCALE;
3725 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3727 audio_enc->channels = audio_channels;
3728 audio_enc->sample_fmt = audio_sample_fmt;
3729 audio_enc->sample_rate = audio_sample_rate;
3730 audio_enc->channel_layout = channel_layout;
3731 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3732 audio_enc->channel_layout = 0;
3733 choose_sample_fmt(st, codec);
3734 choose_sample_rate(st, codec);
3736 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3737 if (audio_language) {
3738 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3739 av_freep(&audio_language);
3742 /* reset some key parameters */
3744 av_freep(&audio_codec_name);
3745 audio_stream_copy = 0;
3748 static void new_data_stream(AVFormatContext *oc, int file_idx)
3751 AVOutputStream *ost;
3752 AVCodec *codec=NULL;
3753 AVCodecContext *data_enc;
3755 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3757 fprintf(stderr, "Could not alloc stream\n");
3760 ost = new_output_stream(oc, file_idx);
3761 data_enc = st->codec;
3762 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3763 if (!data_stream_copy) {
3764 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3767 avcodec_get_context_defaults3(st->codec, codec);
3769 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3772 data_enc->codec_tag= data_codec_tag;
3774 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3775 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3776 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3778 if (data_stream_copy) {
3779 st->stream_copy = 1;
3783 av_freep(&data_codec_name);
3784 data_stream_copy = 0;
3787 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3790 AVOutputStream *ost;
3791 AVCodec *codec=NULL;
3792 AVCodecContext *subtitle_enc;
3793 enum CodecID codec_id = CODEC_ID_NONE;
3795 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3797 fprintf(stderr, "Could not alloc stream\n");
3800 ost = new_output_stream(oc, file_idx);
3801 subtitle_enc = st->codec;
3802 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3803 if(!subtitle_stream_copy){
3804 if (subtitle_codec_name) {
3805 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3806 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3807 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3809 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3810 codec = avcodec_find_encoder(codec_id);
3813 avcodec_get_context_defaults3(st->codec, codec);
3815 ost->bitstream_filters = subtitle_bitstream_filters;
3816 subtitle_bitstream_filters= NULL;
3818 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3820 if(subtitle_codec_tag)
3821 subtitle_enc->codec_tag= subtitle_codec_tag;
3823 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3824 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3825 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3827 if (subtitle_stream_copy) {
3828 st->stream_copy = 1;
3830 subtitle_enc->codec_id = codec_id;
3831 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3834 if (subtitle_language) {
3835 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3836 av_freep(&subtitle_language);
3839 subtitle_disable = 0;
3840 av_freep(&subtitle_codec_name);
3841 subtitle_stream_copy = 0;
3844 static int opt_new_stream(const char *opt, const char *arg)
3846 AVFormatContext *oc;
3847 int file_idx = nb_output_files - 1;
3848 if (nb_output_files <= 0) {
3849 fprintf(stderr, "At least one output file must be specified\n");
3852 oc = output_files[file_idx];
3854 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3855 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3856 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3857 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3862 /* arg format is "output-stream-index:streamid-value". */
3863 static int opt_streamid(const char *opt, const char *arg)
3869 av_strlcpy(idx_str, arg, sizeof(idx_str));
3870 p = strchr(idx_str, ':');
3873 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3878 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3879 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3880 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3884 static void opt_output_file(const char *filename)
3886 AVFormatContext *oc;
3887 int err, use_video, use_audio, use_subtitle, use_data;
3888 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3889 AVFormatParameters params, *ap = ¶ms;
3890 AVOutputFormat *file_oformat;
3892 if (!strcmp(filename, "-"))
3895 oc = avformat_alloc_output_context(last_asked_format, NULL, filename);
3896 last_asked_format = NULL;
3898 print_error(filename, AVERROR(ENOMEM));
3901 file_oformat= oc->oformat;
3903 if (!strcmp(file_oformat->name, "ffm") &&
3904 av_strstart(filename, "http:", NULL)) {
3905 /* special case for files sent to ffserver: we get the stream
3906 parameters from ffserver */
3907 int err = read_ffserver_streams(oc, filename);
3909 print_error(filename, err);
3913 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3914 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3915 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3916 use_data = data_stream_copy || data_codec_name; /* XXX once generic data codec will be available add a ->data_codec reference and use it here */
3918 /* disable if no corresponding type found and at least one
3920 if (nb_input_files > 0) {
3921 check_inputs(&input_has_video,
3923 &input_has_subtitle,
3926 if (!input_has_video)
3928 if (!input_has_audio)
3930 if (!input_has_subtitle)
3932 if (!input_has_data)
3936 /* manual disable */
3937 if (audio_disable) use_audio = 0;
3938 if (video_disable) use_video = 0;
3939 if (subtitle_disable) use_subtitle = 0;
3940 if (data_disable) use_data = 0;
3942 if (use_video) new_video_stream(oc, nb_output_files);
3943 if (use_audio) new_audio_stream(oc, nb_output_files);
3944 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3945 if (use_data) new_data_stream(oc, nb_output_files);
3947 oc->timestamp = recording_timestamp;
3949 av_metadata_copy(&oc->metadata, metadata, 0);
3950 av_metadata_free(&metadata);
3953 output_files[nb_output_files++] = oc;
3955 /* check filename in case of an image number is expected */
3956 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3957 if (!av_filename_number_test(oc->filename)) {
3958 print_error(oc->filename, AVERROR(EINVAL));
3963 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3964 /* test if it already exists to avoid loosing precious files */
3965 if (!file_overwrite &&
3966 (strchr(filename, ':') == NULL ||
3967 filename[1] == ':' ||
3968 av_strstart(filename, "file:", NULL))) {
3969 if (avio_check(filename, 0) == 0) {
3971 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3973 if (!read_yesno()) {
3974 fprintf(stderr, "Not overwriting - exiting\n");
3979 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3986 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3987 print_error(filename, err);
3992 memset(ap, 0, sizeof(*ap));
3993 if (av_set_parameters(oc, ap) < 0) {
3994 fprintf(stderr, "%s: Invalid encoding parameters\n",
3999 oc->preload= (int)(mux_preload*AV_TIME_BASE);
4000 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
4001 oc->loop_output = loop_output;
4003 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
4005 av_freep(&forced_key_frames);
4010 /* same option as mencoder */
4011 static int opt_pass(const char *opt, const char *arg)
4013 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4017 static int64_t getutime(void)
4020 struct rusage rusage;
4022 getrusage(RUSAGE_SELF, &rusage);
4023 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4024 #elif HAVE_GETPROCESSTIMES
4026 FILETIME c, e, k, u;
4027 proc = GetCurrentProcess();
4028 GetProcessTimes(proc, &c, &e, &k, &u);
4029 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4031 return av_gettime();
4035 static int64_t getmaxrss(void)
4037 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4038 struct rusage rusage;
4039 getrusage(RUSAGE_SELF, &rusage);
4040 return (int64_t)rusage.ru_maxrss * 1024;
4041 #elif HAVE_GETPROCESSMEMORYINFO
4043 PROCESS_MEMORY_COUNTERS memcounters;
4044 proc = GetCurrentProcess();
4045 memcounters.cb = sizeof(memcounters);
4046 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4047 return memcounters.PeakPagefileUsage;
4053 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4056 const char *p = str;
4063 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4070 static void opt_inter_matrix(const char *arg)
4072 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4073 parse_matrix_coeffs(inter_matrix, arg);
4076 static void opt_intra_matrix(const char *arg)
4078 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4079 parse_matrix_coeffs(intra_matrix, arg);
4082 static void show_usage(void)
4084 printf("Hyper fast Audio and Video encoder\n");
4085 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4089 static void show_help(void)
4092 AVOutputFormat *oformat = NULL;
4094 av_log_set_callback(log_callback_help);
4096 show_help_options(options, "Main options:\n",
4097 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4098 show_help_options(options, "\nAdvanced options:\n",
4099 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4101 show_help_options(options, "\nVideo options:\n",
4102 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4104 show_help_options(options, "\nAdvanced Video options:\n",
4105 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4106 OPT_VIDEO | OPT_EXPERT);
4107 show_help_options(options, "\nAudio options:\n",
4108 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4110 show_help_options(options, "\nAdvanced Audio options:\n",
4111 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4112 OPT_AUDIO | OPT_EXPERT);
4113 show_help_options(options, "\nSubtitle options:\n",
4114 OPT_SUBTITLE | OPT_GRAB,
4116 show_help_options(options, "\nAudio/Video grab options:\n",
4120 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4123 /* individual codec options */
4125 while ((c = av_codec_next(c))) {
4126 if (c->priv_class) {
4127 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4132 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4135 /* individual muxer options */
4136 while ((oformat = av_oformat_next(oformat))) {
4137 if (oformat->priv_class) {
4138 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4143 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4146 static void opt_target(const char *arg)
4148 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4149 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4151 if(!strncmp(arg, "pal-", 4)) {
4154 } else if(!strncmp(arg, "ntsc-", 5)) {
4157 } else if(!strncmp(arg, "film-", 5)) {
4162 /* Calculate FR via float to avoid int overflow */
4163 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4166 } else if((fr == 29970) || (fr == 23976)) {
4169 /* Try to determine PAL/NTSC by peeking in the input files */
4170 if(nb_input_files) {
4172 for(j = 0; j < nb_input_files; j++) {
4173 for(i = 0; i < input_files[j]->nb_streams; i++) {
4174 AVCodecContext *c = input_files[j]->streams[i]->codec;
4175 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4177 fr = c->time_base.den * 1000 / c->time_base.num;
4181 } else if((fr == 29970) || (fr == 23976)) {
4191 if(verbose > 0 && norm != UNKNOWN)
4192 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4195 if(norm == UNKNOWN) {
4196 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4197 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4198 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4202 if(!strcmp(arg, "vcd")) {
4204 opt_video_codec("mpeg1video");
4205 opt_audio_codec("mp2");
4208 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4209 opt_frame_rate(NULL, frame_rates[norm]);
4210 opt_default("g", norm == PAL ? "15" : "18");
4212 opt_default("b", "1150000");
4213 opt_default("maxrate", "1150000");
4214 opt_default("minrate", "1150000");
4215 opt_default("bufsize", "327680"); // 40*1024*8;
4217 opt_default("ab", "224000");
4218 audio_sample_rate = 44100;
4221 opt_default("packetsize", "2324");
4222 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4224 /* We have to offset the PTS, so that it is consistent with the SCR.
4225 SCR starts at 36000, but the first two packs contain only padding
4226 and the first pack from the other stream, respectively, may also have
4227 been written before.
4228 So the real data starts at SCR 36000+3*1200. */
4229 mux_preload= (36000+3*1200) / 90000.0; //0.44
4230 } else if(!strcmp(arg, "svcd")) {
4232 opt_video_codec("mpeg2video");
4233 opt_audio_codec("mp2");
4236 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4237 opt_frame_rate(NULL, frame_rates[norm]);
4238 opt_default("g", norm == PAL ? "15" : "18");
4240 opt_default("b", "2040000");
4241 opt_default("maxrate", "2516000");
4242 opt_default("minrate", "0"); //1145000;
4243 opt_default("bufsize", "1835008"); //224*1024*8;
4244 opt_default("flags", "+scan_offset");
4247 opt_default("ab", "224000");
4248 audio_sample_rate = 44100;
4250 opt_default("packetsize", "2324");
4252 } else if(!strcmp(arg, "dvd")) {
4254 opt_video_codec("mpeg2video");
4255 opt_audio_codec("ac3");
4258 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4259 opt_frame_rate(NULL, frame_rates[norm]);
4260 opt_default("g", norm == PAL ? "15" : "18");
4262 opt_default("b", "6000000");
4263 opt_default("maxrate", "9000000");
4264 opt_default("minrate", "0"); //1500000;
4265 opt_default("bufsize", "1835008"); //224*1024*8;
4267 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4268 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4270 opt_default("ab", "448000");
4271 audio_sample_rate = 48000;
4273 } else if(!strncmp(arg, "dv", 2)) {
4277 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4278 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4279 (norm == PAL ? "yuv420p" : "yuv411p"));
4280 opt_frame_rate(NULL, frame_rates[norm]);
4282 audio_sample_rate = 48000;
4286 fprintf(stderr, "Unknown target: %s\n", arg);
4291 static void opt_vstats_file (const char *arg)
4293 av_free (vstats_filename);
4294 vstats_filename=av_strdup (arg);
4297 static void opt_vstats (void)
4300 time_t today2 = time(NULL);
4301 struct tm *today = localtime(&today2);
4303 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4305 opt_vstats_file(filename);
4308 static int opt_bsf(const char *opt, const char *arg)
4310 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4311 AVBitStreamFilterContext **bsfp;
4314 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4318 bsfp= *opt == 'v' ? &video_bitstream_filters :
4319 *opt == 'a' ? &audio_bitstream_filters :
4320 &subtitle_bitstream_filters;
4322 bsfp= &(*bsfp)->next;
4329 static int opt_preset(const char *opt, const char *arg)
4332 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4333 char *codec_name = *opt == 'v' ? video_codec_name :
4334 *opt == 'a' ? audio_codec_name :
4335 subtitle_codec_name;
4337 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4338 fprintf(stderr, "File for preset '%s' not found\n", arg);
4343 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4344 if(line[0] == '#' && !e)
4346 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4348 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4351 if(!strcmp(tmp, "acodec")){
4352 opt_audio_codec(tmp2);
4353 }else if(!strcmp(tmp, "vcodec")){
4354 opt_video_codec(tmp2);
4355 }else if(!strcmp(tmp, "scodec")){
4356 opt_subtitle_codec(tmp2);
4357 }else if(!strcmp(tmp, "dcodec")){
4358 opt_data_codec(tmp2);
4359 }else if(opt_default(tmp, tmp2) < 0){
4360 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4370 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4374 static void opt_passlogfile(const char *arg)
4376 pass_logfilename_prefix = arg;
4377 opt_default("passlogfile", arg);
4380 static const OptionDef options[] = {
4382 #include "cmdutils_common_opts.h"
4383 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4384 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4385 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4386 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4387 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4388 "outfile[,metadata]:infile[,metadata]" },
4389 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4390 "outfile[,metadata]:infile[,metadata]" },
4391 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4392 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4393 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4394 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4395 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4396 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4397 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4398 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4399 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4400 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4401 "add timings for benchmarking" },
4402 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4403 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4404 "dump each input packet" },
4405 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4406 "when dumping packets, also dump the payload" },
4407 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4408 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4409 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4410 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4411 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4412 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4413 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4414 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4415 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4416 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4417 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4418 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4419 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4420 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4421 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4422 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4423 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4426 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4427 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4428 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4429 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4430 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4431 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4432 { "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" },
4433 { "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" },
4434 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4435 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4436 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4437 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4438 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4439 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4440 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4441 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4442 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4443 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4444 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4445 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4446 { "qscale", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4447 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4448 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4449 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4450 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4451 "use same quantizer as source (implies VBR)" },
4452 { "pass", HAS_ARG | OPT_FUNC2 | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4453 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4454 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4455 "deinterlace pictures" },
4456 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4457 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4458 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4460 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4462 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4463 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4464 { "top", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4465 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4466 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4467 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4468 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4469 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4470 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4471 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4472 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4475 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4476 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4477 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4478 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4479 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4480 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4481 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4482 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4483 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4484 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4485 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4486 { "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" },
4488 /* subtitle options */
4489 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4490 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4491 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4492 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4493 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4496 { "vc", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4497 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4498 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4501 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4502 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4504 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4505 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4506 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4508 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4509 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4510 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4511 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4512 /* data codec support */
4513 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4515 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4519 int main(int argc, char **argv)
4523 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4525 if(argc>1 && !strcmp(argv[1], "-d")){
4528 av_log_set_callback(log_callback_null);
4533 avcodec_register_all();
4535 avdevice_register_all();
4538 avfilter_register_all();
4543 if(isatty(STDIN_FILENO))
4544 avio_set_interrupt_cb(decode_interrupt_cb);
4553 parse_options(argc, argv, options, opt_output_file);
4555 if(nb_output_files <= 0 && nb_input_files == 0) {
4557 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4561 /* file converter / grab */
4562 if (nb_output_files <= 0) {
4563 fprintf(stderr, "At least one output file must be specified\n");
4567 if (nb_input_files == 0) {
4568 fprintf(stderr, "At least one input file must be specified\n");
4573 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4574 stream_maps, nb_stream_maps) < 0)
4576 ti = getutime() - ti;
4578 int maxrss = getmaxrss() / 1024;
4579 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4582 return ffmpeg_exit(0);