3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "FFmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #if !FF_API_MAX_STREAMS
115 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
118 static const char *last_asked_format = NULL;
119 static AVFormatContext *input_files[MAX_FILES];
120 static int64_t input_files_ts_offset[MAX_FILES];
121 static double *input_files_ts_scale[MAX_FILES] = {NULL};
122 static AVCodec **input_codecs = NULL;
123 static int nb_input_files = 0;
124 static int nb_input_codecs = 0;
125 static int nb_input_files_ts_scale[MAX_FILES] = {0};
127 static AVFormatContext *output_files[MAX_FILES];
128 static AVCodec **output_codecs = NULL;
129 static int nb_output_files = 0;
130 static int nb_output_codecs = 0;
132 static AVStreamMap *stream_maps = NULL;
133 static int nb_stream_maps;
135 /* first item specifies output metadata, second is input */
136 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
137 static int nb_meta_data_maps;
138 static int metadata_global_autocopy = 1;
139 static int metadata_streams_autocopy = 1;
140 static int metadata_chapters_autocopy = 1;
142 static AVChapterMap *chapter_maps = NULL;
143 static int nb_chapter_maps;
145 /* indexed by output file stream index */
146 static int *streamid_map = NULL;
147 static int nb_streamid_map = 0;
149 static int frame_width = 0;
150 static int frame_height = 0;
151 static float frame_aspect_ratio = 0;
152 static int frame_aspect_ratio_override = 0;
153 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
154 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
155 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
156 static AVRational frame_rate;
157 static float video_qscale = 0;
158 static uint16_t *intra_matrix = NULL;
159 static uint16_t *inter_matrix = NULL;
160 static const char *video_rc_override_string=NULL;
161 static int video_disable = 0;
162 static int video_discard = 0;
163 static char *video_codec_name = NULL;
164 static unsigned int video_codec_tag = 0;
165 static char *video_language = NULL;
166 static int same_quality = 0;
167 static int do_deinterlace = 0;
168 static int top_field_first = -1;
169 static int me_threshold = 0;
170 static int intra_dc_precision = 8;
171 static int loop_input = 0;
172 static int loop_output = AVFMT_NOOUTPUTLOOP;
173 static int qp_hist = 0;
175 static char *vfilters = NULL;
177 static unsigned int sws_flags = SWS_BICUBIC;
180 static int intra_only = 0;
181 static int audio_sample_rate = 44100;
182 static int64_t channel_layout = 0;
183 #define QSCALE_NONE -99999
184 static float audio_qscale = QSCALE_NONE;
185 static int audio_disable = 0;
186 static int audio_channels = 1;
187 static char *audio_codec_name = NULL;
188 static unsigned int audio_codec_tag = 0;
189 static char *audio_language = NULL;
191 static int subtitle_disable = 0;
192 static char *subtitle_codec_name = NULL;
193 static char *subtitle_language = NULL;
194 static unsigned int subtitle_codec_tag = 0;
196 static float mux_preload= 0.5;
197 static float mux_max_delay= 0.7;
199 static int64_t recording_time = INT64_MAX;
200 static int64_t start_time = 0;
201 static int64_t recording_timestamp = 0;
202 static int64_t input_ts_offset = 0;
203 static int file_overwrite = 0;
204 static AVMetadata *metadata;
205 static int do_benchmark = 0;
206 static int do_hex_dump = 0;
207 static int do_pkt_dump = 0;
208 static int do_psnr = 0;
209 static int do_pass = 0;
210 static char *pass_logfilename_prefix = NULL;
211 static int audio_stream_copy = 0;
212 static int video_stream_copy = 0;
213 static int subtitle_stream_copy = 0;
214 static int video_sync_method= -1;
215 static int audio_sync_method= 0;
216 static float audio_drift_threshold= 0.1;
217 static int copy_ts= 0;
219 static int opt_shortest = 0;
220 static int video_global_header = 0;
221 static char *vstats_filename;
222 static FILE *vstats_file;
223 static int opt_programid = 0;
224 static int copy_initial_nonkeyframes = 0;
226 static int rate_emu = 0;
228 static int video_channel = 0;
229 static char *video_standard;
231 static int audio_volume = 256;
233 static int exit_on_error = 0;
234 static int using_stdin = 0;
235 static int verbose = 1;
236 static int thread_count= 1;
237 static int q_pressed = 0;
238 static int64_t video_size = 0;
239 static int64_t audio_size = 0;
240 static int64_t extra_size = 0;
241 static int nb_frames_dup = 0;
242 static int nb_frames_drop = 0;
243 static int input_sync;
244 static uint64_t limit_filesize = 0;
245 static int force_fps = 0;
246 static char *forced_key_frames = NULL;
248 static float dts_delta_threshold = 10;
250 static int64_t timer_start;
252 static uint8_t *audio_buf;
253 static uint8_t *audio_out;
254 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
256 static short *samples;
258 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
259 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
260 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
262 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
264 struct AVInputStream;
266 typedef struct AVOutputStream {
267 int file_index; /* file index */
268 int index; /* stream index in the output file */
269 int source_index; /* AVInputStream index */
270 AVStream *st; /* stream in the output file */
271 int encoding_needed; /* true if encoding needed for this stream */
273 /* input pts and corresponding output pts
275 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
276 struct AVInputStream *sync_ist; /* input stream to sync against */
277 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
278 AVBitStreamFilterContext *bitstream_filters;
281 AVFrame pict_tmp; /* temporary image for resampling */
282 struct SwsContext *img_resample_ctx; /* for image resampling */
285 int resample_pix_fmt;
287 /* full frame size of first frame */
291 /* forced key frames */
292 int64_t *forced_kf_pts;
298 ReSampleContext *resample; /* for audio resampling */
299 int resample_sample_fmt;
300 int resample_channels;
301 int resample_sample_rate;
303 AVAudioConvert *reformat_ctx;
304 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
308 AVFilterContext *output_video_filter;
309 AVFilterContext *input_video_filter;
310 AVFilterBufferRef *picref;
312 AVFilterGraph *graph;
316 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
317 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
319 typedef struct AVInputStream {
323 int discard; /* true if stream data should be discarded */
324 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
325 int64_t sample_index; /* current sample */
327 int64_t start; /* time when read started */
328 int64_t next_pts; /* synthetic pts for cases where pkt.pts
330 int64_t pts; /* current pts */
331 int is_start; /* is 1 at the start and after a discontinuity */
332 int showed_multi_packet_warning;
333 int is_past_recording_time;
335 AVFrame *filter_frame;
336 int has_filter_frame;
340 typedef struct AVInputFile {
341 int eof_reached; /* true if eof reached */
342 int ist_index; /* index of first stream in ist_table */
343 int buffer_size; /* current total buffer size */
344 int nb_streams; /* nb streams we are aware of */
349 /* init terminal so that we can grab keys */
350 static struct termios oldtty;
355 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
357 AVFilterContext *last_filter, *filter;
358 /** filter graph containing all filters including input & output */
359 AVCodecContext *codec = ost->st->codec;
360 AVCodecContext *icodec = ist->st->codec;
361 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
362 AVRational sample_aspect_ratio;
366 ost->graph = avfilter_graph_alloc();
368 if (ist->st->sample_aspect_ratio.num){
369 sample_aspect_ratio = ist->st->sample_aspect_ratio;
371 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
373 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
374 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
375 sample_aspect_ratio.num, sample_aspect_ratio.den);
377 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
378 "src", args, NULL, ost->graph);
381 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
382 "out", NULL, &ffsink_ctx, ost->graph);
385 last_filter = ost->input_video_filter;
387 if (codec->width != icodec->width || codec->height != icodec->height) {
388 snprintf(args, 255, "%d:%d:flags=0x%X",
391 (int)av_get_int(sws_opts, "sws_flags", NULL));
392 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
393 NULL, args, NULL, ost->graph)) < 0)
395 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
397 last_filter = filter;
400 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
401 ost->graph->scale_sws_opts = av_strdup(args);
404 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
405 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
407 outputs->name = av_strdup("in");
408 outputs->filter_ctx = last_filter;
409 outputs->pad_idx = 0;
410 outputs->next = NULL;
412 inputs->name = av_strdup("out");
413 inputs->filter_ctx = ost->output_video_filter;
417 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
419 av_freep(&ost->avfilter);
421 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
425 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
428 codec->width = ost->output_video_filter->inputs[0]->w;
429 codec->height = ost->output_video_filter->inputs[0]->h;
430 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
431 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
435 #endif /* CONFIG_AVFILTER */
437 static void term_exit(void)
439 av_log(NULL, AV_LOG_QUIET, "");
441 tcsetattr (0, TCSANOW, &oldtty);
445 static volatile int received_sigterm = 0;
448 sigterm_handler(int sig)
450 received_sigterm = sig;
455 static void term_init(void)
464 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
465 |INLCR|IGNCR|ICRNL|IXON);
466 tty.c_oflag |= OPOST;
467 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
468 tty.c_cflag &= ~(CSIZE|PARENB);
473 tcsetattr (0, TCSANOW, &tty);
474 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
477 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
478 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
480 signal(SIGXCPU, sigterm_handler);
484 /* read a key without blocking */
485 static int read_key(void)
497 n = select(1, &rfds, NULL, NULL, &tv);
512 static int decode_interrupt_cb(void)
514 q_pressed += read_key() == 'q';
515 return q_pressed > 1;
518 static int ffmpeg_exit(int ret)
523 for(i=0;i<nb_output_files;i++) {
524 AVFormatContext *s = output_files[i];
525 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
527 avformat_free_context(s);
528 av_free(output_streams_for_file[i]);
530 for(i=0;i<nb_input_files;i++) {
531 av_close_input_file(input_files[i]);
532 av_free(input_files_ts_scale[i]);
535 av_free(intra_matrix);
536 av_free(inter_matrix);
540 av_free(vstats_filename);
542 av_free(streamid_map);
543 av_free(input_codecs);
544 av_free(output_codecs);
545 av_free(stream_maps);
546 av_free(meta_data_maps);
548 av_free(video_codec_name);
549 av_free(audio_codec_name);
550 av_free(subtitle_codec_name);
552 av_free(video_standard);
557 allocated_audio_buf_size= allocated_audio_out_size= 0;
564 if (received_sigterm) {
566 "Received signal %d: terminating.\n",
567 (int) received_sigterm);
571 exit(ret); /* not all OS-es handle main() return value */
575 /* similar to ff_dynarray_add() and av_fast_realloc() */
576 static void *grow_array(void *array, int elem_size, int *size, int new_size)
578 if (new_size >= INT_MAX / elem_size) {
579 fprintf(stderr, "Array too big.\n");
582 if (*size < new_size) {
583 uint8_t *tmp = av_realloc(array, new_size*elem_size);
585 fprintf(stderr, "Could not alloc buffer.\n");
588 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
595 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
597 if(codec && codec->sample_fmts){
598 const enum AVSampleFormat *p= codec->sample_fmts;
600 if(*p == st->codec->sample_fmt)
604 av_log(NULL, AV_LOG_WARNING,
605 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
606 av_get_sample_fmt_name(st->codec->sample_fmt),
608 av_get_sample_fmt_name(codec->sample_fmts[0]));
609 st->codec->sample_fmt = codec->sample_fmts[0];
614 static void choose_sample_rate(AVStream *st, AVCodec *codec)
616 if(codec && codec->supported_samplerates){
617 const int *p= codec->supported_samplerates;
619 int best_dist=INT_MAX;
621 int dist= abs(st->codec->sample_rate - *p);
622 if(dist < best_dist){
628 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
630 st->codec->sample_rate= best;
634 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
636 if(codec && codec->pix_fmts){
637 const enum PixelFormat *p= codec->pix_fmts;
638 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
639 if(st->codec->codec_id==CODEC_ID_MJPEG){
640 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
641 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
642 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};
646 if(*p == st->codec->pix_fmt)
650 av_log(NULL, AV_LOG_WARNING,
651 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
652 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
654 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
655 st->codec->pix_fmt = codec->pix_fmts[0];
660 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
662 int idx = oc->nb_streams - 1;
665 output_streams_for_file[file_idx] =
666 grow_array(output_streams_for_file[file_idx],
667 sizeof(*output_streams_for_file[file_idx]),
668 &nb_output_streams_for_file[file_idx],
670 ost = output_streams_for_file[file_idx][idx] =
671 av_mallocz(sizeof(AVOutputStream));
673 fprintf(stderr, "Could not alloc output stream\n");
676 ost->file_index = file_idx;
681 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
687 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
690 /* copy stream format */
692 for(i=0;i<ic->nb_streams;i++) {
698 // FIXME: a more elegant solution is needed
699 st = av_mallocz(sizeof(AVStream));
700 memcpy(st, ic->streams[i], sizeof(AVStream));
701 st->codec = avcodec_alloc_context();
703 print_error(filename, AVERROR(ENOMEM));
706 avcodec_copy_context(st->codec, ic->streams[i]->codec);
709 codec = avcodec_find_encoder(st->codec->codec_id);
710 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
711 if (audio_stream_copy) {
714 choose_sample_fmt(st, codec);
715 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
716 if (video_stream_copy) {
719 choose_pixel_fmt(st, codec);
722 if(st->codec->flags & CODEC_FLAG_BITEXACT)
725 new_output_stream(s, nb_output_files);
729 s->timestamp = av_gettime();
731 av_close_input_file(ic);
736 get_sync_ipts(const AVOutputStream *ost)
738 const AVInputStream *ist = ost->sync_ist;
739 return (double)(ist->pts - start_time)/AV_TIME_BASE;
742 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
746 AVPacket new_pkt= *pkt;
747 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
748 &new_pkt.data, &new_pkt.size,
749 pkt->data, pkt->size,
750 pkt->flags & AV_PKT_FLAG_KEY);
753 new_pkt.destruct= av_destruct_packet;
755 fprintf(stderr, "%s failed for stream %d, codec %s",
756 bsfc->filter->name, pkt->stream_index,
757 avctx->codec ? avctx->codec->name : "copy");
767 ret= av_interleaved_write_frame(s, pkt);
769 print_error("av_interleaved_write_frame()", ret);
774 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
776 static void do_audio_out(AVFormatContext *s,
779 unsigned char *buf, int size)
782 int64_t audio_out_size, audio_buf_size;
783 int64_t allocated_for_size= size;
785 int size_out, frame_bytes, ret, resample_changed;
786 AVCodecContext *enc= ost->st->codec;
787 AVCodecContext *dec= ist->st->codec;
788 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
789 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
790 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
793 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
794 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
795 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
796 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
797 audio_buf_size*= osize*enc->channels;
799 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
800 if(coded_bps > 8*osize)
801 audio_out_size= audio_out_size * coded_bps / (8*osize);
802 audio_out_size += FF_MIN_BUFFER_SIZE;
804 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
805 fprintf(stderr, "Buffer sizes too large\n");
809 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
810 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
811 if (!audio_buf || !audio_out){
812 fprintf(stderr, "Out of memory in do_audio_out\n");
816 if (enc->channels != dec->channels)
817 ost->audio_resample = 1;
819 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
820 ost->resample_channels != dec->channels ||
821 ost->resample_sample_rate != dec->sample_rate;
823 if ((ost->audio_resample && !ost->resample) || resample_changed) {
824 if (resample_changed) {
825 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",
826 ist->file_index, ist->index,
827 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
828 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
829 ost->resample_sample_fmt = dec->sample_fmt;
830 ost->resample_channels = dec->channels;
831 ost->resample_sample_rate = dec->sample_rate;
833 audio_resample_close(ost->resample);
835 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
836 if (audio_sync_method <= 1 &&
837 ost->resample_sample_fmt == enc->sample_fmt &&
838 ost->resample_channels == enc->channels &&
839 ost->resample_sample_rate == enc->sample_rate) {
840 ost->resample = NULL;
841 ost->audio_resample = 0;
843 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
844 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
845 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
846 enc->sample_rate, dec->sample_rate,
847 enc->sample_fmt, dec->sample_fmt,
849 if (!ost->resample) {
850 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
851 dec->channels, dec->sample_rate,
852 enc->channels, enc->sample_rate);
858 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
859 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
860 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
861 if (ost->reformat_ctx)
862 av_audio_convert_free(ost->reformat_ctx);
863 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
864 dec->sample_fmt, 1, NULL, 0);
865 if (!ost->reformat_ctx) {
866 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
867 av_get_sample_fmt_name(dec->sample_fmt),
868 av_get_sample_fmt_name(enc->sample_fmt));
871 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
874 if(audio_sync_method){
875 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
876 - av_fifo_size(ost->fifo)/(enc->channels * 2);
877 double idelta= delta*dec->sample_rate / enc->sample_rate;
878 int byte_delta= ((int)idelta)*2*dec->channels;
880 //FIXME resample delay
881 if(fabs(delta) > 50){
882 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
884 byte_delta= FFMAX(byte_delta, -size);
888 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
893 static uint8_t *input_tmp= NULL;
894 input_tmp= av_realloc(input_tmp, byte_delta + size);
896 if(byte_delta > allocated_for_size - size){
897 allocated_for_size= byte_delta + (int64_t)size;
902 memset(input_tmp, 0, byte_delta);
903 memcpy(input_tmp + byte_delta, buf, size);
907 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
909 }else if(audio_sync_method>1){
910 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
911 av_assert0(ost->audio_resample);
913 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
914 // 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));
915 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
919 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
920 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
922 if (ost->audio_resample) {
924 size_out = audio_resample(ost->resample,
925 (short *)buftmp, (short *)buf,
926 size / (dec->channels * isize));
927 size_out = size_out * enc->channels * osize;
933 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
934 const void *ibuf[6]= {buftmp};
935 void *obuf[6]= {audio_buf};
936 int istride[6]= {isize};
937 int ostride[6]= {osize};
938 int len= size_out/istride[0];
939 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
940 printf("av_audio_convert() failed\n");
946 size_out = len*osize;
949 /* now encode as many frames as possible */
950 if (enc->frame_size > 1) {
951 /* output resampled raw samples */
952 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
953 fprintf(stderr, "av_fifo_realloc2() failed\n");
956 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
958 frame_bytes = enc->frame_size * osize * enc->channels;
960 while (av_fifo_size(ost->fifo) >= frame_bytes) {
962 av_init_packet(&pkt);
964 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
966 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
968 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
971 fprintf(stderr, "Audio encoding failed\n");
975 pkt.stream_index= ost->index;
978 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
979 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
980 pkt.flags |= AV_PKT_FLAG_KEY;
981 write_frame(s, &pkt, enc, ost->bitstream_filters);
983 ost->sync_opts += enc->frame_size;
987 av_init_packet(&pkt);
989 ost->sync_opts += size_out / (osize * enc->channels);
991 /* output a pcm frame */
992 /* determine the size of the coded buffer */
995 size_out = size_out*coded_bps/8;
997 if(size_out > audio_out_size){
998 fprintf(stderr, "Internal error, buffer size too small\n");
1002 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1003 ret = avcodec_encode_audio(enc, audio_out, size_out,
1006 fprintf(stderr, "Audio encoding failed\n");
1010 pkt.stream_index= ost->index;
1011 pkt.data= audio_out;
1013 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1014 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1015 pkt.flags |= AV_PKT_FLAG_KEY;
1016 write_frame(s, &pkt, enc, ost->bitstream_filters);
1020 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1022 AVCodecContext *dec;
1023 AVPicture *picture2;
1024 AVPicture picture_tmp;
1027 dec = ist->st->codec;
1029 /* deinterlace : must be done before any resize */
1030 if (do_deinterlace) {
1033 /* create temporary picture */
1034 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1035 buf = av_malloc(size);
1039 picture2 = &picture_tmp;
1040 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1042 if(avpicture_deinterlace(picture2, picture,
1043 dec->pix_fmt, dec->width, dec->height) < 0) {
1044 /* if error, do not deinterlace */
1045 fprintf(stderr, "Deinterlacing failed\n");
1054 if (picture != picture2)
1055 *picture = *picture2;
1059 /* we begin to correct av delay at this threshold */
1060 #define AV_DELAY_MAX 0.100
1062 static void do_subtitle_out(AVFormatContext *s,
1063 AVOutputStream *ost,
1068 static uint8_t *subtitle_out = NULL;
1069 int subtitle_out_max_size = 1024 * 1024;
1070 int subtitle_out_size, nb, i;
1071 AVCodecContext *enc;
1074 if (pts == AV_NOPTS_VALUE) {
1075 fprintf(stderr, "Subtitle packets must have a pts\n");
1081 enc = ost->st->codec;
1083 if (!subtitle_out) {
1084 subtitle_out = av_malloc(subtitle_out_max_size);
1087 /* Note: DVB subtitle need one packet to draw them and one other
1088 packet to clear them */
1089 /* XXX: signal it in the codec context ? */
1090 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1095 for(i = 0; i < nb; i++) {
1096 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1097 // start_display_time is required to be 0
1098 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1099 sub->end_display_time -= sub->start_display_time;
1100 sub->start_display_time = 0;
1101 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1102 subtitle_out_max_size, sub);
1103 if (subtitle_out_size < 0) {
1104 fprintf(stderr, "Subtitle encoding failed\n");
1108 av_init_packet(&pkt);
1109 pkt.stream_index = ost->index;
1110 pkt.data = subtitle_out;
1111 pkt.size = subtitle_out_size;
1112 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1113 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1114 /* XXX: the pts correction is handled here. Maybe handling
1115 it in the codec would be better */
1117 pkt.pts += 90 * sub->start_display_time;
1119 pkt.pts += 90 * sub->end_display_time;
1121 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1125 static int bit_buffer_size= 1024*256;
1126 static uint8_t *bit_buffer= NULL;
1128 static void do_video_out(AVFormatContext *s,
1129 AVOutputStream *ost,
1131 AVFrame *in_picture,
1134 int nb_frames, i, ret;
1135 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1136 AVCodecContext *enc, *dec;
1139 enc = ost->st->codec;
1140 dec = ist->st->codec;
1142 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1144 /* by default, we output a single frame */
1149 if(video_sync_method){
1150 double vdelta = sync_ipts - ost->sync_opts;
1151 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1154 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1157 }else if(vdelta>0.6)
1158 ost->sync_opts= lrintf(sync_ipts);
1159 }else if (vdelta > 1.1)
1160 nb_frames = lrintf(vdelta);
1161 //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);
1162 if (nb_frames == 0){
1165 fprintf(stderr, "*** drop!\n");
1166 }else if (nb_frames > 1) {
1167 nb_frames_dup += nb_frames - 1;
1169 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1172 ost->sync_opts= lrintf(sync_ipts);
1174 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1178 formatted_picture = in_picture;
1179 final_picture = formatted_picture;
1180 padding_src = formatted_picture;
1181 resampling_dst = &ost->pict_tmp;
1183 if ( ost->resample_height != ist->st->codec->height
1184 || ost->resample_width != ist->st->codec->width
1185 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1187 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1188 if(!ost->video_resample)
1192 #if !CONFIG_AVFILTER
1193 if (ost->video_resample) {
1195 final_picture = &ost->pict_tmp;
1196 if( ost->resample_height != ist->st->codec->height
1197 || ost->resample_width != ist->st->codec->width
1198 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1200 /* initialize a new scaler context */
1201 sws_freeContext(ost->img_resample_ctx);
1202 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1203 ost->img_resample_ctx = sws_getContext(
1204 ist->st->codec->width,
1205 ist->st->codec->height,
1206 ist->st->codec->pix_fmt,
1207 ost->st->codec->width,
1208 ost->st->codec->height,
1209 ost->st->codec->pix_fmt,
1210 sws_flags, NULL, NULL, NULL);
1211 if (ost->img_resample_ctx == NULL) {
1212 fprintf(stderr, "Cannot get resampling context\n");
1216 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1217 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1221 /* duplicates frame if needed */
1222 for(i=0;i<nb_frames;i++) {
1224 av_init_packet(&pkt);
1225 pkt.stream_index= ost->index;
1227 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1228 /* raw pictures are written as AVPicture structure to
1229 avoid any copies. We support temorarily the older
1231 AVFrame* old_frame = enc->coded_frame;
1232 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1233 pkt.data= (uint8_t *)final_picture;
1234 pkt.size= sizeof(AVPicture);
1235 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1236 pkt.flags |= AV_PKT_FLAG_KEY;
1238 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1239 enc->coded_frame = old_frame;
1241 AVFrame big_picture;
1243 big_picture= *final_picture;
1244 /* better than nothing: use input picture interlaced
1246 big_picture.interlaced_frame = in_picture->interlaced_frame;
1247 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1248 if(top_field_first == -1)
1249 big_picture.top_field_first = in_picture->top_field_first;
1251 big_picture.top_field_first = top_field_first;
1254 /* handles sameq here. This is not correct because it may
1255 not be a global option */
1256 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1258 big_picture.pict_type = 0;
1259 // big_picture.pts = AV_NOPTS_VALUE;
1260 big_picture.pts= ost->sync_opts;
1261 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1262 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1263 if (ost->forced_kf_index < ost->forced_kf_count &&
1264 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1265 big_picture.pict_type = FF_I_TYPE;
1266 ost->forced_kf_index++;
1268 ret = avcodec_encode_video(enc,
1269 bit_buffer, bit_buffer_size,
1272 fprintf(stderr, "Video encoding failed\n");
1277 pkt.data= bit_buffer;
1279 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1280 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1281 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1282 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1283 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1285 if(enc->coded_frame->key_frame)
1286 pkt.flags |= AV_PKT_FLAG_KEY;
1287 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1290 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1291 // enc->frame_number-1, ret, enc->pict_type);
1292 /* if two pass, output log */
1293 if (ost->logfile && enc->stats_out) {
1294 fprintf(ost->logfile, "%s", enc->stats_out);
1299 ost->frame_number++;
1303 static double psnr(double d){
1304 return -10.0*log(d)/log(10.0);
1307 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1310 AVCodecContext *enc;
1312 double ti1, bitrate, avg_bitrate;
1314 /* this is executed just the first time do_video_stats is called */
1316 vstats_file = fopen(vstats_filename, "w");
1323 enc = ost->st->codec;
1324 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1325 frame_number = ost->frame_number;
1326 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1327 if (enc->flags&CODEC_FLAG_PSNR)
1328 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1330 fprintf(vstats_file,"f_size= %6d ", frame_size);
1331 /* compute pts value */
1332 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1336 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1337 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1338 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1339 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1340 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1344 static void print_report(AVFormatContext **output_files,
1345 AVOutputStream **ost_table, int nb_ostreams,
1349 AVOutputStream *ost;
1350 AVFormatContext *oc;
1352 AVCodecContext *enc;
1353 int frame_number, vid, i;
1354 double bitrate, ti1, pts;
1355 static int64_t last_time = -1;
1356 static int qp_histogram[52];
1358 if (!is_last_report) {
1360 /* display the report every 0.5 seconds */
1361 cur_time = av_gettime();
1362 if (last_time == -1) {
1363 last_time = cur_time;
1366 if ((cur_time - last_time) < 500000)
1368 last_time = cur_time;
1372 oc = output_files[0];
1374 total_size = avio_size(oc->pb);
1375 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1376 total_size= avio_tell(oc->pb);
1381 for(i=0;i<nb_ostreams;i++) {
1383 enc = ost->st->codec;
1384 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1385 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1386 !ost->st->stream_copy ?
1387 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1389 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1390 float t = (av_gettime()-timer_start) / 1000000.0;
1392 frame_number = ost->frame_number;
1393 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1394 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1395 !ost->st->stream_copy ?
1396 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1401 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1402 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1405 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1407 if (enc->flags&CODEC_FLAG_PSNR){
1409 double error, error_sum=0;
1410 double scale, scale_sum=0;
1411 char type[3]= {'Y','U','V'};
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1415 error= enc->error[j];
1416 scale= enc->width*enc->height*255.0*255.0*frame_number;
1418 error= enc->coded_frame->error[j];
1419 scale= enc->width*enc->height*255.0*255.0;
1424 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1430 /* compute min output value */
1431 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1432 if ((pts < ti1) && (pts > 0))
1438 if (verbose || is_last_report) {
1439 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1441 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1442 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1443 (double)total_size / 1024, ti1, bitrate);
1445 if (nb_frames_dup || nb_frames_drop)
1446 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1447 nb_frames_dup, nb_frames_drop);
1450 fprintf(stderr, "%s \r", buf);
1455 if (is_last_report && verbose >= 0){
1456 int64_t raw= audio_size + video_size + extra_size;
1457 fprintf(stderr, "\n");
1458 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1462 100.0*(total_size - raw)/raw
1467 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1468 static int output_packet(AVInputStream *ist, int ist_index,
1469 AVOutputStream **ost_table, int nb_ostreams,
1470 const AVPacket *pkt)
1472 AVFormatContext *os;
1473 AVOutputStream *ost;
1477 void *buffer_to_free;
1478 static unsigned int samples_size= 0;
1479 AVSubtitle subtitle, *subtitle_to_free;
1480 int64_t pkt_pts = AV_NOPTS_VALUE;
1482 int frame_available;
1486 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1488 if(ist->next_pts == AV_NOPTS_VALUE)
1489 ist->next_pts= ist->pts;
1493 av_init_packet(&avpkt);
1501 if(pkt->dts != AV_NOPTS_VALUE)
1502 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1503 if(pkt->pts != AV_NOPTS_VALUE)
1504 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1506 //while we have more to decode or while the decoder did output something on EOF
1507 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1508 uint8_t *data_buf, *decoded_data_buf;
1509 int data_size, decoded_data_size;
1511 ist->pts= ist->next_pts;
1513 if(avpkt.size && avpkt.size != pkt->size &&
1514 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1515 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1516 ist->showed_multi_packet_warning=1;
1519 /* decode the packet if needed */
1520 decoded_data_buf = NULL; /* fail safe */
1521 decoded_data_size= 0;
1522 data_buf = avpkt.data;
1523 data_size = avpkt.size;
1524 subtitle_to_free = NULL;
1525 if (ist->decoding_needed) {
1526 switch(ist->st->codec->codec_type) {
1527 case AVMEDIA_TYPE_AUDIO:{
1528 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1529 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1531 samples= av_malloc(samples_size);
1533 decoded_data_size= samples_size;
1534 /* XXX: could avoid copy if PCM 16 bits with same
1535 endianness as CPU */
1536 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1543 /* Some bug in mpeg audio decoder gives */
1544 /* decoded_data_size < 0, it seems they are overflows */
1545 if (decoded_data_size <= 0) {
1546 /* no audio frame */
1549 decoded_data_buf = (uint8_t *)samples;
1550 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1551 (ist->st->codec->sample_rate * ist->st->codec->channels);
1553 case AVMEDIA_TYPE_VIDEO:
1554 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1555 /* XXX: allocate picture correctly */
1556 avcodec_get_frame_defaults(&picture);
1557 avpkt.pts = pkt_pts;
1558 avpkt.dts = ist->pts;
1559 pkt_pts = AV_NOPTS_VALUE;
1561 ret = avcodec_decode_video2(ist->st->codec,
1562 &picture, &got_picture, &avpkt);
1563 ist->st->quality= picture.quality;
1567 /* no picture yet */
1568 goto discard_packet;
1570 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1571 if (ist->st->codec->time_base.num != 0) {
1572 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1573 ist->next_pts += ((int64_t)AV_TIME_BASE *
1574 ist->st->codec->time_base.num * ticks) /
1575 ist->st->codec->time_base.den;
1579 case AVMEDIA_TYPE_SUBTITLE:
1580 ret = avcodec_decode_subtitle2(ist->st->codec,
1581 &subtitle, &got_picture, &avpkt);
1585 goto discard_packet;
1587 subtitle_to_free = &subtitle;
1594 switch(ist->st->codec->codec_type) {
1595 case AVMEDIA_TYPE_AUDIO:
1596 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1597 ist->st->codec->sample_rate;
1599 case AVMEDIA_TYPE_VIDEO:
1600 if (ist->st->codec->time_base.num != 0) {
1601 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1602 ist->next_pts += ((int64_t)AV_TIME_BASE *
1603 ist->st->codec->time_base.num * ticks) /
1604 ist->st->codec->time_base.den;
1612 buffer_to_free = NULL;
1613 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1614 pre_process_video_frame(ist, (AVPicture *)&picture,
1619 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
1620 for(i=0;i<nb_ostreams;i++) {
1622 if (ost->input_video_filter && ost->source_index == ist_index) {
1624 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1625 else sar = ist->st->codec->sample_aspect_ratio;
1626 // add it to be filtered
1627 av_vsrc_buffer_add_frame2(ost->input_video_filter, &picture,
1629 sar, ist->st->codec->width, ist->st->codec->height,
1630 ist->st->codec->pix_fmt, "0:0"); //TODO user setable params
1636 // preprocess audio (volume)
1637 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1638 if (audio_volume != 256) {
1641 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1642 int v = ((*volp) * audio_volume + 128) >> 8;
1643 if (v < -32768) v = -32768;
1644 if (v > 32767) v = 32767;
1650 /* frame rate emulation */
1652 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1653 int64_t now = av_gettime() - ist->start;
1657 /* if output time reached then transcode raw format,
1658 encode packets and output them */
1659 if (start_time == 0 || ist->pts >= start_time)
1660 for(i=0;i<nb_ostreams;i++) {
1664 if (ost->source_index == ist_index) {
1666 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1667 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1668 while (frame_available) {
1669 AVRational ist_pts_tb;
1670 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1671 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1673 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1675 os = output_files[ost->file_index];
1677 /* set the input output pts pairs */
1678 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1680 if (ost->encoding_needed) {
1681 av_assert0(ist->decoding_needed);
1682 switch(ost->st->codec->codec_type) {
1683 case AVMEDIA_TYPE_AUDIO:
1684 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1686 case AVMEDIA_TYPE_VIDEO:
1688 if (ost->picref->video)
1689 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1691 do_video_out(os, ost, ist, &picture, &frame_size);
1692 if (vstats_filename && frame_size)
1693 do_video_stats(os, ost, frame_size);
1695 case AVMEDIA_TYPE_SUBTITLE:
1696 do_subtitle_out(os, ost, ist, &subtitle,
1703 AVFrame avframe; //FIXME/XXX remove this
1705 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1707 av_init_packet(&opkt);
1709 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1710 #if !CONFIG_AVFILTER
1716 /* no reencoding needed : output the packet directly */
1717 /* force the input stream PTS */
1719 avcodec_get_frame_defaults(&avframe);
1720 ost->st->codec->coded_frame= &avframe;
1721 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1723 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1724 audio_size += data_size;
1725 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1726 video_size += data_size;
1730 opkt.stream_index= ost->index;
1731 if(pkt->pts != AV_NOPTS_VALUE)
1732 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1734 opkt.pts= AV_NOPTS_VALUE;
1736 if (pkt->dts == AV_NOPTS_VALUE)
1737 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1739 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1740 opkt.dts -= ost_tb_start_time;
1742 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1743 opkt.flags= pkt->flags;
1745 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1746 if( ost->st->codec->codec_id != CODEC_ID_H264
1747 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1748 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1750 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1751 opkt.destruct= av_destruct_packet;
1753 opkt.data = data_buf;
1754 opkt.size = data_size;
1757 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1758 ost->st->codec->frame_number++;
1759 ost->frame_number++;
1760 av_free_packet(&opkt);
1764 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1765 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1767 avfilter_unref_buffer(ost->picref);
1773 av_free(buffer_to_free);
1774 /* XXX: allocate the subtitles in the codec ? */
1775 if (subtitle_to_free) {
1776 avsubtitle_free(subtitle_to_free);
1777 subtitle_to_free = NULL;
1784 for(i=0;i<nb_ostreams;i++) {
1786 if (ost->source_index == ist_index) {
1787 AVCodecContext *enc= ost->st->codec;
1788 os = output_files[ost->file_index];
1790 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1792 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1795 if (ost->encoding_needed) {
1799 av_init_packet(&pkt);
1800 pkt.stream_index= ost->index;
1802 switch(ost->st->codec->codec_type) {
1803 case AVMEDIA_TYPE_AUDIO:
1804 fifo_bytes = av_fifo_size(ost->fifo);
1806 /* encode any samples remaining in fifo */
1807 if (fifo_bytes > 0) {
1808 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1809 int fs_tmp = enc->frame_size;
1811 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1812 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1813 enc->frame_size = fifo_bytes / (osize * enc->channels);
1815 int frame_bytes = enc->frame_size*osize*enc->channels;
1816 if (allocated_audio_buf_size < frame_bytes)
1818 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1821 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1822 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1823 ost->st->time_base.num, enc->sample_rate);
1824 enc->frame_size = fs_tmp;
1827 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1830 fprintf(stderr, "Audio encoding failed\n");
1834 pkt.flags |= AV_PKT_FLAG_KEY;
1836 case AVMEDIA_TYPE_VIDEO:
1837 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1839 fprintf(stderr, "Video encoding failed\n");
1843 if(enc->coded_frame && enc->coded_frame->key_frame)
1844 pkt.flags |= AV_PKT_FLAG_KEY;
1845 if (ost->logfile && enc->stats_out) {
1846 fprintf(ost->logfile, "%s", enc->stats_out);
1855 pkt.data= bit_buffer;
1857 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1858 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1859 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1871 static void print_sdp(AVFormatContext **avc, int n)
1875 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1876 printf("SDP:\n%s\n", sdp);
1880 static int copy_chapters(int infile, int outfile)
1882 AVFormatContext *is = input_files[infile];
1883 AVFormatContext *os = output_files[outfile];
1886 for (i = 0; i < is->nb_chapters; i++) {
1887 AVChapter *in_ch = is->chapters[i], *out_ch;
1888 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1889 AV_TIME_BASE_Q, in_ch->time_base);
1890 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1891 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1894 if (in_ch->end < ts_off)
1896 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1899 out_ch = av_mallocz(sizeof(AVChapter));
1901 return AVERROR(ENOMEM);
1903 out_ch->id = in_ch->id;
1904 out_ch->time_base = in_ch->time_base;
1905 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1906 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1908 if (metadata_chapters_autocopy)
1909 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1912 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1914 return AVERROR(ENOMEM);
1915 os->chapters[os->nb_chapters - 1] = out_ch;
1920 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1921 AVCodecContext *avctx)
1927 for (p = kf; *p; p++)
1930 ost->forced_kf_count = n;
1931 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1932 if (!ost->forced_kf_pts) {
1933 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1936 for (i = 0; i < n; i++) {
1937 p = i ? strchr(p, ',') + 1 : kf;
1938 t = parse_time_or_die("force_key_frames", p, 1);
1939 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1944 * The following code is the main loop of the file converter
1946 static int transcode(AVFormatContext **output_files,
1947 int nb_output_files,
1948 AVFormatContext **input_files,
1950 AVStreamMap *stream_maps, int nb_stream_maps)
1952 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0, step;
1953 AVFormatContext *is, *os;
1954 AVCodecContext *codec, *icodec;
1955 AVOutputStream *ost, **ost_table = NULL;
1956 AVInputStream *ist, **ist_table = NULL;
1957 AVInputFile *file_table;
1961 uint8_t no_packet[MAX_FILES]={0};
1962 int no_packet_count=0;
1963 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
1964 int nb_streams[AVMEDIA_TYPE_NB]={0};
1966 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1970 /* input stream init */
1972 for(i=0;i<nb_input_files;i++) {
1973 is = input_files[i];
1974 file_table[i].ist_index = j;
1975 file_table[i].nb_streams = is->nb_streams;
1976 j += is->nb_streams;
1980 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1984 for(i=0;i<nb_istreams;i++) {
1985 ist = av_mallocz(sizeof(AVInputStream));
1991 for(i=0;i<nb_input_files;i++) {
1992 is = input_files[i];
1993 for(k=0;k<is->nb_streams;k++) {
1994 ist = ist_table[j++];
1995 ist->st = is->streams[k];
1996 ist->file_index = i;
1998 ist->discard = 1; /* the stream is discarded by default
2002 ist->start = av_gettime();
2007 /* output stream init */
2009 for(i=0;i<nb_output_files;i++) {
2010 os = output_files[i];
2011 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2012 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2013 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2014 ret = AVERROR(EINVAL);
2017 nb_ostreams += os->nb_streams;
2019 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2020 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2021 ret = AVERROR(EINVAL);
2025 /* Sanity check the mapping args -- do the input files & streams exist? */
2026 for(i=0;i<nb_stream_maps;i++) {
2027 int fi = stream_maps[i].file_index;
2028 int si = stream_maps[i].stream_index;
2030 if (fi < 0 || fi > nb_input_files - 1 ||
2031 si < 0 || si > file_table[fi].nb_streams - 1) {
2032 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2033 ret = AVERROR(EINVAL);
2036 fi = stream_maps[i].sync_file_index;
2037 si = stream_maps[i].sync_stream_index;
2038 if (fi < 0 || fi > nb_input_files - 1 ||
2039 si < 0 || si > file_table[fi].nb_streams - 1) {
2040 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2041 ret = AVERROR(EINVAL);
2046 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2050 for(k=0;k<nb_output_files;k++) {
2051 os = output_files[k];
2052 for(i=0;i<os->nb_streams;i++,n++) {
2053 nb_streams[os->streams[i]->codec->codec_type]++;
2056 for(step=1<<30; step; step>>=1){
2057 int found_streams[AVMEDIA_TYPE_NB]={0};
2058 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2059 nb_frame_threshold[j] += step;
2061 for(j=0; j<nb_istreams; j++) {
2066 AVFormatContext *f= input_files[ ist->file_index ];
2068 for(pi=0; pi<f->nb_programs; pi++){
2069 AVProgram *p= f->programs[pi];
2070 if(p->id == opt_programid)
2071 for(si=0; si<p->nb_stream_indexes; si++){
2072 if(f->streams[ p->stream_index[si] ] == ist->st)
2077 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2078 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2079 found_streams[ist->st->codec->codec_type]++;
2082 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2083 if(found_streams[j] < nb_streams[j])
2084 nb_frame_threshold[j] -= step;
2087 for(k=0;k<nb_output_files;k++) {
2088 os = output_files[k];
2089 for(i=0;i<os->nb_streams;i++,n++) {
2091 ost = ost_table[n] = output_streams_for_file[k][i];
2092 ost->st = os->streams[i];
2093 if (nb_stream_maps > 0) {
2094 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2095 stream_maps[n].stream_index;
2097 /* Sanity check that the stream types match */
2098 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2099 int i= ost->file_index;
2100 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2101 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2102 stream_maps[n].file_index, stream_maps[n].stream_index,
2103 ost->file_index, ost->index);
2108 /* get corresponding input stream index : we select the first one with the right type */
2110 for(j=0;j<nb_istreams;j++) {
2115 AVFormatContext *f= input_files[ ist->file_index ];
2117 for(pi=0; pi<f->nb_programs; pi++){
2118 AVProgram *p= f->programs[pi];
2119 if(p->id == opt_programid)
2120 for(si=0; si<p->nb_stream_indexes; si++){
2121 if(f->streams[ p->stream_index[si] ] == ist->st)
2126 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2127 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2128 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2129 ost->source_index = j;
2136 if(! opt_programid) {
2137 /* try again and reuse existing stream */
2138 for(j=0;j<nb_istreams;j++) {
2140 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2141 && ist->st->discard != AVDISCARD_ALL) {
2142 ost->source_index = j;
2148 int i= ost->file_index;
2149 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2150 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2151 ost->file_index, ost->index);
2156 ist = ist_table[ost->source_index];
2158 ost->sync_ist = (nb_stream_maps > 0) ?
2159 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2160 stream_maps[n].sync_stream_index] : ist;
2164 /* for each output stream, we compute the right encoding parameters */
2165 for(i=0;i<nb_ostreams;i++) {
2167 os = output_files[ost->file_index];
2168 ist = ist_table[ost->source_index];
2170 codec = ost->st->codec;
2171 icodec = ist->st->codec;
2173 if (metadata_streams_autocopy)
2174 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2175 AV_METADATA_DONT_OVERWRITE);
2177 ost->st->disposition = ist->st->disposition;
2178 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2179 codec->chroma_sample_location = icodec->chroma_sample_location;
2181 if (ost->st->stream_copy) {
2182 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2184 if (extra_size > INT_MAX)
2187 /* if stream_copy is selected, no need to decode or encode */
2188 codec->codec_id = icodec->codec_id;
2189 codec->codec_type = icodec->codec_type;
2191 if(!codec->codec_tag){
2192 if( !os->oformat->codec_tag
2193 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2194 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2195 codec->codec_tag = icodec->codec_tag;
2198 codec->bit_rate = icodec->bit_rate;
2199 codec->rc_max_rate = icodec->rc_max_rate;
2200 codec->rc_buffer_size = icodec->rc_buffer_size;
2201 codec->extradata= av_mallocz(extra_size);
2202 if (!codec->extradata)
2204 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2205 codec->extradata_size= icodec->extradata_size;
2206 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){
2207 codec->time_base = icodec->time_base;
2208 codec->time_base.num *= icodec->ticks_per_frame;
2209 av_reduce(&codec->time_base.num, &codec->time_base.den,
2210 codec->time_base.num, codec->time_base.den, INT_MAX);
2212 codec->time_base = ist->st->time_base;
2213 switch(codec->codec_type) {
2214 case AVMEDIA_TYPE_AUDIO:
2215 if(audio_volume != 256) {
2216 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2219 codec->channel_layout = icodec->channel_layout;
2220 codec->sample_rate = icodec->sample_rate;
2221 codec->channels = icodec->channels;
2222 codec->frame_size = icodec->frame_size;
2223 codec->audio_service_type = icodec->audio_service_type;
2224 codec->block_align= icodec->block_align;
2225 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2226 codec->block_align= 0;
2227 if(codec->codec_id == CODEC_ID_AC3)
2228 codec->block_align= 0;
2230 case AVMEDIA_TYPE_VIDEO:
2231 codec->pix_fmt = icodec->pix_fmt;
2232 codec->width = icodec->width;
2233 codec->height = icodec->height;
2234 codec->has_b_frames = icodec->has_b_frames;
2236 case AVMEDIA_TYPE_SUBTITLE:
2237 codec->width = icodec->width;
2238 codec->height = icodec->height;
2244 switch(codec->codec_type) {
2245 case AVMEDIA_TYPE_AUDIO:
2246 ost->fifo= av_fifo_alloc(1024);
2249 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2250 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2251 icodec->request_channels = codec->channels;
2252 ist->decoding_needed = 1;
2253 ost->encoding_needed = 1;
2254 ost->resample_sample_fmt = icodec->sample_fmt;
2255 ost->resample_sample_rate = icodec->sample_rate;
2256 ost->resample_channels = icodec->channels;
2258 case AVMEDIA_TYPE_VIDEO:
2259 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2260 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2263 ost->video_resample = (codec->width != icodec->width ||
2264 codec->height != icodec->height ||
2265 (codec->pix_fmt != icodec->pix_fmt));
2266 if (ost->video_resample) {
2267 #if !CONFIG_AVFILTER
2268 avcodec_get_frame_defaults(&ost->pict_tmp);
2269 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2270 codec->width, codec->height)) {
2271 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2274 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2275 ost->img_resample_ctx = sws_getContext(
2282 sws_flags, NULL, NULL, NULL);
2283 if (ost->img_resample_ctx == NULL) {
2284 fprintf(stderr, "Cannot get resampling context\n");
2288 ost->original_height = icodec->height;
2289 ost->original_width = icodec->width;
2291 codec->bits_per_raw_sample= 0;
2293 ost->resample_height = icodec->height;
2294 ost->resample_width = icodec->width;
2295 ost->resample_pix_fmt= icodec->pix_fmt;
2296 ost->encoding_needed = 1;
2297 ist->decoding_needed = 1;
2300 if (configure_filters(ist, ost)) {
2301 fprintf(stderr, "Error opening filters!\n");
2306 case AVMEDIA_TYPE_SUBTITLE:
2307 ost->encoding_needed = 1;
2308 ist->decoding_needed = 1;
2315 if (ost->encoding_needed &&
2316 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2317 char logfilename[1024];
2320 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2321 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2323 if (codec->flags & CODEC_FLAG_PASS1) {
2324 f = fopen(logfilename, "wb");
2326 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2332 size_t logbuffer_size;
2333 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2334 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2337 codec->stats_in = logbuffer;
2341 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2342 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2343 int size= codec->width * codec->height;
2344 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2349 bit_buffer = av_malloc(bit_buffer_size);
2351 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2353 ret = AVERROR(ENOMEM);
2357 /* open each encoder */
2358 for(i=0;i<nb_ostreams;i++) {
2360 if (ost->encoding_needed) {
2361 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2362 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2364 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2366 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2367 ost->st->codec->codec_id, ost->file_index, ost->index);
2368 ret = AVERROR(EINVAL);
2371 if (dec->subtitle_header) {
2372 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2373 if (!ost->st->codec->subtitle_header) {
2374 ret = AVERROR(ENOMEM);
2377 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2378 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2380 if (avcodec_open(ost->st->codec, codec) < 0) {
2381 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2382 ost->file_index, ost->index);
2383 ret = AVERROR(EINVAL);
2386 extra_size += ost->st->codec->extradata_size;
2390 /* open each decoder */
2391 for(i=0;i<nb_istreams;i++) {
2393 if (ist->decoding_needed) {
2394 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2396 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2398 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2399 ist->st->codec->codec_id, ist->file_index, ist->index);
2400 ret = AVERROR(EINVAL);
2403 if (avcodec_open(ist->st->codec, codec) < 0) {
2404 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2405 ist->file_index, ist->index);
2406 ret = AVERROR(EINVAL);
2409 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2410 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2415 for(i=0;i<nb_istreams;i++) {
2419 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2420 ist->next_pts = AV_NOPTS_VALUE;
2424 /* set meta data information from input file if required */
2425 for (i=0;i<nb_meta_data_maps;i++) {
2426 AVFormatContext *files[2];
2427 AVMetadata **meta[2];
2430 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2431 if ((index) < 0 || (index) >= (nb_elems)) {\
2432 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2434 ret = AVERROR(EINVAL);\
2438 int out_file_index = meta_data_maps[i][0].file;
2439 int in_file_index = meta_data_maps[i][1].file;
2440 if (in_file_index < 0 || out_file_index < 0)
2442 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2443 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2445 files[0] = output_files[out_file_index];
2446 files[1] = input_files[in_file_index];
2448 for (j = 0; j < 2; j++) {
2449 AVMetaDataMap *map = &meta_data_maps[i][j];
2451 switch (map->type) {
2453 meta[j] = &files[j]->metadata;
2456 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2457 meta[j] = &files[j]->streams[map->index]->metadata;
2460 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2461 meta[j] = &files[j]->chapters[map->index]->metadata;
2464 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2465 meta[j] = &files[j]->programs[map->index]->metadata;
2470 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2473 /* copy global metadata by default */
2474 if (metadata_global_autocopy) {
2476 for (i = 0; i < nb_output_files; i++)
2477 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2478 AV_METADATA_DONT_OVERWRITE);
2481 /* copy chapters according to chapter maps */
2482 for (i = 0; i < nb_chapter_maps; i++) {
2483 int infile = chapter_maps[i].in_file;
2484 int outfile = chapter_maps[i].out_file;
2486 if (infile < 0 || outfile < 0)
2488 if (infile >= nb_input_files) {
2489 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2490 ret = AVERROR(EINVAL);
2493 if (outfile >= nb_output_files) {
2494 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2495 ret = AVERROR(EINVAL);
2498 copy_chapters(infile, outfile);
2501 /* copy chapters from the first input file that has them*/
2502 if (!nb_chapter_maps)
2503 for (i = 0; i < nb_input_files; i++) {
2504 if (!input_files[i]->nb_chapters)
2507 for (j = 0; j < nb_output_files; j++)
2508 if ((ret = copy_chapters(i, j)) < 0)
2513 /* open files and write file headers */
2514 for(i=0;i<nb_output_files;i++) {
2515 os = output_files[i];
2516 if (av_write_header(os) < 0) {
2517 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2518 ret = AVERROR(EINVAL);
2521 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2527 /* dump the file output parameters - cannot be done before in case
2529 for(i=0;i<nb_output_files;i++) {
2530 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2533 /* dump the stream mapping */
2535 fprintf(stderr, "Stream mapping:\n");
2536 for(i=0;i<nb_ostreams;i++) {
2538 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2539 ist_table[ost->source_index]->file_index,
2540 ist_table[ost->source_index]->index,
2543 if (ost->sync_ist != ist_table[ost->source_index])
2544 fprintf(stderr, " [sync #%d.%d]",
2545 ost->sync_ist->file_index,
2546 ost->sync_ist->index);
2547 fprintf(stderr, "\n");
2552 fprintf(stderr, "%s\n", error);
2557 print_sdp(output_files, nb_output_files);
2562 fprintf(stderr, "Press [q] to stop encoding\n");
2563 url_set_interrupt_cb(decode_interrupt_cb);
2567 timer_start = av_gettime();
2569 for(; received_sigterm == 0;) {
2570 int file_index, ist_index;
2578 /* if 'q' pressed, exits */
2582 /* read_key() returns 0 on EOF */
2588 /* select the stream that we must read now by looking at the
2589 smallest output pts */
2591 for(i=0;i<nb_ostreams;i++) {
2594 os = output_files[ost->file_index];
2595 ist = ist_table[ost->source_index];
2596 if(ist->is_past_recording_time || no_packet[ist->file_index])
2598 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2599 ipts = (double)ist->pts;
2600 if (!file_table[ist->file_index].eof_reached){
2601 if(ipts < ipts_min) {
2603 if(input_sync ) file_index = ist->file_index;
2605 if(opts < opts_min) {
2607 if(!input_sync) file_index = ist->file_index;
2610 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2615 /* if none, if is finished */
2616 if (file_index < 0) {
2617 if(no_packet_count){
2619 memset(no_packet, 0, sizeof(no_packet));
2626 /* finish if limit size exhausted */
2627 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2630 /* read a frame from it and output it in the fifo */
2631 is = input_files[file_index];
2632 ret= av_read_frame(is, &pkt);
2633 if(ret == AVERROR(EAGAIN)){
2634 no_packet[file_index]=1;
2639 file_table[file_index].eof_reached = 1;
2647 memset(no_packet, 0, sizeof(no_packet));
2650 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2651 is->streams[pkt.stream_index]);
2653 /* the following test is needed in case new streams appear
2654 dynamically in stream : we ignore them */
2655 if (pkt.stream_index >= file_table[file_index].nb_streams)
2656 goto discard_packet;
2657 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2658 ist = ist_table[ist_index];
2660 goto discard_packet;
2662 if (pkt.dts != AV_NOPTS_VALUE)
2663 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2664 if (pkt.pts != AV_NOPTS_VALUE)
2665 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2667 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2668 && input_files_ts_scale[file_index][pkt.stream_index]){
2669 if(pkt.pts != AV_NOPTS_VALUE)
2670 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2671 if(pkt.dts != AV_NOPTS_VALUE)
2672 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2675 // 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);
2676 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2677 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2678 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2679 int64_t delta= pkt_dts - ist->next_pts;
2680 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2681 input_files_ts_offset[ist->file_index]-= delta;
2683 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2684 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2685 if(pkt.pts != AV_NOPTS_VALUE)
2686 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2690 /* finish if recording time exhausted */
2691 if (recording_time != INT64_MAX &&
2692 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2693 ist->is_past_recording_time = 1;
2694 goto discard_packet;
2697 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2698 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2701 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2702 ist->file_index, ist->index);
2705 av_free_packet(&pkt);
2710 av_free_packet(&pkt);
2712 /* dump report by using the output first video and audio streams */
2713 print_report(output_files, ost_table, nb_ostreams, 0);
2716 /* at the end of stream, we must flush the decoder buffers */
2717 for(i=0;i<nb_istreams;i++) {
2719 if (ist->decoding_needed) {
2720 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2726 /* write the trailer if needed and close file */
2727 for(i=0;i<nb_output_files;i++) {
2728 os = output_files[i];
2729 av_write_trailer(os);
2732 /* dump report by using the first video and audio streams */
2733 print_report(output_files, ost_table, nb_ostreams, 1);
2735 /* close each encoder */
2736 for(i=0;i<nb_ostreams;i++) {
2738 if (ost->encoding_needed) {
2739 av_freep(&ost->st->codec->stats_in);
2740 avcodec_close(ost->st->codec);
2743 avfilter_graph_free(&ost->graph);
2747 /* close each decoder */
2748 for(i=0;i<nb_istreams;i++) {
2750 if (ist->decoding_needed) {
2751 avcodec_close(ist->st->codec);
2759 av_freep(&bit_buffer);
2760 av_free(file_table);
2763 for(i=0;i<nb_istreams;i++) {
2770 for(i=0;i<nb_ostreams;i++) {
2773 if (ost->st->stream_copy)
2774 av_freep(&ost->st->codec->extradata);
2776 fclose(ost->logfile);
2777 ost->logfile = NULL;
2779 av_fifo_free(ost->fifo); /* works even if fifo is not
2780 initialized but set to zero */
2781 av_freep(&ost->st->codec->subtitle_header);
2782 av_free(ost->pict_tmp.data[0]);
2783 av_free(ost->forced_kf_pts);
2784 if (ost->video_resample)
2785 sws_freeContext(ost->img_resample_ctx);
2787 audio_resample_close(ost->resample);
2788 if (ost->reformat_ctx)
2789 av_audio_convert_free(ost->reformat_ctx);
2798 static void opt_format(const char *arg)
2800 last_asked_format = arg;
2803 static void opt_video_rc_override_string(const char *arg)
2805 video_rc_override_string = arg;
2808 static int opt_me_threshold(const char *opt, const char *arg)
2810 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2814 static int opt_verbose(const char *opt, const char *arg)
2816 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2820 static int opt_frame_rate(const char *opt, const char *arg)
2822 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2823 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2829 static int opt_bitrate(const char *opt, const char *arg)
2831 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2833 opt_default(opt, arg);
2835 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2836 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2841 static int opt_frame_crop(const char *opt, const char *arg)
2843 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2844 return AVERROR(EINVAL);
2847 static void opt_frame_size(const char *arg)
2849 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2850 fprintf(stderr, "Incorrect frame size\n");
2855 static int opt_pad(const char *opt, const char *arg) {
2856 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2860 static void opt_frame_pix_fmt(const char *arg)
2862 if (strcmp(arg, "list")) {
2863 frame_pix_fmt = av_get_pix_fmt(arg);
2864 if (frame_pix_fmt == PIX_FMT_NONE) {
2865 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2874 static void opt_frame_aspect_ratio(const char *arg)
2881 p = strchr(arg, ':');
2883 x = strtol(arg, &end, 10);
2885 y = strtol(end+1, &end, 10);
2887 ar = (double)x / (double)y;
2889 ar = strtod(arg, NULL);
2892 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2895 frame_aspect_ratio = ar;
2896 frame_aspect_ratio_override = 1;
2899 static int opt_metadata(const char *opt, const char *arg)
2901 char *mid= strchr(arg, '=');
2904 fprintf(stderr, "Missing =\n");
2909 av_metadata_set2(&metadata, arg, mid, 0);
2914 static void opt_qscale(const char *arg)
2916 video_qscale = atof(arg);
2917 if (video_qscale <= 0 ||
2918 video_qscale > 255) {
2919 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2924 static void opt_top_field_first(const char *arg)
2926 top_field_first= atoi(arg);
2929 static int opt_thread_count(const char *opt, const char *arg)
2931 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2934 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2939 static void opt_audio_sample_fmt(const char *arg)
2941 if (strcmp(arg, "list")) {
2942 audio_sample_fmt = av_get_sample_fmt(arg);
2943 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2944 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2950 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2951 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2956 static int opt_audio_rate(const char *opt, const char *arg)
2958 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2962 static int opt_audio_channels(const char *opt, const char *arg)
2964 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2968 static void opt_video_channel(const char *arg)
2970 video_channel = strtol(arg, NULL, 0);
2973 static void opt_video_standard(const char *arg)
2975 video_standard = av_strdup(arg);
2978 static void opt_codec(int *pstream_copy, char **pcodec_name,
2979 int codec_type, const char *arg)
2981 av_freep(pcodec_name);
2982 if (!strcmp(arg, "copy")) {
2985 *pcodec_name = av_strdup(arg);
2989 static void opt_audio_codec(const char *arg)
2991 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2994 static void opt_video_codec(const char *arg)
2996 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2999 static void opt_subtitle_codec(const char *arg)
3001 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
3004 static int opt_codec_tag(const char *opt, const char *arg)
3007 uint32_t *codec_tag;
3009 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3010 !strcmp(opt, "vtag") ? &video_codec_tag :
3011 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3015 *codec_tag = strtol(arg, &tail, 0);
3017 *codec_tag = AV_RL32(arg);
3022 static void opt_map(const char *arg)
3027 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3028 m = &stream_maps[nb_stream_maps-1];
3030 m->file_index = strtol(arg, &p, 0);
3034 m->stream_index = strtol(p, &p, 0);
3037 m->sync_file_index = strtol(p, &p, 0);
3040 m->sync_stream_index = strtol(p, &p, 0);
3042 m->sync_file_index = m->file_index;
3043 m->sync_stream_index = m->stream_index;
3047 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3058 *index = strtol(++arg, endptr, 0);
3061 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3068 static void opt_map_metadata(const char *arg)
3070 AVMetaDataMap *m, *m1;
3073 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3074 &nb_meta_data_maps, nb_meta_data_maps + 1);
3076 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3077 m->file = strtol(arg, &p, 0);
3078 parse_meta_type(p, &m->type, &m->index, &p);
3082 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3083 m1->file = strtol(p, &p, 0);
3084 parse_meta_type(p, &m1->type, &m1->index, &p);
3086 if (m->type == 'g' || m1->type == 'g')
3087 metadata_global_autocopy = 0;
3088 if (m->type == 's' || m1->type == 's')
3089 metadata_streams_autocopy = 0;
3090 if (m->type == 'c' || m1->type == 'c')
3091 metadata_chapters_autocopy = 0;
3094 static void opt_map_meta_data(const char *arg)
3096 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3097 "Use -map_metadata instead.\n");
3098 opt_map_metadata(arg);
3101 static void opt_map_chapters(const char *arg)
3106 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3107 nb_chapter_maps + 1);
3108 c = &chapter_maps[nb_chapter_maps - 1];
3109 c->out_file = strtol(arg, &p, 0);
3113 c->in_file = strtol(p, &p, 0);
3116 static void opt_input_ts_scale(const char *arg)
3118 unsigned int stream;
3122 stream = strtol(arg, &p, 0);
3125 scale= strtod(p, &p);
3127 if(stream >= MAX_STREAMS)
3130 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);
3131 input_files_ts_scale[nb_input_files][stream]= scale;
3134 static int opt_recording_time(const char *opt, const char *arg)
3136 recording_time = parse_time_or_die(opt, arg, 1);
3140 static int opt_start_time(const char *opt, const char *arg)
3142 start_time = parse_time_or_die(opt, arg, 1);
3146 static int opt_recording_timestamp(const char *opt, const char *arg)
3148 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3152 static int opt_input_ts_offset(const char *opt, const char *arg)
3154 input_ts_offset = parse_time_or_die(opt, arg, 1);
3158 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3160 const char *codec_string = encoder ? "encoder" : "decoder";
3164 return CODEC_ID_NONE;
3166 avcodec_find_encoder_by_name(name) :
3167 avcodec_find_decoder_by_name(name);
3169 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3172 if(codec->type != type) {
3173 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3176 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3177 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3178 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3179 "results.\nAdd '-strict experimental' if you want to use it.\n",
3180 codec_string, codec->name);
3182 avcodec_find_encoder(codec->id) :
3183 avcodec_find_decoder(codec->id);
3184 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3185 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3186 codec_string, codec->name);
3192 static void opt_input_file(const char *filename)
3194 AVFormatContext *ic;
3195 AVFormatParameters params, *ap = ¶ms;
3196 AVInputFormat *file_iformat = NULL;
3197 int err, i, ret, rfps, rfps_base;
3200 if (last_asked_format) {
3201 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3202 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3205 last_asked_format = NULL;
3208 if (!strcmp(filename, "-"))
3211 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3212 !strcmp(filename, "/dev/stdin");
3214 /* get default parameters from command line */
3215 ic = avformat_alloc_context();
3217 print_error(filename, AVERROR(ENOMEM));
3221 memset(ap, 0, sizeof(*ap));
3222 ap->prealloced_context = 1;
3223 ap->sample_rate = audio_sample_rate;
3224 ap->channels = audio_channels;
3225 ap->time_base.den = frame_rate.num;
3226 ap->time_base.num = frame_rate.den;
3227 ap->width = frame_width;
3228 ap->height = frame_height;
3229 ap->pix_fmt = frame_pix_fmt;
3230 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3231 ap->channel = video_channel;
3232 ap->standard = video_standard;
3234 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3236 ic->video_codec_id =
3237 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3238 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3239 ic->audio_codec_id =
3240 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3241 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3242 ic->subtitle_codec_id=
3243 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3244 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3245 ic->flags |= AVFMT_FLAG_NONBLOCK;
3247 /* open the input file with generic libav function */
3248 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3250 print_error(filename, err);
3256 for(i=0; i<ic->nb_streams; i++){
3257 ic->streams[i]->discard= AVDISCARD_ALL;
3259 for(i=0; i<ic->nb_programs; i++){
3260 AVProgram *p= ic->programs[i];
3261 if(p->id != opt_programid){
3262 p->discard = AVDISCARD_ALL;
3265 for(j=0; j<p->nb_stream_indexes; j++){
3266 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3271 fprintf(stderr, "Specified program id not found\n");
3277 ic->loop_input = loop_input;
3279 /* If not enough info to get the stream parameters, we decode the
3280 first frames to get it. (used in mpeg case for example) */
3281 ret = av_find_stream_info(ic);
3282 if (ret < 0 && verbose >= 0) {
3283 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3284 av_close_input_file(ic);
3288 timestamp = start_time;
3289 /* add the stream start time */
3290 if (ic->start_time != AV_NOPTS_VALUE)
3291 timestamp += ic->start_time;
3293 /* if seeking requested, we execute it */
3294 if (start_time != 0) {
3295 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3297 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3298 filename, (double)timestamp / AV_TIME_BASE);
3300 /* reset seek info */
3304 /* update the current parameters so that they match the one of the input stream */
3305 for(i=0;i<ic->nb_streams;i++) {
3306 AVStream *st = ic->streams[i];
3307 AVCodecContext *dec = st->codec;
3308 dec->thread_count = thread_count;
3309 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3310 switch (dec->codec_type) {
3311 case AVMEDIA_TYPE_AUDIO:
3312 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3313 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]);
3314 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3315 channel_layout = dec->channel_layout;
3316 audio_channels = dec->channels;
3317 audio_sample_rate = dec->sample_rate;
3318 audio_sample_fmt = dec->sample_fmt;
3320 st->discard= AVDISCARD_ALL;
3321 /* Note that av_find_stream_info can add more streams, and we
3322 * currently have no chance of setting up lowres decoding
3323 * early enough for them. */
3325 audio_sample_rate >>= dec->lowres;
3327 case AVMEDIA_TYPE_VIDEO:
3328 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3329 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]);
3330 frame_height = dec->height;
3331 frame_width = dec->width;
3332 if(ic->streams[i]->sample_aspect_ratio.num)
3333 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3335 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3336 frame_aspect_ratio *= (float) dec->width / dec->height;
3337 frame_aspect_ratio_override = 0;
3338 frame_pix_fmt = dec->pix_fmt;
3339 rfps = ic->streams[i]->r_frame_rate.num;
3340 rfps_base = ic->streams[i]->r_frame_rate.den;
3342 dec->flags |= CODEC_FLAG_EMU_EDGE;
3343 frame_height >>= dec->lowres;
3344 frame_width >>= dec->lowres;
3345 dec->height = frame_height;
3346 dec->width = frame_width;
3349 dec->debug |= FF_DEBUG_MV;
3351 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3354 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3355 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3357 (float)rfps / rfps_base, rfps, rfps_base);
3359 /* update the current frame rate to match the stream frame rate */
3360 frame_rate.num = rfps;
3361 frame_rate.den = rfps_base;
3364 st->discard= AVDISCARD_ALL;
3365 else if(video_discard)
3366 st->discard= video_discard;
3368 case AVMEDIA_TYPE_DATA:
3370 case AVMEDIA_TYPE_SUBTITLE:
3371 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3372 if(subtitle_disable)
3373 st->discard = AVDISCARD_ALL;
3375 case AVMEDIA_TYPE_ATTACHMENT:
3376 case AVMEDIA_TYPE_UNKNOWN:
3383 input_files[nb_input_files] = ic;
3384 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3385 /* dump the file content */
3387 av_dump_format(ic, nb_input_files, filename, 0);
3393 av_freep(&video_codec_name);
3394 av_freep(&audio_codec_name);
3395 av_freep(&subtitle_codec_name);
3398 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3399 int *has_subtitle_ptr)
3401 int has_video, has_audio, has_subtitle, i, j;
3402 AVFormatContext *ic;
3407 for(j=0;j<nb_input_files;j++) {
3408 ic = input_files[j];
3409 for(i=0;i<ic->nb_streams;i++) {
3410 AVCodecContext *enc = ic->streams[i]->codec;
3411 switch(enc->codec_type) {
3412 case AVMEDIA_TYPE_AUDIO:
3415 case AVMEDIA_TYPE_VIDEO:
3418 case AVMEDIA_TYPE_SUBTITLE:
3421 case AVMEDIA_TYPE_DATA:
3422 case AVMEDIA_TYPE_ATTACHMENT:
3423 case AVMEDIA_TYPE_UNKNOWN:
3430 *has_video_ptr = has_video;
3431 *has_audio_ptr = has_audio;
3432 *has_subtitle_ptr = has_subtitle;
3435 static void new_video_stream(AVFormatContext *oc, int file_idx)
3438 AVOutputStream *ost;
3439 AVCodecContext *video_enc;
3440 enum CodecID codec_id = CODEC_ID_NONE;
3441 AVCodec *codec= NULL;
3444 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3446 fprintf(stderr, "Could not alloc stream\n");
3449 ost = new_output_stream(oc, file_idx);
3451 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3452 if(!video_stream_copy){
3453 if (video_codec_name) {
3454 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3455 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3456 codec = avcodec_find_encoder_by_name(video_codec_name);
3457 output_codecs[nb_output_codecs-1] = codec;
3459 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3460 codec = avcodec_find_encoder(codec_id);
3463 if(frame_aspect_ratio_override){
3464 i = vfilters ? strlen(vfilters) : 0;
3465 vfilters = av_realloc(vfilters, i+100);
3466 snprintf(vfilters+i, 100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
3467 frame_aspect_ratio=0;
3468 frame_aspect_ratio_override=0;
3471 ost->avfilter= vfilters;
3476 avcodec_get_context_defaults3(st->codec, codec);
3477 ost->bitstream_filters = video_bitstream_filters;
3478 video_bitstream_filters= NULL;
3480 st->codec->thread_count= thread_count;
3482 video_enc = st->codec;
3485 video_enc->codec_tag= video_codec_tag;
3487 if( (video_global_header&1)
3488 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3489 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3490 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3492 if(video_global_header&2){
3493 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3494 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3497 if (video_stream_copy) {
3498 st->stream_copy = 1;
3499 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3500 video_enc->sample_aspect_ratio =
3501 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3505 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3507 video_enc->codec_id = codec_id;
3508 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3510 if (codec && codec->supported_framerates && !force_fps)
3511 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3512 video_enc->time_base.den = fps.num;
3513 video_enc->time_base.num = fps.den;
3515 video_enc->width = frame_width;
3516 video_enc->height = frame_height;
3517 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3518 video_enc->pix_fmt = frame_pix_fmt;
3519 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3521 choose_pixel_fmt(st, codec);
3524 video_enc->gop_size = 0;
3525 if (video_qscale || same_quality) {
3526 video_enc->flags |= CODEC_FLAG_QSCALE;
3527 video_enc->global_quality=
3528 st->quality = FF_QP2LAMBDA * video_qscale;
3532 video_enc->intra_matrix = intra_matrix;
3534 video_enc->inter_matrix = inter_matrix;
3536 p= video_rc_override_string;
3539 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3541 fprintf(stderr, "error parsing rc_override\n");
3544 video_enc->rc_override=
3545 av_realloc(video_enc->rc_override,
3546 sizeof(RcOverride)*(i+1));
3547 video_enc->rc_override[i].start_frame= start;
3548 video_enc->rc_override[i].end_frame = end;
3550 video_enc->rc_override[i].qscale= q;
3551 video_enc->rc_override[i].quality_factor= 1.0;
3554 video_enc->rc_override[i].qscale= 0;
3555 video_enc->rc_override[i].quality_factor= -q/100.0;
3560 video_enc->rc_override_count=i;
3561 if (!video_enc->rc_initial_buffer_occupancy)
3562 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3563 video_enc->me_threshold= me_threshold;
3564 video_enc->intra_dc_precision= intra_dc_precision - 8;
3567 video_enc->flags|= CODEC_FLAG_PSNR;
3572 video_enc->flags |= CODEC_FLAG_PASS1;
3574 video_enc->flags |= CODEC_FLAG_PASS2;
3578 if (forced_key_frames)
3579 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3581 if (video_language) {
3582 av_metadata_set2(&st->metadata, "language", video_language, 0);
3583 av_freep(&video_language);
3586 /* reset some key parameters */
3588 av_freep(&video_codec_name);
3589 av_freep(&forced_key_frames);
3590 video_stream_copy = 0;
3591 frame_pix_fmt = PIX_FMT_NONE;
3594 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3597 AVOutputStream *ost;
3598 AVCodec *codec= NULL;
3599 AVCodecContext *audio_enc;
3600 enum CodecID codec_id = CODEC_ID_NONE;
3602 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3604 fprintf(stderr, "Could not alloc stream\n");
3607 ost = new_output_stream(oc, file_idx);
3609 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3610 if(!audio_stream_copy){
3611 if (audio_codec_name) {
3612 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3613 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3614 codec = avcodec_find_encoder_by_name(audio_codec_name);
3615 output_codecs[nb_output_codecs-1] = codec;
3617 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3618 codec = avcodec_find_encoder(codec_id);
3622 avcodec_get_context_defaults3(st->codec, codec);
3624 ost->bitstream_filters = audio_bitstream_filters;
3625 audio_bitstream_filters= NULL;
3627 st->codec->thread_count= thread_count;
3629 audio_enc = st->codec;
3630 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3633 audio_enc->codec_tag= audio_codec_tag;
3635 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3636 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3637 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3639 if (audio_stream_copy) {
3640 st->stream_copy = 1;
3641 audio_enc->channels = audio_channels;
3642 audio_enc->sample_rate = audio_sample_rate;
3644 audio_enc->codec_id = codec_id;
3645 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3647 if (audio_qscale > QSCALE_NONE) {
3648 audio_enc->flags |= CODEC_FLAG_QSCALE;
3649 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3651 audio_enc->channels = audio_channels;
3652 audio_enc->sample_fmt = audio_sample_fmt;
3653 audio_enc->sample_rate = audio_sample_rate;
3654 audio_enc->channel_layout = channel_layout;
3655 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3656 audio_enc->channel_layout = 0;
3657 choose_sample_fmt(st, codec);
3658 choose_sample_rate(st, codec);
3660 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3661 if (audio_language) {
3662 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3663 av_freep(&audio_language);
3666 /* reset some key parameters */
3668 av_freep(&audio_codec_name);
3669 audio_stream_copy = 0;
3672 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3675 AVOutputStream *ost;
3676 AVCodec *codec=NULL;
3677 AVCodecContext *subtitle_enc;
3678 enum CodecID codec_id = CODEC_ID_NONE;
3680 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3682 fprintf(stderr, "Could not alloc stream\n");
3685 ost = new_output_stream(oc, file_idx);
3686 subtitle_enc = st->codec;
3687 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3688 if(!subtitle_stream_copy){
3689 if (subtitle_codec_name) {
3690 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3691 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3692 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3694 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3695 codec = avcodec_find_encoder(codec_id);
3698 avcodec_get_context_defaults3(st->codec, codec);
3700 ost->bitstream_filters = subtitle_bitstream_filters;
3701 subtitle_bitstream_filters= NULL;
3703 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3705 if(subtitle_codec_tag)
3706 subtitle_enc->codec_tag= subtitle_codec_tag;
3708 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3709 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3710 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3712 if (subtitle_stream_copy) {
3713 st->stream_copy = 1;
3715 subtitle_enc->codec_id = codec_id;
3716 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3719 if (subtitle_language) {
3720 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3721 av_freep(&subtitle_language);
3724 subtitle_disable = 0;
3725 av_freep(&subtitle_codec_name);
3726 subtitle_stream_copy = 0;
3729 static int opt_new_stream(const char *opt, const char *arg)
3731 AVFormatContext *oc;
3732 int file_idx = nb_output_files - 1;
3733 if (nb_output_files <= 0) {
3734 fprintf(stderr, "At least one output file must be specified\n");
3737 oc = output_files[file_idx];
3739 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3740 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3741 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3746 /* arg format is "output-stream-index:streamid-value". */
3747 static int opt_streamid(const char *opt, const char *arg)
3753 strncpy(idx_str, arg, sizeof(idx_str));
3754 idx_str[sizeof(idx_str)-1] = '\0';
3755 p = strchr(idx_str, ':');
3758 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3763 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3764 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3765 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3769 static void opt_output_file(const char *filename)
3771 AVFormatContext *oc;
3772 int err, use_video, use_audio, use_subtitle;
3773 int input_has_video, input_has_audio, input_has_subtitle;
3774 AVFormatParameters params, *ap = ¶ms;
3775 AVOutputFormat *file_oformat;
3777 if (!strcmp(filename, "-"))
3780 oc = avformat_alloc_context();
3782 print_error(filename, AVERROR(ENOMEM));
3786 if (last_asked_format) {
3787 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3788 if (!file_oformat) {
3789 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3792 last_asked_format = NULL;
3794 file_oformat = av_guess_format(NULL, filename, NULL);
3795 if (!file_oformat) {
3796 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3802 oc->oformat = file_oformat;
3803 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3805 if (!strcmp(file_oformat->name, "ffm") &&
3806 av_strstart(filename, "http:", NULL)) {
3807 /* special case for files sent to ffserver: we get the stream
3808 parameters from ffserver */
3809 int err = read_ffserver_streams(oc, filename);
3811 print_error(filename, err);
3815 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3816 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3817 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3819 /* disable if no corresponding type found and at least one
3821 if (nb_input_files > 0) {
3822 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3823 &input_has_subtitle);
3824 if (!input_has_video)
3826 if (!input_has_audio)
3828 if (!input_has_subtitle)
3832 /* manual disable */
3833 if (audio_disable) use_audio = 0;
3834 if (video_disable) use_video = 0;
3835 if (subtitle_disable) use_subtitle = 0;
3837 if (use_video) new_video_stream(oc, nb_output_files);
3838 if (use_audio) new_audio_stream(oc, nb_output_files);
3839 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3841 oc->timestamp = recording_timestamp;
3843 av_metadata_copy(&oc->metadata, metadata, 0);
3844 av_metadata_free(&metadata);
3847 output_files[nb_output_files++] = oc;
3849 /* check filename in case of an image number is expected */
3850 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3851 if (!av_filename_number_test(oc->filename)) {
3852 print_error(oc->filename, AVERROR_NUMEXPECTED);
3857 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3858 /* test if it already exists to avoid loosing precious files */
3859 if (!file_overwrite &&
3860 (strchr(filename, ':') == NULL ||
3861 filename[1] == ':' ||
3862 av_strstart(filename, "file:", NULL))) {
3863 if (url_exist(filename)) {
3865 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3867 if (!read_yesno()) {
3868 fprintf(stderr, "Not overwriting - exiting\n");
3873 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3880 if ((err = avio_open(&oc->pb, filename, URL_WRONLY)) < 0) {
3881 print_error(filename, err);
3886 memset(ap, 0, sizeof(*ap));
3887 if (av_set_parameters(oc, ap) < 0) {
3888 fprintf(stderr, "%s: Invalid encoding parameters\n",
3893 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3894 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3895 oc->loop_output = loop_output;
3897 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3899 av_freep(&forced_key_frames);
3902 /* same option as mencoder */
3903 static void opt_pass(const char *pass_str)
3906 pass = atoi(pass_str);
3907 if (pass != 1 && pass != 2) {
3908 fprintf(stderr, "pass number can be only 1 or 2\n");
3914 static int64_t getutime(void)
3917 struct rusage rusage;
3919 getrusage(RUSAGE_SELF, &rusage);
3920 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3921 #elif HAVE_GETPROCESSTIMES
3923 FILETIME c, e, k, u;
3924 proc = GetCurrentProcess();
3925 GetProcessTimes(proc, &c, &e, &k, &u);
3926 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3928 return av_gettime();
3932 static int64_t getmaxrss(void)
3934 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3935 struct rusage rusage;
3936 getrusage(RUSAGE_SELF, &rusage);
3937 return (int64_t)rusage.ru_maxrss * 1024;
3938 #elif HAVE_GETPROCESSMEMORYINFO
3940 PROCESS_MEMORY_COUNTERS memcounters;
3941 proc = GetCurrentProcess();
3942 memcounters.cb = sizeof(memcounters);
3943 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3944 return memcounters.PeakPagefileUsage;
3950 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3953 const char *p = str;
3960 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3967 static void opt_inter_matrix(const char *arg)
3969 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3970 parse_matrix_coeffs(inter_matrix, arg);
3973 static void opt_intra_matrix(const char *arg)
3975 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3976 parse_matrix_coeffs(intra_matrix, arg);
3979 static void show_usage(void)
3981 printf("Hyper fast Audio and Video encoder\n");
3982 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3986 static void show_help(void)
3989 AVOutputFormat *oformat = NULL;
3991 av_log_set_callback(log_callback_help);
3993 show_help_options(options, "Main options:\n",
3994 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3995 show_help_options(options, "\nAdvanced options:\n",
3996 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3998 show_help_options(options, "\nVideo options:\n",
3999 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4001 show_help_options(options, "\nAdvanced Video options:\n",
4002 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4003 OPT_VIDEO | OPT_EXPERT);
4004 show_help_options(options, "\nAudio options:\n",
4005 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4007 show_help_options(options, "\nAdvanced Audio options:\n",
4008 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4009 OPT_AUDIO | OPT_EXPERT);
4010 show_help_options(options, "\nSubtitle options:\n",
4011 OPT_SUBTITLE | OPT_GRAB,
4013 show_help_options(options, "\nAudio/Video grab options:\n",
4017 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4020 /* individual codec options */
4022 while ((c = av_codec_next(c))) {
4023 if (c->priv_class) {
4024 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4029 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4032 /* individual muxer options */
4033 while ((oformat = av_oformat_next(oformat))) {
4034 if (oformat->priv_class) {
4035 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4040 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4043 static void opt_target(const char *arg)
4045 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4046 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4048 if(!strncmp(arg, "pal-", 4)) {
4051 } else if(!strncmp(arg, "ntsc-", 5)) {
4054 } else if(!strncmp(arg, "film-", 5)) {
4059 /* Calculate FR via float to avoid int overflow */
4060 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4063 } else if((fr == 29970) || (fr == 23976)) {
4066 /* Try to determine PAL/NTSC by peeking in the input files */
4067 if(nb_input_files) {
4069 for(j = 0; j < nb_input_files; j++) {
4070 for(i = 0; i < input_files[j]->nb_streams; i++) {
4071 AVCodecContext *c = input_files[j]->streams[i]->codec;
4072 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4074 fr = c->time_base.den * 1000 / c->time_base.num;
4078 } else if((fr == 29970) || (fr == 23976)) {
4088 if(verbose && norm != UNKNOWN)
4089 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4092 if(norm == UNKNOWN) {
4093 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4094 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4095 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4099 if(!strcmp(arg, "vcd")) {
4101 opt_video_codec("mpeg1video");
4102 opt_audio_codec("mp2");
4105 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4106 opt_frame_rate(NULL, frame_rates[norm]);
4107 opt_default("g", norm == PAL ? "15" : "18");
4109 opt_default("b", "1150000");
4110 opt_default("maxrate", "1150000");
4111 opt_default("minrate", "1150000");
4112 opt_default("bufsize", "327680"); // 40*1024*8;
4114 opt_default("ab", "224000");
4115 audio_sample_rate = 44100;
4118 opt_default("packetsize", "2324");
4119 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4121 /* We have to offset the PTS, so that it is consistent with the SCR.
4122 SCR starts at 36000, but the first two packs contain only padding
4123 and the first pack from the other stream, respectively, may also have
4124 been written before.
4125 So the real data starts at SCR 36000+3*1200. */
4126 mux_preload= (36000+3*1200) / 90000.0; //0.44
4127 } else if(!strcmp(arg, "svcd")) {
4129 opt_video_codec("mpeg2video");
4130 opt_audio_codec("mp2");
4133 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4134 opt_frame_rate(NULL, frame_rates[norm]);
4135 opt_default("g", norm == PAL ? "15" : "18");
4137 opt_default("b", "2040000");
4138 opt_default("maxrate", "2516000");
4139 opt_default("minrate", "0"); //1145000;
4140 opt_default("bufsize", "1835008"); //224*1024*8;
4141 opt_default("flags", "+scan_offset");
4144 opt_default("ab", "224000");
4145 audio_sample_rate = 44100;
4147 opt_default("packetsize", "2324");
4149 } else if(!strcmp(arg, "dvd")) {
4151 opt_video_codec("mpeg2video");
4152 opt_audio_codec("ac3");
4155 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4156 opt_frame_rate(NULL, frame_rates[norm]);
4157 opt_default("g", norm == PAL ? "15" : "18");
4159 opt_default("b", "6000000");
4160 opt_default("maxrate", "9000000");
4161 opt_default("minrate", "0"); //1500000;
4162 opt_default("bufsize", "1835008"); //224*1024*8;
4164 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4165 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4167 opt_default("ab", "448000");
4168 audio_sample_rate = 48000;
4170 } else if(!strncmp(arg, "dv", 2)) {
4174 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4175 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4176 (norm == PAL ? "yuv420p" : "yuv411p"));
4177 opt_frame_rate(NULL, frame_rates[norm]);
4179 audio_sample_rate = 48000;
4183 fprintf(stderr, "Unknown target: %s\n", arg);
4188 static void opt_vstats_file (const char *arg)
4190 av_free (vstats_filename);
4191 vstats_filename=av_strdup (arg);
4194 static void opt_vstats (void)
4197 time_t today2 = time(NULL);
4198 struct tm *today = localtime(&today2);
4200 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4202 opt_vstats_file(filename);
4205 static int opt_bsf(const char *opt, const char *arg)
4207 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4208 AVBitStreamFilterContext **bsfp;
4211 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4215 bsfp= *opt == 'v' ? &video_bitstream_filters :
4216 *opt == 'a' ? &audio_bitstream_filters :
4217 &subtitle_bitstream_filters;
4219 bsfp= &(*bsfp)->next;
4226 static int opt_preset(const char *opt, const char *arg)
4229 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4230 char *codec_name = *opt == 'v' ? video_codec_name :
4231 *opt == 'a' ? audio_codec_name :
4232 subtitle_codec_name;
4234 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4235 fprintf(stderr, "File for preset '%s' not found\n", arg);
4240 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4241 if(line[0] == '#' && !e)
4243 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4245 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4248 if(!strcmp(tmp, "acodec")){
4249 opt_audio_codec(tmp2);
4250 }else if(!strcmp(tmp, "vcodec")){
4251 opt_video_codec(tmp2);
4252 }else if(!strcmp(tmp, "scodec")){
4253 opt_subtitle_codec(tmp2);
4254 }else if(opt_default(tmp, tmp2) < 0){
4255 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4265 static const OptionDef options[] = {
4267 #include "cmdutils_common_opts.h"
4268 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4269 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4270 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4271 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4272 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4273 "outfile[,metadata]:infile[,metadata]" },
4274 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4275 "outfile[,metadata]:infile[,metadata]" },
4276 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4277 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4278 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4279 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4280 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4281 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4282 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4283 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4284 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4285 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4286 "add timings for benchmarking" },
4287 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4288 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4289 "dump each input packet" },
4290 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4291 "when dumping packets, also dump the payload" },
4292 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4293 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4294 { "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)", "" },
4295 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4296 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4297 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4298 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4299 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4300 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4301 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4302 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4303 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4304 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4305 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4306 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4307 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4308 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4311 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4312 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4313 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4314 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4315 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4316 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4317 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4318 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4319 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4320 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4321 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4322 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4323 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4324 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4325 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4326 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4327 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4328 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4329 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4330 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4331 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4332 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4333 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4334 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4335 "use same video quality as source (implies VBR)" },
4336 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4337 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4338 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4339 "deinterlace pictures" },
4340 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4341 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4342 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4344 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4346 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4347 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4348 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4349 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4350 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4351 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4352 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4353 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4354 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4355 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4356 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4359 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4360 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4361 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4362 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4363 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4364 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4365 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4366 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4367 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4368 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4369 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4370 { "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" },
4372 /* subtitle options */
4373 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4374 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4375 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4376 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4377 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4380 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4381 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4382 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4385 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4386 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4388 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4389 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4390 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4392 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4393 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4394 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4395 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4397 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4401 int main(int argc, char **argv)
4405 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4407 avcodec_register_all();
4409 avdevice_register_all();
4412 avfilter_register_all();
4417 if(isatty(STDIN_FILENO))
4418 url_set_interrupt_cb(decode_interrupt_cb);
4426 parse_options(argc, argv, options, opt_output_file);
4428 if(nb_output_files <= 0 && nb_input_files == 0) {
4430 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4434 /* file converter / grab */
4435 if (nb_output_files <= 0) {
4436 fprintf(stderr, "At least one output file must be specified\n");
4440 if (nb_input_files == 0) {
4441 fprintf(stderr, "At least one input file must be specified\n");
4446 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4447 stream_maps, nb_stream_maps) < 0)
4449 ti = getutime() - ti;
4451 int maxrss = getmaxrss() / 1024;
4452 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4455 return ffmpeg_exit(0);