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/parseutils.h"
40 #include "libavutil/colorspace.h"
41 #include "libavutil/fifo.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/avstring.h"
44 #include "libavutil/libm.h"
45 #include "libavformat/os_support.h"
48 # include "libavfilter/avfilter.h"
49 # include "libavfilter/avfiltergraph.h"
50 # include "libavfilter/graphparser.h"
51 # include "libavfilter/vsrc_buffer.h"
54 #if HAVE_SYS_RESOURCE_H
55 #include <sys/types.h>
57 #include <sys/resource.h>
58 #elif HAVE_GETPROCESSTIMES
61 #if HAVE_GETPROCESSMEMORYINFO
67 #include <sys/select.h>
72 #include <sys/ioctl.h>
82 #include "libavutil/avassert.h"
84 const char program_name[] = "FFmpeg";
85 const int program_birth_year = 2000;
87 /* select an input stream for an output stream */
88 typedef struct AVStreamMap {
92 int sync_stream_index;
96 * select an input file for an output file
98 typedef struct AVMetaDataMap {
103 static const OptionDef options[];
105 #define MAX_FILES 100
106 #if !FF_API_MAX_STREAMS
107 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
110 static const char *last_asked_format = NULL;
111 static AVFormatContext *input_files[MAX_FILES];
112 static int64_t input_files_ts_offset[MAX_FILES];
113 static double *input_files_ts_scale[MAX_FILES] = {NULL};
114 static AVCodec **input_codecs = NULL;
115 static int nb_input_files = 0;
116 static int nb_input_codecs = 0;
117 static int nb_input_files_ts_scale[MAX_FILES] = {0};
119 static AVFormatContext *output_files[MAX_FILES];
120 static AVCodec **output_codecs = NULL;
121 static int nb_output_files = 0;
122 static int nb_output_codecs = 0;
124 static AVStreamMap *stream_maps = NULL;
125 static int nb_stream_maps;
127 static AVMetaDataMap *meta_data_maps = NULL;
128 static int nb_meta_data_maps;
130 /* indexed by output file stream index */
131 static int *streamid_map = NULL;
132 static int nb_streamid_map = 0;
134 static int frame_width = 0;
135 static int frame_height = 0;
136 static float frame_aspect_ratio = 0;
137 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
138 static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
139 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
140 static AVRational frame_rate;
141 static float video_qscale = 0;
142 static uint16_t *intra_matrix = NULL;
143 static uint16_t *inter_matrix = NULL;
144 static const char *video_rc_override_string=NULL;
145 static int video_disable = 0;
146 static int video_discard = 0;
147 static char *video_codec_name = NULL;
148 static unsigned int video_codec_tag = 0;
149 static char *video_language = NULL;
150 static int same_quality = 0;
151 static int do_deinterlace = 0;
152 static int top_field_first = -1;
153 static int me_threshold = 0;
154 static int intra_dc_precision = 8;
155 static int loop_input = 0;
156 static int loop_output = AVFMT_NOOUTPUTLOOP;
157 static int qp_hist = 0;
159 static char *vfilters = NULL;
160 AVFilterGraph *graph = NULL;
163 static int intra_only = 0;
164 static int audio_sample_rate = 44100;
165 static int64_t channel_layout = 0;
166 #define QSCALE_NONE -99999
167 static float audio_qscale = QSCALE_NONE;
168 static int audio_disable = 0;
169 static int audio_channels = 1;
170 static char *audio_codec_name = NULL;
171 static unsigned int audio_codec_tag = 0;
172 static char *audio_language = NULL;
174 static int subtitle_disable = 0;
175 static char *subtitle_codec_name = NULL;
176 static char *subtitle_language = NULL;
177 static unsigned int subtitle_codec_tag = 0;
179 static float mux_preload= 0.5;
180 static float mux_max_delay= 0.7;
182 static int64_t recording_time = INT64_MAX;
183 static int64_t start_time = 0;
184 static int64_t recording_timestamp = 0;
185 static int64_t input_ts_offset = 0;
186 static int file_overwrite = 0;
187 static AVMetadata *metadata;
188 static int do_benchmark = 0;
189 static int do_hex_dump = 0;
190 static int do_pkt_dump = 0;
191 static int do_psnr = 0;
192 static int do_pass = 0;
193 static char *pass_logfilename_prefix = NULL;
194 static int audio_stream_copy = 0;
195 static int video_stream_copy = 0;
196 static int subtitle_stream_copy = 0;
197 static int video_sync_method= -1;
198 static int audio_sync_method= 0;
199 static float audio_drift_threshold= 0.1;
200 static int copy_ts= 0;
201 static int opt_shortest = 0;
202 static int video_global_header = 0;
203 static char *vstats_filename;
204 static FILE *vstats_file;
205 static int opt_programid = 0;
206 static int copy_initial_nonkeyframes = 0;
208 static int rate_emu = 0;
210 static int video_channel = 0;
211 static char *video_standard;
213 static int audio_volume = 256;
215 static int exit_on_error = 0;
216 static int using_stdin = 0;
217 static int verbose = 1;
218 static int thread_count= 1;
219 static int q_pressed = 0;
220 static int64_t video_size = 0;
221 static int64_t audio_size = 0;
222 static int64_t extra_size = 0;
223 static int nb_frames_dup = 0;
224 static int nb_frames_drop = 0;
225 static int input_sync;
226 static uint64_t limit_filesize = 0;
227 static int force_fps = 0;
228 static char *forced_key_frames = NULL;
230 static int pgmyuv_compatibility_hack=0;
231 static float dts_delta_threshold = 10;
233 static unsigned int sws_flags = SWS_BICUBIC;
235 static int64_t timer_start;
237 static uint8_t *audio_buf;
238 static uint8_t *audio_out;
239 unsigned int allocated_audio_out_size, allocated_audio_buf_size;
241 static short *samples;
243 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
244 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
245 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
247 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
249 struct AVInputStream;
251 typedef struct AVOutputStream {
252 int file_index; /* file index */
253 int index; /* stream index in the output file */
254 int source_index; /* AVInputStream index */
255 AVStream *st; /* stream in the output file */
256 int encoding_needed; /* true if encoding needed for this stream */
258 /* input pts and corresponding output pts
260 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
261 struct AVInputStream *sync_ist; /* input stream to sync against */
262 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
263 AVBitStreamFilterContext *bitstream_filters;
266 AVFrame pict_tmp; /* temporary image for resampling */
267 struct SwsContext *img_resample_ctx; /* for image resampling */
270 int resample_pix_fmt;
272 /* full frame size of first frame */
276 /* forced key frames */
277 int64_t *forced_kf_pts;
283 ReSampleContext *resample; /* for audio resampling */
285 AVAudioConvert *reformat_ctx;
286 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
290 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
291 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
293 typedef struct AVInputStream {
297 int discard; /* true if stream data should be discarded */
298 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
299 int64_t sample_index; /* current sample */
301 int64_t start; /* time when read started */
302 int64_t next_pts; /* synthetic pts for cases where pkt.pts
304 int64_t pts; /* current pts */
305 PtsCorrectionContext pts_ctx;
306 int is_start; /* is 1 at the start and after a discontinuity */
307 int showed_multi_packet_warning;
308 int is_past_recording_time;
310 AVFilterContext *output_video_filter;
311 AVFilterContext *input_video_filter;
312 AVFrame *filter_frame;
313 int has_filter_frame;
314 AVFilterBufferRef *picref;
318 typedef struct AVInputFile {
319 int eof_reached; /* true if eof reached */
320 int ist_index; /* index of first stream in ist_table */
321 int buffer_size; /* current total buffer size */
322 int nb_streams; /* nb streams we are aware of */
327 /* init terminal so that we can grab keys */
328 static struct termios oldtty;
333 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
335 AVFilterContext *last_filter, *filter;
336 /** filter graph containing all filters including input & output */
337 AVCodecContext *codec = ost->st->codec;
338 AVCodecContext *icodec = ist->st->codec;
339 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
343 graph = av_mallocz(sizeof(AVFilterGraph));
345 if ((ret = avfilter_open(&ist->input_video_filter, avfilter_get_by_name("buffer"), "src")) < 0)
347 if ((ret = avfilter_open(&ist->output_video_filter, &ffsink, "out")) < 0)
350 snprintf(args, 255, "%d:%d:%d:%d:%d", ist->st->codec->width,
351 ist->st->codec->height, ist->st->codec->pix_fmt,
352 ist->st->time_base.num, ist->st->time_base.den);
353 if ((ret = avfilter_init_filter(ist->input_video_filter, args, NULL)) < 0)
355 if ((ret = avfilter_init_filter(ist->output_video_filter, NULL, &ffsink_ctx)) < 0)
358 /* add input and output filters to the overall graph */
359 avfilter_graph_add_filter(graph, ist->input_video_filter);
360 avfilter_graph_add_filter(graph, ist->output_video_filter);
362 last_filter = ist->input_video_filter;
364 if (codec->width != icodec->width || codec->height != icodec->height) {
365 snprintf(args, 255, "%d:%d:flags=0x%X",
368 (int)av_get_int(sws_opts, "sws_flags", NULL));
369 if ((ret = avfilter_open(&filter, avfilter_get_by_name("scale"), NULL)) < 0)
371 if ((ret = avfilter_init_filter(filter, args, NULL)) < 0)
373 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
375 last_filter = filter;
376 avfilter_graph_add_filter(graph, last_filter);
379 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
380 graph->scale_sws_opts = av_strdup(args);
383 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
384 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
386 outputs->name = av_strdup("in");
387 outputs->filter = last_filter;
388 outputs->pad_idx = 0;
389 outputs->next = NULL;
391 inputs->name = av_strdup("out");
392 inputs->filter = ist->output_video_filter;
396 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
400 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
404 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
407 codec->width = ist->output_video_filter->inputs[0]->w;
408 codec->height = ist->output_video_filter->inputs[0]->h;
412 #endif /* CONFIG_AVFILTER */
414 static void term_exit(void)
416 av_log(NULL, AV_LOG_QUIET, "");
418 tcsetattr (0, TCSANOW, &oldtty);
422 static volatile int received_sigterm = 0;
425 sigterm_handler(int sig)
427 received_sigterm = sig;
431 static void term_init(void)
440 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
441 |INLCR|IGNCR|ICRNL|IXON);
442 tty.c_oflag |= OPOST;
443 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
444 tty.c_cflag &= ~(CSIZE|PARENB);
449 tcsetattr (0, TCSANOW, &tty);
450 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
453 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
454 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
456 signal(SIGXCPU, sigterm_handler);
460 /* read a key without blocking */
461 static int read_key(void)
473 n = select(1, &rfds, NULL, NULL, &tv);
488 static int decode_interrupt_cb(void)
490 return q_pressed || (q_pressed = read_key() == 'q');
493 static int ffmpeg_exit(int ret)
498 for(i=0;i<nb_output_files;i++) {
499 /* maybe av_close_output_file ??? */
500 AVFormatContext *s = output_files[i];
502 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
504 for(j=0;j<s->nb_streams;j++) {
505 av_metadata_free(&s->streams[j]->metadata);
506 av_free(s->streams[j]->codec);
507 av_free(s->streams[j]->info);
508 av_free(s->streams[j]);
510 for(j=0;j<s->nb_programs;j++) {
511 av_metadata_free(&s->programs[j]->metadata);
513 for(j=0;j<s->nb_chapters;j++) {
514 av_metadata_free(&s->chapters[j]->metadata);
516 av_metadata_free(&s->metadata);
518 av_free(output_streams_for_file[i]);
520 for(i=0;i<nb_input_files;i++) {
521 av_close_input_file(input_files[i]);
522 av_free(input_files_ts_scale[i]);
525 av_free(intra_matrix);
526 av_free(inter_matrix);
530 av_free(vstats_filename);
533 av_free(streamid_map);
534 av_free(input_codecs);
535 av_free(output_codecs);
536 av_free(stream_maps);
537 av_free(meta_data_maps);
539 av_free(video_codec_name);
540 av_free(audio_codec_name);
541 av_free(subtitle_codec_name);
543 av_free(video_standard);
548 allocated_audio_buf_size= allocated_audio_out_size= 0;
555 if (received_sigterm) {
557 "Received signal %d: terminating.\n",
558 (int) received_sigterm);
562 exit(ret); /* not all OS-es handle main() return value */
566 /* similar to ff_dynarray_add() and av_fast_realloc() */
567 static void *grow_array(void *array, int elem_size, int *size, int new_size)
569 if (new_size >= INT_MAX / elem_size) {
570 fprintf(stderr, "Array too big.\n");
573 if (*size < new_size) {
574 uint8_t *tmp = av_realloc(array, new_size*elem_size);
576 fprintf(stderr, "Could not alloc buffer.\n");
579 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
586 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
588 if(codec && codec->sample_fmts){
589 const enum SampleFormat *p= codec->sample_fmts;
591 if(*p == st->codec->sample_fmt)
595 st->codec->sample_fmt = codec->sample_fmts[0];
599 static void choose_sample_rate(AVStream *st, AVCodec *codec)
601 if(codec && codec->supported_samplerates){
602 const int *p= codec->supported_samplerates;
604 int best_dist=INT_MAX;
606 int dist= abs(st->codec->sample_rate - *p);
607 if(dist < best_dist){
613 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
615 st->codec->sample_rate= best;
619 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
621 if(codec && codec->pix_fmts){
622 const enum PixelFormat *p= codec->pix_fmts;
624 if(*p == st->codec->pix_fmt)
628 && !( st->codec->codec_id==CODEC_ID_MJPEG
629 && st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL
630 && ( st->codec->pix_fmt == PIX_FMT_YUV420P
631 || st->codec->pix_fmt == PIX_FMT_YUV422P)))
632 st->codec->pix_fmt = codec->pix_fmts[0];
636 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
642 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
645 /* copy stream format */
646 s->nb_streams = ic->nb_streams;
647 for(i=0;i<ic->nb_streams;i++) {
651 // FIXME: a more elegant solution is needed
652 st = av_mallocz(sizeof(AVStream));
653 memcpy(st, ic->streams[i], sizeof(AVStream));
654 st->codec = avcodec_alloc_context();
656 print_error(filename, AVERROR(ENOMEM));
659 avcodec_copy_context(st->codec, ic->streams[i]->codec);
662 codec = avcodec_find_encoder(st->codec->codec_id);
663 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
664 if (audio_stream_copy) {
667 choose_sample_fmt(st, codec);
668 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
669 if (video_stream_copy) {
672 choose_pixel_fmt(st, codec);
675 if(!st->codec->thread_count)
676 st->codec->thread_count = 1;
677 if(st->codec->thread_count>1)
678 avcodec_thread_init(st->codec, st->codec->thread_count);
680 if(st->codec->flags & CODEC_FLAG_BITEXACT)
685 s->timestamp = av_gettime();
687 av_close_input_file(ic);
692 get_sync_ipts(const AVOutputStream *ost)
694 const AVInputStream *ist = ost->sync_ist;
695 return (double)(ist->pts - start_time)/AV_TIME_BASE;
698 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
702 AVPacket new_pkt= *pkt;
703 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
704 &new_pkt.data, &new_pkt.size,
705 pkt->data, pkt->size,
706 pkt->flags & AV_PKT_FLAG_KEY);
709 new_pkt.destruct= av_destruct_packet;
711 fprintf(stderr, "%s failed for stream %d, codec %s",
712 bsfc->filter->name, pkt->stream_index,
713 avctx->codec ? avctx->codec->name : "copy");
723 ret= av_interleaved_write_frame(s, pkt);
725 print_error("av_interleaved_write_frame()", ret);
730 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
732 static void do_audio_out(AVFormatContext *s,
735 unsigned char *buf, int size)
738 int64_t audio_out_size, audio_buf_size;
739 int64_t allocated_for_size= size;
741 int size_out, frame_bytes, ret;
742 AVCodecContext *enc= ost->st->codec;
743 AVCodecContext *dec= ist->st->codec;
744 int osize= av_get_bits_per_sample_format(enc->sample_fmt)/8;
745 int isize= av_get_bits_per_sample_format(dec->sample_fmt)/8;
746 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
749 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
750 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
751 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
752 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
753 audio_buf_size*= osize*enc->channels;
755 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
756 if(coded_bps > 8*osize)
757 audio_out_size= audio_out_size * coded_bps / (8*osize);
758 audio_out_size += FF_MIN_BUFFER_SIZE;
760 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
761 fprintf(stderr, "Buffer sizes too large\n");
765 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
766 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
767 if (!audio_buf || !audio_out){
768 fprintf(stderr, "Out of memory in do_audio_out\n");
772 if (enc->channels != dec->channels)
773 ost->audio_resample = 1;
775 if (ost->audio_resample && !ost->resample) {
776 if (dec->sample_fmt != SAMPLE_FMT_S16)
777 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
778 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
779 enc->sample_rate, dec->sample_rate,
780 enc->sample_fmt, dec->sample_fmt,
782 if (!ost->resample) {
783 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
784 dec->channels, dec->sample_rate,
785 enc->channels, enc->sample_rate);
790 #define MAKE_SFMT_PAIR(a,b) ((a)+SAMPLE_FMT_NB*(b))
791 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
792 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
793 if (ost->reformat_ctx)
794 av_audio_convert_free(ost->reformat_ctx);
795 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
796 dec->sample_fmt, 1, NULL, 0);
797 if (!ost->reformat_ctx) {
798 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
799 avcodec_get_sample_fmt_name(dec->sample_fmt),
800 avcodec_get_sample_fmt_name(enc->sample_fmt));
803 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
806 if(audio_sync_method){
807 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
808 - av_fifo_size(ost->fifo)/(enc->channels * 2);
809 double idelta= delta*dec->sample_rate / enc->sample_rate;
810 int byte_delta= ((int)idelta)*2*dec->channels;
812 //FIXME resample delay
813 if(fabs(delta) > 50){
814 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
816 byte_delta= FFMAX(byte_delta, -size);
820 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
825 static uint8_t *input_tmp= NULL;
826 input_tmp= av_realloc(input_tmp, byte_delta + size);
828 if(byte_delta > allocated_for_size - size){
829 allocated_for_size= byte_delta + (int64_t)size;
834 memset(input_tmp, 0, byte_delta);
835 memcpy(input_tmp + byte_delta, buf, size);
839 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
841 }else if(audio_sync_method>1){
842 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
843 av_assert0(ost->audio_resample);
845 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
846 // 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));
847 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
851 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
852 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
854 if (ost->audio_resample) {
856 size_out = audio_resample(ost->resample,
857 (short *)buftmp, (short *)buf,
858 size / (dec->channels * isize));
859 size_out = size_out * enc->channels * osize;
865 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
866 const void *ibuf[6]= {buftmp};
867 void *obuf[6]= {audio_buf};
868 int istride[6]= {isize};
869 int ostride[6]= {osize};
870 int len= size_out/istride[0];
871 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
872 printf("av_audio_convert() failed\n");
878 size_out = len*osize;
881 /* now encode as many frames as possible */
882 if (enc->frame_size > 1) {
883 /* output resampled raw samples */
884 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
885 fprintf(stderr, "av_fifo_realloc2() failed\n");
888 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
890 frame_bytes = enc->frame_size * osize * enc->channels;
892 while (av_fifo_size(ost->fifo) >= frame_bytes) {
894 av_init_packet(&pkt);
896 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
898 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
900 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
903 fprintf(stderr, "Audio encoding failed\n");
907 pkt.stream_index= ost->index;
910 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
911 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
912 pkt.flags |= AV_PKT_FLAG_KEY;
913 write_frame(s, &pkt, enc, ost->bitstream_filters);
915 ost->sync_opts += enc->frame_size;
919 av_init_packet(&pkt);
921 ost->sync_opts += size_out / (osize * enc->channels);
923 /* output a pcm frame */
924 /* determine the size of the coded buffer */
927 size_out = size_out*coded_bps/8;
929 if(size_out > audio_out_size){
930 fprintf(stderr, "Internal error, buffer size too small\n");
934 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
935 ret = avcodec_encode_audio(enc, audio_out, size_out,
938 fprintf(stderr, "Audio encoding failed\n");
942 pkt.stream_index= ost->index;
945 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
946 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
947 pkt.flags |= AV_PKT_FLAG_KEY;
948 write_frame(s, &pkt, enc, ost->bitstream_filters);
952 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
956 AVPicture picture_tmp;
959 dec = ist->st->codec;
961 /* deinterlace : must be done before any resize */
962 if (do_deinterlace) {
965 /* create temporary picture */
966 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
967 buf = av_malloc(size);
971 picture2 = &picture_tmp;
972 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
974 if(avpicture_deinterlace(picture2, picture,
975 dec->pix_fmt, dec->width, dec->height) < 0) {
976 /* if error, do not deinterlace */
977 fprintf(stderr, "Deinterlacing failed\n");
986 if (picture != picture2)
987 *picture = *picture2;
991 /* we begin to correct av delay at this threshold */
992 #define AV_DELAY_MAX 0.100
994 static void do_subtitle_out(AVFormatContext *s,
1000 static uint8_t *subtitle_out = NULL;
1001 int subtitle_out_max_size = 1024 * 1024;
1002 int subtitle_out_size, nb, i;
1003 AVCodecContext *enc;
1006 if (pts == AV_NOPTS_VALUE) {
1007 fprintf(stderr, "Subtitle packets must have a pts\n");
1013 enc = ost->st->codec;
1015 if (!subtitle_out) {
1016 subtitle_out = av_malloc(subtitle_out_max_size);
1019 /* Note: DVB subtitle need one packet to draw them and one other
1020 packet to clear them */
1021 /* XXX: signal it in the codec context ? */
1022 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1027 for(i = 0; i < nb; i++) {
1028 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1029 // start_display_time is required to be 0
1030 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1031 sub->end_display_time -= sub->start_display_time;
1032 sub->start_display_time = 0;
1033 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1034 subtitle_out_max_size, sub);
1035 if (subtitle_out_size < 0) {
1036 fprintf(stderr, "Subtitle encoding failed\n");
1040 av_init_packet(&pkt);
1041 pkt.stream_index = ost->index;
1042 pkt.data = subtitle_out;
1043 pkt.size = subtitle_out_size;
1044 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1045 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1046 /* XXX: the pts correction is handled here. Maybe handling
1047 it in the codec would be better */
1049 pkt.pts += 90 * sub->start_display_time;
1051 pkt.pts += 90 * sub->end_display_time;
1053 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1057 static int bit_buffer_size= 1024*256;
1058 static uint8_t *bit_buffer= NULL;
1060 static void do_video_out(AVFormatContext *s,
1061 AVOutputStream *ost,
1063 AVFrame *in_picture,
1066 int nb_frames, i, ret;
1067 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1068 AVCodecContext *enc, *dec;
1071 enc = ost->st->codec;
1072 dec = ist->st->codec;
1074 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1076 /* by default, we output a single frame */
1081 if(video_sync_method){
1082 double vdelta = sync_ipts - ost->sync_opts;
1083 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1086 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1089 }else if(vdelta>0.6)
1090 ost->sync_opts= lrintf(sync_ipts);
1091 }else if (vdelta > 1.1)
1092 nb_frames = lrintf(vdelta);
1093 //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);
1094 if (nb_frames == 0){
1097 fprintf(stderr, "*** drop!\n");
1098 }else if (nb_frames > 1) {
1099 nb_frames_dup += nb_frames - 1;
1101 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1104 ost->sync_opts= lrintf(sync_ipts);
1106 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1110 formatted_picture = in_picture;
1111 final_picture = formatted_picture;
1112 padding_src = formatted_picture;
1113 resampling_dst = &ost->pict_tmp;
1115 if ( ost->resample_height != ist->st->codec->height
1116 || ost->resample_width != ist->st->codec->width
1117 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1119 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));
1120 if(!ost->video_resample)
1124 #if !CONFIG_AVFILTER
1125 if (ost->video_resample) {
1127 final_picture = &ost->pict_tmp;
1128 if( ost->resample_height != ist->st->codec->height
1129 || ost->resample_width != ist->st->codec->width
1130 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1132 /* initialize a new scaler context */
1133 sws_freeContext(ost->img_resample_ctx);
1134 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1135 ost->img_resample_ctx = sws_getContext(
1136 ist->st->codec->width,
1137 ist->st->codec->height,
1138 ist->st->codec->pix_fmt,
1139 ost->st->codec->width,
1140 ost->st->codec->height,
1141 ost->st->codec->pix_fmt,
1142 sws_flags, NULL, NULL, NULL);
1143 if (ost->img_resample_ctx == NULL) {
1144 fprintf(stderr, "Cannot get resampling context\n");
1148 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1149 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1153 /* duplicates frame if needed */
1154 for(i=0;i<nb_frames;i++) {
1156 av_init_packet(&pkt);
1157 pkt.stream_index= ost->index;
1159 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1160 /* raw pictures are written as AVPicture structure to
1161 avoid any copies. We support temorarily the older
1163 AVFrame* old_frame = enc->coded_frame;
1164 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1165 pkt.data= (uint8_t *)final_picture;
1166 pkt.size= sizeof(AVPicture);
1167 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1168 pkt.flags |= AV_PKT_FLAG_KEY;
1170 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1171 enc->coded_frame = old_frame;
1173 AVFrame big_picture;
1175 big_picture= *final_picture;
1176 /* better than nothing: use input picture interlaced
1178 big_picture.interlaced_frame = in_picture->interlaced_frame;
1179 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1180 if(top_field_first == -1)
1181 big_picture.top_field_first = in_picture->top_field_first;
1183 big_picture.top_field_first = top_field_first;
1186 /* handles sameq here. This is not correct because it may
1187 not be a global option */
1188 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1190 big_picture.pict_type = 0;
1191 // big_picture.pts = AV_NOPTS_VALUE;
1192 big_picture.pts= ost->sync_opts;
1193 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1194 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1195 if (ost->forced_kf_index < ost->forced_kf_count &&
1196 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1197 big_picture.pict_type = FF_I_TYPE;
1198 ost->forced_kf_index++;
1200 ret = avcodec_encode_video(enc,
1201 bit_buffer, bit_buffer_size,
1204 fprintf(stderr, "Video encoding failed\n");
1209 pkt.data= bit_buffer;
1211 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1212 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1213 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1214 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1215 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1217 if(enc->coded_frame->key_frame)
1218 pkt.flags |= AV_PKT_FLAG_KEY;
1219 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1222 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1223 // enc->frame_number-1, ret, enc->pict_type);
1224 /* if two pass, output log */
1225 if (ost->logfile && enc->stats_out) {
1226 fprintf(ost->logfile, "%s", enc->stats_out);
1231 ost->frame_number++;
1235 static double psnr(double d){
1236 return -10.0*log(d)/log(10.0);
1239 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1242 AVCodecContext *enc;
1244 double ti1, bitrate, avg_bitrate;
1246 /* this is executed just the first time do_video_stats is called */
1248 vstats_file = fopen(vstats_filename, "w");
1255 enc = ost->st->codec;
1256 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1257 frame_number = ost->frame_number;
1258 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1259 if (enc->flags&CODEC_FLAG_PSNR)
1260 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1262 fprintf(vstats_file,"f_size= %6d ", frame_size);
1263 /* compute pts value */
1264 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1268 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1269 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1270 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1271 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1272 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1276 static void print_report(AVFormatContext **output_files,
1277 AVOutputStream **ost_table, int nb_ostreams,
1281 AVOutputStream *ost;
1282 AVFormatContext *oc;
1284 AVCodecContext *enc;
1285 int frame_number, vid, i;
1286 double bitrate, ti1, pts;
1287 static int64_t last_time = -1;
1288 static int qp_histogram[52];
1290 if (!is_last_report) {
1292 /* display the report every 0.5 seconds */
1293 cur_time = av_gettime();
1294 if (last_time == -1) {
1295 last_time = cur_time;
1298 if ((cur_time - last_time) < 500000)
1300 last_time = cur_time;
1304 oc = output_files[0];
1306 total_size = url_fsize(oc->pb);
1307 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1308 total_size= url_ftell(oc->pb);
1313 for(i=0;i<nb_ostreams;i++) {
1315 enc = ost->st->codec;
1316 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1317 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1318 !ost->st->stream_copy ?
1319 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1321 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1322 float t = (av_gettime()-timer_start) / 1000000.0;
1324 frame_number = ost->frame_number;
1325 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1326 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1327 !ost->st->stream_copy ?
1328 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1330 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1333 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1334 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1337 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1339 if (enc->flags&CODEC_FLAG_PSNR){
1341 double error, error_sum=0;
1342 double scale, scale_sum=0;
1343 char type[3]= {'Y','U','V'};
1344 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1347 error= enc->error[j];
1348 scale= enc->width*enc->height*255.0*255.0*frame_number;
1350 error= enc->coded_frame->error[j];
1351 scale= enc->width*enc->height*255.0*255.0;
1356 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1358 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1362 /* compute min output value */
1363 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1364 if ((pts < ti1) && (pts > 0))
1370 if (verbose || is_last_report) {
1371 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1373 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1374 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1375 (double)total_size / 1024, ti1, bitrate);
1377 if (nb_frames_dup || nb_frames_drop)
1378 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1379 nb_frames_dup, nb_frames_drop);
1382 fprintf(stderr, "%s \r", buf);
1387 if (is_last_report && verbose >= 0){
1388 int64_t raw= audio_size + video_size + extra_size;
1389 fprintf(stderr, "\n");
1390 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1394 100.0*(total_size - raw)/raw
1399 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1400 static int output_packet(AVInputStream *ist, int ist_index,
1401 AVOutputStream **ost_table, int nb_ostreams,
1402 const AVPacket *pkt)
1404 AVFormatContext *os;
1405 AVOutputStream *ost;
1409 void *buffer_to_free;
1410 static unsigned int samples_size= 0;
1411 AVSubtitle subtitle, *subtitle_to_free;
1412 int64_t pkt_pts = AV_NOPTS_VALUE;
1414 int frame_available;
1418 int bps = av_get_bits_per_sample_format(ist->st->codec->sample_fmt)>>3;
1420 if(ist->next_pts == AV_NOPTS_VALUE)
1421 ist->next_pts= ist->pts;
1425 av_init_packet(&avpkt);
1433 if(pkt->dts != AV_NOPTS_VALUE)
1434 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1435 if(pkt->pts != AV_NOPTS_VALUE)
1436 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1438 //while we have more to decode or while the decoder did output something on EOF
1439 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1440 uint8_t *data_buf, *decoded_data_buf;
1441 int data_size, decoded_data_size;
1443 ist->pts= ist->next_pts;
1445 if(avpkt.size && avpkt.size != pkt->size &&
1446 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1447 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1448 ist->showed_multi_packet_warning=1;
1451 /* decode the packet if needed */
1452 decoded_data_buf = NULL; /* fail safe */
1453 decoded_data_size= 0;
1454 data_buf = avpkt.data;
1455 data_size = avpkt.size;
1456 subtitle_to_free = NULL;
1457 if (ist->decoding_needed) {
1458 switch(ist->st->codec->codec_type) {
1459 case AVMEDIA_TYPE_AUDIO:{
1460 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1461 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1463 samples= av_malloc(samples_size);
1465 decoded_data_size= samples_size;
1466 /* XXX: could avoid copy if PCM 16 bits with same
1467 endianness as CPU */
1468 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1475 /* Some bug in mpeg audio decoder gives */
1476 /* decoded_data_size < 0, it seems they are overflows */
1477 if (decoded_data_size <= 0) {
1478 /* no audio frame */
1481 decoded_data_buf = (uint8_t *)samples;
1482 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1483 (ist->st->codec->sample_rate * ist->st->codec->channels);
1485 case AVMEDIA_TYPE_VIDEO:
1486 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1487 /* XXX: allocate picture correctly */
1488 avcodec_get_frame_defaults(&picture);
1489 ist->st->codec->reordered_opaque = pkt_pts;
1490 pkt_pts = AV_NOPTS_VALUE;
1492 ret = avcodec_decode_video2(ist->st->codec,
1493 &picture, &got_picture, &avpkt);
1494 ist->st->quality= picture.quality;
1498 /* no picture yet */
1499 goto discard_packet;
1501 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.reordered_opaque, ist->pts);
1502 if (ist->st->codec->time_base.num != 0) {
1503 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1504 ist->next_pts += ((int64_t)AV_TIME_BASE *
1505 ist->st->codec->time_base.num * ticks) /
1506 ist->st->codec->time_base.den;
1510 case AVMEDIA_TYPE_SUBTITLE:
1511 ret = avcodec_decode_subtitle2(ist->st->codec,
1512 &subtitle, &got_picture, &avpkt);
1516 goto discard_packet;
1518 subtitle_to_free = &subtitle;
1525 switch(ist->st->codec->codec_type) {
1526 case AVMEDIA_TYPE_AUDIO:
1527 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1528 ist->st->codec->sample_rate;
1530 case AVMEDIA_TYPE_VIDEO:
1531 if (ist->st->codec->time_base.num != 0) {
1532 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1533 ist->next_pts += ((int64_t)AV_TIME_BASE *
1534 ist->st->codec->time_base.num * ticks) /
1535 ist->st->codec->time_base.den;
1543 buffer_to_free = NULL;
1544 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1545 pre_process_video_frame(ist, (AVPicture *)&picture,
1550 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1551 // add it to be filtered
1552 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1554 ist->st->codec->sample_aspect_ratio);
1558 // preprocess audio (volume)
1559 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1560 if (audio_volume != 256) {
1563 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1564 int v = ((*volp) * audio_volume + 128) >> 8;
1565 if (v < -32768) v = -32768;
1566 if (v > 32767) v = 32767;
1572 /* frame rate emulation */
1574 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1575 int64_t now = av_gettime() - ist->start;
1580 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1581 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1583 /* if output time reached then transcode raw format,
1584 encode packets and output them */
1585 if (start_time == 0 || ist->pts >= start_time)
1587 while (frame_available) {
1588 AVRational ist_pts_tb;
1589 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1590 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1592 ist->pts = ist->picref->pts;
1594 for(i=0;i<nb_ostreams;i++) {
1598 if (ost->source_index == ist_index) {
1599 os = output_files[ost->file_index];
1601 /* set the input output pts pairs */
1602 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1604 if (ost->encoding_needed) {
1605 av_assert0(ist->decoding_needed);
1606 switch(ost->st->codec->codec_type) {
1607 case AVMEDIA_TYPE_AUDIO:
1608 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1610 case AVMEDIA_TYPE_VIDEO:
1612 if (ist->picref->video)
1613 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1615 do_video_out(os, ost, ist, &picture, &frame_size);
1616 if (vstats_filename && frame_size)
1617 do_video_stats(os, ost, frame_size);
1619 case AVMEDIA_TYPE_SUBTITLE:
1620 do_subtitle_out(os, ost, ist, &subtitle,
1627 AVFrame avframe; //FIXME/XXX remove this
1629 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1631 av_init_packet(&opkt);
1633 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1636 /* no reencoding needed : output the packet directly */
1637 /* force the input stream PTS */
1639 avcodec_get_frame_defaults(&avframe);
1640 ost->st->codec->coded_frame= &avframe;
1641 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1643 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1644 audio_size += data_size;
1645 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1646 video_size += data_size;
1650 opkt.stream_index= ost->index;
1651 if(pkt->pts != AV_NOPTS_VALUE)
1652 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1654 opkt.pts= AV_NOPTS_VALUE;
1656 if (pkt->dts == AV_NOPTS_VALUE)
1657 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1659 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1660 opkt.dts -= ost_tb_start_time;
1662 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1663 opkt.flags= pkt->flags;
1665 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1666 if( ost->st->codec->codec_id != CODEC_ID_H264
1667 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1668 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1670 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1671 opkt.destruct= av_destruct_packet;
1673 opkt.data = data_buf;
1674 opkt.size = data_size;
1677 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1678 ost->st->codec->frame_number++;
1679 ost->frame_number++;
1680 av_free_packet(&opkt);
1686 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1687 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1689 avfilter_unref_buffer(ist->picref);
1692 av_free(buffer_to_free);
1693 /* XXX: allocate the subtitles in the codec ? */
1694 if (subtitle_to_free) {
1695 if (subtitle_to_free->rects != NULL) {
1696 for (i = 0; i < subtitle_to_free->num_rects; i++) {
1697 av_freep(&subtitle_to_free->rects[i]->pict.data[0]);
1698 av_freep(&subtitle_to_free->rects[i]->pict.data[1]);
1699 av_freep(&subtitle_to_free->rects[i]);
1701 av_freep(&subtitle_to_free->rects);
1703 subtitle_to_free->num_rects = 0;
1704 subtitle_to_free = NULL;
1711 for(i=0;i<nb_ostreams;i++) {
1713 if (ost->source_index == ist_index) {
1714 AVCodecContext *enc= ost->st->codec;
1715 os = output_files[ost->file_index];
1717 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1719 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1722 if (ost->encoding_needed) {
1726 av_init_packet(&pkt);
1727 pkt.stream_index= ost->index;
1729 switch(ost->st->codec->codec_type) {
1730 case AVMEDIA_TYPE_AUDIO:
1731 fifo_bytes = av_fifo_size(ost->fifo);
1733 /* encode any samples remaining in fifo */
1734 if (fifo_bytes > 0) {
1735 int osize = av_get_bits_per_sample_format(enc->sample_fmt) >> 3;
1736 int fs_tmp = enc->frame_size;
1738 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1739 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1740 enc->frame_size = fifo_bytes / (osize * enc->channels);
1742 int frame_bytes = enc->frame_size*osize*enc->channels;
1743 if (allocated_audio_buf_size < frame_bytes)
1745 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1748 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1749 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1750 ost->st->time_base.num, enc->sample_rate);
1751 enc->frame_size = fs_tmp;
1754 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1757 fprintf(stderr, "Audio encoding failed\n");
1761 pkt.flags |= AV_PKT_FLAG_KEY;
1763 case AVMEDIA_TYPE_VIDEO:
1764 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1766 fprintf(stderr, "Video encoding failed\n");
1770 if(enc->coded_frame && enc->coded_frame->key_frame)
1771 pkt.flags |= AV_PKT_FLAG_KEY;
1772 if (ost->logfile && enc->stats_out) {
1773 fprintf(ost->logfile, "%s", enc->stats_out);
1782 pkt.data= bit_buffer;
1784 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1785 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1786 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1798 static void print_sdp(AVFormatContext **avc, int n)
1802 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1803 printf("SDP:\n%s\n", sdp);
1807 static int copy_chapters(int infile, int outfile)
1809 AVFormatContext *is = input_files[infile];
1810 AVFormatContext *os = output_files[outfile];
1813 for (i = 0; i < is->nb_chapters; i++) {
1814 AVChapter *in_ch = is->chapters[i], *out_ch;
1815 AVMetadataTag *t = NULL;
1816 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1817 AV_TIME_BASE_Q, in_ch->time_base);
1818 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1819 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1822 if (in_ch->end < ts_off)
1824 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1827 out_ch = av_mallocz(sizeof(AVChapter));
1829 return AVERROR(ENOMEM);
1831 out_ch->id = in_ch->id;
1832 out_ch->time_base = in_ch->time_base;
1833 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1834 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1836 while ((t = av_metadata_get(in_ch->metadata, "", t, AV_METADATA_IGNORE_SUFFIX)))
1837 av_metadata_set2(&out_ch->metadata, t->key, t->value, 0);
1840 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1842 return AVERROR(ENOMEM);
1843 os->chapters[os->nb_chapters - 1] = out_ch;
1848 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1849 AVCodecContext *avctx)
1855 for (p = kf; *p; p++)
1858 ost->forced_kf_count = n;
1859 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1860 if (!ost->forced_kf_pts) {
1861 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1864 for (i = 0; i < n; i++) {
1865 p = i ? strchr(p, ',') + 1 : kf;
1866 t = parse_time_or_die("force_key_frames", p, 1);
1867 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1872 * The following code is the main loop of the file converter
1874 static int transcode(AVFormatContext **output_files,
1875 int nb_output_files,
1876 AVFormatContext **input_files,
1878 AVStreamMap *stream_maps, int nb_stream_maps)
1880 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1881 AVFormatContext *is, *os;
1882 AVCodecContext *codec, *icodec;
1883 AVOutputStream *ost, **ost_table = NULL;
1884 AVInputStream *ist, **ist_table = NULL;
1885 AVInputFile *file_table;
1889 uint8_t no_packet[MAX_FILES]={0};
1890 int no_packet_count=0;
1892 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1896 /* input stream init */
1898 for(i=0;i<nb_input_files;i++) {
1899 is = input_files[i];
1900 file_table[i].ist_index = j;
1901 file_table[i].nb_streams = is->nb_streams;
1902 j += is->nb_streams;
1906 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1910 for(i=0;i<nb_istreams;i++) {
1911 ist = av_mallocz(sizeof(AVInputStream));
1917 for(i=0;i<nb_input_files;i++) {
1918 is = input_files[i];
1919 for(k=0;k<is->nb_streams;k++) {
1920 ist = ist_table[j++];
1921 ist->st = is->streams[k];
1922 ist->file_index = i;
1924 ist->discard = 1; /* the stream is discarded by default
1928 ist->start = av_gettime();
1933 /* output stream init */
1935 for(i=0;i<nb_output_files;i++) {
1936 os = output_files[i];
1937 if (!os->nb_streams) {
1938 dump_format(output_files[i], i, output_files[i]->filename, 1);
1939 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1940 ret = AVERROR(EINVAL);
1943 nb_ostreams += os->nb_streams;
1945 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1946 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1947 ret = AVERROR(EINVAL);
1951 /* Sanity check the mapping args -- do the input files & streams exist? */
1952 for(i=0;i<nb_stream_maps;i++) {
1953 int fi = stream_maps[i].file_index;
1954 int si = stream_maps[i].stream_index;
1956 if (fi < 0 || fi > nb_input_files - 1 ||
1957 si < 0 || si > file_table[fi].nb_streams - 1) {
1958 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1959 ret = AVERROR(EINVAL);
1962 fi = stream_maps[i].sync_file_index;
1963 si = stream_maps[i].sync_stream_index;
1964 if (fi < 0 || fi > nb_input_files - 1 ||
1965 si < 0 || si > file_table[fi].nb_streams - 1) {
1966 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1967 ret = AVERROR(EINVAL);
1972 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1976 for(k=0;k<nb_output_files;k++) {
1977 os = output_files[k];
1978 for(i=0;i<os->nb_streams;i++,n++) {
1980 ost = ost_table[n] = output_streams_for_file[k][i];
1981 ost->st = os->streams[i];
1982 if (nb_stream_maps > 0) {
1983 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1984 stream_maps[n].stream_index;
1986 /* Sanity check that the stream types match */
1987 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1988 int i= ost->file_index;
1989 dump_format(output_files[i], i, output_files[i]->filename, 1);
1990 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1991 stream_maps[n].file_index, stream_maps[n].stream_index,
1992 ost->file_index, ost->index);
1997 int best_nb_frames=-1;
1998 /* get corresponding input stream index : we select the first one with the right type */
2000 for(j=0;j<nb_istreams;j++) {
2005 AVFormatContext *f= input_files[ ist->file_index ];
2007 for(pi=0; pi<f->nb_programs; pi++){
2008 AVProgram *p= f->programs[pi];
2009 if(p->id == opt_programid)
2010 for(si=0; si<p->nb_stream_indexes; si++){
2011 if(f->streams[ p->stream_index[si] ] == ist->st)
2016 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2017 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2018 if(best_nb_frames < ist->st->codec_info_nb_frames){
2019 best_nb_frames= ist->st->codec_info_nb_frames;
2020 ost->source_index = j;
2027 if(! opt_programid) {
2028 /* try again and reuse existing stream */
2029 for(j=0;j<nb_istreams;j++) {
2031 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2032 && ist->st->discard != AVDISCARD_ALL) {
2033 ost->source_index = j;
2039 int i= ost->file_index;
2040 dump_format(output_files[i], i, output_files[i]->filename, 1);
2041 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2042 ost->file_index, ost->index);
2047 ist = ist_table[ost->source_index];
2049 ost->sync_ist = (nb_stream_maps > 0) ?
2050 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2051 stream_maps[n].sync_stream_index] : ist;
2055 /* for each output stream, we compute the right encoding parameters */
2056 for(i=0;i<nb_ostreams;i++) {
2057 AVMetadataTag *t = NULL;
2059 os = output_files[ost->file_index];
2060 ist = ist_table[ost->source_index];
2062 codec = ost->st->codec;
2063 icodec = ist->st->codec;
2065 while ((t = av_metadata_get(ist->st->metadata, "", t, AV_METADATA_IGNORE_SUFFIX))) {
2066 av_metadata_set2(&ost->st->metadata, t->key, t->value, AV_METADATA_DONT_OVERWRITE);
2069 ost->st->disposition = ist->st->disposition;
2070 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2071 codec->chroma_sample_location = icodec->chroma_sample_location;
2073 if (ost->st->stream_copy) {
2074 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2076 if (extra_size > INT_MAX)
2079 /* if stream_copy is selected, no need to decode or encode */
2080 codec->codec_id = icodec->codec_id;
2081 codec->codec_type = icodec->codec_type;
2083 if(!codec->codec_tag){
2084 if( !os->oformat->codec_tag
2085 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2086 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2087 codec->codec_tag = icodec->codec_tag;
2090 codec->bit_rate = icodec->bit_rate;
2091 codec->rc_max_rate = icodec->rc_max_rate;
2092 codec->rc_buffer_size = icodec->rc_buffer_size;
2093 codec->extradata= av_mallocz(extra_size);
2094 if (!codec->extradata)
2096 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2097 codec->extradata_size= icodec->extradata_size;
2098 if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
2099 codec->time_base = icodec->time_base;
2100 codec->time_base.num *= icodec->ticks_per_frame;
2101 av_reduce(&codec->time_base.num, &codec->time_base.den,
2102 codec->time_base.num, codec->time_base.den, INT_MAX);
2104 codec->time_base = ist->st->time_base;
2105 switch(codec->codec_type) {
2106 case AVMEDIA_TYPE_AUDIO:
2107 if(audio_volume != 256) {
2108 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2111 codec->channel_layout = icodec->channel_layout;
2112 codec->sample_rate = icodec->sample_rate;
2113 codec->channels = icodec->channels;
2114 codec->frame_size = icodec->frame_size;
2115 codec->block_align= icodec->block_align;
2116 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2117 codec->block_align= 0;
2118 if(codec->codec_id == CODEC_ID_AC3)
2119 codec->block_align= 0;
2121 case AVMEDIA_TYPE_VIDEO:
2122 codec->pix_fmt = icodec->pix_fmt;
2123 codec->width = icodec->width;
2124 codec->height = icodec->height;
2125 codec->has_b_frames = icodec->has_b_frames;
2127 case AVMEDIA_TYPE_SUBTITLE:
2128 codec->width = icodec->width;
2129 codec->height = icodec->height;
2135 switch(codec->codec_type) {
2136 case AVMEDIA_TYPE_AUDIO:
2137 ost->fifo= av_fifo_alloc(1024);
2140 ost->reformat_pair = MAKE_SFMT_PAIR(SAMPLE_FMT_NONE,SAMPLE_FMT_NONE);
2141 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2142 icodec->request_channels = codec->channels;
2143 ist->decoding_needed = 1;
2144 ost->encoding_needed = 1;
2146 case AVMEDIA_TYPE_VIDEO:
2147 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2148 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2151 ost->video_resample = (codec->width != icodec->width ||
2152 codec->height != icodec->height ||
2153 (codec->pix_fmt != icodec->pix_fmt));
2154 if (ost->video_resample) {
2155 avcodec_get_frame_defaults(&ost->pict_tmp);
2156 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2157 codec->width, codec->height)) {
2158 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2161 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2162 ost->img_resample_ctx = sws_getContext(
2169 sws_flags, NULL, NULL, NULL);
2170 if (ost->img_resample_ctx == NULL) {
2171 fprintf(stderr, "Cannot get resampling context\n");
2175 #if !CONFIG_AVFILTER
2176 ost->original_height = icodec->height;
2177 ost->original_width = icodec->width;
2179 codec->bits_per_raw_sample= 0;
2181 ost->resample_height = icodec->height;
2182 ost->resample_width = icodec->width;
2183 ost->resample_pix_fmt= icodec->pix_fmt;
2184 ost->encoding_needed = 1;
2185 ist->decoding_needed = 1;
2188 if (configure_filters(ist, ost)) {
2189 fprintf(stderr, "Error opening filters!\n");
2194 case AVMEDIA_TYPE_SUBTITLE:
2195 ost->encoding_needed = 1;
2196 ist->decoding_needed = 1;
2203 if (ost->encoding_needed &&
2204 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2205 char logfilename[1024];
2208 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2209 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2211 if (codec->flags & CODEC_FLAG_PASS1) {
2212 f = fopen(logfilename, "wb");
2214 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2220 size_t logbuffer_size;
2221 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2222 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2225 codec->stats_in = logbuffer;
2229 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2230 int size= codec->width * codec->height;
2231 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2236 bit_buffer = av_malloc(bit_buffer_size);
2238 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2240 ret = AVERROR(ENOMEM);
2244 /* open each encoder */
2245 for(i=0;i<nb_ostreams;i++) {
2247 if (ost->encoding_needed) {
2248 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2250 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2252 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2253 ost->st->codec->codec_id, ost->file_index, ost->index);
2254 ret = AVERROR(EINVAL);
2257 if (avcodec_open(ost->st->codec, codec) < 0) {
2258 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2259 ost->file_index, ost->index);
2260 ret = AVERROR(EINVAL);
2263 extra_size += ost->st->codec->extradata_size;
2267 /* open each decoder */
2268 for(i=0;i<nb_istreams;i++) {
2270 if (ist->decoding_needed) {
2271 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2273 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2275 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2276 ist->st->codec->codec_id, ist->file_index, ist->index);
2277 ret = AVERROR(EINVAL);
2280 if (avcodec_open(ist->st->codec, codec) < 0) {
2281 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2282 ist->file_index, ist->index);
2283 ret = AVERROR(EINVAL);
2286 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2287 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2292 for(i=0;i<nb_istreams;i++) {
2296 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2297 ist->next_pts = AV_NOPTS_VALUE;
2298 init_pts_correction(&ist->pts_ctx);
2302 /* set meta data information from input file if required */
2303 for (i=0;i<nb_meta_data_maps;i++) {
2304 AVFormatContext *out_file;
2305 AVFormatContext *in_file;
2306 AVMetadataTag *mtag;
2308 int out_file_index = meta_data_maps[i].out_file;
2309 int in_file_index = meta_data_maps[i].in_file;
2310 if (out_file_index < 0 || out_file_index >= nb_output_files) {
2311 snprintf(error, sizeof(error), "Invalid output file index %d map_meta_data(%d,%d)",
2312 out_file_index, out_file_index, in_file_index);
2313 ret = AVERROR(EINVAL);
2316 if (in_file_index < 0 || in_file_index >= nb_input_files) {
2317 snprintf(error, sizeof(error), "Invalid input file index %d map_meta_data(%d,%d)",
2318 in_file_index, out_file_index, in_file_index);
2319 ret = AVERROR(EINVAL);
2323 out_file = output_files[out_file_index];
2324 in_file = input_files[in_file_index];
2328 while((mtag=av_metadata_get(in_file->metadata, "", mtag, AV_METADATA_IGNORE_SUFFIX)))
2329 av_metadata_set2(&out_file->metadata, mtag->key, mtag->value, AV_METADATA_DONT_OVERWRITE);
2332 /* copy chapters from the first input file that has them*/
2333 for (i = 0; i < nb_input_files; i++) {
2334 if (!input_files[i]->nb_chapters)
2337 for (j = 0; j < nb_output_files; j++)
2338 if ((ret = copy_chapters(i, j)) < 0)
2342 /* open files and write file headers */
2343 for(i=0;i<nb_output_files;i++) {
2344 os = output_files[i];
2345 if (av_write_header(os) < 0) {
2346 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2347 ret = AVERROR(EINVAL);
2350 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2356 /* dump the file output parameters - cannot be done before in case
2358 for(i=0;i<nb_output_files;i++) {
2359 dump_format(output_files[i], i, output_files[i]->filename, 1);
2362 /* dump the stream mapping */
2364 fprintf(stderr, "Stream mapping:\n");
2365 for(i=0;i<nb_ostreams;i++) {
2367 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2368 ist_table[ost->source_index]->file_index,
2369 ist_table[ost->source_index]->index,
2372 if (ost->sync_ist != ist_table[ost->source_index])
2373 fprintf(stderr, " [sync #%d.%d]",
2374 ost->sync_ist->file_index,
2375 ost->sync_ist->index);
2376 fprintf(stderr, "\n");
2381 fprintf(stderr, "%s\n", error);
2386 print_sdp(output_files, nb_output_files);
2389 if (!using_stdin && verbose >= 0) {
2390 fprintf(stderr, "Press [q] to stop encoding\n");
2391 url_set_interrupt_cb(decode_interrupt_cb);
2395 timer_start = av_gettime();
2397 for(; received_sigterm == 0;) {
2398 int file_index, ist_index;
2406 /* if 'q' pressed, exits */
2410 /* read_key() returns 0 on EOF */
2416 /* select the stream that we must read now by looking at the
2417 smallest output pts */
2419 for(i=0;i<nb_ostreams;i++) {
2422 os = output_files[ost->file_index];
2423 ist = ist_table[ost->source_index];
2424 if(ist->is_past_recording_time || no_packet[ist->file_index])
2426 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2427 ipts = (double)ist->pts;
2428 if (!file_table[ist->file_index].eof_reached){
2429 if(ipts < ipts_min) {
2431 if(input_sync ) file_index = ist->file_index;
2433 if(opts < opts_min) {
2435 if(!input_sync) file_index = ist->file_index;
2438 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2443 /* if none, if is finished */
2444 if (file_index < 0) {
2445 if(no_packet_count){
2447 memset(no_packet, 0, sizeof(no_packet));
2454 /* finish if limit size exhausted */
2455 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2458 /* read a frame from it and output it in the fifo */
2459 is = input_files[file_index];
2460 ret= av_read_frame(is, &pkt);
2461 if(ret == AVERROR(EAGAIN)){
2462 no_packet[file_index]=1;
2467 file_table[file_index].eof_reached = 1;
2475 memset(no_packet, 0, sizeof(no_packet));
2478 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2480 /* the following test is needed in case new streams appear
2481 dynamically in stream : we ignore them */
2482 if (pkt.stream_index >= file_table[file_index].nb_streams)
2483 goto discard_packet;
2484 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2485 ist = ist_table[ist_index];
2487 goto discard_packet;
2489 if (pkt.dts != AV_NOPTS_VALUE)
2490 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2491 if (pkt.pts != AV_NOPTS_VALUE)
2492 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2494 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2495 && input_files_ts_scale[file_index][pkt.stream_index]){
2496 if(pkt.pts != AV_NOPTS_VALUE)
2497 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2498 if(pkt.dts != AV_NOPTS_VALUE)
2499 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2502 // 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);
2503 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2504 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2505 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2506 int64_t delta= pkt_dts - ist->next_pts;
2507 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2508 input_files_ts_offset[ist->file_index]-= delta;
2510 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2511 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2512 if(pkt.pts != AV_NOPTS_VALUE)
2513 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2517 /* finish if recording time exhausted */
2518 if (recording_time != INT64_MAX &&
2519 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2520 ist->is_past_recording_time = 1;
2521 goto discard_packet;
2524 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2525 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2528 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2529 ist->file_index, ist->index);
2532 av_free_packet(&pkt);
2537 av_free_packet(&pkt);
2539 /* dump report by using the output first video and audio streams */
2540 print_report(output_files, ost_table, nb_ostreams, 0);
2543 /* at the end of stream, we must flush the decoder buffers */
2544 for(i=0;i<nb_istreams;i++) {
2546 if (ist->decoding_needed) {
2547 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2553 /* write the trailer if needed and close file */
2554 for(i=0;i<nb_output_files;i++) {
2555 os = output_files[i];
2556 av_write_trailer(os);
2559 /* dump report by using the first video and audio streams */
2560 print_report(output_files, ost_table, nb_ostreams, 1);
2562 /* close each encoder */
2563 for(i=0;i<nb_ostreams;i++) {
2565 if (ost->encoding_needed) {
2566 av_freep(&ost->st->codec->stats_in);
2567 avcodec_close(ost->st->codec);
2571 /* close each decoder */
2572 for(i=0;i<nb_istreams;i++) {
2574 if (ist->decoding_needed) {
2575 avcodec_close(ist->st->codec);
2580 avfilter_graph_destroy(graph);
2589 av_freep(&bit_buffer);
2590 av_free(file_table);
2593 for(i=0;i<nb_istreams;i++) {
2600 for(i=0;i<nb_ostreams;i++) {
2603 if (ost->st->stream_copy)
2604 av_freep(&ost->st->codec->extradata);
2606 fclose(ost->logfile);
2607 ost->logfile = NULL;
2609 av_fifo_free(ost->fifo); /* works even if fifo is not
2610 initialized but set to zero */
2611 av_free(ost->pict_tmp.data[0]);
2612 av_free(ost->forced_kf_pts);
2613 if (ost->video_resample)
2614 sws_freeContext(ost->img_resample_ctx);
2616 audio_resample_close(ost->resample);
2617 if (ost->reformat_ctx)
2618 av_audio_convert_free(ost->reformat_ctx);
2627 static void opt_format(const char *arg)
2629 /* compatibility stuff for pgmyuv */
2630 if (!strcmp(arg, "pgmyuv")) {
2631 pgmyuv_compatibility_hack=1;
2632 // opt_image_format(arg);
2634 fprintf(stderr, "pgmyuv format is deprecated, use image2\n");
2637 last_asked_format = arg;
2640 static void opt_video_rc_override_string(const char *arg)
2642 video_rc_override_string = arg;
2645 static int opt_me_threshold(const char *opt, const char *arg)
2647 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2651 static int opt_verbose(const char *opt, const char *arg)
2653 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2657 static int opt_frame_rate(const char *opt, const char *arg)
2659 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2660 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2666 static int opt_bitrate(const char *opt, const char *arg)
2668 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2670 opt_default(opt, arg);
2672 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2673 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2678 static int opt_frame_crop(const char *opt, const char *arg)
2680 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2681 return AVERROR(EINVAL);
2684 static void opt_frame_size(const char *arg)
2686 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2687 fprintf(stderr, "Incorrect frame size\n");
2692 static int opt_pad(const char *opt, const char *arg) {
2693 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2697 static void opt_frame_pix_fmt(const char *arg)
2699 if (strcmp(arg, "list")) {
2700 frame_pix_fmt = av_get_pix_fmt(arg);
2701 if (frame_pix_fmt == PIX_FMT_NONE) {
2702 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2711 static void opt_frame_aspect_ratio(const char *arg)
2718 p = strchr(arg, ':');
2720 x = strtol(arg, &end, 10);
2722 y = strtol(end+1, &end, 10);
2724 ar = (double)x / (double)y;
2726 ar = strtod(arg, NULL);
2729 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2732 frame_aspect_ratio = ar;
2735 static int opt_metadata(const char *opt, const char *arg)
2737 char *mid= strchr(arg, '=');
2740 fprintf(stderr, "Missing =\n");
2745 av_metadata_set2(&metadata, arg, mid, 0);
2750 static void opt_qscale(const char *arg)
2752 video_qscale = atof(arg);
2753 if (video_qscale <= 0 ||
2754 video_qscale > 255) {
2755 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2760 static void opt_top_field_first(const char *arg)
2762 top_field_first= atoi(arg);
2765 static int opt_thread_count(const char *opt, const char *arg)
2767 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2770 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2775 static void opt_audio_sample_fmt(const char *arg)
2777 if (strcmp(arg, "list"))
2778 audio_sample_fmt = avcodec_get_sample_fmt(arg);
2780 list_fmts(avcodec_sample_fmt_string, SAMPLE_FMT_NB);
2785 static int opt_audio_rate(const char *opt, const char *arg)
2787 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2791 static int opt_audio_channels(const char *opt, const char *arg)
2793 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2797 static void opt_video_channel(const char *arg)
2799 video_channel = strtol(arg, NULL, 0);
2802 static void opt_video_standard(const char *arg)
2804 video_standard = av_strdup(arg);
2807 static void opt_codec(int *pstream_copy, char **pcodec_name,
2808 int codec_type, const char *arg)
2810 av_freep(pcodec_name);
2811 if (!strcmp(arg, "copy")) {
2814 *pcodec_name = av_strdup(arg);
2818 static void opt_audio_codec(const char *arg)
2820 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2823 static void opt_video_codec(const char *arg)
2825 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2828 static void opt_subtitle_codec(const char *arg)
2830 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2833 static void opt_codec_tag(const char *opt, const char *arg)
2836 uint32_t *codec_tag;
2838 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2839 !strcmp(opt, "vtag") ? &video_codec_tag :
2840 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2842 *codec_tag = strtol(arg, &tail, 0);
2844 *codec_tag = arg[0] + (arg[1]<<8) + (arg[2]<<16) + (arg[3]<<24);
2847 static void opt_map(const char *arg)
2852 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2853 m = &stream_maps[nb_stream_maps-1];
2855 m->file_index = strtol(arg, &p, 0);
2859 m->stream_index = strtol(p, &p, 0);
2862 m->sync_file_index = strtol(p, &p, 0);
2865 m->sync_stream_index = strtol(p, &p, 0);
2867 m->sync_file_index = m->file_index;
2868 m->sync_stream_index = m->stream_index;
2872 static void opt_map_meta_data(const char *arg)
2877 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2878 &nb_meta_data_maps, nb_meta_data_maps + 1);
2880 m = &meta_data_maps[nb_meta_data_maps - 1];
2881 m->out_file = strtol(arg, &p, 0);
2885 m->in_file = strtol(p, &p, 0);
2888 static void opt_input_ts_scale(const char *arg)
2890 unsigned int stream;
2894 stream = strtol(arg, &p, 0);
2897 scale= strtod(p, &p);
2899 if(stream >= MAX_STREAMS)
2902 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);
2903 input_files_ts_scale[nb_input_files][stream]= scale;
2906 static int opt_recording_time(const char *opt, const char *arg)
2908 recording_time = parse_time_or_die(opt, arg, 1);
2912 static int opt_start_time(const char *opt, const char *arg)
2914 start_time = parse_time_or_die(opt, arg, 1);
2918 static int opt_recording_timestamp(const char *opt, const char *arg)
2920 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
2924 static int opt_input_ts_offset(const char *opt, const char *arg)
2926 input_ts_offset = parse_time_or_die(opt, arg, 1);
2930 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
2932 const char *codec_string = encoder ? "encoder" : "decoder";
2936 return CODEC_ID_NONE;
2938 avcodec_find_encoder_by_name(name) :
2939 avcodec_find_decoder_by_name(name);
2941 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
2944 if(codec->type != type) {
2945 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
2948 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
2949 strict > FF_COMPLIANCE_EXPERIMENTAL) {
2950 fprintf(stderr, "%s '%s' is experimental and might produce bad "
2951 "results.\nAdd '-strict experimental' if you want to use it.\n",
2952 codec_string, codec->name);
2954 avcodec_find_encoder(codec->id) :
2955 avcodec_find_decoder(codec->id);
2956 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
2957 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
2958 codec_string, codec->name);
2964 static void opt_input_file(const char *filename)
2966 AVFormatContext *ic;
2967 AVFormatParameters params, *ap = ¶ms;
2968 AVInputFormat *file_iformat = NULL;
2969 int err, i, ret, rfps, rfps_base;
2972 if (last_asked_format) {
2973 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2974 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2977 last_asked_format = NULL;
2980 if (!strcmp(filename, "-"))
2983 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2984 !strcmp(filename, "/dev/stdin");
2986 /* get default parameters from command line */
2987 ic = avformat_alloc_context();
2989 print_error(filename, AVERROR(ENOMEM));
2993 memset(ap, 0, sizeof(*ap));
2994 ap->prealloced_context = 1;
2995 ap->sample_rate = audio_sample_rate;
2996 ap->channels = audio_channels;
2997 ap->time_base.den = frame_rate.num;
2998 ap->time_base.num = frame_rate.den;
2999 ap->width = frame_width;
3000 ap->height = frame_height;
3001 ap->pix_fmt = frame_pix_fmt;
3002 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3003 ap->channel = video_channel;
3004 ap->standard = video_standard;
3006 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3008 ic->video_codec_id =
3009 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3010 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3011 ic->audio_codec_id =
3012 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3013 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3014 ic->subtitle_codec_id=
3015 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3016 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3017 ic->flags |= AVFMT_FLAG_NONBLOCK;
3019 if(pgmyuv_compatibility_hack)
3020 ic->video_codec_id= CODEC_ID_PGMYUV;
3022 /* open the input file with generic libav function */
3023 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3025 print_error(filename, err);
3031 for(i=0; i<ic->nb_streams; i++){
3032 ic->streams[i]->discard= AVDISCARD_ALL;
3034 for(i=0; i<ic->nb_programs; i++){
3035 AVProgram *p= ic->programs[i];
3036 if(p->id != opt_programid){
3037 p->discard = AVDISCARD_ALL;
3040 for(j=0; j<p->nb_stream_indexes; j++){
3041 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3046 fprintf(stderr, "Specified program id not found\n");
3052 ic->loop_input = loop_input;
3054 /* If not enough info to get the stream parameters, we decode the
3055 first frames to get it. (used in mpeg case for example) */
3056 ret = av_find_stream_info(ic);
3057 if (ret < 0 && verbose >= 0) {
3058 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3059 av_close_input_file(ic);
3063 timestamp = start_time;
3064 /* add the stream start time */
3065 if (ic->start_time != AV_NOPTS_VALUE)
3066 timestamp += ic->start_time;
3068 /* if seeking requested, we execute it */
3069 if (start_time != 0) {
3070 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3072 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3073 filename, (double)timestamp / AV_TIME_BASE);
3075 /* reset seek info */
3079 /* update the current parameters so that they match the one of the input stream */
3080 for(i=0;i<ic->nb_streams;i++) {
3081 AVStream *st = ic->streams[i];
3082 AVCodecContext *dec = st->codec;
3083 avcodec_thread_init(dec, thread_count);
3084 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3085 switch (dec->codec_type) {
3086 case AVMEDIA_TYPE_AUDIO:
3087 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3088 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]);
3089 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3090 channel_layout = dec->channel_layout;
3091 audio_channels = dec->channels;
3092 audio_sample_rate = dec->sample_rate;
3093 audio_sample_fmt = dec->sample_fmt;
3095 st->discard= AVDISCARD_ALL;
3096 /* Note that av_find_stream_info can add more streams, and we
3097 * currently have no chance of setting up lowres decoding
3098 * early enough for them. */
3100 audio_sample_rate >>= dec->lowres;
3102 case AVMEDIA_TYPE_VIDEO:
3103 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3104 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]);
3105 frame_height = dec->height;
3106 frame_width = dec->width;
3107 if(ic->streams[i]->sample_aspect_ratio.num)
3108 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3110 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3111 frame_aspect_ratio *= (float) dec->width / dec->height;
3112 frame_pix_fmt = dec->pix_fmt;
3113 rfps = ic->streams[i]->r_frame_rate.num;
3114 rfps_base = ic->streams[i]->r_frame_rate.den;
3116 dec->flags |= CODEC_FLAG_EMU_EDGE;
3117 frame_height >>= dec->lowres;
3118 frame_width >>= dec->lowres;
3121 dec->debug |= FF_DEBUG_MV;
3123 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3126 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3127 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3129 (float)rfps / rfps_base, rfps, rfps_base);
3131 /* update the current frame rate to match the stream frame rate */
3132 frame_rate.num = rfps;
3133 frame_rate.den = rfps_base;
3136 st->discard= AVDISCARD_ALL;
3137 else if(video_discard)
3138 st->discard= video_discard;
3140 case AVMEDIA_TYPE_DATA:
3142 case AVMEDIA_TYPE_SUBTITLE:
3143 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3144 if(subtitle_disable)
3145 st->discard = AVDISCARD_ALL;
3147 case AVMEDIA_TYPE_ATTACHMENT:
3148 case AVMEDIA_TYPE_UNKNOWN:
3155 input_files[nb_input_files] = ic;
3156 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3157 /* dump the file content */
3159 dump_format(ic, nb_input_files, filename, 0);
3165 av_freep(&video_codec_name);
3166 av_freep(&audio_codec_name);
3167 av_freep(&subtitle_codec_name);
3170 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3171 int *has_subtitle_ptr)
3173 int has_video, has_audio, has_subtitle, i, j;
3174 AVFormatContext *ic;
3179 for(j=0;j<nb_input_files;j++) {
3180 ic = input_files[j];
3181 for(i=0;i<ic->nb_streams;i++) {
3182 AVCodecContext *enc = ic->streams[i]->codec;
3183 switch(enc->codec_type) {
3184 case AVMEDIA_TYPE_AUDIO:
3187 case AVMEDIA_TYPE_VIDEO:
3190 case AVMEDIA_TYPE_SUBTITLE:
3193 case AVMEDIA_TYPE_DATA:
3194 case AVMEDIA_TYPE_ATTACHMENT:
3195 case AVMEDIA_TYPE_UNKNOWN:
3202 *has_video_ptr = has_video;
3203 *has_audio_ptr = has_audio;
3204 *has_subtitle_ptr = has_subtitle;
3207 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
3209 int idx = oc->nb_streams - 1;
3210 AVOutputStream *ost;
3212 output_streams_for_file[file_idx] =
3213 grow_array(output_streams_for_file[file_idx],
3214 sizeof(*output_streams_for_file[file_idx]),
3215 &nb_output_streams_for_file[file_idx],
3217 ost = output_streams_for_file[file_idx][idx] =
3218 av_mallocz(sizeof(AVOutputStream));
3220 fprintf(stderr, "Could not alloc output stream\n");
3223 ost->file_index = file_idx;
3228 static void new_video_stream(AVFormatContext *oc, int file_idx)
3231 AVOutputStream *ost;
3232 AVCodecContext *video_enc;
3233 enum CodecID codec_id;
3234 AVCodec *codec= NULL;
3236 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3238 fprintf(stderr, "Could not alloc stream\n");
3241 ost = new_output_stream(oc, file_idx);
3243 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3244 if(!video_stream_copy){
3245 if (video_codec_name) {
3246 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3247 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3248 codec = avcodec_find_encoder_by_name(video_codec_name);
3249 output_codecs[nb_output_codecs-1] = codec;
3251 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3252 codec = avcodec_find_encoder(codec_id);
3256 avcodec_get_context_defaults3(st->codec, codec);
3257 ost->bitstream_filters = video_bitstream_filters;
3258 video_bitstream_filters= NULL;
3260 avcodec_thread_init(st->codec, thread_count);
3262 video_enc = st->codec;
3265 video_enc->codec_tag= video_codec_tag;
3267 if( (video_global_header&1)
3268 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3269 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3270 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3272 if(video_global_header&2){
3273 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3274 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3277 if (video_stream_copy) {
3278 st->stream_copy = 1;
3279 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3280 video_enc->sample_aspect_ratio =
3281 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3285 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3287 video_enc->codec_id = codec_id;
3288 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3290 if (codec && codec->supported_framerates && !force_fps)
3291 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3292 video_enc->time_base.den = fps.num;
3293 video_enc->time_base.num = fps.den;
3295 video_enc->width = frame_width;
3296 video_enc->height = frame_height;
3297 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3298 video_enc->pix_fmt = frame_pix_fmt;
3299 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3301 choose_pixel_fmt(st, codec);
3304 video_enc->gop_size = 0;
3305 if (video_qscale || same_quality) {
3306 video_enc->flags |= CODEC_FLAG_QSCALE;
3307 video_enc->global_quality=
3308 st->quality = FF_QP2LAMBDA * video_qscale;
3312 video_enc->intra_matrix = intra_matrix;
3314 video_enc->inter_matrix = inter_matrix;
3316 p= video_rc_override_string;
3319 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3321 fprintf(stderr, "error parsing rc_override\n");
3324 video_enc->rc_override=
3325 av_realloc(video_enc->rc_override,
3326 sizeof(RcOverride)*(i+1));
3327 video_enc->rc_override[i].start_frame= start;
3328 video_enc->rc_override[i].end_frame = end;
3330 video_enc->rc_override[i].qscale= q;
3331 video_enc->rc_override[i].quality_factor= 1.0;
3334 video_enc->rc_override[i].qscale= 0;
3335 video_enc->rc_override[i].quality_factor= -q/100.0;
3340 video_enc->rc_override_count=i;
3341 if (!video_enc->rc_initial_buffer_occupancy)
3342 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3343 video_enc->me_threshold= me_threshold;
3344 video_enc->intra_dc_precision= intra_dc_precision - 8;
3347 video_enc->flags|= CODEC_FLAG_PSNR;
3352 video_enc->flags |= CODEC_FLAG_PASS1;
3354 video_enc->flags |= CODEC_FLAG_PASS2;
3358 if (forced_key_frames)
3359 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3361 if (video_language) {
3362 av_metadata_set2(&st->metadata, "language", video_language, 0);
3363 av_freep(&video_language);
3366 /* reset some key parameters */
3368 av_freep(&video_codec_name);
3369 av_freep(&forced_key_frames);
3370 video_stream_copy = 0;
3371 frame_pix_fmt = PIX_FMT_NONE;
3374 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3377 AVOutputStream *ost;
3378 AVCodec *codec= NULL;
3379 AVCodecContext *audio_enc;
3380 enum CodecID codec_id;
3382 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3384 fprintf(stderr, "Could not alloc stream\n");
3387 ost = new_output_stream(oc, file_idx);
3389 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3390 if(!audio_stream_copy){
3391 if (audio_codec_name) {
3392 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3393 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3394 codec = avcodec_find_encoder_by_name(audio_codec_name);
3395 output_codecs[nb_output_codecs-1] = codec;
3397 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3398 codec = avcodec_find_encoder(codec_id);
3402 avcodec_get_context_defaults3(st->codec, codec);
3404 ost->bitstream_filters = audio_bitstream_filters;
3405 audio_bitstream_filters= NULL;
3407 avcodec_thread_init(st->codec, thread_count);
3409 audio_enc = st->codec;
3410 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3413 audio_enc->codec_tag= audio_codec_tag;
3415 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3416 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3417 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3419 if (audio_stream_copy) {
3420 st->stream_copy = 1;
3421 audio_enc->channels = audio_channels;
3422 audio_enc->sample_rate = audio_sample_rate;
3424 audio_enc->codec_id = codec_id;
3425 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3427 if (audio_qscale > QSCALE_NONE) {
3428 audio_enc->flags |= CODEC_FLAG_QSCALE;
3429 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3431 audio_enc->channels = audio_channels;
3432 audio_enc->sample_fmt = audio_sample_fmt;
3433 audio_enc->sample_rate = audio_sample_rate;
3434 audio_enc->channel_layout = channel_layout;
3435 if (avcodec_channel_layout_num_channels(channel_layout) != audio_channels)
3436 audio_enc->channel_layout = 0;
3437 choose_sample_fmt(st, codec);
3438 choose_sample_rate(st, codec);
3440 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3441 if (audio_language) {
3442 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3443 av_freep(&audio_language);
3446 /* reset some key parameters */
3448 av_freep(&audio_codec_name);
3449 audio_stream_copy = 0;
3452 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3455 AVOutputStream *ost;
3456 AVCodec *codec=NULL;
3457 AVCodecContext *subtitle_enc;
3459 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3461 fprintf(stderr, "Could not alloc stream\n");
3464 ost = new_output_stream(oc, file_idx);
3465 subtitle_enc = st->codec;
3466 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3467 if(!subtitle_stream_copy){
3468 subtitle_enc->codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3469 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3470 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3472 avcodec_get_context_defaults3(st->codec, codec);
3474 ost->bitstream_filters = subtitle_bitstream_filters;
3475 subtitle_bitstream_filters= NULL;
3477 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3479 if(subtitle_codec_tag)
3480 subtitle_enc->codec_tag= subtitle_codec_tag;
3482 if (subtitle_stream_copy) {
3483 st->stream_copy = 1;
3485 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3488 if (subtitle_language) {
3489 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3490 av_freep(&subtitle_language);
3493 subtitle_disable = 0;
3494 av_freep(&subtitle_codec_name);
3495 subtitle_stream_copy = 0;
3498 static int opt_new_stream(const char *opt, const char *arg)
3500 AVFormatContext *oc;
3501 int file_idx = nb_output_files - 1;
3502 if (nb_output_files <= 0) {
3503 fprintf(stderr, "At least one output file must be specified\n");
3506 oc = output_files[file_idx];
3508 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3509 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3510 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3515 /* arg format is "output-stream-index:streamid-value". */
3516 static int opt_streamid(const char *opt, const char *arg)
3522 strncpy(idx_str, arg, sizeof(idx_str));
3523 idx_str[sizeof(idx_str)-1] = '\0';
3524 p = strchr(idx_str, ':');
3527 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3532 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3533 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3534 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3538 static void opt_output_file(const char *filename)
3540 AVFormatContext *oc;
3541 int err, use_video, use_audio, use_subtitle;
3542 int input_has_video, input_has_audio, input_has_subtitle;
3543 AVFormatParameters params, *ap = ¶ms;
3544 AVOutputFormat *file_oformat;
3545 AVMetadataTag *tag = NULL;
3547 if (!strcmp(filename, "-"))
3550 oc = avformat_alloc_context();
3552 print_error(filename, AVERROR(ENOMEM));
3556 if (last_asked_format) {
3557 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3558 if (!file_oformat) {
3559 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3562 last_asked_format = NULL;
3564 file_oformat = av_guess_format(NULL, filename, NULL);
3565 if (!file_oformat) {
3566 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3572 oc->oformat = file_oformat;
3573 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3575 if (!strcmp(file_oformat->name, "ffm") &&
3576 av_strstart(filename, "http:", NULL)) {
3577 /* special case for files sent to ffserver: we get the stream
3578 parameters from ffserver */
3579 int err = read_ffserver_streams(oc, filename);
3581 print_error(filename, err);
3585 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3586 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3587 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3589 /* disable if no corresponding type found and at least one
3591 if (nb_input_files > 0) {
3592 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3593 &input_has_subtitle);
3594 if (!input_has_video)
3596 if (!input_has_audio)
3598 if (!input_has_subtitle)
3602 /* manual disable */
3603 if (audio_disable) use_audio = 0;
3604 if (video_disable) use_video = 0;
3605 if (subtitle_disable) use_subtitle = 0;
3607 if (use_video) new_video_stream(oc, nb_output_files);
3608 if (use_audio) new_audio_stream(oc, nb_output_files);
3609 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3611 oc->timestamp = recording_timestamp;
3613 while ((tag = av_metadata_get(metadata, "", tag, AV_METADATA_IGNORE_SUFFIX)))
3614 av_metadata_set2(&oc->metadata, tag->key, tag->value, 0);
3615 av_metadata_free(&metadata);
3618 output_files[nb_output_files++] = oc;
3620 /* check filename in case of an image number is expected */
3621 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3622 if (!av_filename_number_test(oc->filename)) {
3623 print_error(oc->filename, AVERROR_NUMEXPECTED);
3628 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3629 /* test if it already exists to avoid loosing precious files */
3630 if (!file_overwrite &&
3631 (strchr(filename, ':') == NULL ||
3632 filename[1] == ':' ||
3633 av_strstart(filename, "file:", NULL))) {
3634 if (url_exist(filename)) {
3636 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3638 if (!read_yesno()) {
3639 fprintf(stderr, "Not overwriting - exiting\n");
3644 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3651 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3652 print_error(filename, err);
3657 memset(ap, 0, sizeof(*ap));
3658 if (av_set_parameters(oc, ap) < 0) {
3659 fprintf(stderr, "%s: Invalid encoding parameters\n",
3664 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3665 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3666 oc->loop_output = loop_output;
3667 oc->flags |= AVFMT_FLAG_NONBLOCK;
3669 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3671 nb_streamid_map = 0;
3672 av_freep(&forced_key_frames);
3675 /* same option as mencoder */
3676 static void opt_pass(const char *pass_str)
3679 pass = atoi(pass_str);
3680 if (pass != 1 && pass != 2) {
3681 fprintf(stderr, "pass number can be only 1 or 2\n");
3687 static int64_t getutime(void)
3690 struct rusage rusage;
3692 getrusage(RUSAGE_SELF, &rusage);
3693 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3694 #elif HAVE_GETPROCESSTIMES
3696 FILETIME c, e, k, u;
3697 proc = GetCurrentProcess();
3698 GetProcessTimes(proc, &c, &e, &k, &u);
3699 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3701 return av_gettime();
3705 static int64_t getmaxrss(void)
3707 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3708 struct rusage rusage;
3709 getrusage(RUSAGE_SELF, &rusage);
3710 return (int64_t)rusage.ru_maxrss * 1024;
3711 #elif HAVE_GETPROCESSMEMORYINFO
3713 PROCESS_MEMORY_COUNTERS memcounters;
3714 proc = GetCurrentProcess();
3715 memcounters.cb = sizeof(memcounters);
3716 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3717 return memcounters.PeakPagefileUsage;
3723 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3726 const char *p = str;
3733 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3740 static void opt_inter_matrix(const char *arg)
3742 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3743 parse_matrix_coeffs(inter_matrix, arg);
3746 static void opt_intra_matrix(const char *arg)
3748 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3749 parse_matrix_coeffs(intra_matrix, arg);
3752 static void show_usage(void)
3754 printf("Hyper fast Audio and Video encoder\n");
3755 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3759 static void show_help(void)
3761 av_log_set_callback(log_callback_help);
3763 show_help_options(options, "Main options:\n",
3764 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3765 show_help_options(options, "\nAdvanced options:\n",
3766 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3768 show_help_options(options, "\nVideo options:\n",
3769 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3771 show_help_options(options, "\nAdvanced Video options:\n",
3772 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3773 OPT_VIDEO | OPT_EXPERT);
3774 show_help_options(options, "\nAudio options:\n",
3775 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3777 show_help_options(options, "\nAdvanced Audio options:\n",
3778 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3779 OPT_AUDIO | OPT_EXPERT);
3780 show_help_options(options, "\nSubtitle options:\n",
3781 OPT_SUBTITLE | OPT_GRAB,
3783 show_help_options(options, "\nAudio/Video grab options:\n",
3787 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3789 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3791 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3794 static void opt_target(const char *arg)
3796 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3797 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3799 if(!strncmp(arg, "pal-", 4)) {
3802 } else if(!strncmp(arg, "ntsc-", 5)) {
3805 } else if(!strncmp(arg, "film-", 5)) {
3810 /* Calculate FR via float to avoid int overflow */
3811 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3814 } else if((fr == 29970) || (fr == 23976)) {
3817 /* Try to determine PAL/NTSC by peeking in the input files */
3818 if(nb_input_files) {
3820 for(j = 0; j < nb_input_files; j++) {
3821 for(i = 0; i < input_files[j]->nb_streams; i++) {
3822 AVCodecContext *c = input_files[j]->streams[i]->codec;
3823 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3825 fr = c->time_base.den * 1000 / c->time_base.num;
3829 } else if((fr == 29970) || (fr == 23976)) {
3839 if(verbose && norm != UNKNOWN)
3840 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3843 if(norm == UNKNOWN) {
3844 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3845 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3846 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3850 if(!strcmp(arg, "vcd")) {
3852 opt_video_codec("mpeg1video");
3853 opt_audio_codec("mp2");
3856 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3857 opt_frame_rate(NULL, frame_rates[norm]);
3858 opt_default("g", norm == PAL ? "15" : "18");
3860 opt_default("b", "1150000");
3861 opt_default("maxrate", "1150000");
3862 opt_default("minrate", "1150000");
3863 opt_default("bufsize", "327680"); // 40*1024*8;
3865 opt_default("ab", "224000");
3866 audio_sample_rate = 44100;
3869 opt_default("packetsize", "2324");
3870 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3872 /* We have to offset the PTS, so that it is consistent with the SCR.
3873 SCR starts at 36000, but the first two packs contain only padding
3874 and the first pack from the other stream, respectively, may also have
3875 been written before.
3876 So the real data starts at SCR 36000+3*1200. */
3877 mux_preload= (36000+3*1200) / 90000.0; //0.44
3878 } else if(!strcmp(arg, "svcd")) {
3880 opt_video_codec("mpeg2video");
3881 opt_audio_codec("mp2");
3884 opt_frame_size(norm == PAL ? "480x576" : "480x480");
3885 opt_frame_rate(NULL, frame_rates[norm]);
3886 opt_default("g", norm == PAL ? "15" : "18");
3888 opt_default("b", "2040000");
3889 opt_default("maxrate", "2516000");
3890 opt_default("minrate", "0"); //1145000;
3891 opt_default("bufsize", "1835008"); //224*1024*8;
3892 opt_default("flags", "+scan_offset");
3895 opt_default("ab", "224000");
3896 audio_sample_rate = 44100;
3898 opt_default("packetsize", "2324");
3900 } else if(!strcmp(arg, "dvd")) {
3902 opt_video_codec("mpeg2video");
3903 opt_audio_codec("ac3");
3906 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3907 opt_frame_rate(NULL, frame_rates[norm]);
3908 opt_default("g", norm == PAL ? "15" : "18");
3910 opt_default("b", "6000000");
3911 opt_default("maxrate", "9000000");
3912 opt_default("minrate", "0"); //1500000;
3913 opt_default("bufsize", "1835008"); //224*1024*8;
3915 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3916 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3918 opt_default("ab", "448000");
3919 audio_sample_rate = 48000;
3921 } else if(!strncmp(arg, "dv", 2)) {
3925 opt_frame_size(norm == PAL ? "720x576" : "720x480");
3926 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
3927 (norm == PAL ? "yuv420p" : "yuv411p"));
3928 opt_frame_rate(NULL, frame_rates[norm]);
3930 audio_sample_rate = 48000;
3934 fprintf(stderr, "Unknown target: %s\n", arg);
3939 static void opt_vstats_file (const char *arg)
3941 av_free (vstats_filename);
3942 vstats_filename=av_strdup (arg);
3945 static void opt_vstats (void)
3948 time_t today2 = time(NULL);
3949 struct tm *today = localtime(&today2);
3951 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3953 opt_vstats_file(filename);
3956 static int opt_bsf(const char *opt, const char *arg)
3958 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3959 AVBitStreamFilterContext **bsfp;
3962 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
3966 bsfp= *opt == 'v' ? &video_bitstream_filters :
3967 *opt == 'a' ? &audio_bitstream_filters :
3968 &subtitle_bitstream_filters;
3970 bsfp= &(*bsfp)->next;
3977 static int opt_preset(const char *opt, const char *arg)
3980 char filename[1000], tmp[1000], tmp2[1000], line[1000];
3982 const char *base[3]= { getenv("FFMPEG_DATADIR"),
3988 for(i=0; i<3 && !f; i++){
3991 snprintf(filename, sizeof(filename), "%s%s/%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", arg);
3992 f= fopen(filename, "r");
3994 char *codec_name= *opt == 'v' ? video_codec_name :
3995 *opt == 'a' ? audio_codec_name :
3996 subtitle_codec_name;
3997 snprintf(filename, sizeof(filename), "%s%s/%s-%s.ffpreset", base[i], i != 1 ? "" : "/.ffmpeg", codec_name, arg);
3998 f= fopen(filename, "r");
4002 av_strlcpy(filename, arg, sizeof(filename));
4003 f= fopen(filename, "r");
4007 fprintf(stderr, "File for preset '%s' not found\n", arg);
4012 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4013 if(line[0] == '#' && !e)
4015 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4017 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4020 if(!strcmp(tmp, "acodec")){
4021 opt_audio_codec(tmp2);
4022 }else if(!strcmp(tmp, "vcodec")){
4023 opt_video_codec(tmp2);
4024 }else if(!strcmp(tmp, "scodec")){
4025 opt_subtitle_codec(tmp2);
4026 }else if(opt_default(tmp, tmp2) < 0){
4027 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4037 static const OptionDef options[] = {
4039 #include "cmdutils_common_opts.h"
4040 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4041 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4042 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4043 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4044 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "set meta data information of outfile from infile", "outfile:infile" },
4045 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4046 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4047 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4048 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4049 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4050 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4051 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4052 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4053 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4054 "add timings for benchmarking" },
4055 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4056 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4057 "dump each input packet" },
4058 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4059 "when dumping packets, also dump the payload" },
4060 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4061 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4062 { "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)", "" },
4063 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4064 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4065 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4066 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4067 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4068 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4069 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4070 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4071 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4072 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4073 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4074 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4075 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4078 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4079 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4080 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4081 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4082 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4083 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4084 { "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" },
4085 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4086 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4087 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4088 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4089 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4090 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4091 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4092 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4093 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4094 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4095 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4096 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4097 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4098 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4099 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4100 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4101 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4102 "use same video quality as source (implies VBR)" },
4103 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4104 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4105 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4106 "deinterlace pictures" },
4107 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4108 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4109 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4111 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4113 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4114 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4115 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4116 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4117 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4118 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4119 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4120 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4121 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4122 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4123 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4126 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4127 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4128 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4129 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4130 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4131 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4132 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4133 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4134 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4135 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4136 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4137 { "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" },
4139 /* subtitle options */
4140 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4141 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4142 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4143 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4144 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4147 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4148 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4149 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4152 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4153 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4155 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4156 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4157 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4159 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4160 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4161 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4162 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4164 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4168 int main(int argc, char **argv)
4172 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4174 avcodec_register_all();
4176 avdevice_register_all();
4179 avfilter_register_all();
4184 if(isatty(STDIN_FILENO))
4185 url_set_interrupt_cb(decode_interrupt_cb);
4193 parse_options(argc, argv, options, opt_output_file);
4195 if(nb_output_files <= 0 && nb_input_files == 0) {
4197 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4201 /* file converter / grab */
4202 if (nb_output_files <= 0) {
4203 fprintf(stderr, "At least one output file must be specified\n");
4207 if (nb_input_files == 0) {
4208 fprintf(stderr, "At least one input file must be specified\n");
4213 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4214 stream_maps, nb_stream_maps) < 0)
4216 ti = getutime() - ti;
4218 int maxrss = getmaxrss() / 1024;
4219 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4222 return ffmpeg_exit(0);