3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; 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"
48 # include "libavfilter/avfilter.h"
49 # include "libavfilter/avfiltergraph.h"
50 # include "libavfilter/vsrc_buffer.h"
53 #if HAVE_SYS_RESOURCE_H
54 #include <sys/types.h>
56 #include <sys/resource.h>
57 #elif HAVE_GETPROCESSTIMES
60 #if HAVE_GETPROCESSMEMORYINFO
66 #include <sys/select.h>
76 #include "libavutil/avassert.h"
78 const char program_name[] = "ffmpeg";
79 const int program_birth_year = 2000;
81 /* select an input stream for an output stream */
82 typedef struct AVStreamMap {
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct AVMetaDataMap {
93 int file; //< file index
94 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; //< stream/chapter/program number
98 typedef struct AVChapterMap {
103 static const OptionDef options[];
105 #define MAX_FILES 100
106 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
108 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
110 static const char *last_asked_format = NULL;
111 static AVFormatContext *input_files[MAX_FILES];
112 static int64_t input_files_ts_offset[MAX_FILES];
113 static double *input_files_ts_scale[MAX_FILES] = {NULL};
114 static AVCodec **input_codecs = NULL;
115 static int nb_input_files = 0;
116 static int nb_input_codecs = 0;
117 static int nb_input_files_ts_scale[MAX_FILES] = {0};
119 static AVFormatContext *output_files[MAX_FILES];
120 static AVCodec **output_codecs = NULL;
121 static int nb_output_files = 0;
122 static int nb_output_codecs = 0;
124 static AVStreamMap *stream_maps = NULL;
125 static int nb_stream_maps;
127 /* first item specifies output metadata, second is input */
128 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
129 static int nb_meta_data_maps;
130 static int metadata_global_autocopy = 1;
131 static int metadata_streams_autocopy = 1;
132 static int metadata_chapters_autocopy = 1;
134 static AVChapterMap *chapter_maps = NULL;
135 static int nb_chapter_maps;
137 /* indexed by output file stream index */
138 static int *streamid_map = NULL;
139 static int nb_streamid_map = 0;
141 static int frame_width = 0;
142 static int frame_height = 0;
143 static float frame_aspect_ratio = 0;
144 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
145 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
146 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
147 static AVRational frame_rate;
148 static float video_qscale = 0;
149 static uint16_t *intra_matrix = NULL;
150 static uint16_t *inter_matrix = NULL;
151 static const char *video_rc_override_string=NULL;
152 static int video_disable = 0;
153 static int video_discard = 0;
154 static char *video_codec_name = NULL;
155 static unsigned int video_codec_tag = 0;
156 static char *video_language = NULL;
157 static int same_quality = 0;
158 static int do_deinterlace = 0;
159 static int top_field_first = -1;
160 static int me_threshold = 0;
161 static int intra_dc_precision = 8;
162 static int loop_input = 0;
163 static int loop_output = AVFMT_NOOUTPUTLOOP;
164 static int qp_hist = 0;
166 static char *vfilters = NULL;
167 static AVFilterGraph *graph = NULL;
170 static int intra_only = 0;
171 static int audio_sample_rate = 44100;
172 static int64_t channel_layout = 0;
173 #define QSCALE_NONE -99999
174 static float audio_qscale = QSCALE_NONE;
175 static int audio_disable = 0;
176 static int audio_channels = 1;
177 static char *audio_codec_name = NULL;
178 static unsigned int audio_codec_tag = 0;
179 static char *audio_language = NULL;
181 static int subtitle_disable = 0;
182 static char *subtitle_codec_name = NULL;
183 static char *subtitle_language = NULL;
184 static unsigned int subtitle_codec_tag = 0;
186 static int data_disable = 0;
187 static char *data_codec_name = NULL;
188 static unsigned int data_codec_tag = 0;
190 static float mux_preload= 0.5;
191 static float mux_max_delay= 0.7;
193 static int64_t recording_time = INT64_MAX;
194 static int64_t start_time = 0;
195 static int64_t recording_timestamp = 0;
196 static int64_t input_ts_offset = 0;
197 static int file_overwrite = 0;
198 static AVMetadata *metadata;
199 static int do_benchmark = 0;
200 static int do_hex_dump = 0;
201 static int do_pkt_dump = 0;
202 static int do_psnr = 0;
203 static int do_pass = 0;
204 static char *pass_logfilename_prefix = NULL;
205 static int audio_stream_copy = 0;
206 static int video_stream_copy = 0;
207 static int subtitle_stream_copy = 0;
208 static int data_stream_copy = 0;
209 static int video_sync_method= -1;
210 static int audio_sync_method= 0;
211 static float audio_drift_threshold= 0.1;
212 static int copy_ts= 0;
214 static int opt_shortest = 0;
215 static int video_global_header = 0;
216 static char *vstats_filename;
217 static FILE *vstats_file;
218 static int opt_programid = 0;
219 static int copy_initial_nonkeyframes = 0;
221 static int rate_emu = 0;
223 static int video_channel = 0;
224 static char *video_standard;
226 static int audio_volume = 256;
228 static int exit_on_error = 0;
229 static int using_stdin = 0;
230 static int verbose = 1;
231 static int thread_count= 1;
232 static int q_pressed = 0;
233 static int64_t video_size = 0;
234 static int64_t audio_size = 0;
235 static int64_t extra_size = 0;
236 static int nb_frames_dup = 0;
237 static int nb_frames_drop = 0;
238 static int input_sync;
239 static uint64_t limit_filesize = 0;
240 static int force_fps = 0;
241 static char *forced_key_frames = NULL;
243 static float dts_delta_threshold = 10;
245 static int64_t timer_start;
247 static uint8_t *audio_buf;
248 static uint8_t *audio_out;
249 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
251 static short *samples;
253 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
254 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
255 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
257 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
259 struct AVInputStream;
261 typedef struct AVOutputStream {
262 int file_index; /* file index */
263 int index; /* stream index in the output file */
264 int source_index; /* AVInputStream index */
265 AVStream *st; /* stream in the output file */
266 int encoding_needed; /* true if encoding needed for this stream */
268 /* input pts and corresponding output pts
270 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
271 struct AVInputStream *sync_ist; /* input stream to sync against */
272 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
273 AVBitStreamFilterContext *bitstream_filters;
276 AVFrame pict_tmp; /* temporary image for resampling */
277 struct SwsContext *img_resample_ctx; /* for image resampling */
280 int resample_pix_fmt;
282 /* forced key frames */
283 int64_t *forced_kf_pts;
289 ReSampleContext *resample; /* for audio resampling */
290 int resample_sample_fmt;
291 int resample_channels;
292 int resample_sample_rate;
294 AVAudioConvert *reformat_ctx;
295 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
301 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
302 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
304 typedef struct AVInputStream {
308 int discard; /* true if stream data should be discarded */
309 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
310 int64_t sample_index; /* current sample */
312 int64_t start; /* time when read started */
313 int64_t next_pts; /* synthetic pts for cases where pkt.pts
315 int64_t pts; /* current pts */
316 PtsCorrectionContext pts_ctx;
317 int is_start; /* is 1 at the start and after a discontinuity */
318 int showed_multi_packet_warning;
319 int is_past_recording_time;
321 AVFilterContext *output_video_filter;
322 AVFilterContext *input_video_filter;
323 AVFrame *filter_frame;
324 int has_filter_frame;
325 AVFilterBufferRef *picref;
329 typedef struct AVInputFile {
330 int eof_reached; /* true if eof reached */
331 int ist_index; /* index of first stream in ist_table */
332 int buffer_size; /* current total buffer size */
333 int nb_streams; /* nb streams we are aware of */
338 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
340 AVFilterContext *last_filter, *filter;
341 /** filter graph containing all filters including input & output */
342 AVCodecContext *codec = ost->st->codec;
343 AVCodecContext *icodec = ist->st->codec;
344 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
345 AVRational sample_aspect_ratio;
349 graph = avfilter_graph_alloc();
351 if (ist->st->sample_aspect_ratio.num){
352 sample_aspect_ratio = ist->st->sample_aspect_ratio;
354 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
356 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
357 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
358 sample_aspect_ratio.num, sample_aspect_ratio.den);
360 ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
361 "src", args, NULL, graph);
364 ret = avfilter_graph_create_filter(&ist->output_video_filter, &ffsink,
365 "out", NULL, &ffsink_ctx, graph);
368 last_filter = ist->input_video_filter;
370 if (codec->width != icodec->width || codec->height != icodec->height) {
371 snprintf(args, 255, "%d:%d:flags=0x%X",
375 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
376 NULL, args, NULL, graph)) < 0)
378 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
380 last_filter = filter;
383 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
384 graph->scale_sws_opts = av_strdup(args);
387 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
388 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
390 outputs->name = av_strdup("in");
391 outputs->filter_ctx = last_filter;
392 outputs->pad_idx = 0;
393 outputs->next = NULL;
395 inputs->name = av_strdup("out");
396 inputs->filter_ctx = ist->output_video_filter;
400 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
404 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
408 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
411 codec->width = ist->output_video_filter->inputs[0]->w;
412 codec->height = ist->output_video_filter->inputs[0]->h;
413 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
414 ist->output_video_filter->inputs[0]->sample_aspect_ratio;
418 #endif /* CONFIG_AVFILTER */
420 static void term_exit(void)
422 av_log(NULL, AV_LOG_QUIET, "");
425 static volatile int received_sigterm = 0;
428 sigterm_handler(int sig)
430 received_sigterm = sig;
434 static void term_init(void)
436 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
437 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
439 signal(SIGXCPU, sigterm_handler);
443 /* read a key without blocking */
444 static int read_key(void)
453 static int decode_interrupt_cb(void)
455 return q_pressed || (q_pressed = read_key() == 'q');
458 static int ffmpeg_exit(int ret)
463 for(i=0;i<nb_output_files;i++) {
464 AVFormatContext *s = output_files[i];
465 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
467 avformat_free_context(s);
468 av_free(output_streams_for_file[i]);
470 for(i=0;i<nb_input_files;i++) {
471 av_close_input_file(input_files[i]);
472 av_free(input_files_ts_scale[i]);
475 av_free(intra_matrix);
476 av_free(inter_matrix);
480 av_free(vstats_filename);
482 av_free(streamid_map);
483 av_free(input_codecs);
484 av_free(output_codecs);
485 av_free(stream_maps);
486 av_free(meta_data_maps);
488 av_free(video_codec_name);
489 av_free(audio_codec_name);
490 av_free(subtitle_codec_name);
491 av_free(data_codec_name);
493 av_free(video_standard);
498 allocated_audio_buf_size= allocated_audio_out_size= 0;
505 if (received_sigterm) {
507 "Received signal %d: terminating.\n",
508 (int) received_sigterm);
512 exit(ret); /* not all OS-es handle main() return value */
516 /* similar to ff_dynarray_add() and av_fast_realloc() */
517 static void *grow_array(void *array, int elem_size, int *size, int new_size)
519 if (new_size >= INT_MAX / elem_size) {
520 fprintf(stderr, "Array too big.\n");
523 if (*size < new_size) {
524 uint8_t *tmp = av_realloc(array, new_size*elem_size);
526 fprintf(stderr, "Could not alloc buffer.\n");
529 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
536 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
538 if(codec && codec->sample_fmts){
539 const enum AVSampleFormat *p= codec->sample_fmts;
541 if(*p == st->codec->sample_fmt)
545 av_log(NULL, AV_LOG_WARNING,
546 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
547 av_get_sample_fmt_name(st->codec->sample_fmt),
549 av_get_sample_fmt_name(codec->sample_fmts[0]));
550 st->codec->sample_fmt = codec->sample_fmts[0];
555 static void choose_sample_rate(AVStream *st, AVCodec *codec)
557 if(codec && codec->supported_samplerates){
558 const int *p= codec->supported_samplerates;
560 int best_dist=INT_MAX;
562 int dist= abs(st->codec->sample_rate - *p);
563 if(dist < best_dist){
569 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
571 st->codec->sample_rate= best;
575 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
577 if(codec && codec->pix_fmts){
578 const enum PixelFormat *p= codec->pix_fmts;
579 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
580 if(st->codec->codec_id==CODEC_ID_MJPEG){
581 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
582 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
583 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};
587 if(*p == st->codec->pix_fmt)
591 if(st->codec->pix_fmt != PIX_FMT_NONE)
592 av_log(NULL, AV_LOG_WARNING,
593 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
594 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
596 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
597 st->codec->pix_fmt = codec->pix_fmts[0];
602 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
604 int idx = oc->nb_streams - 1;
607 output_streams_for_file[file_idx] =
608 grow_array(output_streams_for_file[file_idx],
609 sizeof(*output_streams_for_file[file_idx]),
610 &nb_output_streams_for_file[file_idx],
612 ost = output_streams_for_file[file_idx][idx] =
613 av_mallocz(sizeof(AVOutputStream));
615 fprintf(stderr, "Could not alloc output stream\n");
618 ost->file_index = file_idx;
621 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
625 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
631 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
634 /* copy stream format */
636 for(i=0;i<ic->nb_streams;i++) {
642 // FIXME: a more elegant solution is needed
643 st = av_mallocz(sizeof(AVStream));
644 memcpy(st, ic->streams[i], sizeof(AVStream));
645 st->codec = avcodec_alloc_context();
647 print_error(filename, AVERROR(ENOMEM));
650 avcodec_copy_context(st->codec, ic->streams[i]->codec);
653 codec = avcodec_find_encoder(st->codec->codec_id);
654 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
655 if (audio_stream_copy) {
658 choose_sample_fmt(st, codec);
659 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
660 if (video_stream_copy) {
663 choose_pixel_fmt(st, codec);
666 if(st->codec->flags & CODEC_FLAG_BITEXACT)
669 new_output_stream(s, nb_output_files);
673 s->timestamp = av_gettime();
675 av_close_input_file(ic);
680 get_sync_ipts(const AVOutputStream *ost)
682 const AVInputStream *ist = ost->sync_ist;
683 return (double)(ist->pts - start_time)/AV_TIME_BASE;
686 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
690 AVPacket new_pkt= *pkt;
691 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
692 &new_pkt.data, &new_pkt.size,
693 pkt->data, pkt->size,
694 pkt->flags & AV_PKT_FLAG_KEY);
697 new_pkt.destruct= av_destruct_packet;
699 fprintf(stderr, "%s failed for stream %d, codec %s",
700 bsfc->filter->name, pkt->stream_index,
701 avctx->codec ? avctx->codec->name : "copy");
711 ret= av_interleaved_write_frame(s, pkt);
713 print_error("av_interleaved_write_frame()", ret);
718 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
720 static void do_audio_out(AVFormatContext *s,
723 unsigned char *buf, int size)
726 int64_t audio_out_size, audio_buf_size;
727 int64_t allocated_for_size= size;
729 int size_out, frame_bytes, ret, resample_changed;
730 AVCodecContext *enc= ost->st->codec;
731 AVCodecContext *dec= ist->st->codec;
732 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
733 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
734 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
737 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
738 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
739 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
740 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
741 audio_buf_size*= osize*enc->channels;
743 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
744 if(coded_bps > 8*osize)
745 audio_out_size= audio_out_size * coded_bps / (8*osize);
746 audio_out_size += FF_MIN_BUFFER_SIZE;
748 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
749 fprintf(stderr, "Buffer sizes too large\n");
753 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
754 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
755 if (!audio_buf || !audio_out){
756 fprintf(stderr, "Out of memory in do_audio_out\n");
760 if (enc->channels != dec->channels)
761 ost->audio_resample = 1;
763 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
764 ost->resample_channels != dec->channels ||
765 ost->resample_sample_rate != dec->sample_rate;
767 if ((ost->audio_resample && !ost->resample) || resample_changed) {
768 if (resample_changed) {
769 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",
770 ist->file_index, ist->index,
771 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
772 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
773 ost->resample_sample_fmt = dec->sample_fmt;
774 ost->resample_channels = dec->channels;
775 ost->resample_sample_rate = dec->sample_rate;
777 audio_resample_close(ost->resample);
779 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
780 if (audio_sync_method <= 1 &&
781 ost->resample_sample_fmt == enc->sample_fmt &&
782 ost->resample_channels == enc->channels &&
783 ost->resample_sample_rate == enc->sample_rate) {
784 ost->resample = NULL;
785 ost->audio_resample = 0;
787 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
788 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
789 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
790 enc->sample_rate, dec->sample_rate,
791 enc->sample_fmt, dec->sample_fmt,
793 if (!ost->resample) {
794 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
795 dec->channels, dec->sample_rate,
796 enc->channels, enc->sample_rate);
802 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
803 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
804 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
805 if (ost->reformat_ctx)
806 av_audio_convert_free(ost->reformat_ctx);
807 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
808 dec->sample_fmt, 1, NULL, 0);
809 if (!ost->reformat_ctx) {
810 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
811 av_get_sample_fmt_name(dec->sample_fmt),
812 av_get_sample_fmt_name(enc->sample_fmt));
815 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
818 if(audio_sync_method){
819 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
820 - av_fifo_size(ost->fifo)/(enc->channels * 2);
821 double idelta= delta*dec->sample_rate / enc->sample_rate;
822 int byte_delta= ((int)idelta)*2*dec->channels;
824 //FIXME resample delay
825 if(fabs(delta) > 50){
826 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
828 byte_delta= FFMAX(byte_delta, -size);
832 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
837 static uint8_t *input_tmp= NULL;
838 input_tmp= av_realloc(input_tmp, byte_delta + size);
840 if(byte_delta > allocated_for_size - size){
841 allocated_for_size= byte_delta + (int64_t)size;
846 memset(input_tmp, 0, byte_delta);
847 memcpy(input_tmp + byte_delta, buf, size);
851 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
853 }else if(audio_sync_method>1){
854 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
855 av_assert0(ost->audio_resample);
857 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
858 // 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));
859 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
863 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
864 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
866 if (ost->audio_resample) {
868 size_out = audio_resample(ost->resample,
869 (short *)buftmp, (short *)buf,
870 size / (dec->channels * isize));
871 size_out = size_out * enc->channels * osize;
877 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
878 const void *ibuf[6]= {buftmp};
879 void *obuf[6]= {audio_buf};
880 int istride[6]= {isize};
881 int ostride[6]= {osize};
882 int len= size_out/istride[0];
883 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
884 printf("av_audio_convert() failed\n");
890 size_out = len*osize;
893 /* now encode as many frames as possible */
894 if (enc->frame_size > 1) {
895 /* output resampled raw samples */
896 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
897 fprintf(stderr, "av_fifo_realloc2() failed\n");
900 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
902 frame_bytes = enc->frame_size * osize * enc->channels;
904 while (av_fifo_size(ost->fifo) >= frame_bytes) {
906 av_init_packet(&pkt);
908 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
910 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
912 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
915 fprintf(stderr, "Audio encoding failed\n");
919 pkt.stream_index= ost->index;
922 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
923 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
924 pkt.flags |= AV_PKT_FLAG_KEY;
925 write_frame(s, &pkt, enc, ost->bitstream_filters);
927 ost->sync_opts += enc->frame_size;
931 av_init_packet(&pkt);
933 ost->sync_opts += size_out / (osize * enc->channels);
935 /* output a pcm frame */
936 /* determine the size of the coded buffer */
939 size_out = size_out*coded_bps/8;
941 if(size_out > audio_out_size){
942 fprintf(stderr, "Internal error, buffer size too small\n");
946 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
947 ret = avcodec_encode_audio(enc, audio_out, size_out,
950 fprintf(stderr, "Audio encoding failed\n");
954 pkt.stream_index= ost->index;
957 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
958 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
959 pkt.flags |= AV_PKT_FLAG_KEY;
960 write_frame(s, &pkt, enc, ost->bitstream_filters);
964 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
968 AVPicture picture_tmp;
971 dec = ist->st->codec;
973 /* deinterlace : must be done before any resize */
974 if (do_deinterlace) {
977 /* create temporary picture */
978 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
979 buf = av_malloc(size);
983 picture2 = &picture_tmp;
984 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
986 if(avpicture_deinterlace(picture2, picture,
987 dec->pix_fmt, dec->width, dec->height) < 0) {
988 /* if error, do not deinterlace */
989 fprintf(stderr, "Deinterlacing failed\n");
998 if (picture != picture2)
999 *picture = *picture2;
1003 /* we begin to correct av delay at this threshold */
1004 #define AV_DELAY_MAX 0.100
1006 static void do_subtitle_out(AVFormatContext *s,
1007 AVOutputStream *ost,
1012 static uint8_t *subtitle_out = NULL;
1013 int subtitle_out_max_size = 1024 * 1024;
1014 int subtitle_out_size, nb, i;
1015 AVCodecContext *enc;
1018 if (pts == AV_NOPTS_VALUE) {
1019 fprintf(stderr, "Subtitle packets must have a pts\n");
1025 enc = ost->st->codec;
1027 if (!subtitle_out) {
1028 subtitle_out = av_malloc(subtitle_out_max_size);
1031 /* Note: DVB subtitle need one packet to draw them and one other
1032 packet to clear them */
1033 /* XXX: signal it in the codec context ? */
1034 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1039 for(i = 0; i < nb; i++) {
1040 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1041 // start_display_time is required to be 0
1042 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1043 sub->end_display_time -= sub->start_display_time;
1044 sub->start_display_time = 0;
1045 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1046 subtitle_out_max_size, sub);
1047 if (subtitle_out_size < 0) {
1048 fprintf(stderr, "Subtitle encoding failed\n");
1052 av_init_packet(&pkt);
1053 pkt.stream_index = ost->index;
1054 pkt.data = subtitle_out;
1055 pkt.size = subtitle_out_size;
1056 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1057 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1058 /* XXX: the pts correction is handled here. Maybe handling
1059 it in the codec would be better */
1061 pkt.pts += 90 * sub->start_display_time;
1063 pkt.pts += 90 * sub->end_display_time;
1065 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1069 static int bit_buffer_size= 1024*256;
1070 static uint8_t *bit_buffer= NULL;
1072 static void do_video_out(AVFormatContext *s,
1073 AVOutputStream *ost,
1075 AVFrame *in_picture,
1078 int nb_frames, i, ret, resample_changed;
1079 AVFrame *final_picture, *formatted_picture, *resampling_dst;
1080 AVCodecContext *enc, *dec;
1083 enc = ost->st->codec;
1084 dec = ist->st->codec;
1086 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1088 /* by default, we output a single frame */
1093 if(video_sync_method){
1094 double vdelta = sync_ipts - ost->sync_opts;
1095 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1098 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1101 }else if(vdelta>0.6)
1102 ost->sync_opts= lrintf(sync_ipts);
1103 }else if (vdelta > 1.1)
1104 nb_frames = lrintf(vdelta);
1105 //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);
1106 if (nb_frames == 0){
1109 fprintf(stderr, "*** drop!\n");
1110 }else if (nb_frames > 1) {
1111 nb_frames_dup += nb_frames - 1;
1113 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1116 ost->sync_opts= lrintf(sync_ipts);
1118 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1122 formatted_picture = in_picture;
1123 final_picture = formatted_picture;
1124 resampling_dst = &ost->pict_tmp;
1126 resample_changed = ost->resample_width != dec->width ||
1127 ost->resample_height != dec->height ||
1128 ost->resample_pix_fmt != dec->pix_fmt;
1130 if (resample_changed) {
1131 av_log(NULL, AV_LOG_INFO,
1132 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1133 ist->file_index, ist->index,
1134 ost->resample_width, ost->resample_height, avcodec_get_pix_fmt_name(ost->resample_pix_fmt),
1135 dec->width , dec->height , avcodec_get_pix_fmt_name(dec->pix_fmt));
1136 if(!ost->video_resample)
1140 #if !CONFIG_AVFILTER
1141 if (ost->video_resample) {
1142 final_picture = &ost->pict_tmp;
1143 if (resample_changed) {
1144 /* initialize a new scaler context */
1145 sws_freeContext(ost->img_resample_ctx);
1146 ost->img_resample_ctx = sws_getContext(
1147 ist->st->codec->width,
1148 ist->st->codec->height,
1149 ist->st->codec->pix_fmt,
1150 ost->st->codec->width,
1151 ost->st->codec->height,
1152 ost->st->codec->pix_fmt,
1153 ost->sws_flags, NULL, NULL, NULL);
1154 if (ost->img_resample_ctx == NULL) {
1155 fprintf(stderr, "Cannot get resampling context\n");
1159 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1160 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1164 /* duplicates frame if needed */
1165 for(i=0;i<nb_frames;i++) {
1167 av_init_packet(&pkt);
1168 pkt.stream_index= ost->index;
1170 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1171 /* raw pictures are written as AVPicture structure to
1172 avoid any copies. We support temorarily the older
1174 AVFrame* old_frame = enc->coded_frame;
1175 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1176 pkt.data= (uint8_t *)final_picture;
1177 pkt.size= sizeof(AVPicture);
1178 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1179 pkt.flags |= AV_PKT_FLAG_KEY;
1181 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1182 enc->coded_frame = old_frame;
1184 AVFrame big_picture;
1186 big_picture= *final_picture;
1187 /* better than nothing: use input picture interlaced
1189 big_picture.interlaced_frame = in_picture->interlaced_frame;
1190 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1191 if(top_field_first == -1)
1192 big_picture.top_field_first = in_picture->top_field_first;
1194 big_picture.top_field_first = top_field_first;
1197 /* handles sameq here. This is not correct because it may
1198 not be a global option */
1199 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1201 big_picture.pict_type = 0;
1202 // big_picture.pts = AV_NOPTS_VALUE;
1203 big_picture.pts= ost->sync_opts;
1204 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1205 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1206 if (ost->forced_kf_index < ost->forced_kf_count &&
1207 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1208 big_picture.pict_type = AV_PICTURE_TYPE_I;
1209 ost->forced_kf_index++;
1211 ret = avcodec_encode_video(enc,
1212 bit_buffer, bit_buffer_size,
1215 fprintf(stderr, "Video encoding failed\n");
1220 pkt.data= bit_buffer;
1222 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1223 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1224 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1225 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1226 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1228 if(enc->coded_frame->key_frame)
1229 pkt.flags |= AV_PKT_FLAG_KEY;
1230 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1233 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1234 // enc->frame_number-1, ret, enc->pict_type);
1235 /* if two pass, output log */
1236 if (ost->logfile && enc->stats_out) {
1237 fprintf(ost->logfile, "%s", enc->stats_out);
1242 ost->frame_number++;
1246 static double psnr(double d){
1247 return -10.0*log(d)/log(10.0);
1250 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1253 AVCodecContext *enc;
1255 double ti1, bitrate, avg_bitrate;
1257 /* this is executed just the first time do_video_stats is called */
1259 vstats_file = fopen(vstats_filename, "w");
1266 enc = ost->st->codec;
1267 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1268 frame_number = ost->frame_number;
1269 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1270 if (enc->flags&CODEC_FLAG_PSNR)
1271 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1273 fprintf(vstats_file,"f_size= %6d ", frame_size);
1274 /* compute pts value */
1275 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1279 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1280 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1281 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1282 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1283 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1287 static void print_report(AVFormatContext **output_files,
1288 AVOutputStream **ost_table, int nb_ostreams,
1292 AVOutputStream *ost;
1293 AVFormatContext *oc;
1295 AVCodecContext *enc;
1296 int frame_number, vid, i;
1297 double bitrate, ti1, pts;
1298 static int64_t last_time = -1;
1299 static int qp_histogram[52];
1301 if (!is_last_report) {
1303 /* display the report every 0.5 seconds */
1304 cur_time = av_gettime();
1305 if (last_time == -1) {
1306 last_time = cur_time;
1309 if ((cur_time - last_time) < 500000)
1311 last_time = cur_time;
1315 oc = output_files[0];
1317 total_size = avio_size(oc->pb);
1318 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1319 total_size= avio_tell(oc->pb);
1324 for(i=0;i<nb_ostreams;i++) {
1326 enc = ost->st->codec;
1327 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1328 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1329 !ost->st->stream_copy ?
1330 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1332 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1333 float t = (av_gettime()-timer_start) / 1000000.0;
1335 frame_number = ost->frame_number;
1336 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1337 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1338 !ost->st->stream_copy ?
1339 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1341 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1344 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1345 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1348 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1350 if (enc->flags&CODEC_FLAG_PSNR){
1352 double error, error_sum=0;
1353 double scale, scale_sum=0;
1354 char type[3]= {'Y','U','V'};
1355 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1358 error= enc->error[j];
1359 scale= enc->width*enc->height*255.0*255.0*frame_number;
1361 error= enc->coded_frame->error[j];
1362 scale= enc->width*enc->height*255.0*255.0;
1367 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1373 /* compute min output value */
1374 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1375 if ((pts < ti1) && (pts > 0))
1381 if (verbose > 0 || is_last_report) {
1382 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1384 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1385 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1386 (double)total_size / 1024, ti1, bitrate);
1388 if (nb_frames_dup || nb_frames_drop)
1389 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1390 nb_frames_dup, nb_frames_drop);
1393 fprintf(stderr, "%s \r", buf);
1398 if (is_last_report && verbose >= 0){
1399 int64_t raw= audio_size + video_size + extra_size;
1400 fprintf(stderr, "\n");
1401 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1405 100.0*(total_size - raw)/raw
1410 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1412 int fill_char = 0x00;
1413 if (sample_fmt == AV_SAMPLE_FMT_U8)
1415 memset(buf, fill_char, size);
1418 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1419 static int output_packet(AVInputStream *ist, int ist_index,
1420 AVOutputStream **ost_table, int nb_ostreams,
1421 const AVPacket *pkt)
1423 AVFormatContext *os;
1424 AVOutputStream *ost;
1428 void *buffer_to_free = NULL;
1429 static unsigned int samples_size= 0;
1430 AVSubtitle subtitle, *subtitle_to_free;
1431 int64_t pkt_pts = AV_NOPTS_VALUE;
1433 int frame_available;
1437 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1439 if(ist->next_pts == AV_NOPTS_VALUE)
1440 ist->next_pts= ist->pts;
1444 av_init_packet(&avpkt);
1452 if(pkt->dts != AV_NOPTS_VALUE)
1453 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1454 if(pkt->pts != AV_NOPTS_VALUE)
1455 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1457 //while we have more to decode or while the decoder did output something on EOF
1458 while (avpkt.size > 0 || (!pkt && got_output)) {
1459 uint8_t *data_buf, *decoded_data_buf;
1460 int data_size, decoded_data_size;
1462 ist->pts= ist->next_pts;
1464 if(avpkt.size && avpkt.size != pkt->size &&
1465 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1466 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1467 ist->showed_multi_packet_warning=1;
1470 /* decode the packet if needed */
1471 decoded_data_buf = NULL; /* fail safe */
1472 decoded_data_size= 0;
1473 data_buf = avpkt.data;
1474 data_size = avpkt.size;
1475 subtitle_to_free = NULL;
1476 if (ist->decoding_needed) {
1477 switch(ist->st->codec->codec_type) {
1478 case AVMEDIA_TYPE_AUDIO:{
1479 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1480 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1482 samples= av_malloc(samples_size);
1484 decoded_data_size= samples_size;
1485 /* XXX: could avoid copy if PCM 16 bits with same
1486 endianness as CPU */
1487 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1494 got_output = decoded_data_size > 0;
1495 /* Some bug in mpeg audio decoder gives */
1496 /* decoded_data_size < 0, it seems they are overflows */
1498 /* no audio frame */
1501 decoded_data_buf = (uint8_t *)samples;
1502 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1503 (ist->st->codec->sample_rate * ist->st->codec->channels);
1505 case AVMEDIA_TYPE_VIDEO:
1506 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1507 /* XXX: allocate picture correctly */
1508 avcodec_get_frame_defaults(&picture);
1509 avpkt.pts = pkt_pts;
1510 avpkt.dts = ist->pts;
1511 pkt_pts = AV_NOPTS_VALUE;
1513 ret = avcodec_decode_video2(ist->st->codec,
1514 &picture, &got_output, &avpkt);
1515 ist->st->quality= picture.quality;
1519 /* no picture yet */
1520 goto discard_packet;
1522 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1523 if (ist->st->codec->time_base.num != 0) {
1524 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1525 ist->next_pts += ((int64_t)AV_TIME_BASE *
1526 ist->st->codec->time_base.num * ticks) /
1527 ist->st->codec->time_base.den;
1530 buffer_to_free = NULL;
1531 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1533 case AVMEDIA_TYPE_SUBTITLE:
1534 ret = avcodec_decode_subtitle2(ist->st->codec,
1535 &subtitle, &got_output, &avpkt);
1539 goto discard_packet;
1541 subtitle_to_free = &subtitle;
1548 switch(ist->st->codec->codec_type) {
1549 case AVMEDIA_TYPE_AUDIO:
1550 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1551 ist->st->codec->sample_rate;
1553 case AVMEDIA_TYPE_VIDEO:
1554 if (ist->st->codec->time_base.num != 0) {
1555 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1556 ist->next_pts += ((int64_t)AV_TIME_BASE *
1557 ist->st->codec->time_base.num * ticks) /
1558 ist->st->codec->time_base.den;
1567 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1569 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1570 else sar = ist->st->codec->sample_aspect_ratio;
1571 // add it to be filtered
1572 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1578 // preprocess audio (volume)
1579 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1580 if (audio_volume != 256) {
1583 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1584 int v = ((*volp) * audio_volume + 128) >> 8;
1585 if (v < -32768) v = -32768;
1586 if (v > 32767) v = 32767;
1592 /* frame rate emulation */
1594 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1595 int64_t now = av_gettime() - ist->start;
1600 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1601 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1603 /* if output time reached then transcode raw format,
1604 encode packets and output them */
1605 if (start_time == 0 || ist->pts >= start_time)
1607 while (frame_available) {
1608 AVRational ist_pts_tb;
1609 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1610 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1612 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1614 for(i=0;i<nb_ostreams;i++) {
1618 if (ost->source_index == ist_index) {
1619 os = output_files[ost->file_index];
1621 /* set the input output pts pairs */
1622 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1624 if (ost->encoding_needed) {
1625 av_assert0(ist->decoding_needed);
1626 switch(ost->st->codec->codec_type) {
1627 case AVMEDIA_TYPE_AUDIO:
1628 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1630 case AVMEDIA_TYPE_VIDEO:
1632 if (ist->picref->video)
1633 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1635 do_video_out(os, ost, ist, &picture, &frame_size);
1636 if (vstats_filename && frame_size)
1637 do_video_stats(os, ost, frame_size);
1639 case AVMEDIA_TYPE_SUBTITLE:
1640 do_subtitle_out(os, ost, ist, &subtitle,
1647 AVFrame avframe; //FIXME/XXX remove this
1649 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1651 av_init_packet(&opkt);
1653 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1656 /* no reencoding needed : output the packet directly */
1657 /* force the input stream PTS */
1659 avcodec_get_frame_defaults(&avframe);
1660 ost->st->codec->coded_frame= &avframe;
1661 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1663 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1664 audio_size += data_size;
1665 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1666 video_size += data_size;
1670 opkt.stream_index= ost->index;
1671 if(pkt->pts != AV_NOPTS_VALUE)
1672 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1674 opkt.pts= AV_NOPTS_VALUE;
1676 if (pkt->dts == AV_NOPTS_VALUE)
1677 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1679 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1680 opkt.dts -= ost_tb_start_time;
1682 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1683 opkt.flags= pkt->flags;
1685 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1686 if( ost->st->codec->codec_id != CODEC_ID_H264
1687 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1688 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1690 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1691 opkt.destruct= av_destruct_packet;
1693 opkt.data = data_buf;
1694 opkt.size = data_size;
1697 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1698 ost->st->codec->frame_number++;
1699 ost->frame_number++;
1700 av_free_packet(&opkt);
1706 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1707 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1709 avfilter_unref_buffer(ist->picref);
1712 av_free(buffer_to_free);
1713 /* XXX: allocate the subtitles in the codec ? */
1714 if (subtitle_to_free) {
1715 avsubtitle_free(subtitle_to_free);
1716 subtitle_to_free = NULL;
1723 for(i=0;i<nb_ostreams;i++) {
1725 if (ost->source_index == ist_index) {
1726 AVCodecContext *enc= ost->st->codec;
1727 os = output_files[ost->file_index];
1729 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1731 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1734 if (ost->encoding_needed) {
1738 av_init_packet(&pkt);
1739 pkt.stream_index= ost->index;
1741 switch(ost->st->codec->codec_type) {
1742 case AVMEDIA_TYPE_AUDIO:
1743 fifo_bytes = av_fifo_size(ost->fifo);
1745 /* encode any samples remaining in fifo */
1746 if (fifo_bytes > 0) {
1747 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1748 int fs_tmp = enc->frame_size;
1750 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1751 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1752 enc->frame_size = fifo_bytes / (osize * enc->channels);
1754 int frame_bytes = enc->frame_size*osize*enc->channels;
1755 if (allocated_audio_buf_size < frame_bytes)
1757 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1760 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1761 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1762 ost->st->time_base.num, enc->sample_rate);
1763 enc->frame_size = fs_tmp;
1766 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1769 fprintf(stderr, "Audio encoding failed\n");
1773 pkt.flags |= AV_PKT_FLAG_KEY;
1775 case AVMEDIA_TYPE_VIDEO:
1776 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1778 fprintf(stderr, "Video encoding failed\n");
1782 if(enc->coded_frame && enc->coded_frame->key_frame)
1783 pkt.flags |= AV_PKT_FLAG_KEY;
1784 if (ost->logfile && enc->stats_out) {
1785 fprintf(ost->logfile, "%s", enc->stats_out);
1794 pkt.data= bit_buffer;
1796 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1797 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1798 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1810 static void print_sdp(AVFormatContext **avc, int n)
1814 av_sdp_create(avc, n, sdp, sizeof(sdp));
1815 printf("SDP:\n%s\n", sdp);
1819 static int copy_chapters(int infile, int outfile)
1821 AVFormatContext *is = input_files[infile];
1822 AVFormatContext *os = output_files[outfile];
1825 for (i = 0; i < is->nb_chapters; i++) {
1826 AVChapter *in_ch = is->chapters[i], *out_ch;
1827 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1828 AV_TIME_BASE_Q, in_ch->time_base);
1829 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1830 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1833 if (in_ch->end < ts_off)
1835 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1838 out_ch = av_mallocz(sizeof(AVChapter));
1840 return AVERROR(ENOMEM);
1842 out_ch->id = in_ch->id;
1843 out_ch->time_base = in_ch->time_base;
1844 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1845 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1847 if (metadata_chapters_autocopy)
1848 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1851 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1853 return AVERROR(ENOMEM);
1854 os->chapters[os->nb_chapters - 1] = out_ch;
1859 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1860 AVCodecContext *avctx)
1866 for (p = kf; *p; p++)
1869 ost->forced_kf_count = n;
1870 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1871 if (!ost->forced_kf_pts) {
1872 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1875 for (i = 0; i < n; i++) {
1876 p = i ? strchr(p, ',') + 1 : kf;
1877 t = parse_time_or_die("force_key_frames", p, 1);
1878 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1883 * The following code is the main loop of the file converter
1885 static int transcode(AVFormatContext **output_files,
1886 int nb_output_files,
1887 AVFormatContext **input_files,
1889 AVStreamMap *stream_maps, int nb_stream_maps)
1891 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1892 AVFormatContext *is, *os;
1893 AVCodecContext *codec, *icodec;
1894 AVOutputStream *ost, **ost_table = NULL;
1895 AVInputStream *ist, **ist_table = NULL;
1896 AVInputFile *file_table;
1900 uint8_t no_packet[MAX_FILES]={0};
1901 int no_packet_count=0;
1903 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1907 /* input stream init */
1909 for(i=0;i<nb_input_files;i++) {
1910 is = input_files[i];
1911 file_table[i].ist_index = j;
1912 file_table[i].nb_streams = is->nb_streams;
1913 j += is->nb_streams;
1917 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1921 for(i=0;i<nb_istreams;i++) {
1922 ist = av_mallocz(sizeof(AVInputStream));
1928 for(i=0;i<nb_input_files;i++) {
1929 is = input_files[i];
1930 for(k=0;k<is->nb_streams;k++) {
1931 ist = ist_table[j++];
1932 ist->st = is->streams[k];
1933 ist->file_index = i;
1935 ist->discard = 1; /* the stream is discarded by default
1939 ist->start = av_gettime();
1944 /* output stream init */
1946 for(i=0;i<nb_output_files;i++) {
1947 os = output_files[i];
1948 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1949 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1950 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1951 ret = AVERROR(EINVAL);
1954 nb_ostreams += os->nb_streams;
1956 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1957 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1958 ret = AVERROR(EINVAL);
1962 /* Sanity check the mapping args -- do the input files & streams exist? */
1963 for(i=0;i<nb_stream_maps;i++) {
1964 int fi = stream_maps[i].file_index;
1965 int si = stream_maps[i].stream_index;
1967 if (fi < 0 || fi > nb_input_files - 1 ||
1968 si < 0 || si > file_table[fi].nb_streams - 1) {
1969 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1970 ret = AVERROR(EINVAL);
1973 fi = stream_maps[i].sync_file_index;
1974 si = stream_maps[i].sync_stream_index;
1975 if (fi < 0 || fi > nb_input_files - 1 ||
1976 si < 0 || si > file_table[fi].nb_streams - 1) {
1977 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1978 ret = AVERROR(EINVAL);
1983 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1987 for(k=0;k<nb_output_files;k++) {
1988 os = output_files[k];
1989 for(i=0;i<os->nb_streams;i++,n++) {
1991 ost = ost_table[n] = output_streams_for_file[k][i];
1992 ost->st = os->streams[i];
1993 if (nb_stream_maps > 0) {
1994 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1995 stream_maps[n].stream_index;
1997 /* Sanity check that the stream types match */
1998 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1999 int i= ost->file_index;
2000 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2001 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2002 stream_maps[n].file_index, stream_maps[n].stream_index,
2003 ost->file_index, ost->index);
2008 int best_nb_frames=-1;
2009 /* get corresponding input stream index : we select the first one with the right type */
2011 for(j=0;j<nb_istreams;j++) {
2016 AVFormatContext *f= input_files[ ist->file_index ];
2018 for(pi=0; pi<f->nb_programs; pi++){
2019 AVProgram *p= f->programs[pi];
2020 if(p->id == opt_programid)
2021 for(si=0; si<p->nb_stream_indexes; si++){
2022 if(f->streams[ p->stream_index[si] ] == ist->st)
2027 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2028 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2029 if(best_nb_frames < ist->st->codec_info_nb_frames){
2030 best_nb_frames= ist->st->codec_info_nb_frames;
2031 ost->source_index = j;
2038 if(! opt_programid) {
2039 /* try again and reuse existing stream */
2040 for(j=0;j<nb_istreams;j++) {
2042 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2043 && ist->st->discard != AVDISCARD_ALL) {
2044 ost->source_index = j;
2050 int i= ost->file_index;
2051 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2052 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2053 ost->file_index, ost->index);
2058 ist = ist_table[ost->source_index];
2060 ost->sync_ist = (nb_stream_maps > 0) ?
2061 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2062 stream_maps[n].sync_stream_index] : ist;
2066 /* for each output stream, we compute the right encoding parameters */
2067 for(i=0;i<nb_ostreams;i++) {
2069 os = output_files[ost->file_index];
2070 ist = ist_table[ost->source_index];
2072 codec = ost->st->codec;
2073 icodec = ist->st->codec;
2075 if (metadata_streams_autocopy)
2076 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2077 AV_METADATA_DONT_OVERWRITE);
2079 ost->st->disposition = ist->st->disposition;
2080 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2081 codec->chroma_sample_location = icodec->chroma_sample_location;
2083 if (ost->st->stream_copy) {
2084 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2086 if (extra_size > INT_MAX)
2089 /* if stream_copy is selected, no need to decode or encode */
2090 codec->codec_id = icodec->codec_id;
2091 codec->codec_type = icodec->codec_type;
2093 if(!codec->codec_tag){
2094 if( !os->oformat->codec_tag
2095 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2096 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2097 codec->codec_tag = icodec->codec_tag;
2100 codec->bit_rate = icodec->bit_rate;
2101 codec->rc_max_rate = icodec->rc_max_rate;
2102 codec->rc_buffer_size = icodec->rc_buffer_size;
2103 codec->extradata= av_mallocz(extra_size);
2104 if (!codec->extradata)
2106 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2107 codec->extradata_size= icodec->extradata_size;
2108 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){
2109 codec->time_base = icodec->time_base;
2110 codec->time_base.num *= icodec->ticks_per_frame;
2111 av_reduce(&codec->time_base.num, &codec->time_base.den,
2112 codec->time_base.num, codec->time_base.den, INT_MAX);
2114 codec->time_base = ist->st->time_base;
2115 switch(codec->codec_type) {
2116 case AVMEDIA_TYPE_AUDIO:
2117 if(audio_volume != 256) {
2118 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2121 codec->channel_layout = icodec->channel_layout;
2122 codec->sample_rate = icodec->sample_rate;
2123 codec->channels = icodec->channels;
2124 codec->frame_size = icodec->frame_size;
2125 codec->audio_service_type = icodec->audio_service_type;
2126 codec->block_align= icodec->block_align;
2127 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2128 codec->block_align= 0;
2129 if(codec->codec_id == CODEC_ID_AC3)
2130 codec->block_align= 0;
2132 case AVMEDIA_TYPE_VIDEO:
2133 codec->pix_fmt = icodec->pix_fmt;
2134 codec->width = icodec->width;
2135 codec->height = icodec->height;
2136 codec->has_b_frames = icodec->has_b_frames;
2138 case AVMEDIA_TYPE_SUBTITLE:
2139 codec->width = icodec->width;
2140 codec->height = icodec->height;
2142 case AVMEDIA_TYPE_DATA:
2148 switch(codec->codec_type) {
2149 case AVMEDIA_TYPE_AUDIO:
2150 ost->fifo= av_fifo_alloc(1024);
2153 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2154 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2155 icodec->request_channels = codec->channels;
2156 ist->decoding_needed = 1;
2157 ost->encoding_needed = 1;
2158 ost->resample_sample_fmt = icodec->sample_fmt;
2159 ost->resample_sample_rate = icodec->sample_rate;
2160 ost->resample_channels = icodec->channels;
2162 case AVMEDIA_TYPE_VIDEO:
2163 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2164 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2167 ost->video_resample = codec->width != icodec->width ||
2168 codec->height != icodec->height ||
2169 codec->pix_fmt != icodec->pix_fmt;
2170 if (ost->video_resample) {
2171 #if !CONFIG_AVFILTER
2172 avcodec_get_frame_defaults(&ost->pict_tmp);
2173 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2174 codec->width, codec->height)) {
2175 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2178 ost->img_resample_ctx = sws_getContext(
2185 ost->sws_flags, NULL, NULL, NULL);
2186 if (ost->img_resample_ctx == NULL) {
2187 fprintf(stderr, "Cannot get resampling context\n");
2191 codec->bits_per_raw_sample= 0;
2193 ost->resample_height = icodec->height;
2194 ost->resample_width = icodec->width;
2195 ost->resample_pix_fmt= icodec->pix_fmt;
2196 ost->encoding_needed = 1;
2197 ist->decoding_needed = 1;
2200 if (configure_video_filters(ist, ost)) {
2201 fprintf(stderr, "Error opening filters!\n");
2206 case AVMEDIA_TYPE_SUBTITLE:
2207 ost->encoding_needed = 1;
2208 ist->decoding_needed = 1;
2215 if (ost->encoding_needed &&
2216 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2217 char logfilename[1024];
2220 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2221 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2223 if (codec->flags & CODEC_FLAG_PASS1) {
2224 f = fopen(logfilename, "wb");
2226 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2232 size_t logbuffer_size;
2233 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2234 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2237 codec->stats_in = logbuffer;
2241 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2242 int size= codec->width * codec->height;
2243 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2248 bit_buffer = av_malloc(bit_buffer_size);
2250 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2252 ret = AVERROR(ENOMEM);
2256 /* open each encoder */
2257 for(i=0;i<nb_ostreams;i++) {
2259 if (ost->encoding_needed) {
2260 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2261 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2263 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2265 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2266 ost->st->codec->codec_id, ost->file_index, ost->index);
2267 ret = AVERROR(EINVAL);
2270 if (dec->subtitle_header) {
2271 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2272 if (!ost->st->codec->subtitle_header) {
2273 ret = AVERROR(ENOMEM);
2276 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2277 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2279 if (avcodec_open(ost->st->codec, codec) < 0) {
2280 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2281 ost->file_index, ost->index);
2282 ret = AVERROR(EINVAL);
2285 extra_size += ost->st->codec->extradata_size;
2289 /* open each decoder */
2290 for(i=0;i<nb_istreams;i++) {
2292 if (ist->decoding_needed) {
2293 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2295 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2297 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2298 ist->st->codec->codec_id, ist->file_index, ist->index);
2299 ret = AVERROR(EINVAL);
2302 if (avcodec_open(ist->st->codec, codec) < 0) {
2303 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2304 ist->file_index, ist->index);
2305 ret = AVERROR(EINVAL);
2308 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2309 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2314 for(i=0;i<nb_istreams;i++) {
2318 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2319 ist->next_pts = AV_NOPTS_VALUE;
2320 init_pts_correction(&ist->pts_ctx);
2324 /* set meta data information from input file if required */
2325 for (i=0;i<nb_meta_data_maps;i++) {
2326 AVFormatContext *files[2];
2327 AVMetadata **meta[2];
2330 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2331 if ((index) < 0 || (index) >= (nb_elems)) {\
2332 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2334 ret = AVERROR(EINVAL);\
2338 int out_file_index = meta_data_maps[i][0].file;
2339 int in_file_index = meta_data_maps[i][1].file;
2340 if (in_file_index < 0 || out_file_index < 0)
2342 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2343 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2345 files[0] = output_files[out_file_index];
2346 files[1] = input_files[in_file_index];
2348 for (j = 0; j < 2; j++) {
2349 AVMetaDataMap *map = &meta_data_maps[i][j];
2351 switch (map->type) {
2353 meta[j] = &files[j]->metadata;
2356 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2357 meta[j] = &files[j]->streams[map->index]->metadata;
2360 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2361 meta[j] = &files[j]->chapters[map->index]->metadata;
2364 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2365 meta[j] = &files[j]->programs[map->index]->metadata;
2370 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2373 /* copy global metadata by default */
2374 if (metadata_global_autocopy) {
2376 for (i = 0; i < nb_output_files; i++)
2377 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2378 AV_METADATA_DONT_OVERWRITE);
2381 /* copy chapters according to chapter maps */
2382 for (i = 0; i < nb_chapter_maps; i++) {
2383 int infile = chapter_maps[i].in_file;
2384 int outfile = chapter_maps[i].out_file;
2386 if (infile < 0 || outfile < 0)
2388 if (infile >= nb_input_files) {
2389 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2390 ret = AVERROR(EINVAL);
2393 if (outfile >= nb_output_files) {
2394 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2395 ret = AVERROR(EINVAL);
2398 copy_chapters(infile, outfile);
2401 /* copy chapters from the first input file that has them*/
2402 if (!nb_chapter_maps)
2403 for (i = 0; i < nb_input_files; i++) {
2404 if (!input_files[i]->nb_chapters)
2407 for (j = 0; j < nb_output_files; j++)
2408 if ((ret = copy_chapters(i, j)) < 0)
2413 /* open files and write file headers */
2414 for(i=0;i<nb_output_files;i++) {
2415 os = output_files[i];
2416 if (av_write_header(os) < 0) {
2417 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2418 ret = AVERROR(EINVAL);
2421 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2427 /* dump the file output parameters - cannot be done before in case
2429 for(i=0;i<nb_output_files;i++) {
2430 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2433 /* dump the stream mapping */
2435 fprintf(stderr, "Stream mapping:\n");
2436 for(i=0;i<nb_ostreams;i++) {
2438 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2439 ist_table[ost->source_index]->file_index,
2440 ist_table[ost->source_index]->index,
2443 if (ost->sync_ist != ist_table[ost->source_index])
2444 fprintf(stderr, " [sync #%d.%d]",
2445 ost->sync_ist->file_index,
2446 ost->sync_ist->index);
2447 fprintf(stderr, "\n");
2452 fprintf(stderr, "%s\n", error);
2457 print_sdp(output_files, nb_output_files);
2460 if (!using_stdin && verbose >= 0) {
2462 fprintf(stderr, "Press [q] to stop encoding\n");
2464 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2466 avio_set_interrupt_cb(decode_interrupt_cb);
2470 timer_start = av_gettime();
2472 for(; received_sigterm == 0;) {
2473 int file_index, ist_index;
2481 /* if 'q' pressed, exits */
2485 /* read_key() returns 0 on EOF */
2491 /* select the stream that we must read now by looking at the
2492 smallest output pts */
2494 for(i=0;i<nb_ostreams;i++) {
2497 os = output_files[ost->file_index];
2498 ist = ist_table[ost->source_index];
2499 if(ist->is_past_recording_time || no_packet[ist->file_index])
2501 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2502 ipts = (double)ist->pts;
2503 if (!file_table[ist->file_index].eof_reached){
2504 if(ipts < ipts_min) {
2506 if(input_sync ) file_index = ist->file_index;
2508 if(opts < opts_min) {
2510 if(!input_sync) file_index = ist->file_index;
2513 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2518 /* if none, if is finished */
2519 if (file_index < 0) {
2520 if(no_packet_count){
2522 memset(no_packet, 0, sizeof(no_packet));
2529 /* finish if limit size exhausted */
2530 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2533 /* read a frame from it and output it in the fifo */
2534 is = input_files[file_index];
2535 ret= av_read_frame(is, &pkt);
2536 if(ret == AVERROR(EAGAIN)){
2537 no_packet[file_index]=1;
2542 file_table[file_index].eof_reached = 1;
2550 memset(no_packet, 0, sizeof(no_packet));
2553 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2554 is->streams[pkt.stream_index]);
2556 /* the following test is needed in case new streams appear
2557 dynamically in stream : we ignore them */
2558 if (pkt.stream_index >= file_table[file_index].nb_streams)
2559 goto discard_packet;
2560 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2561 ist = ist_table[ist_index];
2563 goto discard_packet;
2565 if (pkt.dts != AV_NOPTS_VALUE)
2566 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2567 if (pkt.pts != AV_NOPTS_VALUE)
2568 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2570 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2571 && input_files_ts_scale[file_index][pkt.stream_index]){
2572 if(pkt.pts != AV_NOPTS_VALUE)
2573 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2574 if(pkt.dts != AV_NOPTS_VALUE)
2575 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2578 // 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);
2579 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2580 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2581 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2582 int64_t delta= pkt_dts - ist->next_pts;
2583 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2584 input_files_ts_offset[ist->file_index]-= delta;
2586 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2587 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2588 if(pkt.pts != AV_NOPTS_VALUE)
2589 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2593 /* finish if recording time exhausted */
2594 if (recording_time != INT64_MAX &&
2595 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2596 ist->is_past_recording_time = 1;
2597 goto discard_packet;
2600 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2601 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2604 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2605 ist->file_index, ist->index);
2608 av_free_packet(&pkt);
2613 av_free_packet(&pkt);
2615 /* dump report by using the output first video and audio streams */
2616 print_report(output_files, ost_table, nb_ostreams, 0);
2619 /* at the end of stream, we must flush the decoder buffers */
2620 for(i=0;i<nb_istreams;i++) {
2622 if (ist->decoding_needed) {
2623 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2629 /* write the trailer if needed and close file */
2630 for(i=0;i<nb_output_files;i++) {
2631 os = output_files[i];
2632 av_write_trailer(os);
2635 /* dump report by using the first video and audio streams */
2636 print_report(output_files, ost_table, nb_ostreams, 1);
2638 /* close each encoder */
2639 for(i=0;i<nb_ostreams;i++) {
2641 if (ost->encoding_needed) {
2642 av_freep(&ost->st->codec->stats_in);
2643 avcodec_close(ost->st->codec);
2647 /* close each decoder */
2648 for(i=0;i<nb_istreams;i++) {
2650 if (ist->decoding_needed) {
2651 avcodec_close(ist->st->codec);
2655 avfilter_graph_free(&graph);
2662 av_freep(&bit_buffer);
2663 av_free(file_table);
2666 for(i=0;i<nb_istreams;i++) {
2673 for(i=0;i<nb_ostreams;i++) {
2676 if (ost->st->stream_copy)
2677 av_freep(&ost->st->codec->extradata);
2679 fclose(ost->logfile);
2680 ost->logfile = NULL;
2682 av_fifo_free(ost->fifo); /* works even if fifo is not
2683 initialized but set to zero */
2684 av_freep(&ost->st->codec->subtitle_header);
2685 av_free(ost->pict_tmp.data[0]);
2686 av_free(ost->forced_kf_pts);
2687 if (ost->video_resample)
2688 sws_freeContext(ost->img_resample_ctx);
2690 audio_resample_close(ost->resample);
2691 if (ost->reformat_ctx)
2692 av_audio_convert_free(ost->reformat_ctx);
2701 static void opt_format(const char *arg)
2703 last_asked_format = arg;
2706 static void opt_video_rc_override_string(const char *arg)
2708 video_rc_override_string = arg;
2711 static int opt_me_threshold(const char *opt, const char *arg)
2713 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2717 static int opt_verbose(const char *opt, const char *arg)
2719 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2723 static int opt_frame_rate(const char *opt, const char *arg)
2725 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2726 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2732 static int opt_bitrate(const char *opt, const char *arg)
2734 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2736 opt_default(opt, arg);
2738 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2739 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2744 static int opt_frame_crop(const char *opt, const char *arg)
2746 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2747 return AVERROR(EINVAL);
2750 static void opt_frame_size(const char *arg)
2752 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2753 fprintf(stderr, "Incorrect frame size\n");
2758 static int opt_pad(const char *opt, const char *arg) {
2759 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2763 static void opt_frame_pix_fmt(const char *arg)
2765 if (strcmp(arg, "list")) {
2766 frame_pix_fmt = av_get_pix_fmt(arg);
2767 if (frame_pix_fmt == PIX_FMT_NONE) {
2768 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2777 static void opt_frame_aspect_ratio(const char *arg)
2784 p = strchr(arg, ':');
2786 x = strtol(arg, &end, 10);
2788 y = strtol(end+1, &end, 10);
2790 ar = (double)x / (double)y;
2792 ar = strtod(arg, NULL);
2795 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2798 frame_aspect_ratio = ar;
2801 x = vfilters ? strlen(vfilters) : 0;
2802 vfilters = av_realloc(vfilters, x+100);
2803 snprintf(vfilters+x, x+100, "%csetdar=%f\n", x?',':' ', ar);
2807 static int opt_metadata(const char *opt, const char *arg)
2809 char *mid= strchr(arg, '=');
2812 fprintf(stderr, "Missing =\n");
2817 av_metadata_set2(&metadata, arg, mid, 0);
2822 static void opt_qscale(const char *arg)
2824 video_qscale = atof(arg);
2825 if (video_qscale <= 0 ||
2826 video_qscale > 255) {
2827 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2832 static void opt_top_field_first(const char *arg)
2834 top_field_first= atoi(arg);
2837 static int opt_thread_count(const char *opt, const char *arg)
2839 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2842 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2847 static void opt_audio_sample_fmt(const char *arg)
2849 if (strcmp(arg, "list")) {
2850 audio_sample_fmt = av_get_sample_fmt(arg);
2851 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2852 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2858 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2859 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2864 static int opt_audio_rate(const char *opt, const char *arg)
2866 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2870 static int opt_audio_channels(const char *opt, const char *arg)
2872 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2876 static void opt_video_channel(const char *arg)
2878 video_channel = strtol(arg, NULL, 0);
2881 static void opt_video_standard(const char *arg)
2883 video_standard = av_strdup(arg);
2886 static void opt_codec(int *pstream_copy, char **pcodec_name,
2887 int codec_type, const char *arg)
2889 av_freep(pcodec_name);
2890 if (!strcmp(arg, "copy")) {
2893 *pcodec_name = av_strdup(arg);
2897 static void opt_audio_codec(const char *arg)
2899 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2902 static void opt_video_codec(const char *arg)
2904 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2907 static void opt_subtitle_codec(const char *arg)
2909 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2912 static void opt_data_codec(const char *arg)
2914 opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2917 static int opt_codec_tag(const char *opt, const char *arg)
2920 uint32_t *codec_tag;
2922 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2923 !strcmp(opt, "vtag") ? &video_codec_tag :
2924 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2928 *codec_tag = strtol(arg, &tail, 0);
2930 *codec_tag = AV_RL32(arg);
2935 static void opt_map(const char *arg)
2940 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2941 m = &stream_maps[nb_stream_maps-1];
2943 m->file_index = strtol(arg, &p, 0);
2947 m->stream_index = strtol(p, &p, 0);
2950 m->sync_file_index = strtol(p, &p, 0);
2953 m->sync_stream_index = strtol(p, &p, 0);
2955 m->sync_file_index = m->file_index;
2956 m->sync_stream_index = m->stream_index;
2960 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
2971 *index = strtol(++arg, endptr, 0);
2974 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2981 static void opt_map_metadata(const char *arg)
2983 AVMetaDataMap *m, *m1;
2986 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2987 &nb_meta_data_maps, nb_meta_data_maps + 1);
2989 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2990 m->file = strtol(arg, &p, 0);
2991 parse_meta_type(p, &m->type, &m->index, &p);
2995 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2996 m1->file = strtol(p, &p, 0);
2997 parse_meta_type(p, &m1->type, &m1->index, &p);
2999 if (m->type == 'g' || m1->type == 'g')
3000 metadata_global_autocopy = 0;
3001 if (m->type == 's' || m1->type == 's')
3002 metadata_streams_autocopy = 0;
3003 if (m->type == 'c' || m1->type == 'c')
3004 metadata_chapters_autocopy = 0;
3007 static void opt_map_meta_data(const char *arg)
3009 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3010 "Use -map_metadata instead.\n");
3011 opt_map_metadata(arg);
3014 static void opt_map_chapters(const char *arg)
3019 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3020 nb_chapter_maps + 1);
3021 c = &chapter_maps[nb_chapter_maps - 1];
3022 c->out_file = strtol(arg, &p, 0);
3026 c->in_file = strtol(p, &p, 0);
3029 static void opt_input_ts_scale(const char *arg)
3031 unsigned int stream;
3035 stream = strtol(arg, &p, 0);
3038 scale= strtod(p, &p);
3040 if(stream >= MAX_STREAMS)
3043 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);
3044 input_files_ts_scale[nb_input_files][stream]= scale;
3047 static int opt_recording_time(const char *opt, const char *arg)
3049 recording_time = parse_time_or_die(opt, arg, 1);
3053 static int opt_start_time(const char *opt, const char *arg)
3055 start_time = parse_time_or_die(opt, arg, 1);
3059 static int opt_recording_timestamp(const char *opt, const char *arg)
3061 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3065 static int opt_input_ts_offset(const char *opt, const char *arg)
3067 input_ts_offset = parse_time_or_die(opt, arg, 1);
3071 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3073 const char *codec_string = encoder ? "encoder" : "decoder";
3077 return CODEC_ID_NONE;
3079 avcodec_find_encoder_by_name(name) :
3080 avcodec_find_decoder_by_name(name);
3082 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3085 if(codec->type != type) {
3086 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3089 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3090 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3091 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3092 "results.\nAdd '-strict experimental' if you want to use it.\n",
3093 codec_string, codec->name);
3095 avcodec_find_encoder(codec->id) :
3096 avcodec_find_decoder(codec->id);
3097 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3098 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3099 codec_string, codec->name);
3105 static void opt_input_file(const char *filename)
3107 AVFormatContext *ic;
3108 AVFormatParameters params, *ap = ¶ms;
3109 AVInputFormat *file_iformat = NULL;
3110 int err, i, ret, rfps, rfps_base;
3113 if (last_asked_format) {
3114 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3115 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3118 last_asked_format = NULL;
3121 if (!strcmp(filename, "-"))
3124 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3125 !strcmp(filename, "/dev/stdin");
3127 /* get default parameters from command line */
3128 ic = avformat_alloc_context();
3130 print_error(filename, AVERROR(ENOMEM));
3134 memset(ap, 0, sizeof(*ap));
3135 ap->prealloced_context = 1;
3136 ap->sample_rate = audio_sample_rate;
3137 ap->channels = audio_channels;
3138 ap->time_base.den = frame_rate.num;
3139 ap->time_base.num = frame_rate.den;
3140 ap->width = frame_width;
3141 ap->height = frame_height;
3142 ap->pix_fmt = frame_pix_fmt;
3143 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3144 ap->channel = video_channel;
3145 ap->standard = video_standard;
3147 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3149 ic->video_codec_id =
3150 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3151 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3152 ic->audio_codec_id =
3153 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3154 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3155 ic->subtitle_codec_id=
3156 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3157 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3158 ic->flags |= AVFMT_FLAG_NONBLOCK;
3160 /* open the input file with generic libav function */
3161 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3163 print_error(filename, err);
3169 for(i=0; i<ic->nb_streams; i++){
3170 ic->streams[i]->discard= AVDISCARD_ALL;
3172 for(i=0; i<ic->nb_programs; i++){
3173 AVProgram *p= ic->programs[i];
3174 if(p->id != opt_programid){
3175 p->discard = AVDISCARD_ALL;
3178 for(j=0; j<p->nb_stream_indexes; j++){
3179 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3184 fprintf(stderr, "Specified program id not found\n");
3190 ic->loop_input = loop_input;
3192 /* If not enough info to get the stream parameters, we decode the
3193 first frames to get it. (used in mpeg case for example) */
3194 ret = av_find_stream_info(ic);
3195 if (ret < 0 && verbose >= 0) {
3196 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3197 av_close_input_file(ic);
3201 timestamp = start_time;
3202 /* add the stream start time */
3203 if (ic->start_time != AV_NOPTS_VALUE)
3204 timestamp += ic->start_time;
3206 /* if seeking requested, we execute it */
3207 if (start_time != 0) {
3208 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3210 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3211 filename, (double)timestamp / AV_TIME_BASE);
3213 /* reset seek info */
3217 /* update the current parameters so that they match the one of the input stream */
3218 for(i=0;i<ic->nb_streams;i++) {
3219 AVStream *st = ic->streams[i];
3220 AVCodecContext *dec = st->codec;
3221 dec->thread_count = thread_count;
3222 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3223 switch (dec->codec_type) {
3224 case AVMEDIA_TYPE_AUDIO:
3225 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3226 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]);
3227 channel_layout = dec->channel_layout;
3228 audio_channels = dec->channels;
3229 audio_sample_rate = dec->sample_rate;
3230 audio_sample_fmt = dec->sample_fmt;
3232 st->discard= AVDISCARD_ALL;
3233 /* Note that av_find_stream_info can add more streams, and we
3234 * currently have no chance of setting up lowres decoding
3235 * early enough for them. */
3237 audio_sample_rate >>= dec->lowres;
3239 case AVMEDIA_TYPE_VIDEO:
3240 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3241 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]);
3242 frame_height = dec->height;
3243 frame_width = dec->width;
3244 if(ic->streams[i]->sample_aspect_ratio.num)
3245 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3247 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3248 frame_aspect_ratio *= (float) dec->width / dec->height;
3249 frame_pix_fmt = dec->pix_fmt;
3250 rfps = ic->streams[i]->r_frame_rate.num;
3251 rfps_base = ic->streams[i]->r_frame_rate.den;
3253 dec->flags |= CODEC_FLAG_EMU_EDGE;
3254 frame_height >>= dec->lowres;
3255 frame_width >>= dec->lowres;
3256 dec->height = frame_height;
3257 dec->width = frame_width;
3260 dec->debug |= FF_DEBUG_MV;
3262 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3265 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3266 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3268 (float)rfps / rfps_base, rfps, rfps_base);
3270 /* update the current frame rate to match the stream frame rate */
3271 frame_rate.num = rfps;
3272 frame_rate.den = rfps_base;
3275 st->discard= AVDISCARD_ALL;
3276 else if(video_discard)
3277 st->discard= video_discard;
3279 case AVMEDIA_TYPE_DATA:
3281 case AVMEDIA_TYPE_SUBTITLE:
3282 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3283 if(subtitle_disable)
3284 st->discard = AVDISCARD_ALL;
3286 case AVMEDIA_TYPE_ATTACHMENT:
3287 case AVMEDIA_TYPE_UNKNOWN:
3294 input_files[nb_input_files] = ic;
3295 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3296 /* dump the file content */
3298 av_dump_format(ic, nb_input_files, filename, 0);
3304 av_freep(&video_codec_name);
3305 av_freep(&audio_codec_name);
3306 av_freep(&subtitle_codec_name);
3311 static void check_inputs(int *has_video_ptr,
3313 int *has_subtitle_ptr,
3316 int has_video, has_audio, has_subtitle, has_data, i, j;
3317 AVFormatContext *ic;
3324 for(j=0;j<nb_input_files;j++) {
3325 ic = input_files[j];
3326 for(i=0;i<ic->nb_streams;i++) {
3327 AVCodecContext *enc = ic->streams[i]->codec;
3328 switch(enc->codec_type) {
3329 case AVMEDIA_TYPE_AUDIO:
3332 case AVMEDIA_TYPE_VIDEO:
3335 case AVMEDIA_TYPE_SUBTITLE:
3338 case AVMEDIA_TYPE_DATA:
3339 case AVMEDIA_TYPE_ATTACHMENT:
3340 case AVMEDIA_TYPE_UNKNOWN:
3348 *has_video_ptr = has_video;
3349 *has_audio_ptr = has_audio;
3350 *has_subtitle_ptr = has_subtitle;
3351 *has_data_ptr = has_data;
3354 static void new_video_stream(AVFormatContext *oc, int file_idx)
3357 AVOutputStream *ost;
3358 AVCodecContext *video_enc;
3359 enum CodecID codec_id = CODEC_ID_NONE;
3360 AVCodec *codec= NULL;
3362 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3364 fprintf(stderr, "Could not alloc stream\n");
3367 ost = new_output_stream(oc, file_idx);
3369 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3370 if(!video_stream_copy){
3371 if (video_codec_name) {
3372 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3373 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3374 codec = avcodec_find_encoder_by_name(video_codec_name);
3375 output_codecs[nb_output_codecs-1] = codec;
3377 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3378 codec = avcodec_find_encoder(codec_id);
3382 avcodec_get_context_defaults3(st->codec, codec);
3383 ost->bitstream_filters = video_bitstream_filters;
3384 video_bitstream_filters= NULL;
3386 st->codec->thread_count= thread_count;
3388 video_enc = st->codec;
3391 video_enc->codec_tag= video_codec_tag;
3393 if( (video_global_header&1)
3394 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3395 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3396 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3398 if(video_global_header&2){
3399 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3400 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3403 if (video_stream_copy) {
3404 st->stream_copy = 1;
3405 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3406 video_enc->sample_aspect_ratio =
3407 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3411 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3413 video_enc->codec_id = codec_id;
3414 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3416 if (codec && codec->supported_framerates && !force_fps)
3417 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3418 video_enc->time_base.den = fps.num;
3419 video_enc->time_base.num = fps.den;
3421 video_enc->width = frame_width;
3422 video_enc->height = frame_height;
3423 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3424 video_enc->pix_fmt = frame_pix_fmt;
3425 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3427 choose_pixel_fmt(st, codec);
3430 video_enc->gop_size = 0;
3431 if (video_qscale || same_quality) {
3432 video_enc->flags |= CODEC_FLAG_QSCALE;
3433 video_enc->global_quality=
3434 st->quality = FF_QP2LAMBDA * video_qscale;
3438 video_enc->intra_matrix = intra_matrix;
3440 video_enc->inter_matrix = inter_matrix;
3442 p= video_rc_override_string;
3445 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3447 fprintf(stderr, "error parsing rc_override\n");
3450 video_enc->rc_override=
3451 av_realloc(video_enc->rc_override,
3452 sizeof(RcOverride)*(i+1));
3453 video_enc->rc_override[i].start_frame= start;
3454 video_enc->rc_override[i].end_frame = end;
3456 video_enc->rc_override[i].qscale= q;
3457 video_enc->rc_override[i].quality_factor= 1.0;
3460 video_enc->rc_override[i].qscale= 0;
3461 video_enc->rc_override[i].quality_factor= -q/100.0;
3466 video_enc->rc_override_count=i;
3467 if (!video_enc->rc_initial_buffer_occupancy)
3468 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3469 video_enc->me_threshold= me_threshold;
3470 video_enc->intra_dc_precision= intra_dc_precision - 8;
3473 video_enc->flags|= CODEC_FLAG_PSNR;
3478 video_enc->flags |= CODEC_FLAG_PASS1;
3480 video_enc->flags |= CODEC_FLAG_PASS2;
3484 if (forced_key_frames)
3485 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3487 if (video_language) {
3488 av_metadata_set2(&st->metadata, "language", video_language, 0);
3489 av_freep(&video_language);
3492 /* reset some key parameters */
3494 av_freep(&video_codec_name);
3495 av_freep(&forced_key_frames);
3496 video_stream_copy = 0;
3497 frame_pix_fmt = PIX_FMT_NONE;
3500 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3503 AVOutputStream *ost;
3504 AVCodec *codec= NULL;
3505 AVCodecContext *audio_enc;
3506 enum CodecID codec_id = CODEC_ID_NONE;
3508 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3510 fprintf(stderr, "Could not alloc stream\n");
3513 ost = new_output_stream(oc, file_idx);
3515 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3516 if(!audio_stream_copy){
3517 if (audio_codec_name) {
3518 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3519 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3520 codec = avcodec_find_encoder_by_name(audio_codec_name);
3521 output_codecs[nb_output_codecs-1] = codec;
3523 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3524 codec = avcodec_find_encoder(codec_id);
3528 avcodec_get_context_defaults3(st->codec, codec);
3530 ost->bitstream_filters = audio_bitstream_filters;
3531 audio_bitstream_filters= NULL;
3533 st->codec->thread_count= thread_count;
3535 audio_enc = st->codec;
3536 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3539 audio_enc->codec_tag= audio_codec_tag;
3541 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3542 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3543 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3545 if (audio_stream_copy) {
3546 st->stream_copy = 1;
3547 audio_enc->channels = audio_channels;
3548 audio_enc->sample_rate = audio_sample_rate;
3550 audio_enc->codec_id = codec_id;
3551 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3553 if (audio_qscale > QSCALE_NONE) {
3554 audio_enc->flags |= CODEC_FLAG_QSCALE;
3555 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3557 audio_enc->channels = audio_channels;
3558 audio_enc->sample_fmt = audio_sample_fmt;
3559 audio_enc->sample_rate = audio_sample_rate;
3560 audio_enc->channel_layout = channel_layout;
3561 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3562 audio_enc->channel_layout = 0;
3563 choose_sample_fmt(st, codec);
3564 choose_sample_rate(st, codec);
3566 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3567 if (audio_language) {
3568 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3569 av_freep(&audio_language);
3572 /* reset some key parameters */
3574 av_freep(&audio_codec_name);
3575 audio_stream_copy = 0;
3578 static void new_data_stream(AVFormatContext *oc, int file_idx)
3581 AVOutputStream *ost;
3582 AVCodec *codec=NULL;
3583 AVCodecContext *data_enc;
3585 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3587 fprintf(stderr, "Could not alloc stream\n");
3590 ost = new_output_stream(oc, file_idx);
3591 data_enc = st->codec;
3592 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3593 if (!data_stream_copy) {
3594 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3597 avcodec_get_context_defaults3(st->codec, codec);
3599 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3602 data_enc->codec_tag= data_codec_tag;
3604 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3605 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3606 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3608 if (data_stream_copy) {
3609 st->stream_copy = 1;
3613 av_freep(&data_codec_name);
3614 data_stream_copy = 0;
3617 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3620 AVOutputStream *ost;
3621 AVCodec *codec=NULL;
3622 AVCodecContext *subtitle_enc;
3623 enum CodecID codec_id = CODEC_ID_NONE;
3625 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3627 fprintf(stderr, "Could not alloc stream\n");
3630 ost = new_output_stream(oc, file_idx);
3631 subtitle_enc = st->codec;
3632 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3633 if(!subtitle_stream_copy){
3634 if (subtitle_codec_name) {
3635 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3636 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3637 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3639 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3640 codec = avcodec_find_encoder(codec_id);
3643 avcodec_get_context_defaults3(st->codec, codec);
3645 ost->bitstream_filters = subtitle_bitstream_filters;
3646 subtitle_bitstream_filters= NULL;
3648 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3650 if(subtitle_codec_tag)
3651 subtitle_enc->codec_tag= subtitle_codec_tag;
3653 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3654 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3655 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3657 if (subtitle_stream_copy) {
3658 st->stream_copy = 1;
3660 subtitle_enc->codec_id = codec_id;
3661 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3664 if (subtitle_language) {
3665 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3666 av_freep(&subtitle_language);
3669 subtitle_disable = 0;
3670 av_freep(&subtitle_codec_name);
3671 subtitle_stream_copy = 0;
3674 static int opt_new_stream(const char *opt, const char *arg)
3676 AVFormatContext *oc;
3677 int file_idx = nb_output_files - 1;
3678 if (nb_output_files <= 0) {
3679 fprintf(stderr, "At least one output file must be specified\n");
3682 oc = output_files[file_idx];
3684 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3685 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3686 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3687 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3692 /* arg format is "output-stream-index:streamid-value". */
3693 static int opt_streamid(const char *opt, const char *arg)
3699 av_strlcpy(idx_str, arg, sizeof(idx_str));
3700 p = strchr(idx_str, ':');
3703 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3708 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3709 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3710 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3714 static void opt_output_file(const char *filename)
3716 AVFormatContext *oc;
3717 int err, use_video, use_audio, use_subtitle, use_data;
3718 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3719 AVFormatParameters params, *ap = ¶ms;
3720 AVOutputFormat *file_oformat;
3722 if (!strcmp(filename, "-"))
3725 oc = avformat_alloc_context();
3727 print_error(filename, AVERROR(ENOMEM));
3731 if (last_asked_format) {
3732 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3733 if (!file_oformat) {
3734 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3737 last_asked_format = NULL;
3739 file_oformat = av_guess_format(NULL, filename, NULL);
3740 if (!file_oformat) {
3741 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3747 oc->oformat = file_oformat;
3748 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3750 if (!strcmp(file_oformat->name, "ffm") &&
3751 av_strstart(filename, "http:", NULL)) {
3752 /* special case for files sent to ffserver: we get the stream
3753 parameters from ffserver */
3754 int err = read_ffserver_streams(oc, filename);
3756 print_error(filename, err);
3760 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3761 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3762 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3763 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 */
3765 /* disable if no corresponding type found and at least one
3767 if (nb_input_files > 0) {
3768 check_inputs(&input_has_video,
3770 &input_has_subtitle,
3773 if (!input_has_video)
3775 if (!input_has_audio)
3777 if (!input_has_subtitle)
3779 if (!input_has_data)
3783 /* manual disable */
3784 if (audio_disable) use_audio = 0;
3785 if (video_disable) use_video = 0;
3786 if (subtitle_disable) use_subtitle = 0;
3787 if (data_disable) use_data = 0;
3789 if (use_video) new_video_stream(oc, nb_output_files);
3790 if (use_audio) new_audio_stream(oc, nb_output_files);
3791 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3792 if (use_data) new_data_stream(oc, nb_output_files);
3794 oc->timestamp = recording_timestamp;
3796 av_metadata_copy(&oc->metadata, metadata, 0);
3797 av_metadata_free(&metadata);
3800 output_files[nb_output_files++] = oc;
3802 /* check filename in case of an image number is expected */
3803 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3804 if (!av_filename_number_test(oc->filename)) {
3805 print_error(oc->filename, AVERROR(EINVAL));
3810 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3811 /* test if it already exists to avoid loosing precious files */
3812 if (!file_overwrite &&
3813 (strchr(filename, ':') == NULL ||
3814 filename[1] == ':' ||
3815 av_strstart(filename, "file:", NULL))) {
3816 if (avio_check(filename, 0) == 0) {
3818 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3820 if (!read_yesno()) {
3821 fprintf(stderr, "Not overwriting - exiting\n");
3826 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3833 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3834 print_error(filename, err);
3839 memset(ap, 0, sizeof(*ap));
3840 if (av_set_parameters(oc, ap) < 0) {
3841 fprintf(stderr, "%s: Invalid encoding parameters\n",
3846 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3847 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3848 oc->loop_output = loop_output;
3849 oc->flags |= AVFMT_FLAG_NONBLOCK;
3851 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3853 av_freep(&forced_key_frames);
3858 /* same option as mencoder */
3859 static void opt_pass(const char *pass_str)
3862 pass = atoi(pass_str);
3863 if (pass != 1 && pass != 2) {
3864 fprintf(stderr, "pass number can be only 1 or 2\n");
3870 static int64_t getutime(void)
3873 struct rusage rusage;
3875 getrusage(RUSAGE_SELF, &rusage);
3876 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3877 #elif HAVE_GETPROCESSTIMES
3879 FILETIME c, e, k, u;
3880 proc = GetCurrentProcess();
3881 GetProcessTimes(proc, &c, &e, &k, &u);
3882 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3884 return av_gettime();
3888 static int64_t getmaxrss(void)
3890 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3891 struct rusage rusage;
3892 getrusage(RUSAGE_SELF, &rusage);
3893 return (int64_t)rusage.ru_maxrss * 1024;
3894 #elif HAVE_GETPROCESSMEMORYINFO
3896 PROCESS_MEMORY_COUNTERS memcounters;
3897 proc = GetCurrentProcess();
3898 memcounters.cb = sizeof(memcounters);
3899 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3900 return memcounters.PeakPagefileUsage;
3906 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3909 const char *p = str;
3916 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3923 static void opt_inter_matrix(const char *arg)
3925 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3926 parse_matrix_coeffs(inter_matrix, arg);
3929 static void opt_intra_matrix(const char *arg)
3931 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3932 parse_matrix_coeffs(intra_matrix, arg);
3935 static void show_usage(void)
3937 printf("Hyper fast Audio and Video encoder\n");
3938 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3942 static void show_help(void)
3945 AVOutputFormat *oformat = NULL;
3947 av_log_set_callback(log_callback_help);
3949 show_help_options(options, "Main options:\n",
3950 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3951 show_help_options(options, "\nAdvanced options:\n",
3952 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3954 show_help_options(options, "\nVideo options:\n",
3955 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3957 show_help_options(options, "\nAdvanced Video options:\n",
3958 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3959 OPT_VIDEO | OPT_EXPERT);
3960 show_help_options(options, "\nAudio options:\n",
3961 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3963 show_help_options(options, "\nAdvanced Audio options:\n",
3964 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3965 OPT_AUDIO | OPT_EXPERT);
3966 show_help_options(options, "\nSubtitle options:\n",
3967 OPT_SUBTITLE | OPT_GRAB,
3969 show_help_options(options, "\nAudio/Video grab options:\n",
3973 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3976 /* individual codec options */
3978 while ((c = av_codec_next(c))) {
3979 if (c->priv_class) {
3980 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3985 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3988 /* individual muxer options */
3989 while ((oformat = av_oformat_next(oformat))) {
3990 if (oformat->priv_class) {
3991 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3996 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3999 static void opt_target(const char *arg)
4001 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4002 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4004 if(!strncmp(arg, "pal-", 4)) {
4007 } else if(!strncmp(arg, "ntsc-", 5)) {
4010 } else if(!strncmp(arg, "film-", 5)) {
4015 /* Calculate FR via float to avoid int overflow */
4016 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4019 } else if((fr == 29970) || (fr == 23976)) {
4022 /* Try to determine PAL/NTSC by peeking in the input files */
4023 if(nb_input_files) {
4025 for(j = 0; j < nb_input_files; j++) {
4026 for(i = 0; i < input_files[j]->nb_streams; i++) {
4027 AVCodecContext *c = input_files[j]->streams[i]->codec;
4028 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4030 fr = c->time_base.den * 1000 / c->time_base.num;
4034 } else if((fr == 29970) || (fr == 23976)) {
4044 if(verbose > 0 && norm != UNKNOWN)
4045 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4048 if(norm == UNKNOWN) {
4049 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4050 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4051 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4055 if(!strcmp(arg, "vcd")) {
4057 opt_video_codec("mpeg1video");
4058 opt_audio_codec("mp2");
4061 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4062 opt_frame_rate(NULL, frame_rates[norm]);
4063 opt_default("g", norm == PAL ? "15" : "18");
4065 opt_default("b", "1150000");
4066 opt_default("maxrate", "1150000");
4067 opt_default("minrate", "1150000");
4068 opt_default("bufsize", "327680"); // 40*1024*8;
4070 opt_default("ab", "224000");
4071 audio_sample_rate = 44100;
4074 opt_default("packetsize", "2324");
4075 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4077 /* We have to offset the PTS, so that it is consistent with the SCR.
4078 SCR starts at 36000, but the first two packs contain only padding
4079 and the first pack from the other stream, respectively, may also have
4080 been written before.
4081 So the real data starts at SCR 36000+3*1200. */
4082 mux_preload= (36000+3*1200) / 90000.0; //0.44
4083 } else if(!strcmp(arg, "svcd")) {
4085 opt_video_codec("mpeg2video");
4086 opt_audio_codec("mp2");
4089 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4090 opt_frame_rate(NULL, frame_rates[norm]);
4091 opt_default("g", norm == PAL ? "15" : "18");
4093 opt_default("b", "2040000");
4094 opt_default("maxrate", "2516000");
4095 opt_default("minrate", "0"); //1145000;
4096 opt_default("bufsize", "1835008"); //224*1024*8;
4097 opt_default("flags", "+scan_offset");
4100 opt_default("ab", "224000");
4101 audio_sample_rate = 44100;
4103 opt_default("packetsize", "2324");
4105 } else if(!strcmp(arg, "dvd")) {
4107 opt_video_codec("mpeg2video");
4108 opt_audio_codec("ac3");
4111 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4112 opt_frame_rate(NULL, frame_rates[norm]);
4113 opt_default("g", norm == PAL ? "15" : "18");
4115 opt_default("b", "6000000");
4116 opt_default("maxrate", "9000000");
4117 opt_default("minrate", "0"); //1500000;
4118 opt_default("bufsize", "1835008"); //224*1024*8;
4120 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4121 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4123 opt_default("ab", "448000");
4124 audio_sample_rate = 48000;
4126 } else if(!strncmp(arg, "dv", 2)) {
4130 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4131 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4132 (norm == PAL ? "yuv420p" : "yuv411p"));
4133 opt_frame_rate(NULL, frame_rates[norm]);
4135 audio_sample_rate = 48000;
4139 fprintf(stderr, "Unknown target: %s\n", arg);
4144 static void opt_vstats_file (const char *arg)
4146 av_free (vstats_filename);
4147 vstats_filename=av_strdup (arg);
4150 static void opt_vstats (void)
4153 time_t today2 = time(NULL);
4154 struct tm *today = localtime(&today2);
4156 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4158 opt_vstats_file(filename);
4161 static int opt_bsf(const char *opt, const char *arg)
4163 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4164 AVBitStreamFilterContext **bsfp;
4167 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4171 bsfp= *opt == 'v' ? &video_bitstream_filters :
4172 *opt == 'a' ? &audio_bitstream_filters :
4173 &subtitle_bitstream_filters;
4175 bsfp= &(*bsfp)->next;
4182 static int opt_preset(const char *opt, const char *arg)
4185 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4186 char *codec_name = *opt == 'v' ? video_codec_name :
4187 *opt == 'a' ? audio_codec_name :
4188 subtitle_codec_name;
4190 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4191 fprintf(stderr, "File for preset '%s' not found\n", arg);
4196 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4197 if(line[0] == '#' && !e)
4199 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4201 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4204 if(!strcmp(tmp, "acodec")){
4205 opt_audio_codec(tmp2);
4206 }else if(!strcmp(tmp, "vcodec")){
4207 opt_video_codec(tmp2);
4208 }else if(!strcmp(tmp, "scodec")){
4209 opt_subtitle_codec(tmp2);
4210 }else if(!strcmp(tmp, "dcodec")){
4211 opt_data_codec(tmp2);
4212 }else if(opt_default(tmp, tmp2) < 0){
4213 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4223 static const OptionDef options[] = {
4225 #include "cmdutils_common_opts.h"
4226 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4227 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4228 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4229 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4230 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4231 "outfile[,metadata]:infile[,metadata]" },
4232 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4233 "outfile[,metadata]:infile[,metadata]" },
4234 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4235 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4236 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4237 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4238 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4239 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4240 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4241 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4242 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4243 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4244 "add timings for benchmarking" },
4245 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4246 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4247 "dump each input packet" },
4248 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4249 "when dumping packets, also dump the payload" },
4250 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4251 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4252 { "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)", "" },
4253 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4254 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4255 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4256 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4257 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4258 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4259 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4260 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4261 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4262 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4263 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4264 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4265 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4266 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4269 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4270 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4271 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4272 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4273 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4274 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4275 { "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" },
4276 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4277 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4278 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4279 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4280 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4281 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4282 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4283 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4284 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4285 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4286 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4287 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4288 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4289 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4290 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4291 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4292 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4293 "use same quantizer as source (implies VBR)" },
4294 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4295 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4296 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4297 "deinterlace pictures" },
4298 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4299 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4300 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4302 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4304 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4305 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4306 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4307 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4308 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4309 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4310 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4311 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4312 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4313 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4314 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4317 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4318 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4319 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4320 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4321 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4322 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4323 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4324 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4325 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4326 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4327 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4328 { "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" },
4330 /* subtitle options */
4331 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4332 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4333 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4334 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4335 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4338 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4339 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4340 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4343 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4344 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4346 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4347 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4348 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4350 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4351 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4352 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4353 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4354 /* data codec support */
4355 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4357 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4361 int main(int argc, char **argv)
4365 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4367 avcodec_register_all();
4369 avdevice_register_all();
4372 avfilter_register_all();
4377 if(isatty(STDIN_FILENO))
4378 avio_set_interrupt_cb(decode_interrupt_cb);
4386 parse_options(argc, argv, options, opt_output_file);
4388 if(nb_output_files <= 0 && nb_input_files == 0) {
4390 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4394 /* file converter / grab */
4395 if (nb_output_files <= 0) {
4396 fprintf(stderr, "At least one output file must be specified\n");
4400 if (nb_input_files == 0) {
4401 fprintf(stderr, "At least one input file must be specified\n");
4406 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4407 stream_maps, nb_stream_maps) < 0)
4409 ti = getutime() - ti;
4411 int maxrss = getmaxrss() / 1024;
4412 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4415 return ffmpeg_exit(0);