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 "libavcore/audioconvert.h"
40 #include "libavcore/parseutils.h"
41 #include "libavcore/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 enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
153 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
154 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
155 static AVRational frame_rate;
156 static float video_qscale = 0;
157 static uint16_t *intra_matrix = NULL;
158 static uint16_t *inter_matrix = NULL;
159 static const char *video_rc_override_string=NULL;
160 static int video_disable = 0;
161 static int video_discard = 0;
162 static char *video_codec_name = NULL;
163 static unsigned int video_codec_tag = 0;
164 static char *video_language = NULL;
165 static int same_quality = 0;
166 static int do_deinterlace = 0;
167 static int top_field_first = -1;
168 static int me_threshold = 0;
169 static int intra_dc_precision = 8;
170 static int loop_input = 0;
171 static int loop_output = AVFMT_NOOUTPUTLOOP;
172 static int qp_hist = 0;
174 static char *vfilters = NULL;
175 static AVFilterGraph *graph = NULL;
178 static int intra_only = 0;
179 static int audio_sample_rate = 44100;
180 static int64_t channel_layout = 0;
181 #define QSCALE_NONE -99999
182 static float audio_qscale = QSCALE_NONE;
183 static int audio_disable = 0;
184 static int audio_channels = 1;
185 static char *audio_codec_name = NULL;
186 static unsigned int audio_codec_tag = 0;
187 static char *audio_language = NULL;
189 static int subtitle_disable = 0;
190 static char *subtitle_codec_name = NULL;
191 static char *subtitle_language = NULL;
192 static unsigned int subtitle_codec_tag = 0;
194 static float mux_preload= 0.5;
195 static float mux_max_delay= 0.7;
197 static int64_t recording_time = INT64_MAX;
198 static int64_t start_time = 0;
199 static int64_t recording_timestamp = 0;
200 static int64_t input_ts_offset = 0;
201 static int file_overwrite = 0;
202 static AVMetadata *metadata;
203 static int do_benchmark = 0;
204 static int do_hex_dump = 0;
205 static int do_pkt_dump = 0;
206 static int do_psnr = 0;
207 static int do_pass = 0;
208 static char *pass_logfilename_prefix = NULL;
209 static int audio_stream_copy = 0;
210 static int video_stream_copy = 0;
211 static int subtitle_stream_copy = 0;
212 static int video_sync_method= -1;
213 static int audio_sync_method= 0;
214 static float audio_drift_threshold= 0.1;
215 static int copy_ts= 0;
217 static int opt_shortest = 0;
218 static int video_global_header = 0;
219 static char *vstats_filename;
220 static FILE *vstats_file;
221 static int opt_programid = 0;
222 static int copy_initial_nonkeyframes = 0;
224 static int rate_emu = 0;
226 static int video_channel = 0;
227 static char *video_standard;
229 static int audio_volume = 256;
231 static int exit_on_error = 0;
232 static int using_stdin = 0;
233 static int verbose = 1;
234 static int thread_count= 1;
235 static int q_pressed = 0;
236 static int64_t video_size = 0;
237 static int64_t audio_size = 0;
238 static int64_t extra_size = 0;
239 static int nb_frames_dup = 0;
240 static int nb_frames_drop = 0;
241 static int input_sync;
242 static uint64_t limit_filesize = 0;
243 static int force_fps = 0;
244 static char *forced_key_frames = NULL;
246 static float dts_delta_threshold = 10;
248 static unsigned int sws_flags = SWS_BICUBIC;
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 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
309 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
311 typedef struct AVInputStream {
315 int discard; /* true if stream data should be discarded */
316 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
317 int64_t sample_index; /* current sample */
319 int64_t start; /* time when read started */
320 int64_t next_pts; /* synthetic pts for cases where pkt.pts
322 int64_t pts; /* current pts */
323 PtsCorrectionContext pts_ctx;
324 int is_start; /* is 1 at the start and after a discontinuity */
325 int showed_multi_packet_warning;
326 int is_past_recording_time;
328 AVFilterContext *output_video_filter;
329 AVFilterContext *input_video_filter;
330 AVFrame *filter_frame;
331 int has_filter_frame;
332 AVFilterBufferRef *picref;
336 typedef struct AVInputFile {
337 int eof_reached; /* true if eof reached */
338 int ist_index; /* index of first stream in ist_table */
339 int buffer_size; /* current total buffer size */
340 int nb_streams; /* nb streams we are aware of */
345 /* init terminal so that we can grab keys */
346 static struct termios oldtty;
351 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
353 AVFilterContext *last_filter, *filter;
354 /** filter graph containing all filters including input & output */
355 AVCodecContext *codec = ost->st->codec;
356 AVCodecContext *icodec = ist->st->codec;
357 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
361 graph = avfilter_graph_alloc();
363 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
364 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE);
365 ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
366 "src", args, NULL, graph);
369 ret = avfilter_graph_create_filter(&ist->output_video_filter, &ffsink,
370 "out", NULL, &ffsink_ctx, graph);
373 last_filter = ist->input_video_filter;
375 if (codec->width != icodec->width || codec->height != icodec->height) {
376 snprintf(args, 255, "%d:%d:flags=0x%X",
379 (int)av_get_int(sws_opts, "sws_flags", NULL));
380 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
381 NULL, args, NULL, graph)) < 0)
383 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
385 last_filter = filter;
388 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
389 graph->scale_sws_opts = av_strdup(args);
392 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
393 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
395 outputs->name = av_strdup("in");
396 outputs->filter_ctx = last_filter;
397 outputs->pad_idx = 0;
398 outputs->next = NULL;
400 inputs->name = av_strdup("out");
401 inputs->filter_ctx = ist->output_video_filter;
405 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
409 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
413 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
416 codec->width = ist->output_video_filter->inputs[0]->w;
417 codec->height = ist->output_video_filter->inputs[0]->h;
421 #endif /* CONFIG_AVFILTER */
423 static void term_exit(void)
425 av_log(NULL, AV_LOG_QUIET, "");
427 tcsetattr (0, TCSANOW, &oldtty);
431 static volatile int received_sigterm = 0;
434 sigterm_handler(int sig)
436 received_sigterm = sig;
440 static void term_init(void)
449 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
450 |INLCR|IGNCR|ICRNL|IXON);
451 tty.c_oflag |= OPOST;
452 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
453 tty.c_cflag &= ~(CSIZE|PARENB);
458 tcsetattr (0, TCSANOW, &tty);
459 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
462 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
463 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
465 signal(SIGXCPU, sigterm_handler);
469 /* read a key without blocking */
470 static int read_key(void)
482 n = select(1, &rfds, NULL, NULL, &tv);
497 static int decode_interrupt_cb(void)
499 return q_pressed || (q_pressed = read_key() == 'q');
502 static int ffmpeg_exit(int ret)
507 for(i=0;i<nb_output_files;i++) {
508 /* maybe av_close_output_file ??? */
509 AVFormatContext *s = output_files[i];
511 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
513 for(j=0;j<s->nb_streams;j++) {
514 av_metadata_free(&s->streams[j]->metadata);
515 av_free(s->streams[j]->codec);
516 av_free(s->streams[j]->info);
517 av_free(s->streams[j]);
519 for(j=0;j<s->nb_programs;j++) {
520 av_metadata_free(&s->programs[j]->metadata);
522 for(j=0;j<s->nb_chapters;j++) {
523 av_metadata_free(&s->chapters[j]->metadata);
525 av_metadata_free(&s->metadata);
527 av_free(output_streams_for_file[i]);
529 for(i=0;i<nb_input_files;i++) {
530 av_close_input_file(input_files[i]);
531 av_free(input_files_ts_scale[i]);
534 av_free(intra_matrix);
535 av_free(inter_matrix);
539 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 st->codec->pix_fmt = codec->pix_fmts[0];
654 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
656 int idx = oc->nb_streams - 1;
659 output_streams_for_file[file_idx] =
660 grow_array(output_streams_for_file[file_idx],
661 sizeof(*output_streams_for_file[file_idx]),
662 &nb_output_streams_for_file[file_idx],
664 ost = output_streams_for_file[file_idx][idx] =
665 av_mallocz(sizeof(AVOutputStream));
667 fprintf(stderr, "Could not alloc output stream\n");
670 ost->file_index = file_idx;
675 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
681 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
684 /* copy stream format */
686 for(i=0;i<ic->nb_streams;i++) {
692 // FIXME: a more elegant solution is needed
693 st = av_mallocz(sizeof(AVStream));
694 memcpy(st, ic->streams[i], sizeof(AVStream));
695 st->codec = avcodec_alloc_context();
697 print_error(filename, AVERROR(ENOMEM));
700 avcodec_copy_context(st->codec, ic->streams[i]->codec);
703 codec = avcodec_find_encoder(st->codec->codec_id);
704 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
705 if (audio_stream_copy) {
708 choose_sample_fmt(st, codec);
709 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
710 if (video_stream_copy) {
713 choose_pixel_fmt(st, codec);
716 if(!st->codec->thread_count)
717 st->codec->thread_count = 1;
718 if(st->codec->thread_count>1)
719 avcodec_thread_init(st->codec, st->codec->thread_count);
721 if(st->codec->flags & CODEC_FLAG_BITEXACT)
724 new_output_stream(s, nb_output_files);
728 s->timestamp = av_gettime();
730 av_close_input_file(ic);
735 get_sync_ipts(const AVOutputStream *ost)
737 const AVInputStream *ist = ost->sync_ist;
738 return (double)(ist->pts - start_time)/AV_TIME_BASE;
741 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
745 AVPacket new_pkt= *pkt;
746 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
747 &new_pkt.data, &new_pkt.size,
748 pkt->data, pkt->size,
749 pkt->flags & AV_PKT_FLAG_KEY);
752 new_pkt.destruct= av_destruct_packet;
754 fprintf(stderr, "%s failed for stream %d, codec %s",
755 bsfc->filter->name, pkt->stream_index,
756 avctx->codec ? avctx->codec->name : "copy");
766 ret= av_interleaved_write_frame(s, pkt);
768 print_error("av_interleaved_write_frame()", ret);
773 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
775 static void do_audio_out(AVFormatContext *s,
778 unsigned char *buf, int size)
781 int64_t audio_out_size, audio_buf_size;
782 int64_t allocated_for_size= size;
784 int size_out, frame_bytes, ret, resample_changed;
785 AVCodecContext *enc= ost->st->codec;
786 AVCodecContext *dec= ist->st->codec;
787 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
788 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
789 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
792 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
793 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
794 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
795 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
796 audio_buf_size*= osize*enc->channels;
798 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
799 if(coded_bps > 8*osize)
800 audio_out_size= audio_out_size * coded_bps / (8*osize);
801 audio_out_size += FF_MIN_BUFFER_SIZE;
803 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
804 fprintf(stderr, "Buffer sizes too large\n");
808 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
809 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
810 if (!audio_buf || !audio_out){
811 fprintf(stderr, "Out of memory in do_audio_out\n");
815 if (enc->channels != dec->channels)
816 ost->audio_resample = 1;
818 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
819 ost->resample_channels != dec->channels ||
820 ost->resample_sample_rate != dec->sample_rate;
822 if ((ost->audio_resample && !ost->resample) || resample_changed) {
823 if (resample_changed) {
824 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",
825 ist->file_index, ist->index,
826 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
827 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
828 ost->resample_sample_fmt = dec->sample_fmt;
829 ost->resample_channels = dec->channels;
830 ost->resample_sample_rate = dec->sample_rate;
832 audio_resample_close(ost->resample);
834 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
835 if (audio_sync_method <= 1 &&
836 ost->resample_sample_fmt == enc->sample_fmt &&
837 ost->resample_channels == enc->channels &&
838 ost->resample_sample_rate == enc->sample_rate) {
839 ost->resample = NULL;
840 ost->audio_resample = 0;
842 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
843 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
844 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
845 enc->sample_rate, dec->sample_rate,
846 enc->sample_fmt, dec->sample_fmt,
848 if (!ost->resample) {
849 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
850 dec->channels, dec->sample_rate,
851 enc->channels, enc->sample_rate);
857 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
858 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
859 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
860 if (ost->reformat_ctx)
861 av_audio_convert_free(ost->reformat_ctx);
862 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
863 dec->sample_fmt, 1, NULL, 0);
864 if (!ost->reformat_ctx) {
865 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
866 av_get_sample_fmt_name(dec->sample_fmt),
867 av_get_sample_fmt_name(enc->sample_fmt));
870 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
873 if(audio_sync_method){
874 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
875 - av_fifo_size(ost->fifo)/(enc->channels * 2);
876 double idelta= delta*dec->sample_rate / enc->sample_rate;
877 int byte_delta= ((int)idelta)*2*dec->channels;
879 //FIXME resample delay
880 if(fabs(delta) > 50){
881 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
883 byte_delta= FFMAX(byte_delta, -size);
887 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
892 static uint8_t *input_tmp= NULL;
893 input_tmp= av_realloc(input_tmp, byte_delta + size);
895 if(byte_delta > allocated_for_size - size){
896 allocated_for_size= byte_delta + (int64_t)size;
901 memset(input_tmp, 0, byte_delta);
902 memcpy(input_tmp + byte_delta, buf, size);
906 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
908 }else if(audio_sync_method>1){
909 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
910 av_assert0(ost->audio_resample);
912 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
913 // 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));
914 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
918 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
919 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
921 if (ost->audio_resample) {
923 size_out = audio_resample(ost->resample,
924 (short *)buftmp, (short *)buf,
925 size / (dec->channels * isize));
926 size_out = size_out * enc->channels * osize;
932 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
933 const void *ibuf[6]= {buftmp};
934 void *obuf[6]= {audio_buf};
935 int istride[6]= {isize};
936 int ostride[6]= {osize};
937 int len= size_out/istride[0];
938 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
939 printf("av_audio_convert() failed\n");
945 size_out = len*osize;
948 /* now encode as many frames as possible */
949 if (enc->frame_size > 1) {
950 /* output resampled raw samples */
951 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
952 fprintf(stderr, "av_fifo_realloc2() failed\n");
955 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
957 frame_bytes = enc->frame_size * osize * enc->channels;
959 while (av_fifo_size(ost->fifo) >= frame_bytes) {
961 av_init_packet(&pkt);
963 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
965 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
967 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
970 fprintf(stderr, "Audio encoding failed\n");
974 pkt.stream_index= ost->index;
977 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
978 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
979 pkt.flags |= AV_PKT_FLAG_KEY;
980 write_frame(s, &pkt, enc, ost->bitstream_filters);
982 ost->sync_opts += enc->frame_size;
986 av_init_packet(&pkt);
988 ost->sync_opts += size_out / (osize * enc->channels);
990 /* output a pcm frame */
991 /* determine the size of the coded buffer */
994 size_out = size_out*coded_bps/8;
996 if(size_out > audio_out_size){
997 fprintf(stderr, "Internal error, buffer size too small\n");
1001 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1002 ret = avcodec_encode_audio(enc, audio_out, size_out,
1005 fprintf(stderr, "Audio encoding failed\n");
1009 pkt.stream_index= ost->index;
1010 pkt.data= audio_out;
1012 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1013 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1014 pkt.flags |= AV_PKT_FLAG_KEY;
1015 write_frame(s, &pkt, enc, ost->bitstream_filters);
1019 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1021 AVCodecContext *dec;
1022 AVPicture *picture2;
1023 AVPicture picture_tmp;
1026 dec = ist->st->codec;
1028 /* deinterlace : must be done before any resize */
1029 if (do_deinterlace) {
1032 /* create temporary picture */
1033 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1034 buf = av_malloc(size);
1038 picture2 = &picture_tmp;
1039 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1041 if(avpicture_deinterlace(picture2, picture,
1042 dec->pix_fmt, dec->width, dec->height) < 0) {
1043 /* if error, do not deinterlace */
1044 fprintf(stderr, "Deinterlacing failed\n");
1053 if (picture != picture2)
1054 *picture = *picture2;
1058 /* we begin to correct av delay at this threshold */
1059 #define AV_DELAY_MAX 0.100
1061 static void do_subtitle_out(AVFormatContext *s,
1062 AVOutputStream *ost,
1067 static uint8_t *subtitle_out = NULL;
1068 int subtitle_out_max_size = 1024 * 1024;
1069 int subtitle_out_size, nb, i;
1070 AVCodecContext *enc;
1073 if (pts == AV_NOPTS_VALUE) {
1074 fprintf(stderr, "Subtitle packets must have a pts\n");
1080 enc = ost->st->codec;
1082 if (!subtitle_out) {
1083 subtitle_out = av_malloc(subtitle_out_max_size);
1086 /* Note: DVB subtitle need one packet to draw them and one other
1087 packet to clear them */
1088 /* XXX: signal it in the codec context ? */
1089 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1094 for(i = 0; i < nb; i++) {
1095 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1096 // start_display_time is required to be 0
1097 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1098 sub->end_display_time -= sub->start_display_time;
1099 sub->start_display_time = 0;
1100 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1101 subtitle_out_max_size, sub);
1102 if (subtitle_out_size < 0) {
1103 fprintf(stderr, "Subtitle encoding failed\n");
1107 av_init_packet(&pkt);
1108 pkt.stream_index = ost->index;
1109 pkt.data = subtitle_out;
1110 pkt.size = subtitle_out_size;
1111 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1112 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1113 /* XXX: the pts correction is handled here. Maybe handling
1114 it in the codec would be better */
1116 pkt.pts += 90 * sub->start_display_time;
1118 pkt.pts += 90 * sub->end_display_time;
1120 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1124 static int bit_buffer_size= 1024*256;
1125 static uint8_t *bit_buffer= NULL;
1127 static void do_video_out(AVFormatContext *s,
1128 AVOutputStream *ost,
1130 AVFrame *in_picture,
1133 int nb_frames, i, ret;
1134 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1135 AVCodecContext *enc, *dec;
1138 enc = ost->st->codec;
1139 dec = ist->st->codec;
1141 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1143 /* by default, we output a single frame */
1148 if(video_sync_method){
1149 double vdelta = sync_ipts - ost->sync_opts;
1150 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1153 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1156 }else if(vdelta>0.6)
1157 ost->sync_opts= lrintf(sync_ipts);
1158 }else if (vdelta > 1.1)
1159 nb_frames = lrintf(vdelta);
1160 //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);
1161 if (nb_frames == 0){
1164 fprintf(stderr, "*** drop!\n");
1165 }else if (nb_frames > 1) {
1166 nb_frames_dup += nb_frames - 1;
1168 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1171 ost->sync_opts= lrintf(sync_ipts);
1173 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1177 formatted_picture = in_picture;
1178 final_picture = formatted_picture;
1179 padding_src = formatted_picture;
1180 resampling_dst = &ost->pict_tmp;
1182 if ( ost->resample_height != ist->st->codec->height
1183 || ost->resample_width != ist->st->codec->width
1184 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1186 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));
1187 if(!ost->video_resample)
1191 #if !CONFIG_AVFILTER
1192 if (ost->video_resample) {
1194 final_picture = &ost->pict_tmp;
1195 if( ost->resample_height != ist->st->codec->height
1196 || ost->resample_width != ist->st->codec->width
1197 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1199 /* initialize a new scaler context */
1200 sws_freeContext(ost->img_resample_ctx);
1201 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1202 ost->img_resample_ctx = sws_getContext(
1203 ist->st->codec->width,
1204 ist->st->codec->height,
1205 ist->st->codec->pix_fmt,
1206 ost->st->codec->width,
1207 ost->st->codec->height,
1208 ost->st->codec->pix_fmt,
1209 sws_flags, NULL, NULL, NULL);
1210 if (ost->img_resample_ctx == NULL) {
1211 fprintf(stderr, "Cannot get resampling context\n");
1215 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1216 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1220 /* duplicates frame if needed */
1221 for(i=0;i<nb_frames;i++) {
1223 av_init_packet(&pkt);
1224 pkt.stream_index= ost->index;
1226 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1227 /* raw pictures are written as AVPicture structure to
1228 avoid any copies. We support temorarily the older
1230 AVFrame* old_frame = enc->coded_frame;
1231 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1232 pkt.data= (uint8_t *)final_picture;
1233 pkt.size= sizeof(AVPicture);
1234 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1235 pkt.flags |= AV_PKT_FLAG_KEY;
1237 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1238 enc->coded_frame = old_frame;
1240 AVFrame big_picture;
1242 big_picture= *final_picture;
1243 /* better than nothing: use input picture interlaced
1245 big_picture.interlaced_frame = in_picture->interlaced_frame;
1246 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1247 if(top_field_first == -1)
1248 big_picture.top_field_first = in_picture->top_field_first;
1250 big_picture.top_field_first = top_field_first;
1253 /* handles sameq here. This is not correct because it may
1254 not be a global option */
1255 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1257 big_picture.pict_type = 0;
1258 // big_picture.pts = AV_NOPTS_VALUE;
1259 big_picture.pts= ost->sync_opts;
1260 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1261 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1262 if (ost->forced_kf_index < ost->forced_kf_count &&
1263 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1264 big_picture.pict_type = FF_I_TYPE;
1265 ost->forced_kf_index++;
1267 ret = avcodec_encode_video(enc,
1268 bit_buffer, bit_buffer_size,
1271 fprintf(stderr, "Video encoding failed\n");
1276 pkt.data= bit_buffer;
1278 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1279 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1280 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1281 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1282 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1284 if(enc->coded_frame->key_frame)
1285 pkt.flags |= AV_PKT_FLAG_KEY;
1286 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1289 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1290 // enc->frame_number-1, ret, enc->pict_type);
1291 /* if two pass, output log */
1292 if (ost->logfile && enc->stats_out) {
1293 fprintf(ost->logfile, "%s", enc->stats_out);
1298 ost->frame_number++;
1302 static double psnr(double d){
1303 return -10.0*log(d)/log(10.0);
1306 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1309 AVCodecContext *enc;
1311 double ti1, bitrate, avg_bitrate;
1313 /* this is executed just the first time do_video_stats is called */
1315 vstats_file = fopen(vstats_filename, "w");
1322 enc = ost->st->codec;
1323 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1324 frame_number = ost->frame_number;
1325 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1326 if (enc->flags&CODEC_FLAG_PSNR)
1327 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1329 fprintf(vstats_file,"f_size= %6d ", frame_size);
1330 /* compute pts value */
1331 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1335 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1336 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1337 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1338 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1339 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1343 static void print_report(AVFormatContext **output_files,
1344 AVOutputStream **ost_table, int nb_ostreams,
1348 AVOutputStream *ost;
1349 AVFormatContext *oc;
1351 AVCodecContext *enc;
1352 int frame_number, vid, i;
1353 double bitrate, ti1, pts;
1354 static int64_t last_time = -1;
1355 static int qp_histogram[52];
1357 if (!is_last_report) {
1359 /* display the report every 0.5 seconds */
1360 cur_time = av_gettime();
1361 if (last_time == -1) {
1362 last_time = cur_time;
1365 if ((cur_time - last_time) < 500000)
1367 last_time = cur_time;
1371 oc = output_files[0];
1373 total_size = url_fsize(oc->pb);
1374 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1375 total_size= url_ftell(oc->pb);
1380 for(i=0;i<nb_ostreams;i++) {
1382 enc = ost->st->codec;
1383 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1384 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1385 !ost->st->stream_copy ?
1386 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1388 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1389 float t = (av_gettime()-timer_start) / 1000000.0;
1391 frame_number = ost->frame_number;
1392 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1393 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1394 !ost->st->stream_copy ?
1395 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1400 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1401 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1406 if (enc->flags&CODEC_FLAG_PSNR){
1408 double error, error_sum=0;
1409 double scale, scale_sum=0;
1410 char type[3]= {'Y','U','V'};
1411 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1414 error= enc->error[j];
1415 scale= enc->width*enc->height*255.0*255.0*frame_number;
1417 error= enc->coded_frame->error[j];
1418 scale= enc->width*enc->height*255.0*255.0;
1423 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1425 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1429 /* compute min output value */
1430 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1431 if ((pts < ti1) && (pts > 0))
1437 if (verbose || is_last_report) {
1438 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1440 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1441 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1442 (double)total_size / 1024, ti1, bitrate);
1444 if (nb_frames_dup || nb_frames_drop)
1445 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1446 nb_frames_dup, nb_frames_drop);
1449 fprintf(stderr, "%s \r", buf);
1454 if (is_last_report && verbose >= 0){
1455 int64_t raw= audio_size + video_size + extra_size;
1456 fprintf(stderr, "\n");
1457 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1461 100.0*(total_size - raw)/raw
1466 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1467 static int output_packet(AVInputStream *ist, int ist_index,
1468 AVOutputStream **ost_table, int nb_ostreams,
1469 const AVPacket *pkt)
1471 AVFormatContext *os;
1472 AVOutputStream *ost;
1476 void *buffer_to_free;
1477 static unsigned int samples_size= 0;
1478 AVSubtitle subtitle, *subtitle_to_free;
1479 int64_t pkt_pts = AV_NOPTS_VALUE;
1481 int frame_available;
1485 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1487 if(ist->next_pts == AV_NOPTS_VALUE)
1488 ist->next_pts= ist->pts;
1492 av_init_packet(&avpkt);
1500 if(pkt->dts != AV_NOPTS_VALUE)
1501 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1502 if(pkt->pts != AV_NOPTS_VALUE)
1503 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1505 //while we have more to decode or while the decoder did output something on EOF
1506 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1507 uint8_t *data_buf, *decoded_data_buf;
1508 int data_size, decoded_data_size;
1510 ist->pts= ist->next_pts;
1512 if(avpkt.size && avpkt.size != pkt->size &&
1513 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1514 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1515 ist->showed_multi_packet_warning=1;
1518 /* decode the packet if needed */
1519 decoded_data_buf = NULL; /* fail safe */
1520 decoded_data_size= 0;
1521 data_buf = avpkt.data;
1522 data_size = avpkt.size;
1523 subtitle_to_free = NULL;
1524 if (ist->decoding_needed) {
1525 switch(ist->st->codec->codec_type) {
1526 case AVMEDIA_TYPE_AUDIO:{
1527 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1528 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1530 samples= av_malloc(samples_size);
1532 decoded_data_size= samples_size;
1533 /* XXX: could avoid copy if PCM 16 bits with same
1534 endianness as CPU */
1535 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1542 /* Some bug in mpeg audio decoder gives */
1543 /* decoded_data_size < 0, it seems they are overflows */
1544 if (decoded_data_size <= 0) {
1545 /* no audio frame */
1548 decoded_data_buf = (uint8_t *)samples;
1549 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1550 (ist->st->codec->sample_rate * ist->st->codec->channels);
1552 case AVMEDIA_TYPE_VIDEO:
1553 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1554 /* XXX: allocate picture correctly */
1555 avcodec_get_frame_defaults(&picture);
1556 ist->st->codec->reordered_opaque = pkt_pts;
1557 pkt_pts = AV_NOPTS_VALUE;
1559 ret = avcodec_decode_video2(ist->st->codec,
1560 &picture, &got_picture, &avpkt);
1561 ist->st->quality= picture.quality;
1565 /* no picture yet */
1566 goto discard_packet;
1568 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.reordered_opaque, ist->pts);
1569 if (ist->st->codec->time_base.num != 0) {
1570 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1571 ist->next_pts += ((int64_t)AV_TIME_BASE *
1572 ist->st->codec->time_base.num * ticks) /
1573 ist->st->codec->time_base.den;
1577 case AVMEDIA_TYPE_SUBTITLE:
1578 ret = avcodec_decode_subtitle2(ist->st->codec,
1579 &subtitle, &got_picture, &avpkt);
1583 goto discard_packet;
1585 subtitle_to_free = &subtitle;
1592 switch(ist->st->codec->codec_type) {
1593 case AVMEDIA_TYPE_AUDIO:
1594 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1595 ist->st->codec->sample_rate;
1597 case AVMEDIA_TYPE_VIDEO:
1598 if (ist->st->codec->time_base.num != 0) {
1599 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1600 ist->next_pts += ((int64_t)AV_TIME_BASE *
1601 ist->st->codec->time_base.num * ticks) /
1602 ist->st->codec->time_base.den;
1610 buffer_to_free = NULL;
1611 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1612 pre_process_video_frame(ist, (AVPicture *)&picture,
1617 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1619 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1620 else sar = ist->st->codec->sample_aspect_ratio;
1621 // add it to be filtered
1622 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1628 // preprocess audio (volume)
1629 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1630 if (audio_volume != 256) {
1633 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1634 int v = ((*volp) * audio_volume + 128) >> 8;
1635 if (v < -32768) v = -32768;
1636 if (v > 32767) v = 32767;
1642 /* frame rate emulation */
1644 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1645 int64_t now = av_gettime() - ist->start;
1650 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1651 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1653 /* if output time reached then transcode raw format,
1654 encode packets and output them */
1655 if (start_time == 0 || ist->pts >= start_time)
1657 while (frame_available) {
1658 AVRational ist_pts_tb;
1659 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1660 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1662 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1664 for(i=0;i<nb_ostreams;i++) {
1668 if (ost->source_index == ist_index) {
1669 os = output_files[ost->file_index];
1671 /* set the input output pts pairs */
1672 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1674 if (ost->encoding_needed) {
1675 av_assert0(ist->decoding_needed);
1676 switch(ost->st->codec->codec_type) {
1677 case AVMEDIA_TYPE_AUDIO:
1678 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1680 case AVMEDIA_TYPE_VIDEO:
1682 if (ist->picref->video)
1683 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1685 do_video_out(os, ost, ist, &picture, &frame_size);
1686 if (vstats_filename && frame_size)
1687 do_video_stats(os, ost, frame_size);
1689 case AVMEDIA_TYPE_SUBTITLE:
1690 do_subtitle_out(os, ost, ist, &subtitle,
1697 AVFrame avframe; //FIXME/XXX remove this
1699 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1701 av_init_packet(&opkt);
1703 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1706 /* no reencoding needed : output the packet directly */
1707 /* force the input stream PTS */
1709 avcodec_get_frame_defaults(&avframe);
1710 ost->st->codec->coded_frame= &avframe;
1711 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1713 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1714 audio_size += data_size;
1715 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1716 video_size += data_size;
1720 opkt.stream_index= ost->index;
1721 if(pkt->pts != AV_NOPTS_VALUE)
1722 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1724 opkt.pts= AV_NOPTS_VALUE;
1726 if (pkt->dts == AV_NOPTS_VALUE)
1727 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1729 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1730 opkt.dts -= ost_tb_start_time;
1732 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1733 opkt.flags= pkt->flags;
1735 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1736 if( ost->st->codec->codec_id != CODEC_ID_H264
1737 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1738 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1740 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1741 opkt.destruct= av_destruct_packet;
1743 opkt.data = data_buf;
1744 opkt.size = data_size;
1747 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1748 ost->st->codec->frame_number++;
1749 ost->frame_number++;
1750 av_free_packet(&opkt);
1756 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1757 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1759 avfilter_unref_buffer(ist->picref);
1762 av_free(buffer_to_free);
1763 /* XXX: allocate the subtitles in the codec ? */
1764 if (subtitle_to_free) {
1765 avsubtitle_free(subtitle_to_free);
1766 subtitle_to_free = NULL;
1773 for(i=0;i<nb_ostreams;i++) {
1775 if (ost->source_index == ist_index) {
1776 AVCodecContext *enc= ost->st->codec;
1777 os = output_files[ost->file_index];
1779 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1781 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1784 if (ost->encoding_needed) {
1788 av_init_packet(&pkt);
1789 pkt.stream_index= ost->index;
1791 switch(ost->st->codec->codec_type) {
1792 case AVMEDIA_TYPE_AUDIO:
1793 fifo_bytes = av_fifo_size(ost->fifo);
1795 /* encode any samples remaining in fifo */
1796 if (fifo_bytes > 0) {
1797 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1798 int fs_tmp = enc->frame_size;
1800 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1801 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1802 enc->frame_size = fifo_bytes / (osize * enc->channels);
1804 int frame_bytes = enc->frame_size*osize*enc->channels;
1805 if (allocated_audio_buf_size < frame_bytes)
1807 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1810 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1811 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1812 ost->st->time_base.num, enc->sample_rate);
1813 enc->frame_size = fs_tmp;
1816 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1819 fprintf(stderr, "Audio encoding failed\n");
1823 pkt.flags |= AV_PKT_FLAG_KEY;
1825 case AVMEDIA_TYPE_VIDEO:
1826 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1828 fprintf(stderr, "Video encoding failed\n");
1832 if(enc->coded_frame && enc->coded_frame->key_frame)
1833 pkt.flags |= AV_PKT_FLAG_KEY;
1834 if (ost->logfile && enc->stats_out) {
1835 fprintf(ost->logfile, "%s", enc->stats_out);
1844 pkt.data= bit_buffer;
1846 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1847 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1848 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1860 static void print_sdp(AVFormatContext **avc, int n)
1864 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1865 printf("SDP:\n%s\n", sdp);
1869 static int copy_chapters(int infile, int outfile)
1871 AVFormatContext *is = input_files[infile];
1872 AVFormatContext *os = output_files[outfile];
1875 for (i = 0; i < is->nb_chapters; i++) {
1876 AVChapter *in_ch = is->chapters[i], *out_ch;
1877 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1878 AV_TIME_BASE_Q, in_ch->time_base);
1879 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1880 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1883 if (in_ch->end < ts_off)
1885 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1888 out_ch = av_mallocz(sizeof(AVChapter));
1890 return AVERROR(ENOMEM);
1892 out_ch->id = in_ch->id;
1893 out_ch->time_base = in_ch->time_base;
1894 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1895 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1897 if (metadata_chapters_autocopy)
1898 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1901 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1903 return AVERROR(ENOMEM);
1904 os->chapters[os->nb_chapters - 1] = out_ch;
1909 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1910 AVCodecContext *avctx)
1916 for (p = kf; *p; p++)
1919 ost->forced_kf_count = n;
1920 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1921 if (!ost->forced_kf_pts) {
1922 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1925 for (i = 0; i < n; i++) {
1926 p = i ? strchr(p, ',') + 1 : kf;
1927 t = parse_time_or_die("force_key_frames", p, 1);
1928 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1933 * The following code is the main loop of the file converter
1935 static int transcode(AVFormatContext **output_files,
1936 int nb_output_files,
1937 AVFormatContext **input_files,
1939 AVStreamMap *stream_maps, int nb_stream_maps)
1941 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1942 AVFormatContext *is, *os;
1943 AVCodecContext *codec, *icodec;
1944 AVOutputStream *ost, **ost_table = NULL;
1945 AVInputStream *ist, **ist_table = NULL;
1946 AVInputFile *file_table;
1950 uint8_t no_packet[MAX_FILES]={0};
1951 int no_packet_count=0;
1953 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1957 /* input stream init */
1959 for(i=0;i<nb_input_files;i++) {
1960 is = input_files[i];
1961 file_table[i].ist_index = j;
1962 file_table[i].nb_streams = is->nb_streams;
1963 j += is->nb_streams;
1967 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1971 for(i=0;i<nb_istreams;i++) {
1972 ist = av_mallocz(sizeof(AVInputStream));
1978 for(i=0;i<nb_input_files;i++) {
1979 is = input_files[i];
1980 for(k=0;k<is->nb_streams;k++) {
1981 ist = ist_table[j++];
1982 ist->st = is->streams[k];
1983 ist->file_index = i;
1985 ist->discard = 1; /* the stream is discarded by default
1989 ist->start = av_gettime();
1994 /* output stream init */
1996 for(i=0;i<nb_output_files;i++) {
1997 os = output_files[i];
1998 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1999 dump_format(output_files[i], i, output_files[i]->filename, 1);
2000 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2001 ret = AVERROR(EINVAL);
2004 nb_ostreams += os->nb_streams;
2006 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2007 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2008 ret = AVERROR(EINVAL);
2012 /* Sanity check the mapping args -- do the input files & streams exist? */
2013 for(i=0;i<nb_stream_maps;i++) {
2014 int fi = stream_maps[i].file_index;
2015 int si = stream_maps[i].stream_index;
2017 if (fi < 0 || fi > nb_input_files - 1 ||
2018 si < 0 || si > file_table[fi].nb_streams - 1) {
2019 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2020 ret = AVERROR(EINVAL);
2023 fi = stream_maps[i].sync_file_index;
2024 si = stream_maps[i].sync_stream_index;
2025 if (fi < 0 || fi > nb_input_files - 1 ||
2026 si < 0 || si > file_table[fi].nb_streams - 1) {
2027 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2028 ret = AVERROR(EINVAL);
2033 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2037 for(k=0;k<nb_output_files;k++) {
2038 os = output_files[k];
2039 for(i=0;i<os->nb_streams;i++,n++) {
2041 ost = ost_table[n] = output_streams_for_file[k][i];
2042 ost->st = os->streams[i];
2043 if (nb_stream_maps > 0) {
2044 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2045 stream_maps[n].stream_index;
2047 /* Sanity check that the stream types match */
2048 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2049 int i= ost->file_index;
2050 dump_format(output_files[i], i, output_files[i]->filename, 1);
2051 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2052 stream_maps[n].file_index, stream_maps[n].stream_index,
2053 ost->file_index, ost->index);
2058 int best_nb_frames=-1;
2059 /* get corresponding input stream index : we select the first one with the right type */
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 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2079 if(best_nb_frames < ist->st->codec_info_nb_frames){
2080 best_nb_frames= ist->st->codec_info_nb_frames;
2081 ost->source_index = j;
2088 if(! opt_programid) {
2089 /* try again and reuse existing stream */
2090 for(j=0;j<nb_istreams;j++) {
2092 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2093 && ist->st->discard != AVDISCARD_ALL) {
2094 ost->source_index = j;
2100 int i= ost->file_index;
2101 dump_format(output_files[i], i, output_files[i]->filename, 1);
2102 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2103 ost->file_index, ost->index);
2108 ist = ist_table[ost->source_index];
2110 ost->sync_ist = (nb_stream_maps > 0) ?
2111 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2112 stream_maps[n].sync_stream_index] : ist;
2116 /* for each output stream, we compute the right encoding parameters */
2117 for(i=0;i<nb_ostreams;i++) {
2119 os = output_files[ost->file_index];
2120 ist = ist_table[ost->source_index];
2122 codec = ost->st->codec;
2123 icodec = ist->st->codec;
2125 if (metadata_streams_autocopy)
2126 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2127 AV_METADATA_DONT_OVERWRITE);
2129 ost->st->disposition = ist->st->disposition;
2130 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2131 codec->chroma_sample_location = icodec->chroma_sample_location;
2133 if (ost->st->stream_copy) {
2134 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2136 if (extra_size > INT_MAX)
2139 /* if stream_copy is selected, no need to decode or encode */
2140 codec->codec_id = icodec->codec_id;
2141 codec->codec_type = icodec->codec_type;
2143 if(!codec->codec_tag){
2144 if( !os->oformat->codec_tag
2145 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2146 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2147 codec->codec_tag = icodec->codec_tag;
2150 codec->bit_rate = icodec->bit_rate;
2151 codec->rc_max_rate = icodec->rc_max_rate;
2152 codec->rc_buffer_size = icodec->rc_buffer_size;
2153 codec->extradata= av_mallocz(extra_size);
2154 if (!codec->extradata)
2156 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2157 codec->extradata_size= icodec->extradata_size;
2158 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){
2159 codec->time_base = icodec->time_base;
2160 codec->time_base.num *= icodec->ticks_per_frame;
2161 av_reduce(&codec->time_base.num, &codec->time_base.den,
2162 codec->time_base.num, codec->time_base.den, INT_MAX);
2164 codec->time_base = ist->st->time_base;
2165 switch(codec->codec_type) {
2166 case AVMEDIA_TYPE_AUDIO:
2167 if(audio_volume != 256) {
2168 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2171 codec->channel_layout = icodec->channel_layout;
2172 codec->sample_rate = icodec->sample_rate;
2173 codec->channels = icodec->channels;
2174 codec->frame_size = icodec->frame_size;
2175 codec->block_align= icodec->block_align;
2176 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2177 codec->block_align= 0;
2178 if(codec->codec_id == CODEC_ID_AC3)
2179 codec->block_align= 0;
2181 case AVMEDIA_TYPE_VIDEO:
2182 codec->pix_fmt = icodec->pix_fmt;
2183 codec->width = icodec->width;
2184 codec->height = icodec->height;
2185 codec->has_b_frames = icodec->has_b_frames;
2187 case AVMEDIA_TYPE_SUBTITLE:
2188 codec->width = icodec->width;
2189 codec->height = icodec->height;
2195 switch(codec->codec_type) {
2196 case AVMEDIA_TYPE_AUDIO:
2197 ost->fifo= av_fifo_alloc(1024);
2200 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2201 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2202 icodec->request_channels = codec->channels;
2203 ist->decoding_needed = 1;
2204 ost->encoding_needed = 1;
2205 ost->resample_sample_fmt = icodec->sample_fmt;
2206 ost->resample_sample_rate = icodec->sample_rate;
2207 ost->resample_channels = icodec->channels;
2209 case AVMEDIA_TYPE_VIDEO:
2210 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2211 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2214 ost->video_resample = (codec->width != icodec->width ||
2215 codec->height != icodec->height ||
2216 (codec->pix_fmt != icodec->pix_fmt));
2217 if (ost->video_resample) {
2218 #if !CONFIG_AVFILTER
2219 avcodec_get_frame_defaults(&ost->pict_tmp);
2220 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2221 codec->width, codec->height)) {
2222 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2225 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2226 ost->img_resample_ctx = sws_getContext(
2233 sws_flags, NULL, NULL, NULL);
2234 if (ost->img_resample_ctx == NULL) {
2235 fprintf(stderr, "Cannot get resampling context\n");
2239 ost->original_height = icodec->height;
2240 ost->original_width = icodec->width;
2242 codec->bits_per_raw_sample= 0;
2244 ost->resample_height = icodec->height;
2245 ost->resample_width = icodec->width;
2246 ost->resample_pix_fmt= icodec->pix_fmt;
2247 ost->encoding_needed = 1;
2248 ist->decoding_needed = 1;
2251 if (configure_filters(ist, ost)) {
2252 fprintf(stderr, "Error opening filters!\n");
2257 case AVMEDIA_TYPE_SUBTITLE:
2258 ost->encoding_needed = 1;
2259 ist->decoding_needed = 1;
2266 if (ost->encoding_needed &&
2267 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2268 char logfilename[1024];
2271 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2272 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2274 if (codec->flags & CODEC_FLAG_PASS1) {
2275 f = fopen(logfilename, "wb");
2277 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2283 size_t logbuffer_size;
2284 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2285 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2288 codec->stats_in = logbuffer;
2292 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2293 int size= codec->width * codec->height;
2294 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2299 bit_buffer = av_malloc(bit_buffer_size);
2301 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2303 ret = AVERROR(ENOMEM);
2307 /* open each encoder */
2308 for(i=0;i<nb_ostreams;i++) {
2310 if (ost->encoding_needed) {
2311 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2312 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2314 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2316 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2317 ost->st->codec->codec_id, ost->file_index, ost->index);
2318 ret = AVERROR(EINVAL);
2321 if (dec->subtitle_header) {
2322 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2323 if (!ost->st->codec->subtitle_header) {
2324 ret = AVERROR(ENOMEM);
2327 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2328 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2330 if (avcodec_open(ost->st->codec, codec) < 0) {
2331 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2332 ost->file_index, ost->index);
2333 ret = AVERROR(EINVAL);
2336 extra_size += ost->st->codec->extradata_size;
2340 /* open each decoder */
2341 for(i=0;i<nb_istreams;i++) {
2343 if (ist->decoding_needed) {
2344 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2346 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2348 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2349 ist->st->codec->codec_id, ist->file_index, ist->index);
2350 ret = AVERROR(EINVAL);
2353 if (avcodec_open(ist->st->codec, codec) < 0) {
2354 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2355 ist->file_index, ist->index);
2356 ret = AVERROR(EINVAL);
2359 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2360 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2365 for(i=0;i<nb_istreams;i++) {
2369 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2370 ist->next_pts = AV_NOPTS_VALUE;
2371 init_pts_correction(&ist->pts_ctx);
2375 /* set meta data information from input file if required */
2376 for (i=0;i<nb_meta_data_maps;i++) {
2377 AVFormatContext *files[2];
2378 AVMetadata **meta[2];
2381 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2382 if ((index) < 0 || (index) >= (nb_elems)) {\
2383 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2385 ret = AVERROR(EINVAL);\
2389 int out_file_index = meta_data_maps[i][0].file;
2390 int in_file_index = meta_data_maps[i][1].file;
2391 if (in_file_index < 0 || out_file_index < 0)
2393 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2394 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2396 files[0] = output_files[out_file_index];
2397 files[1] = input_files[in_file_index];
2399 for (j = 0; j < 2; j++) {
2400 AVMetaDataMap *map = &meta_data_maps[i][j];
2402 switch (map->type) {
2404 meta[j] = &files[j]->metadata;
2407 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2408 meta[j] = &files[j]->streams[map->index]->metadata;
2411 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2412 meta[j] = &files[j]->chapters[map->index]->metadata;
2415 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2416 meta[j] = &files[j]->programs[map->index]->metadata;
2421 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2424 /* copy global metadata by default */
2425 if (metadata_global_autocopy) {
2427 for (i = 0; i < nb_output_files; i++)
2428 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2429 AV_METADATA_DONT_OVERWRITE);
2432 /* copy chapters according to chapter maps */
2433 for (i = 0; i < nb_chapter_maps; i++) {
2434 int infile = chapter_maps[i].in_file;
2435 int outfile = chapter_maps[i].out_file;
2437 if (infile < 0 || outfile < 0)
2439 if (infile >= nb_input_files) {
2440 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2441 ret = AVERROR(EINVAL);
2444 if (outfile >= nb_output_files) {
2445 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2446 ret = AVERROR(EINVAL);
2449 copy_chapters(infile, outfile);
2452 /* copy chapters from the first input file that has them*/
2453 if (!nb_chapter_maps)
2454 for (i = 0; i < nb_input_files; i++) {
2455 if (!input_files[i]->nb_chapters)
2458 for (j = 0; j < nb_output_files; j++)
2459 if ((ret = copy_chapters(i, j)) < 0)
2464 /* open files and write file headers */
2465 for(i=0;i<nb_output_files;i++) {
2466 os = output_files[i];
2467 if (av_write_header(os) < 0) {
2468 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2469 ret = AVERROR(EINVAL);
2472 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2478 /* dump the file output parameters - cannot be done before in case
2480 for(i=0;i<nb_output_files;i++) {
2481 dump_format(output_files[i], i, output_files[i]->filename, 1);
2484 /* dump the stream mapping */
2486 fprintf(stderr, "Stream mapping:\n");
2487 for(i=0;i<nb_ostreams;i++) {
2489 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2490 ist_table[ost->source_index]->file_index,
2491 ist_table[ost->source_index]->index,
2494 if (ost->sync_ist != ist_table[ost->source_index])
2495 fprintf(stderr, " [sync #%d.%d]",
2496 ost->sync_ist->file_index,
2497 ost->sync_ist->index);
2498 fprintf(stderr, "\n");
2503 fprintf(stderr, "%s\n", error);
2508 print_sdp(output_files, nb_output_files);
2511 if (!using_stdin && verbose >= 0) {
2512 fprintf(stderr, "Press [q] to stop encoding\n");
2513 url_set_interrupt_cb(decode_interrupt_cb);
2517 timer_start = av_gettime();
2519 for(; received_sigterm == 0;) {
2520 int file_index, ist_index;
2528 /* if 'q' pressed, exits */
2532 /* read_key() returns 0 on EOF */
2538 /* select the stream that we must read now by looking at the
2539 smallest output pts */
2541 for(i=0;i<nb_ostreams;i++) {
2544 os = output_files[ost->file_index];
2545 ist = ist_table[ost->source_index];
2546 if(ist->is_past_recording_time || no_packet[ist->file_index])
2548 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2549 ipts = (double)ist->pts;
2550 if (!file_table[ist->file_index].eof_reached){
2551 if(ipts < ipts_min) {
2553 if(input_sync ) file_index = ist->file_index;
2555 if(opts < opts_min) {
2557 if(!input_sync) file_index = ist->file_index;
2560 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2565 /* if none, if is finished */
2566 if (file_index < 0) {
2567 if(no_packet_count){
2569 memset(no_packet, 0, sizeof(no_packet));
2576 /* finish if limit size exhausted */
2577 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2580 /* read a frame from it and output it in the fifo */
2581 is = input_files[file_index];
2582 ret= av_read_frame(is, &pkt);
2583 if(ret == AVERROR(EAGAIN)){
2584 no_packet[file_index]=1;
2589 file_table[file_index].eof_reached = 1;
2597 memset(no_packet, 0, sizeof(no_packet));
2600 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2602 /* the following test is needed in case new streams appear
2603 dynamically in stream : we ignore them */
2604 if (pkt.stream_index >= file_table[file_index].nb_streams)
2605 goto discard_packet;
2606 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2607 ist = ist_table[ist_index];
2609 goto discard_packet;
2611 if (pkt.dts != AV_NOPTS_VALUE)
2612 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2613 if (pkt.pts != AV_NOPTS_VALUE)
2614 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2616 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2617 && input_files_ts_scale[file_index][pkt.stream_index]){
2618 if(pkt.pts != AV_NOPTS_VALUE)
2619 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2620 if(pkt.dts != AV_NOPTS_VALUE)
2621 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2624 // 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);
2625 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2626 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2627 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2628 int64_t delta= pkt_dts - ist->next_pts;
2629 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2630 input_files_ts_offset[ist->file_index]-= delta;
2632 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2633 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2634 if(pkt.pts != AV_NOPTS_VALUE)
2635 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2639 /* finish if recording time exhausted */
2640 if (recording_time != INT64_MAX &&
2641 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2642 ist->is_past_recording_time = 1;
2643 goto discard_packet;
2646 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2647 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2650 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2651 ist->file_index, ist->index);
2654 av_free_packet(&pkt);
2659 av_free_packet(&pkt);
2661 /* dump report by using the output first video and audio streams */
2662 print_report(output_files, ost_table, nb_ostreams, 0);
2665 /* at the end of stream, we must flush the decoder buffers */
2666 for(i=0;i<nb_istreams;i++) {
2668 if (ist->decoding_needed) {
2669 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2675 /* write the trailer if needed and close file */
2676 for(i=0;i<nb_output_files;i++) {
2677 os = output_files[i];
2678 av_write_trailer(os);
2681 /* dump report by using the first video and audio streams */
2682 print_report(output_files, ost_table, nb_ostreams, 1);
2684 /* close each encoder */
2685 for(i=0;i<nb_ostreams;i++) {
2687 if (ost->encoding_needed) {
2688 av_freep(&ost->st->codec->stats_in);
2689 avcodec_close(ost->st->codec);
2693 /* close each decoder */
2694 for(i=0;i<nb_istreams;i++) {
2696 if (ist->decoding_needed) {
2697 avcodec_close(ist->st->codec);
2702 avfilter_graph_free(graph);
2711 av_freep(&bit_buffer);
2712 av_free(file_table);
2715 for(i=0;i<nb_istreams;i++) {
2722 for(i=0;i<nb_ostreams;i++) {
2725 if (ost->st->stream_copy)
2726 av_freep(&ost->st->codec->extradata);
2728 fclose(ost->logfile);
2729 ost->logfile = NULL;
2731 av_fifo_free(ost->fifo); /* works even if fifo is not
2732 initialized but set to zero */
2733 av_freep(&ost->st->codec->subtitle_header);
2734 av_free(ost->pict_tmp.data[0]);
2735 av_free(ost->forced_kf_pts);
2736 if (ost->video_resample)
2737 sws_freeContext(ost->img_resample_ctx);
2739 audio_resample_close(ost->resample);
2740 if (ost->reformat_ctx)
2741 av_audio_convert_free(ost->reformat_ctx);
2750 static void opt_format(const char *arg)
2752 last_asked_format = arg;
2755 static void opt_video_rc_override_string(const char *arg)
2757 video_rc_override_string = arg;
2760 static int opt_me_threshold(const char *opt, const char *arg)
2762 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2766 static int opt_verbose(const char *opt, const char *arg)
2768 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2772 static int opt_frame_rate(const char *opt, const char *arg)
2774 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2775 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2781 static int opt_bitrate(const char *opt, const char *arg)
2783 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2785 opt_default(opt, arg);
2787 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2788 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2793 static int opt_frame_crop(const char *opt, const char *arg)
2795 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2796 return AVERROR(EINVAL);
2799 static void opt_frame_size(const char *arg)
2801 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2802 fprintf(stderr, "Incorrect frame size\n");
2807 static int opt_pad(const char *opt, const char *arg) {
2808 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2812 static void opt_frame_pix_fmt(const char *arg)
2814 if (strcmp(arg, "list")) {
2815 frame_pix_fmt = av_get_pix_fmt(arg);
2816 if (frame_pix_fmt == PIX_FMT_NONE) {
2817 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2826 static void opt_frame_aspect_ratio(const char *arg)
2833 p = strchr(arg, ':');
2835 x = strtol(arg, &end, 10);
2837 y = strtol(end+1, &end, 10);
2839 ar = (double)x / (double)y;
2841 ar = strtod(arg, NULL);
2844 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2847 frame_aspect_ratio = ar;
2850 static int opt_metadata(const char *opt, const char *arg)
2852 char *mid= strchr(arg, '=');
2855 fprintf(stderr, "Missing =\n");
2860 av_metadata_set2(&metadata, arg, mid, 0);
2865 static void opt_qscale(const char *arg)
2867 video_qscale = atof(arg);
2868 if (video_qscale <= 0 ||
2869 video_qscale > 255) {
2870 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2875 static void opt_top_field_first(const char *arg)
2877 top_field_first= atoi(arg);
2880 static int opt_thread_count(const char *opt, const char *arg)
2882 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2885 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2890 static void opt_audio_sample_fmt(const char *arg)
2892 if (strcmp(arg, "list")) {
2893 audio_sample_fmt = av_get_sample_fmt(arg);
2894 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2895 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2899 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2904 static int opt_audio_rate(const char *opt, const char *arg)
2906 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2910 static int opt_audio_channels(const char *opt, const char *arg)
2912 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2916 static void opt_video_channel(const char *arg)
2918 video_channel = strtol(arg, NULL, 0);
2921 static void opt_video_standard(const char *arg)
2923 video_standard = av_strdup(arg);
2926 static void opt_codec(int *pstream_copy, char **pcodec_name,
2927 int codec_type, const char *arg)
2929 av_freep(pcodec_name);
2930 if (!strcmp(arg, "copy")) {
2933 *pcodec_name = av_strdup(arg);
2937 static void opt_audio_codec(const char *arg)
2939 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2942 static void opt_video_codec(const char *arg)
2944 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2947 static void opt_subtitle_codec(const char *arg)
2949 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2952 static int opt_codec_tag(const char *opt, const char *arg)
2955 uint32_t *codec_tag;
2957 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2958 !strcmp(opt, "vtag") ? &video_codec_tag :
2959 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2963 *codec_tag = strtol(arg, &tail, 0);
2965 *codec_tag = AV_RL32(arg);
2970 static void opt_map(const char *arg)
2975 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2976 m = &stream_maps[nb_stream_maps-1];
2978 m->file_index = strtol(arg, &p, 0);
2982 m->stream_index = strtol(p, &p, 0);
2985 m->sync_file_index = strtol(p, &p, 0);
2988 m->sync_stream_index = strtol(p, &p, 0);
2990 m->sync_file_index = m->file_index;
2991 m->sync_stream_index = m->stream_index;
2995 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3006 *index = strtol(++arg, endptr, 0);
3009 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3016 static void opt_map_meta_data(const char *arg)
3018 AVMetaDataMap *m, *m1;
3021 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3022 &nb_meta_data_maps, nb_meta_data_maps + 1);
3024 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3025 m->file = strtol(arg, &p, 0);
3026 parse_meta_type(p, &m->type, &m->index, &p);
3030 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3031 m1->file = strtol(p, &p, 0);
3032 parse_meta_type(p, &m1->type, &m1->index, &p);
3034 if (m->type == 'g' || m1->type == 'g')
3035 metadata_global_autocopy = 0;
3036 if (m->type == 's' || m1->type == 's')
3037 metadata_streams_autocopy = 0;
3038 if (m->type == 'c' || m1->type == 'c')
3039 metadata_chapters_autocopy = 0;
3042 static void opt_map_chapters(const char *arg)
3047 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3048 nb_chapter_maps + 1);
3049 c = &chapter_maps[nb_chapter_maps - 1];
3050 c->out_file = strtol(arg, &p, 0);
3054 c->in_file = strtol(p, &p, 0);
3057 static void opt_input_ts_scale(const char *arg)
3059 unsigned int stream;
3063 stream = strtol(arg, &p, 0);
3066 scale= strtod(p, &p);
3068 if(stream >= MAX_STREAMS)
3071 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);
3072 input_files_ts_scale[nb_input_files][stream]= scale;
3075 static int opt_recording_time(const char *opt, const char *arg)
3077 recording_time = parse_time_or_die(opt, arg, 1);
3081 static int opt_start_time(const char *opt, const char *arg)
3083 start_time = parse_time_or_die(opt, arg, 1);
3087 static int opt_recording_timestamp(const char *opt, const char *arg)
3089 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3093 static int opt_input_ts_offset(const char *opt, const char *arg)
3095 input_ts_offset = parse_time_or_die(opt, arg, 1);
3099 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3101 const char *codec_string = encoder ? "encoder" : "decoder";
3105 return CODEC_ID_NONE;
3107 avcodec_find_encoder_by_name(name) :
3108 avcodec_find_decoder_by_name(name);
3110 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3113 if(codec->type != type) {
3114 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3117 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3118 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3119 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3120 "results.\nAdd '-strict experimental' if you want to use it.\n",
3121 codec_string, codec->name);
3123 avcodec_find_encoder(codec->id) :
3124 avcodec_find_decoder(codec->id);
3125 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3126 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3127 codec_string, codec->name);
3133 static void opt_input_file(const char *filename)
3135 AVFormatContext *ic;
3136 AVFormatParameters params, *ap = ¶ms;
3137 AVInputFormat *file_iformat = NULL;
3138 int err, i, ret, rfps, rfps_base;
3141 if (last_asked_format) {
3142 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3143 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3146 last_asked_format = NULL;
3149 if (!strcmp(filename, "-"))
3152 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3153 !strcmp(filename, "/dev/stdin");
3155 /* get default parameters from command line */
3156 ic = avformat_alloc_context();
3158 print_error(filename, AVERROR(ENOMEM));
3162 memset(ap, 0, sizeof(*ap));
3163 ap->prealloced_context = 1;
3164 ap->sample_rate = audio_sample_rate;
3165 ap->channels = audio_channels;
3166 ap->time_base.den = frame_rate.num;
3167 ap->time_base.num = frame_rate.den;
3168 ap->width = frame_width;
3169 ap->height = frame_height;
3170 ap->pix_fmt = frame_pix_fmt;
3171 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3172 ap->channel = video_channel;
3173 ap->standard = video_standard;
3175 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3177 ic->video_codec_id =
3178 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3179 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3180 ic->audio_codec_id =
3181 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3182 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3183 ic->subtitle_codec_id=
3184 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3185 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3186 ic->flags |= AVFMT_FLAG_NONBLOCK;
3188 /* open the input file with generic libav function */
3189 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3191 print_error(filename, err);
3197 for(i=0; i<ic->nb_streams; i++){
3198 ic->streams[i]->discard= AVDISCARD_ALL;
3200 for(i=0; i<ic->nb_programs; i++){
3201 AVProgram *p= ic->programs[i];
3202 if(p->id != opt_programid){
3203 p->discard = AVDISCARD_ALL;
3206 for(j=0; j<p->nb_stream_indexes; j++){
3207 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3212 fprintf(stderr, "Specified program id not found\n");
3218 ic->loop_input = loop_input;
3220 /* If not enough info to get the stream parameters, we decode the
3221 first frames to get it. (used in mpeg case for example) */
3222 ret = av_find_stream_info(ic);
3223 if (ret < 0 && verbose >= 0) {
3224 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3225 av_close_input_file(ic);
3229 timestamp = start_time;
3230 /* add the stream start time */
3231 if (ic->start_time != AV_NOPTS_VALUE)
3232 timestamp += ic->start_time;
3234 /* if seeking requested, we execute it */
3235 if (start_time != 0) {
3236 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3238 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3239 filename, (double)timestamp / AV_TIME_BASE);
3241 /* reset seek info */
3245 /* update the current parameters so that they match the one of the input stream */
3246 for(i=0;i<ic->nb_streams;i++) {
3247 AVStream *st = ic->streams[i];
3248 AVCodecContext *dec = st->codec;
3249 avcodec_thread_init(dec, thread_count);
3250 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3251 switch (dec->codec_type) {
3252 case AVMEDIA_TYPE_AUDIO:
3253 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3254 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]);
3255 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3256 channel_layout = dec->channel_layout;
3257 audio_channels = dec->channels;
3258 audio_sample_rate = dec->sample_rate;
3259 audio_sample_fmt = dec->sample_fmt;
3261 st->discard= AVDISCARD_ALL;
3262 /* Note that av_find_stream_info can add more streams, and we
3263 * currently have no chance of setting up lowres decoding
3264 * early enough for them. */
3266 audio_sample_rate >>= dec->lowres;
3268 case AVMEDIA_TYPE_VIDEO:
3269 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3270 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]);
3271 frame_height = dec->height;
3272 frame_width = dec->width;
3273 if(ic->streams[i]->sample_aspect_ratio.num)
3274 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3276 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3277 frame_aspect_ratio *= (float) dec->width / dec->height;
3278 frame_pix_fmt = dec->pix_fmt;
3279 rfps = ic->streams[i]->r_frame_rate.num;
3280 rfps_base = ic->streams[i]->r_frame_rate.den;
3282 dec->flags |= CODEC_FLAG_EMU_EDGE;
3283 frame_height >>= dec->lowres;
3284 frame_width >>= dec->lowres;
3285 dec->height = frame_height;
3286 dec->width = frame_width;
3289 dec->debug |= FF_DEBUG_MV;
3291 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3294 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3295 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3297 (float)rfps / rfps_base, rfps, rfps_base);
3299 /* update the current frame rate to match the stream frame rate */
3300 frame_rate.num = rfps;
3301 frame_rate.den = rfps_base;
3304 st->discard= AVDISCARD_ALL;
3305 else if(video_discard)
3306 st->discard= video_discard;
3308 case AVMEDIA_TYPE_DATA:
3310 case AVMEDIA_TYPE_SUBTITLE:
3311 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3312 if(subtitle_disable)
3313 st->discard = AVDISCARD_ALL;
3315 case AVMEDIA_TYPE_ATTACHMENT:
3316 case AVMEDIA_TYPE_UNKNOWN:
3323 input_files[nb_input_files] = ic;
3324 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3325 /* dump the file content */
3327 dump_format(ic, nb_input_files, filename, 0);
3333 av_freep(&video_codec_name);
3334 av_freep(&audio_codec_name);
3335 av_freep(&subtitle_codec_name);
3338 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3339 int *has_subtitle_ptr)
3341 int has_video, has_audio, has_subtitle, i, j;
3342 AVFormatContext *ic;
3347 for(j=0;j<nb_input_files;j++) {
3348 ic = input_files[j];
3349 for(i=0;i<ic->nb_streams;i++) {
3350 AVCodecContext *enc = ic->streams[i]->codec;
3351 switch(enc->codec_type) {
3352 case AVMEDIA_TYPE_AUDIO:
3355 case AVMEDIA_TYPE_VIDEO:
3358 case AVMEDIA_TYPE_SUBTITLE:
3361 case AVMEDIA_TYPE_DATA:
3362 case AVMEDIA_TYPE_ATTACHMENT:
3363 case AVMEDIA_TYPE_UNKNOWN:
3370 *has_video_ptr = has_video;
3371 *has_audio_ptr = has_audio;
3372 *has_subtitle_ptr = has_subtitle;
3375 static void new_video_stream(AVFormatContext *oc, int file_idx)
3378 AVOutputStream *ost;
3379 AVCodecContext *video_enc;
3380 enum CodecID codec_id = CODEC_ID_NONE;
3381 AVCodec *codec= NULL;
3383 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3385 fprintf(stderr, "Could not alloc stream\n");
3388 ost = new_output_stream(oc, file_idx);
3390 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3391 if(!video_stream_copy){
3392 if (video_codec_name) {
3393 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3394 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3395 codec = avcodec_find_encoder_by_name(video_codec_name);
3396 output_codecs[nb_output_codecs-1] = codec;
3398 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3399 codec = avcodec_find_encoder(codec_id);
3403 avcodec_get_context_defaults3(st->codec, codec);
3404 ost->bitstream_filters = video_bitstream_filters;
3405 video_bitstream_filters= NULL;
3407 avcodec_thread_init(st->codec, thread_count);
3409 video_enc = st->codec;
3412 video_enc->codec_tag= video_codec_tag;
3414 if( (video_global_header&1)
3415 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3416 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3417 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3419 if(video_global_header&2){
3420 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3421 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3424 if (video_stream_copy) {
3425 st->stream_copy = 1;
3426 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3427 video_enc->sample_aspect_ratio =
3428 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3432 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3434 video_enc->codec_id = codec_id;
3435 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3437 if (codec && codec->supported_framerates && !force_fps)
3438 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3439 video_enc->time_base.den = fps.num;
3440 video_enc->time_base.num = fps.den;
3442 video_enc->width = frame_width;
3443 video_enc->height = frame_height;
3444 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3445 video_enc->pix_fmt = frame_pix_fmt;
3446 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3448 choose_pixel_fmt(st, codec);
3451 video_enc->gop_size = 0;
3452 if (video_qscale || same_quality) {
3453 video_enc->flags |= CODEC_FLAG_QSCALE;
3454 video_enc->global_quality=
3455 st->quality = FF_QP2LAMBDA * video_qscale;
3459 video_enc->intra_matrix = intra_matrix;
3461 video_enc->inter_matrix = inter_matrix;
3463 p= video_rc_override_string;
3466 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3468 fprintf(stderr, "error parsing rc_override\n");
3471 video_enc->rc_override=
3472 av_realloc(video_enc->rc_override,
3473 sizeof(RcOverride)*(i+1));
3474 video_enc->rc_override[i].start_frame= start;
3475 video_enc->rc_override[i].end_frame = end;
3477 video_enc->rc_override[i].qscale= q;
3478 video_enc->rc_override[i].quality_factor= 1.0;
3481 video_enc->rc_override[i].qscale= 0;
3482 video_enc->rc_override[i].quality_factor= -q/100.0;
3487 video_enc->rc_override_count=i;
3488 if (!video_enc->rc_initial_buffer_occupancy)
3489 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3490 video_enc->me_threshold= me_threshold;
3491 video_enc->intra_dc_precision= intra_dc_precision - 8;
3494 video_enc->flags|= CODEC_FLAG_PSNR;
3499 video_enc->flags |= CODEC_FLAG_PASS1;
3501 video_enc->flags |= CODEC_FLAG_PASS2;
3505 if (forced_key_frames)
3506 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3508 if (video_language) {
3509 av_metadata_set2(&st->metadata, "language", video_language, 0);
3510 av_freep(&video_language);
3513 /* reset some key parameters */
3515 av_freep(&video_codec_name);
3516 av_freep(&forced_key_frames);
3517 video_stream_copy = 0;
3518 frame_pix_fmt = PIX_FMT_NONE;
3521 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3524 AVOutputStream *ost;
3525 AVCodec *codec= NULL;
3526 AVCodecContext *audio_enc;
3527 enum CodecID codec_id = CODEC_ID_NONE;
3529 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3531 fprintf(stderr, "Could not alloc stream\n");
3534 ost = new_output_stream(oc, file_idx);
3536 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3537 if(!audio_stream_copy){
3538 if (audio_codec_name) {
3539 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3540 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3541 codec = avcodec_find_encoder_by_name(audio_codec_name);
3542 output_codecs[nb_output_codecs-1] = codec;
3544 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3545 codec = avcodec_find_encoder(codec_id);
3549 avcodec_get_context_defaults3(st->codec, codec);
3551 ost->bitstream_filters = audio_bitstream_filters;
3552 audio_bitstream_filters= NULL;
3554 avcodec_thread_init(st->codec, thread_count);
3556 audio_enc = st->codec;
3557 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3560 audio_enc->codec_tag= audio_codec_tag;
3562 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3563 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3564 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3566 if (audio_stream_copy) {
3567 st->stream_copy = 1;
3568 audio_enc->channels = audio_channels;
3569 audio_enc->sample_rate = audio_sample_rate;
3571 audio_enc->codec_id = codec_id;
3572 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3574 if (audio_qscale > QSCALE_NONE) {
3575 audio_enc->flags |= CODEC_FLAG_QSCALE;
3576 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3578 audio_enc->channels = audio_channels;
3579 audio_enc->sample_fmt = audio_sample_fmt;
3580 audio_enc->sample_rate = audio_sample_rate;
3581 audio_enc->channel_layout = channel_layout;
3582 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3583 audio_enc->channel_layout = 0;
3584 choose_sample_fmt(st, codec);
3585 choose_sample_rate(st, codec);
3587 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3588 if (audio_language) {
3589 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3590 av_freep(&audio_language);
3593 /* reset some key parameters */
3595 av_freep(&audio_codec_name);
3596 audio_stream_copy = 0;
3599 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3602 AVOutputStream *ost;
3603 AVCodec *codec=NULL;
3604 AVCodecContext *subtitle_enc;
3605 enum CodecID codec_id = CODEC_ID_NONE;
3607 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3609 fprintf(stderr, "Could not alloc stream\n");
3612 ost = new_output_stream(oc, file_idx);
3613 subtitle_enc = st->codec;
3614 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3615 if(!subtitle_stream_copy){
3616 if (subtitle_codec_name) {
3617 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3618 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3619 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3621 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3622 codec = avcodec_find_encoder(codec_id);
3625 avcodec_get_context_defaults3(st->codec, codec);
3627 ost->bitstream_filters = subtitle_bitstream_filters;
3628 subtitle_bitstream_filters= NULL;
3630 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3632 if(subtitle_codec_tag)
3633 subtitle_enc->codec_tag= subtitle_codec_tag;
3635 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3636 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3637 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3639 if (subtitle_stream_copy) {
3640 st->stream_copy = 1;
3642 subtitle_enc->codec_id = codec_id;
3643 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3646 if (subtitle_language) {
3647 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3648 av_freep(&subtitle_language);
3651 subtitle_disable = 0;
3652 av_freep(&subtitle_codec_name);
3653 subtitle_stream_copy = 0;
3656 static int opt_new_stream(const char *opt, const char *arg)
3658 AVFormatContext *oc;
3659 int file_idx = nb_output_files - 1;
3660 if (nb_output_files <= 0) {
3661 fprintf(stderr, "At least one output file must be specified\n");
3664 oc = output_files[file_idx];
3666 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3667 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3668 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3673 /* arg format is "output-stream-index:streamid-value". */
3674 static int opt_streamid(const char *opt, const char *arg)
3680 strncpy(idx_str, arg, sizeof(idx_str));
3681 idx_str[sizeof(idx_str)-1] = '\0';
3682 p = strchr(idx_str, ':');
3685 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3690 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3691 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3692 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3696 static void opt_output_file(const char *filename)
3698 AVFormatContext *oc;
3699 int err, use_video, use_audio, use_subtitle;
3700 int input_has_video, input_has_audio, input_has_subtitle;
3701 AVFormatParameters params, *ap = ¶ms;
3702 AVOutputFormat *file_oformat;
3704 if (!strcmp(filename, "-"))
3707 oc = avformat_alloc_context();
3709 print_error(filename, AVERROR(ENOMEM));
3713 if (last_asked_format) {
3714 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3715 if (!file_oformat) {
3716 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3719 last_asked_format = NULL;
3721 file_oformat = av_guess_format(NULL, filename, NULL);
3722 if (!file_oformat) {
3723 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3729 oc->oformat = file_oformat;
3730 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3732 if (!strcmp(file_oformat->name, "ffm") &&
3733 av_strstart(filename, "http:", NULL)) {
3734 /* special case for files sent to ffserver: we get the stream
3735 parameters from ffserver */
3736 int err = read_ffserver_streams(oc, filename);
3738 print_error(filename, err);
3742 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3743 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3744 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3746 /* disable if no corresponding type found and at least one
3748 if (nb_input_files > 0) {
3749 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3750 &input_has_subtitle);
3751 if (!input_has_video)
3753 if (!input_has_audio)
3755 if (!input_has_subtitle)
3759 /* manual disable */
3760 if (audio_disable) use_audio = 0;
3761 if (video_disable) use_video = 0;
3762 if (subtitle_disable) use_subtitle = 0;
3764 if (use_video) new_video_stream(oc, nb_output_files);
3765 if (use_audio) new_audio_stream(oc, nb_output_files);
3766 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3768 oc->timestamp = recording_timestamp;
3770 av_metadata_copy(&oc->metadata, metadata, 0);
3771 av_metadata_free(&metadata);
3774 output_files[nb_output_files++] = oc;
3776 /* check filename in case of an image number is expected */
3777 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3778 if (!av_filename_number_test(oc->filename)) {
3779 print_error(oc->filename, AVERROR_NUMEXPECTED);
3784 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3785 /* test if it already exists to avoid loosing precious files */
3786 if (!file_overwrite &&
3787 (strchr(filename, ':') == NULL ||
3788 filename[1] == ':' ||
3789 av_strstart(filename, "file:", NULL))) {
3790 if (url_exist(filename)) {
3792 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3794 if (!read_yesno()) {
3795 fprintf(stderr, "Not overwriting - exiting\n");
3800 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3807 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3808 print_error(filename, err);
3813 memset(ap, 0, sizeof(*ap));
3814 if (av_set_parameters(oc, ap) < 0) {
3815 fprintf(stderr, "%s: Invalid encoding parameters\n",
3820 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3821 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3822 oc->loop_output = loop_output;
3823 oc->flags |= AVFMT_FLAG_NONBLOCK;
3825 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3827 av_freep(&forced_key_frames);
3830 /* same option as mencoder */
3831 static void opt_pass(const char *pass_str)
3834 pass = atoi(pass_str);
3835 if (pass != 1 && pass != 2) {
3836 fprintf(stderr, "pass number can be only 1 or 2\n");
3842 static int64_t getutime(void)
3845 struct rusage rusage;
3847 getrusage(RUSAGE_SELF, &rusage);
3848 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3849 #elif HAVE_GETPROCESSTIMES
3851 FILETIME c, e, k, u;
3852 proc = GetCurrentProcess();
3853 GetProcessTimes(proc, &c, &e, &k, &u);
3854 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3856 return av_gettime();
3860 static int64_t getmaxrss(void)
3862 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3863 struct rusage rusage;
3864 getrusage(RUSAGE_SELF, &rusage);
3865 return (int64_t)rusage.ru_maxrss * 1024;
3866 #elif HAVE_GETPROCESSMEMORYINFO
3868 PROCESS_MEMORY_COUNTERS memcounters;
3869 proc = GetCurrentProcess();
3870 memcounters.cb = sizeof(memcounters);
3871 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3872 return memcounters.PeakPagefileUsage;
3878 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3881 const char *p = str;
3888 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3895 static void opt_inter_matrix(const char *arg)
3897 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3898 parse_matrix_coeffs(inter_matrix, arg);
3901 static void opt_intra_matrix(const char *arg)
3903 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3904 parse_matrix_coeffs(intra_matrix, arg);
3907 static void show_usage(void)
3909 printf("Hyper fast Audio and Video encoder\n");
3910 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3914 static void show_help(void)
3917 AVOutputFormat *oformat = NULL;
3919 av_log_set_callback(log_callback_help);
3921 show_help_options(options, "Main options:\n",
3922 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3923 show_help_options(options, "\nAdvanced options:\n",
3924 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3926 show_help_options(options, "\nVideo options:\n",
3927 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3929 show_help_options(options, "\nAdvanced Video options:\n",
3930 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3931 OPT_VIDEO | OPT_EXPERT);
3932 show_help_options(options, "\nAudio options:\n",
3933 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3935 show_help_options(options, "\nAdvanced Audio options:\n",
3936 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3937 OPT_AUDIO | OPT_EXPERT);
3938 show_help_options(options, "\nSubtitle options:\n",
3939 OPT_SUBTITLE | OPT_GRAB,
3941 show_help_options(options, "\nAudio/Video grab options:\n",
3945 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3948 /* individual codec options */
3950 while ((c = av_codec_next(c))) {
3951 if (c->priv_class) {
3952 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3957 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3960 /* individual muxer options */
3961 while ((oformat = av_oformat_next(oformat))) {
3962 if (oformat->priv_class) {
3963 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3968 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3971 static void opt_target(const char *arg)
3973 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3974 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3976 if(!strncmp(arg, "pal-", 4)) {
3979 } else if(!strncmp(arg, "ntsc-", 5)) {
3982 } else if(!strncmp(arg, "film-", 5)) {
3987 /* Calculate FR via float to avoid int overflow */
3988 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3991 } else if((fr == 29970) || (fr == 23976)) {
3994 /* Try to determine PAL/NTSC by peeking in the input files */
3995 if(nb_input_files) {
3997 for(j = 0; j < nb_input_files; j++) {
3998 for(i = 0; i < input_files[j]->nb_streams; i++) {
3999 AVCodecContext *c = input_files[j]->streams[i]->codec;
4000 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4002 fr = c->time_base.den * 1000 / c->time_base.num;
4006 } else if((fr == 29970) || (fr == 23976)) {
4016 if(verbose && norm != UNKNOWN)
4017 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4020 if(norm == UNKNOWN) {
4021 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4022 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4023 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4027 if(!strcmp(arg, "vcd")) {
4029 opt_video_codec("mpeg1video");
4030 opt_audio_codec("mp2");
4033 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4034 opt_frame_rate(NULL, frame_rates[norm]);
4035 opt_default("g", norm == PAL ? "15" : "18");
4037 opt_default("b", "1150000");
4038 opt_default("maxrate", "1150000");
4039 opt_default("minrate", "1150000");
4040 opt_default("bufsize", "327680"); // 40*1024*8;
4042 opt_default("ab", "224000");
4043 audio_sample_rate = 44100;
4046 opt_default("packetsize", "2324");
4047 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4049 /* We have to offset the PTS, so that it is consistent with the SCR.
4050 SCR starts at 36000, but the first two packs contain only padding
4051 and the first pack from the other stream, respectively, may also have
4052 been written before.
4053 So the real data starts at SCR 36000+3*1200. */
4054 mux_preload= (36000+3*1200) / 90000.0; //0.44
4055 } else if(!strcmp(arg, "svcd")) {
4057 opt_video_codec("mpeg2video");
4058 opt_audio_codec("mp2");
4061 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4062 opt_frame_rate(NULL, frame_rates[norm]);
4063 opt_default("g", norm == PAL ? "15" : "18");
4065 opt_default("b", "2040000");
4066 opt_default("maxrate", "2516000");
4067 opt_default("minrate", "0"); //1145000;
4068 opt_default("bufsize", "1835008"); //224*1024*8;
4069 opt_default("flags", "+scan_offset");
4072 opt_default("ab", "224000");
4073 audio_sample_rate = 44100;
4075 opt_default("packetsize", "2324");
4077 } else if(!strcmp(arg, "dvd")) {
4079 opt_video_codec("mpeg2video");
4080 opt_audio_codec("ac3");
4083 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4084 opt_frame_rate(NULL, frame_rates[norm]);
4085 opt_default("g", norm == PAL ? "15" : "18");
4087 opt_default("b", "6000000");
4088 opt_default("maxrate", "9000000");
4089 opt_default("minrate", "0"); //1500000;
4090 opt_default("bufsize", "1835008"); //224*1024*8;
4092 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4093 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4095 opt_default("ab", "448000");
4096 audio_sample_rate = 48000;
4098 } else if(!strncmp(arg, "dv", 2)) {
4102 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4103 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4104 (norm == PAL ? "yuv420p" : "yuv411p"));
4105 opt_frame_rate(NULL, frame_rates[norm]);
4107 audio_sample_rate = 48000;
4111 fprintf(stderr, "Unknown target: %s\n", arg);
4116 static void opt_vstats_file (const char *arg)
4118 av_free (vstats_filename);
4119 vstats_filename=av_strdup (arg);
4122 static void opt_vstats (void)
4125 time_t today2 = time(NULL);
4126 struct tm *today = localtime(&today2);
4128 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4130 opt_vstats_file(filename);
4133 static int opt_bsf(const char *opt, const char *arg)
4135 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4136 AVBitStreamFilterContext **bsfp;
4139 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4143 bsfp= *opt == 'v' ? &video_bitstream_filters :
4144 *opt == 'a' ? &audio_bitstream_filters :
4145 &subtitle_bitstream_filters;
4147 bsfp= &(*bsfp)->next;
4154 static int opt_preset(const char *opt, const char *arg)
4157 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4158 char *codec_name = *opt == 'v' ? video_codec_name :
4159 *opt == 'a' ? audio_codec_name :
4160 subtitle_codec_name;
4162 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4163 fprintf(stderr, "File for preset '%s' not found\n", arg);
4168 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4169 if(line[0] == '#' && !e)
4171 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4173 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4176 if(!strcmp(tmp, "acodec")){
4177 opt_audio_codec(tmp2);
4178 }else if(!strcmp(tmp, "vcodec")){
4179 opt_video_codec(tmp2);
4180 }else if(!strcmp(tmp, "scodec")){
4181 opt_subtitle_codec(tmp2);
4182 }else if(opt_default(tmp, tmp2) < 0){
4183 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4193 static const OptionDef options[] = {
4195 #include "cmdutils_common_opts.h"
4196 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4197 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4198 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4199 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4200 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile[,metadata]:infile[,metadata]" },
4201 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4202 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4203 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4204 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4205 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4206 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4207 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4208 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4209 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4210 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4211 "add timings for benchmarking" },
4212 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4213 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4214 "dump each input packet" },
4215 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4216 "when dumping packets, also dump the payload" },
4217 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4218 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4219 { "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)", "" },
4220 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4221 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4222 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4223 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4224 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4225 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4226 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4227 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4228 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4229 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4230 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4231 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4232 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4233 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4236 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4237 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4238 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4239 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4240 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4241 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4242 { "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" },
4243 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4244 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4245 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4246 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4247 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4248 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4249 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4250 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4251 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4252 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4253 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4254 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4255 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4256 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4257 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4258 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4259 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4260 "use same video quality as source (implies VBR)" },
4261 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4262 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4263 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4264 "deinterlace pictures" },
4265 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4266 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4267 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4269 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4271 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4272 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4273 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4274 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4275 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4276 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4277 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4278 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4279 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4280 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4281 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4284 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4285 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4286 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4287 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4288 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4289 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4290 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4291 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4292 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4293 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4294 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4295 { "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" },
4297 /* subtitle options */
4298 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4299 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4300 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4301 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4302 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4305 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4306 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4307 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4310 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4311 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4313 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4314 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4315 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4317 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4318 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4319 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4320 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4322 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4326 int main(int argc, char **argv)
4330 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4332 avcodec_register_all();
4334 avdevice_register_all();
4337 avfilter_register_all();
4342 if(isatty(STDIN_FILENO))
4343 url_set_interrupt_cb(decode_interrupt_cb);
4351 parse_options(argc, argv, options, opt_output_file);
4353 if(nb_output_files <= 0 && nb_input_files == 0) {
4355 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4359 /* file converter / grab */
4360 if (nb_output_files <= 0) {
4361 fprintf(stderr, "At least one output file must be specified\n");
4365 if (nb_input_files == 0) {
4366 fprintf(stderr, "At least one input file must be specified\n");
4371 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4372 stream_maps, nb_stream_maps) < 0)
4374 ti = getutime() - ti;
4376 int maxrss = getmaxrss() / 1024;
4377 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4380 return ffmpeg_exit(0);