3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "FFmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #if !FF_API_MAX_STREAMS
115 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
118 static const char *last_asked_format = NULL;
119 static AVFormatContext *input_files[MAX_FILES];
120 static int64_t input_files_ts_offset[MAX_FILES];
121 static double *input_files_ts_scale[MAX_FILES] = {NULL};
122 static AVCodec **input_codecs = NULL;
123 static int nb_input_files = 0;
124 static int nb_input_codecs = 0;
125 static int nb_input_files_ts_scale[MAX_FILES] = {0};
127 static AVFormatContext *output_files[MAX_FILES];
128 static AVCodec **output_codecs = NULL;
129 static int nb_output_files = 0;
130 static int nb_output_codecs = 0;
132 static AVStreamMap *stream_maps = NULL;
133 static int nb_stream_maps;
135 /* first item specifies output metadata, second is input */
136 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
137 static int nb_meta_data_maps;
138 static int metadata_global_autocopy = 1;
139 static int metadata_streams_autocopy = 1;
140 static int metadata_chapters_autocopy = 1;
142 static AVChapterMap *chapter_maps = NULL;
143 static int nb_chapter_maps;
145 /* indexed by output file stream index */
146 static int *streamid_map = NULL;
147 static int nb_streamid_map = 0;
149 static int frame_width = 0;
150 static int frame_height = 0;
151 static float frame_aspect_ratio = 0;
152 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
153 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
154 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
155 static AVRational frame_rate;
156 static float video_qscale = 0;
157 static uint16_t *intra_matrix = NULL;
158 static uint16_t *inter_matrix = NULL;
159 static const char *video_rc_override_string=NULL;
160 static int video_disable = 0;
161 static int video_discard = 0;
162 static char *video_codec_name = NULL;
163 static unsigned int video_codec_tag = 0;
164 static char *video_language = NULL;
165 static int same_quality = 0;
166 static int do_deinterlace = 0;
167 static int top_field_first = -1;
168 static int me_threshold = 0;
169 static int intra_dc_precision = 8;
170 static int loop_input = 0;
171 static int loop_output = AVFMT_NOOUTPUTLOOP;
172 static int qp_hist = 0;
174 static char *vfilters = NULL;
177 static int intra_only = 0;
178 static int audio_sample_rate = 44100;
179 static int64_t channel_layout = 0;
180 #define QSCALE_NONE -99999
181 static float audio_qscale = QSCALE_NONE;
182 static int audio_disable = 0;
183 static int audio_channels = 1;
184 static char *audio_codec_name = NULL;
185 static unsigned int audio_codec_tag = 0;
186 static char *audio_language = NULL;
188 static int subtitle_disable = 0;
189 static char *subtitle_codec_name = NULL;
190 static char *subtitle_language = NULL;
191 static unsigned int subtitle_codec_tag = 0;
193 static float mux_preload= 0.5;
194 static float mux_max_delay= 0.7;
196 static int64_t recording_time = INT64_MAX;
197 static int64_t start_time = 0;
198 static int64_t recording_timestamp = 0;
199 static int64_t input_ts_offset = 0;
200 static int file_overwrite = 0;
201 static AVMetadata *metadata;
202 static int do_benchmark = 0;
203 static int do_hex_dump = 0;
204 static int do_pkt_dump = 0;
205 static int do_psnr = 0;
206 static int do_pass = 0;
207 static char *pass_logfilename_prefix = NULL;
208 static int audio_stream_copy = 0;
209 static int video_stream_copy = 0;
210 static int subtitle_stream_copy = 0;
211 static int video_sync_method= -1;
212 static int audio_sync_method= 0;
213 static float audio_drift_threshold= 0.1;
214 static int copy_ts= 0;
216 static int opt_shortest = 0;
217 static int video_global_header = 0;
218 static char *vstats_filename;
219 static FILE *vstats_file;
220 static int opt_programid = 0;
221 static int copy_initial_nonkeyframes = 0;
223 static int rate_emu = 0;
225 static int video_channel = 0;
226 static char *video_standard;
228 static int audio_volume = 256;
230 static int exit_on_error = 0;
231 static int using_stdin = 0;
232 static int verbose = 1;
233 static int thread_count= 1;
234 static int q_pressed = 0;
235 static int64_t video_size = 0;
236 static int64_t audio_size = 0;
237 static int64_t extra_size = 0;
238 static int nb_frames_dup = 0;
239 static int nb_frames_drop = 0;
240 static int input_sync;
241 static uint64_t limit_filesize = 0;
242 static int force_fps = 0;
243 static char *forced_key_frames = NULL;
245 static float dts_delta_threshold = 10;
247 static unsigned int sws_flags = SWS_BICUBIC;
249 static int64_t timer_start;
251 static uint8_t *audio_buf;
252 static uint8_t *audio_out;
253 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
255 static short *samples;
257 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
258 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
259 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
261 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
263 struct AVInputStream;
265 typedef struct AVOutputStream {
266 int file_index; /* file index */
267 int index; /* stream index in the output file */
268 int source_index; /* AVInputStream index */
269 AVStream *st; /* stream in the output file */
270 int encoding_needed; /* true if encoding needed for this stream */
272 /* input pts and corresponding output pts
274 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
275 struct AVInputStream *sync_ist; /* input stream to sync against */
276 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
277 AVBitStreamFilterContext *bitstream_filters;
280 AVFrame pict_tmp; /* temporary image for resampling */
281 struct SwsContext *img_resample_ctx; /* for image resampling */
284 int resample_pix_fmt;
286 /* full frame size of first frame */
290 /* forced key frames */
291 int64_t *forced_kf_pts;
297 ReSampleContext *resample; /* for audio resampling */
298 int resample_sample_fmt;
299 int resample_channels;
300 int resample_sample_rate;
302 AVAudioConvert *reformat_ctx;
303 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
307 AVFilterContext *output_video_filter;
308 AVFilterContext *input_video_filter;
309 AVFilterBufferRef *picref;
311 AVFilterGraph *graph;
315 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
316 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
318 typedef struct AVInputStream {
322 int discard; /* true if stream data should be discarded */
323 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
324 int64_t sample_index; /* current sample */
326 int64_t start; /* time when read started */
327 int64_t next_pts; /* synthetic pts for cases where pkt.pts
329 int64_t pts; /* current pts */
330 int is_start; /* is 1 at the start and after a discontinuity */
331 int showed_multi_packet_warning;
332 int is_past_recording_time;
334 AVFrame *filter_frame;
335 int has_filter_frame;
339 typedef struct AVInputFile {
340 int eof_reached; /* true if eof reached */
341 int ist_index; /* index of first stream in ist_table */
342 int buffer_size; /* current total buffer size */
343 int nb_streams; /* nb streams we are aware of */
348 /* init terminal so that we can grab keys */
349 static struct termios oldtty;
354 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
356 AVFilterContext *last_filter, *filter;
357 /** filter graph containing all filters including input & output */
358 AVCodecContext *codec = ost->st->codec;
359 AVCodecContext *icodec = ist->st->codec;
360 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
361 AVRational sample_aspect_ratio;
365 ost->graph = avfilter_graph_alloc();
367 if (ist->st->sample_aspect_ratio.num){
368 sample_aspect_ratio = ist->st->sample_aspect_ratio;
370 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
372 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
373 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
374 sample_aspect_ratio.num, sample_aspect_ratio.den);
376 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
377 "src", args, NULL, ost->graph);
380 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
381 "out", NULL, &ffsink_ctx, ost->graph);
384 last_filter = ost->input_video_filter;
386 if (codec->width != icodec->width || codec->height != icodec->height) {
387 snprintf(args, 255, "%d:%d:flags=0x%X",
390 (int)av_get_int(sws_opts, "sws_flags", NULL));
391 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
392 NULL, args, NULL, ost->graph)) < 0)
394 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
396 last_filter = filter;
399 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
400 ost->graph->scale_sws_opts = av_strdup(args);
403 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
404 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
406 outputs->name = av_strdup("in");
407 outputs->filter_ctx = last_filter;
408 outputs->pad_idx = 0;
409 outputs->next = NULL;
411 inputs->name = av_strdup("out");
412 inputs->filter_ctx = ost->output_video_filter;
416 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
418 av_freep(&ost->avfilter);
420 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
424 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
427 codec->width = ost->output_video_filter->inputs[0]->w;
428 codec->height = ost->output_video_filter->inputs[0]->h;
429 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
430 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
434 #endif /* CONFIG_AVFILTER */
436 static void term_exit(void)
438 av_log(NULL, AV_LOG_QUIET, "");
440 tcsetattr (0, TCSANOW, &oldtty);
444 static volatile int received_sigterm = 0;
447 sigterm_handler(int sig)
449 received_sigterm = sig;
453 static void term_init(void)
462 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
463 |INLCR|IGNCR|ICRNL|IXON);
464 tty.c_oflag |= OPOST;
465 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
466 tty.c_cflag &= ~(CSIZE|PARENB);
471 tcsetattr (0, TCSANOW, &tty);
472 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
475 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
476 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
478 signal(SIGXCPU, sigterm_handler);
482 /* read a key without blocking */
483 static int read_key(void)
495 n = select(1, &rfds, NULL, NULL, &tv);
510 static int decode_interrupt_cb(void)
512 return q_pressed || (q_pressed = read_key() == 'q');
515 static int ffmpeg_exit(int ret)
520 for(i=0;i<nb_output_files;i++) {
521 AVFormatContext *s = output_files[i];
523 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
525 avformat_free_context(s);
526 av_free(output_streams_for_file[i]);
528 for(i=0;i<nb_input_files;i++) {
529 av_close_input_file(input_files[i]);
530 av_free(input_files_ts_scale[i]);
533 av_free(intra_matrix);
534 av_free(inter_matrix);
538 av_free(vstats_filename);
540 av_free(streamid_map);
541 av_free(input_codecs);
542 av_free(output_codecs);
543 av_free(stream_maps);
544 av_free(meta_data_maps);
546 av_free(video_codec_name);
547 av_free(audio_codec_name);
548 av_free(subtitle_codec_name);
550 av_free(video_standard);
555 allocated_audio_buf_size= allocated_audio_out_size= 0;
562 if (received_sigterm) {
564 "Received signal %d: terminating.\n",
565 (int) received_sigterm);
569 exit(ret); /* not all OS-es handle main() return value */
573 /* similar to ff_dynarray_add() and av_fast_realloc() */
574 static void *grow_array(void *array, int elem_size, int *size, int new_size)
576 if (new_size >= INT_MAX / elem_size) {
577 fprintf(stderr, "Array too big.\n");
580 if (*size < new_size) {
581 uint8_t *tmp = av_realloc(array, new_size*elem_size);
583 fprintf(stderr, "Could not alloc buffer.\n");
586 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
593 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
595 if(codec && codec->sample_fmts){
596 const enum AVSampleFormat *p= codec->sample_fmts;
598 if(*p == st->codec->sample_fmt)
602 av_log(NULL, AV_LOG_WARNING,
603 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
604 av_get_sample_fmt_name(st->codec->sample_fmt),
606 av_get_sample_fmt_name(codec->sample_fmts[0]));
607 st->codec->sample_fmt = codec->sample_fmts[0];
612 static void choose_sample_rate(AVStream *st, AVCodec *codec)
614 if(codec && codec->supported_samplerates){
615 const int *p= codec->supported_samplerates;
617 int best_dist=INT_MAX;
619 int dist= abs(st->codec->sample_rate - *p);
620 if(dist < best_dist){
626 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
628 st->codec->sample_rate= best;
632 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
634 if(codec && codec->pix_fmts){
635 const enum PixelFormat *p= codec->pix_fmts;
636 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
637 if(st->codec->codec_id==CODEC_ID_MJPEG){
638 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
639 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
640 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
644 if(*p == st->codec->pix_fmt)
648 st->codec->pix_fmt = codec->pix_fmts[0];
652 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
654 int idx = oc->nb_streams - 1;
657 output_streams_for_file[file_idx] =
658 grow_array(output_streams_for_file[file_idx],
659 sizeof(*output_streams_for_file[file_idx]),
660 &nb_output_streams_for_file[file_idx],
662 ost = output_streams_for_file[file_idx][idx] =
663 av_mallocz(sizeof(AVOutputStream));
665 fprintf(stderr, "Could not alloc output stream\n");
668 ost->file_index = file_idx;
673 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
679 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
682 /* copy stream format */
684 for(i=0;i<ic->nb_streams;i++) {
690 // FIXME: a more elegant solution is needed
691 st = av_mallocz(sizeof(AVStream));
692 memcpy(st, ic->streams[i], sizeof(AVStream));
693 st->codec = avcodec_alloc_context();
695 print_error(filename, AVERROR(ENOMEM));
698 avcodec_copy_context(st->codec, ic->streams[i]->codec);
701 codec = avcodec_find_encoder(st->codec->codec_id);
702 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
703 if (audio_stream_copy) {
706 choose_sample_fmt(st, codec);
707 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
708 if (video_stream_copy) {
711 choose_pixel_fmt(st, codec);
714 if(st->codec->flags & CODEC_FLAG_BITEXACT)
717 new_output_stream(s, nb_output_files);
721 s->timestamp = av_gettime();
723 av_close_input_file(ic);
728 get_sync_ipts(const AVOutputStream *ost)
730 const AVInputStream *ist = ost->sync_ist;
731 return (double)(ist->pts - start_time)/AV_TIME_BASE;
734 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
738 AVPacket new_pkt= *pkt;
739 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
740 &new_pkt.data, &new_pkt.size,
741 pkt->data, pkt->size,
742 pkt->flags & AV_PKT_FLAG_KEY);
745 new_pkt.destruct= av_destruct_packet;
747 fprintf(stderr, "%s failed for stream %d, codec %s",
748 bsfc->filter->name, pkt->stream_index,
749 avctx->codec ? avctx->codec->name : "copy");
759 ret= av_interleaved_write_frame(s, pkt);
761 print_error("av_interleaved_write_frame()", ret);
766 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
768 static void do_audio_out(AVFormatContext *s,
771 unsigned char *buf, int size)
774 int64_t audio_out_size, audio_buf_size;
775 int64_t allocated_for_size= size;
777 int size_out, frame_bytes, ret, resample_changed;
778 AVCodecContext *enc= ost->st->codec;
779 AVCodecContext *dec= ist->st->codec;
780 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
781 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
782 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
785 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
786 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
787 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
788 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
789 audio_buf_size*= osize*enc->channels;
791 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
792 if(coded_bps > 8*osize)
793 audio_out_size= audio_out_size * coded_bps / (8*osize);
794 audio_out_size += FF_MIN_BUFFER_SIZE;
796 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
797 fprintf(stderr, "Buffer sizes too large\n");
801 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
802 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
803 if (!audio_buf || !audio_out){
804 fprintf(stderr, "Out of memory in do_audio_out\n");
808 if (enc->channels != dec->channels)
809 ost->audio_resample = 1;
811 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
812 ost->resample_channels != dec->channels ||
813 ost->resample_sample_rate != dec->sample_rate;
815 if ((ost->audio_resample && !ost->resample) || resample_changed) {
816 if (resample_changed) {
817 av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
818 ist->file_index, ist->index,
819 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
820 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
821 ost->resample_sample_fmt = dec->sample_fmt;
822 ost->resample_channels = dec->channels;
823 ost->resample_sample_rate = dec->sample_rate;
825 audio_resample_close(ost->resample);
827 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
828 if (audio_sync_method <= 1 &&
829 ost->resample_sample_fmt == enc->sample_fmt &&
830 ost->resample_channels == enc->channels &&
831 ost->resample_sample_rate == enc->sample_rate) {
832 ost->resample = NULL;
833 ost->audio_resample = 0;
835 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
836 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
837 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
838 enc->sample_rate, dec->sample_rate,
839 enc->sample_fmt, dec->sample_fmt,
841 if (!ost->resample) {
842 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
843 dec->channels, dec->sample_rate,
844 enc->channels, enc->sample_rate);
850 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
851 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
852 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
853 if (ost->reformat_ctx)
854 av_audio_convert_free(ost->reformat_ctx);
855 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
856 dec->sample_fmt, 1, NULL, 0);
857 if (!ost->reformat_ctx) {
858 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
859 av_get_sample_fmt_name(dec->sample_fmt),
860 av_get_sample_fmt_name(enc->sample_fmt));
863 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
866 if(audio_sync_method){
867 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
868 - av_fifo_size(ost->fifo)/(enc->channels * 2);
869 double idelta= delta*dec->sample_rate / enc->sample_rate;
870 int byte_delta= ((int)idelta)*2*dec->channels;
872 //FIXME resample delay
873 if(fabs(delta) > 50){
874 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
876 byte_delta= FFMAX(byte_delta, -size);
880 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
885 static uint8_t *input_tmp= NULL;
886 input_tmp= av_realloc(input_tmp, byte_delta + size);
888 if(byte_delta > allocated_for_size - size){
889 allocated_for_size= byte_delta + (int64_t)size;
894 memset(input_tmp, 0, byte_delta);
895 memcpy(input_tmp + byte_delta, buf, size);
899 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
901 }else if(audio_sync_method>1){
902 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
903 av_assert0(ost->audio_resample);
905 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
906 // 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));
907 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
911 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
912 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
914 if (ost->audio_resample) {
916 size_out = audio_resample(ost->resample,
917 (short *)buftmp, (short *)buf,
918 size / (dec->channels * isize));
919 size_out = size_out * enc->channels * osize;
925 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
926 const void *ibuf[6]= {buftmp};
927 void *obuf[6]= {audio_buf};
928 int istride[6]= {isize};
929 int ostride[6]= {osize};
930 int len= size_out/istride[0];
931 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
932 printf("av_audio_convert() failed\n");
938 size_out = len*osize;
941 /* now encode as many frames as possible */
942 if (enc->frame_size > 1) {
943 /* output resampled raw samples */
944 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
945 fprintf(stderr, "av_fifo_realloc2() failed\n");
948 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
950 frame_bytes = enc->frame_size * osize * enc->channels;
952 while (av_fifo_size(ost->fifo) >= frame_bytes) {
954 av_init_packet(&pkt);
956 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
958 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
960 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
963 fprintf(stderr, "Audio encoding failed\n");
967 pkt.stream_index= ost->index;
970 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
971 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
972 pkt.flags |= AV_PKT_FLAG_KEY;
973 write_frame(s, &pkt, enc, ost->bitstream_filters);
975 ost->sync_opts += enc->frame_size;
979 av_init_packet(&pkt);
981 ost->sync_opts += size_out / (osize * enc->channels);
983 /* output a pcm frame */
984 /* determine the size of the coded buffer */
987 size_out = size_out*coded_bps/8;
989 if(size_out > audio_out_size){
990 fprintf(stderr, "Internal error, buffer size too small\n");
994 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
995 ret = avcodec_encode_audio(enc, audio_out, size_out,
998 fprintf(stderr, "Audio encoding failed\n");
1002 pkt.stream_index= ost->index;
1003 pkt.data= audio_out;
1005 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1006 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1007 pkt.flags |= AV_PKT_FLAG_KEY;
1008 write_frame(s, &pkt, enc, ost->bitstream_filters);
1012 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1014 AVCodecContext *dec;
1015 AVPicture *picture2;
1016 AVPicture picture_tmp;
1019 dec = ist->st->codec;
1021 /* deinterlace : must be done before any resize */
1022 if (do_deinterlace) {
1025 /* create temporary picture */
1026 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1027 buf = av_malloc(size);
1031 picture2 = &picture_tmp;
1032 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1034 if(avpicture_deinterlace(picture2, picture,
1035 dec->pix_fmt, dec->width, dec->height) < 0) {
1036 /* if error, do not deinterlace */
1037 fprintf(stderr, "Deinterlacing failed\n");
1046 if (picture != picture2)
1047 *picture = *picture2;
1051 /* we begin to correct av delay at this threshold */
1052 #define AV_DELAY_MAX 0.100
1054 static void do_subtitle_out(AVFormatContext *s,
1055 AVOutputStream *ost,
1060 static uint8_t *subtitle_out = NULL;
1061 int subtitle_out_max_size = 1024 * 1024;
1062 int subtitle_out_size, nb, i;
1063 AVCodecContext *enc;
1066 if (pts == AV_NOPTS_VALUE) {
1067 fprintf(stderr, "Subtitle packets must have a pts\n");
1073 enc = ost->st->codec;
1075 if (!subtitle_out) {
1076 subtitle_out = av_malloc(subtitle_out_max_size);
1079 /* Note: DVB subtitle need one packet to draw them and one other
1080 packet to clear them */
1081 /* XXX: signal it in the codec context ? */
1082 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1087 for(i = 0; i < nb; i++) {
1088 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1089 // start_display_time is required to be 0
1090 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1091 sub->end_display_time -= sub->start_display_time;
1092 sub->start_display_time = 0;
1093 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1094 subtitle_out_max_size, sub);
1095 if (subtitle_out_size < 0) {
1096 fprintf(stderr, "Subtitle encoding failed\n");
1100 av_init_packet(&pkt);
1101 pkt.stream_index = ost->index;
1102 pkt.data = subtitle_out;
1103 pkt.size = subtitle_out_size;
1104 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1105 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1106 /* XXX: the pts correction is handled here. Maybe handling
1107 it in the codec would be better */
1109 pkt.pts += 90 * sub->start_display_time;
1111 pkt.pts += 90 * sub->end_display_time;
1113 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1117 static int bit_buffer_size= 1024*256;
1118 static uint8_t *bit_buffer= NULL;
1120 static void do_video_out(AVFormatContext *s,
1121 AVOutputStream *ost,
1123 AVFrame *in_picture,
1126 int nb_frames, i, ret;
1127 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1128 AVCodecContext *enc, *dec;
1131 enc = ost->st->codec;
1132 dec = ist->st->codec;
1134 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1136 /* by default, we output a single frame */
1141 if(video_sync_method){
1142 double vdelta = sync_ipts - ost->sync_opts;
1143 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1146 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1149 }else if(vdelta>0.6)
1150 ost->sync_opts= lrintf(sync_ipts);
1151 }else if (vdelta > 1.1)
1152 nb_frames = lrintf(vdelta);
1153 //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);
1154 if (nb_frames == 0){
1157 fprintf(stderr, "*** drop!\n");
1158 }else if (nb_frames > 1) {
1159 nb_frames_dup += nb_frames - 1;
1161 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1164 ost->sync_opts= lrintf(sync_ipts);
1166 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1170 formatted_picture = in_picture;
1171 final_picture = formatted_picture;
1172 padding_src = formatted_picture;
1173 resampling_dst = &ost->pict_tmp;
1175 if ( ost->resample_height != ist->st->codec->height
1176 || ost->resample_width != ist->st->codec->width
1177 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1179 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));
1180 if(!ost->video_resample)
1184 #if !CONFIG_AVFILTER
1185 if (ost->video_resample) {
1187 final_picture = &ost->pict_tmp;
1188 if( ost->resample_height != ist->st->codec->height
1189 || ost->resample_width != ist->st->codec->width
1190 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1192 /* initialize a new scaler context */
1193 sws_freeContext(ost->img_resample_ctx);
1194 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1195 ost->img_resample_ctx = sws_getContext(
1196 ist->st->codec->width,
1197 ist->st->codec->height,
1198 ist->st->codec->pix_fmt,
1199 ost->st->codec->width,
1200 ost->st->codec->height,
1201 ost->st->codec->pix_fmt,
1202 sws_flags, NULL, NULL, NULL);
1203 if (ost->img_resample_ctx == NULL) {
1204 fprintf(stderr, "Cannot get resampling context\n");
1208 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1209 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1213 /* duplicates frame if needed */
1214 for(i=0;i<nb_frames;i++) {
1216 av_init_packet(&pkt);
1217 pkt.stream_index= ost->index;
1219 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1220 /* raw pictures are written as AVPicture structure to
1221 avoid any copies. We support temorarily the older
1223 AVFrame* old_frame = enc->coded_frame;
1224 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1225 pkt.data= (uint8_t *)final_picture;
1226 pkt.size= sizeof(AVPicture);
1227 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1228 pkt.flags |= AV_PKT_FLAG_KEY;
1230 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1231 enc->coded_frame = old_frame;
1233 AVFrame big_picture;
1235 big_picture= *final_picture;
1236 /* better than nothing: use input picture interlaced
1238 big_picture.interlaced_frame = in_picture->interlaced_frame;
1239 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1240 if(top_field_first == -1)
1241 big_picture.top_field_first = in_picture->top_field_first;
1243 big_picture.top_field_first = top_field_first;
1246 /* handles sameq here. This is not correct because it may
1247 not be a global option */
1248 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1250 big_picture.pict_type = 0;
1251 // big_picture.pts = AV_NOPTS_VALUE;
1252 big_picture.pts= ost->sync_opts;
1253 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1254 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1255 if (ost->forced_kf_index < ost->forced_kf_count &&
1256 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1257 big_picture.pict_type = FF_I_TYPE;
1258 ost->forced_kf_index++;
1260 ret = avcodec_encode_video(enc,
1261 bit_buffer, bit_buffer_size,
1264 fprintf(stderr, "Video encoding failed\n");
1269 pkt.data= bit_buffer;
1271 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1272 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1273 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1274 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1275 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1277 if(enc->coded_frame->key_frame)
1278 pkt.flags |= AV_PKT_FLAG_KEY;
1279 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1282 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1283 // enc->frame_number-1, ret, enc->pict_type);
1284 /* if two pass, output log */
1285 if (ost->logfile && enc->stats_out) {
1286 fprintf(ost->logfile, "%s", enc->stats_out);
1291 ost->frame_number++;
1295 static double psnr(double d){
1296 return -10.0*log(d)/log(10.0);
1299 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1302 AVCodecContext *enc;
1304 double ti1, bitrate, avg_bitrate;
1306 /* this is executed just the first time do_video_stats is called */
1308 vstats_file = fopen(vstats_filename, "w");
1315 enc = ost->st->codec;
1316 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1317 frame_number = ost->frame_number;
1318 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1319 if (enc->flags&CODEC_FLAG_PSNR)
1320 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1322 fprintf(vstats_file,"f_size= %6d ", frame_size);
1323 /* compute pts value */
1324 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1328 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1329 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1330 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1331 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1332 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1336 static void print_report(AVFormatContext **output_files,
1337 AVOutputStream **ost_table, int nb_ostreams,
1341 AVOutputStream *ost;
1342 AVFormatContext *oc;
1344 AVCodecContext *enc;
1345 int frame_number, vid, i;
1346 double bitrate, ti1, pts;
1347 static int64_t last_time = -1;
1348 static int qp_histogram[52];
1350 if (!is_last_report) {
1352 /* display the report every 0.5 seconds */
1353 cur_time = av_gettime();
1354 if (last_time == -1) {
1355 last_time = cur_time;
1358 if ((cur_time - last_time) < 500000)
1360 last_time = cur_time;
1364 oc = output_files[0];
1366 total_size = url_fsize(oc->pb);
1367 if(total_size<0) // FIXME improve url_fsize() so it works with non seekable output too
1368 total_size= url_ftell(oc->pb);
1373 for(i=0;i<nb_ostreams;i++) {
1375 enc = ost->st->codec;
1376 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1377 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1378 !ost->st->stream_copy ?
1379 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1381 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1382 float t = (av_gettime()-timer_start) / 1000000.0;
1384 frame_number = ost->frame_number;
1385 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1386 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1387 !ost->st->stream_copy ?
1388 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1393 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1394 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1399 if (enc->flags&CODEC_FLAG_PSNR){
1401 double error, error_sum=0;
1402 double scale, scale_sum=0;
1403 char type[3]= {'Y','U','V'};
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1407 error= enc->error[j];
1408 scale= enc->width*enc->height*255.0*255.0*frame_number;
1410 error= enc->coded_frame->error[j];
1411 scale= enc->width*enc->height*255.0*255.0;
1416 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1418 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1422 /* compute min output value */
1423 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1424 if ((pts < ti1) && (pts > 0))
1430 if (verbose || is_last_report) {
1431 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1433 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1434 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1435 (double)total_size / 1024, ti1, bitrate);
1437 if (nb_frames_dup || nb_frames_drop)
1438 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1439 nb_frames_dup, nb_frames_drop);
1442 fprintf(stderr, "%s \r", buf);
1447 if (is_last_report && verbose >= 0){
1448 int64_t raw= audio_size + video_size + extra_size;
1449 fprintf(stderr, "\n");
1450 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1454 100.0*(total_size - raw)/raw
1459 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1460 static int output_packet(AVInputStream *ist, int ist_index,
1461 AVOutputStream **ost_table, int nb_ostreams,
1462 const AVPacket *pkt)
1464 AVFormatContext *os;
1465 AVOutputStream *ost;
1469 void *buffer_to_free;
1470 static unsigned int samples_size= 0;
1471 AVSubtitle subtitle, *subtitle_to_free;
1472 int64_t pkt_pts = AV_NOPTS_VALUE;
1474 int frame_available;
1478 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1480 if(ist->next_pts == AV_NOPTS_VALUE)
1481 ist->next_pts= ist->pts;
1485 av_init_packet(&avpkt);
1493 if(pkt->dts != AV_NOPTS_VALUE)
1494 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1495 if(pkt->pts != AV_NOPTS_VALUE)
1496 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1498 //while we have more to decode or while the decoder did output something on EOF
1499 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1500 uint8_t *data_buf, *decoded_data_buf;
1501 int data_size, decoded_data_size;
1503 ist->pts= ist->next_pts;
1505 if(avpkt.size && avpkt.size != pkt->size &&
1506 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1507 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1508 ist->showed_multi_packet_warning=1;
1511 /* decode the packet if needed */
1512 decoded_data_buf = NULL; /* fail safe */
1513 decoded_data_size= 0;
1514 data_buf = avpkt.data;
1515 data_size = avpkt.size;
1516 subtitle_to_free = NULL;
1517 if (ist->decoding_needed) {
1518 switch(ist->st->codec->codec_type) {
1519 case AVMEDIA_TYPE_AUDIO:{
1520 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1521 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1523 samples= av_malloc(samples_size);
1525 decoded_data_size= samples_size;
1526 /* XXX: could avoid copy if PCM 16 bits with same
1527 endianness as CPU */
1528 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1535 /* Some bug in mpeg audio decoder gives */
1536 /* decoded_data_size < 0, it seems they are overflows */
1537 if (decoded_data_size <= 0) {
1538 /* no audio frame */
1541 decoded_data_buf = (uint8_t *)samples;
1542 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1543 (ist->st->codec->sample_rate * ist->st->codec->channels);
1545 case AVMEDIA_TYPE_VIDEO:
1546 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1547 /* XXX: allocate picture correctly */
1548 avcodec_get_frame_defaults(&picture);
1549 avpkt.pts = pkt_pts;
1550 avpkt.dts = ist->pts;
1551 pkt_pts = AV_NOPTS_VALUE;
1553 ret = avcodec_decode_video2(ist->st->codec,
1554 &picture, &got_picture, &avpkt);
1555 ist->st->quality= picture.quality;
1559 /* no picture yet */
1560 goto discard_packet;
1562 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1563 if (ist->st->codec->time_base.num != 0) {
1564 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1565 ist->next_pts += ((int64_t)AV_TIME_BASE *
1566 ist->st->codec->time_base.num * ticks) /
1567 ist->st->codec->time_base.den;
1571 case AVMEDIA_TYPE_SUBTITLE:
1572 ret = avcodec_decode_subtitle2(ist->st->codec,
1573 &subtitle, &got_picture, &avpkt);
1577 goto discard_packet;
1579 subtitle_to_free = &subtitle;
1586 switch(ist->st->codec->codec_type) {
1587 case AVMEDIA_TYPE_AUDIO:
1588 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1589 ist->st->codec->sample_rate;
1591 case AVMEDIA_TYPE_VIDEO:
1592 if (ist->st->codec->time_base.num != 0) {
1593 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1594 ist->next_pts += ((int64_t)AV_TIME_BASE *
1595 ist->st->codec->time_base.num * ticks) /
1596 ist->st->codec->time_base.den;
1604 buffer_to_free = NULL;
1605 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1606 pre_process_video_frame(ist, (AVPicture *)&picture,
1611 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
1612 for(i=0;i<nb_ostreams;i++) {
1614 if (ost->input_video_filter && ost->source_index == ist_index) {
1616 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1617 else sar = ist->st->codec->sample_aspect_ratio;
1618 // add it to be filtered
1619 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1627 // preprocess audio (volume)
1628 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1629 if (audio_volume != 256) {
1632 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1633 int v = ((*volp) * audio_volume + 128) >> 8;
1634 if (v < -32768) v = -32768;
1635 if (v > 32767) v = 32767;
1641 /* frame rate emulation */
1643 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1644 int64_t now = av_gettime() - ist->start;
1648 /* if output time reached then transcode raw format,
1649 encode packets and output them */
1650 if (start_time == 0 || ist->pts >= start_time)
1651 for(i=0;i<nb_ostreams;i++) {
1655 if (ost->source_index == ist_index) {
1657 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1658 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1659 while (frame_available) {
1660 AVRational ist_pts_tb;
1661 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1662 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1664 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1666 os = output_files[ost->file_index];
1668 /* set the input output pts pairs */
1669 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1671 if (ost->encoding_needed) {
1672 av_assert0(ist->decoding_needed);
1673 switch(ost->st->codec->codec_type) {
1674 case AVMEDIA_TYPE_AUDIO:
1675 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1677 case AVMEDIA_TYPE_VIDEO:
1679 if (ost->picref->video)
1680 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1682 do_video_out(os, ost, ist, &picture, &frame_size);
1683 if (vstats_filename && frame_size)
1684 do_video_stats(os, ost, frame_size);
1686 case AVMEDIA_TYPE_SUBTITLE:
1687 do_subtitle_out(os, ost, ist, &subtitle,
1694 AVFrame avframe; //FIXME/XXX remove this
1696 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1698 av_init_packet(&opkt);
1700 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1703 /* no reencoding needed : output the packet directly */
1704 /* force the input stream PTS */
1706 avcodec_get_frame_defaults(&avframe);
1707 ost->st->codec->coded_frame= &avframe;
1708 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1710 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1711 audio_size += data_size;
1712 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1713 video_size += data_size;
1717 opkt.stream_index= ost->index;
1718 if(pkt->pts != AV_NOPTS_VALUE)
1719 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1721 opkt.pts= AV_NOPTS_VALUE;
1723 if (pkt->dts == AV_NOPTS_VALUE)
1724 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1726 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1727 opkt.dts -= ost_tb_start_time;
1729 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1730 opkt.flags= pkt->flags;
1732 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1733 if( ost->st->codec->codec_id != CODEC_ID_H264
1734 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1735 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1737 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1738 opkt.destruct= av_destruct_packet;
1740 opkt.data = data_buf;
1741 opkt.size = data_size;
1744 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1745 ost->st->codec->frame_number++;
1746 ost->frame_number++;
1747 av_free_packet(&opkt);
1751 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1752 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1754 avfilter_unref_buffer(ost->picref);
1760 av_free(buffer_to_free);
1761 /* XXX: allocate the subtitles in the codec ? */
1762 if (subtitle_to_free) {
1763 avsubtitle_free(subtitle_to_free);
1764 subtitle_to_free = NULL;
1771 for(i=0;i<nb_ostreams;i++) {
1773 if (ost->source_index == ist_index) {
1774 AVCodecContext *enc= ost->st->codec;
1775 os = output_files[ost->file_index];
1777 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1779 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1782 if (ost->encoding_needed) {
1786 av_init_packet(&pkt);
1787 pkt.stream_index= ost->index;
1789 switch(ost->st->codec->codec_type) {
1790 case AVMEDIA_TYPE_AUDIO:
1791 fifo_bytes = av_fifo_size(ost->fifo);
1793 /* encode any samples remaining in fifo */
1794 if (fifo_bytes > 0) {
1795 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1796 int fs_tmp = enc->frame_size;
1798 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1799 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1800 enc->frame_size = fifo_bytes / (osize * enc->channels);
1802 int frame_bytes = enc->frame_size*osize*enc->channels;
1803 if (allocated_audio_buf_size < frame_bytes)
1805 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1808 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1809 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1810 ost->st->time_base.num, enc->sample_rate);
1811 enc->frame_size = fs_tmp;
1814 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1817 fprintf(stderr, "Audio encoding failed\n");
1821 pkt.flags |= AV_PKT_FLAG_KEY;
1823 case AVMEDIA_TYPE_VIDEO:
1824 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1826 fprintf(stderr, "Video encoding failed\n");
1830 if(enc->coded_frame && enc->coded_frame->key_frame)
1831 pkt.flags |= AV_PKT_FLAG_KEY;
1832 if (ost->logfile && enc->stats_out) {
1833 fprintf(ost->logfile, "%s", enc->stats_out);
1842 pkt.data= bit_buffer;
1844 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1845 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1846 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1858 static void print_sdp(AVFormatContext **avc, int n)
1862 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1863 printf("SDP:\n%s\n", sdp);
1867 static int copy_chapters(int infile, int outfile)
1869 AVFormatContext *is = input_files[infile];
1870 AVFormatContext *os = output_files[outfile];
1873 for (i = 0; i < is->nb_chapters; i++) {
1874 AVChapter *in_ch = is->chapters[i], *out_ch;
1875 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1876 AV_TIME_BASE_Q, in_ch->time_base);
1877 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1878 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1881 if (in_ch->end < ts_off)
1883 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1886 out_ch = av_mallocz(sizeof(AVChapter));
1888 return AVERROR(ENOMEM);
1890 out_ch->id = in_ch->id;
1891 out_ch->time_base = in_ch->time_base;
1892 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1893 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1895 if (metadata_chapters_autocopy)
1896 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1899 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1901 return AVERROR(ENOMEM);
1902 os->chapters[os->nb_chapters - 1] = out_ch;
1907 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1908 AVCodecContext *avctx)
1914 for (p = kf; *p; p++)
1917 ost->forced_kf_count = n;
1918 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1919 if (!ost->forced_kf_pts) {
1920 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1923 for (i = 0; i < n; i++) {
1924 p = i ? strchr(p, ',') + 1 : kf;
1925 t = parse_time_or_die("force_key_frames", p, 1);
1926 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1931 * The following code is the main loop of the file converter
1933 static int transcode(AVFormatContext **output_files,
1934 int nb_output_files,
1935 AVFormatContext **input_files,
1937 AVStreamMap *stream_maps, int nb_stream_maps)
1939 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1940 AVFormatContext *is, *os;
1941 AVCodecContext *codec, *icodec;
1942 AVOutputStream *ost, **ost_table = NULL;
1943 AVInputStream *ist, **ist_table = NULL;
1944 AVInputFile *file_table;
1948 uint8_t no_packet[MAX_FILES]={0};
1949 int no_packet_count=0;
1951 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1955 /* input stream init */
1957 for(i=0;i<nb_input_files;i++) {
1958 is = input_files[i];
1959 file_table[i].ist_index = j;
1960 file_table[i].nb_streams = is->nb_streams;
1961 j += is->nb_streams;
1965 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1969 for(i=0;i<nb_istreams;i++) {
1970 ist = av_mallocz(sizeof(AVInputStream));
1976 for(i=0;i<nb_input_files;i++) {
1977 is = input_files[i];
1978 for(k=0;k<is->nb_streams;k++) {
1979 ist = ist_table[j++];
1980 ist->st = is->streams[k];
1981 ist->file_index = i;
1983 ist->discard = 1; /* the stream is discarded by default
1987 ist->start = av_gettime();
1992 /* output stream init */
1994 for(i=0;i<nb_output_files;i++) {
1995 os = output_files[i];
1996 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1997 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1998 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1999 ret = AVERROR(EINVAL);
2002 nb_ostreams += os->nb_streams;
2004 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2005 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2006 ret = AVERROR(EINVAL);
2010 /* Sanity check the mapping args -- do the input files & streams exist? */
2011 for(i=0;i<nb_stream_maps;i++) {
2012 int fi = stream_maps[i].file_index;
2013 int si = stream_maps[i].stream_index;
2015 if (fi < 0 || fi > nb_input_files - 1 ||
2016 si < 0 || si > file_table[fi].nb_streams - 1) {
2017 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2018 ret = AVERROR(EINVAL);
2021 fi = stream_maps[i].sync_file_index;
2022 si = stream_maps[i].sync_stream_index;
2023 if (fi < 0 || fi > nb_input_files - 1 ||
2024 si < 0 || si > file_table[fi].nb_streams - 1) {
2025 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2026 ret = AVERROR(EINVAL);
2031 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2035 for(k=0;k<nb_output_files;k++) {
2036 os = output_files[k];
2037 for(i=0;i<os->nb_streams;i++,n++) {
2039 ost = ost_table[n] = output_streams_for_file[k][i];
2040 ost->st = os->streams[i];
2041 if (nb_stream_maps > 0) {
2042 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2043 stream_maps[n].stream_index;
2045 /* Sanity check that the stream types match */
2046 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2047 int i= ost->file_index;
2048 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2049 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2050 stream_maps[n].file_index, stream_maps[n].stream_index,
2051 ost->file_index, ost->index);
2056 int best_nb_frames=-1;
2057 /* get corresponding input stream index : we select the first one with the right type */
2059 for(j=0;j<nb_istreams;j++) {
2064 AVFormatContext *f= input_files[ ist->file_index ];
2066 for(pi=0; pi<f->nb_programs; pi++){
2067 AVProgram *p= f->programs[pi];
2068 if(p->id == opt_programid)
2069 for(si=0; si<p->nb_stream_indexes; si++){
2070 if(f->streams[ p->stream_index[si] ] == ist->st)
2075 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2076 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2077 if(best_nb_frames < ist->st->codec_info_nb_frames){
2078 best_nb_frames= ist->st->codec_info_nb_frames;
2079 ost->source_index = j;
2086 if(! opt_programid) {
2087 /* try again and reuse existing stream */
2088 for(j=0;j<nb_istreams;j++) {
2090 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2091 && ist->st->discard != AVDISCARD_ALL) {
2092 ost->source_index = j;
2098 int i= ost->file_index;
2099 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2100 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2101 ost->file_index, ost->index);
2106 ist = ist_table[ost->source_index];
2108 ost->sync_ist = (nb_stream_maps > 0) ?
2109 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2110 stream_maps[n].sync_stream_index] : ist;
2114 /* for each output stream, we compute the right encoding parameters */
2115 for(i=0;i<nb_ostreams;i++) {
2117 os = output_files[ost->file_index];
2118 ist = ist_table[ost->source_index];
2120 codec = ost->st->codec;
2121 icodec = ist->st->codec;
2123 if (metadata_streams_autocopy)
2124 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2125 AV_METADATA_DONT_OVERWRITE);
2127 ost->st->disposition = ist->st->disposition;
2128 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2129 codec->chroma_sample_location = icodec->chroma_sample_location;
2131 if (ost->st->stream_copy) {
2132 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2134 if (extra_size > INT_MAX)
2137 /* if stream_copy is selected, no need to decode or encode */
2138 codec->codec_id = icodec->codec_id;
2139 codec->codec_type = icodec->codec_type;
2141 if(!codec->codec_tag){
2142 if( !os->oformat->codec_tag
2143 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2144 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2145 codec->codec_tag = icodec->codec_tag;
2148 codec->bit_rate = icodec->bit_rate;
2149 codec->rc_max_rate = icodec->rc_max_rate;
2150 codec->rc_buffer_size = icodec->rc_buffer_size;
2151 codec->extradata= av_mallocz(extra_size);
2152 if (!codec->extradata)
2154 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2155 codec->extradata_size= icodec->extradata_size;
2156 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2157 codec->time_base = icodec->time_base;
2158 codec->time_base.num *= icodec->ticks_per_frame;
2159 av_reduce(&codec->time_base.num, &codec->time_base.den,
2160 codec->time_base.num, codec->time_base.den, INT_MAX);
2162 codec->time_base = ist->st->time_base;
2163 switch(codec->codec_type) {
2164 case AVMEDIA_TYPE_AUDIO:
2165 if(audio_volume != 256) {
2166 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2169 codec->channel_layout = icodec->channel_layout;
2170 codec->sample_rate = icodec->sample_rate;
2171 codec->channels = icodec->channels;
2172 codec->frame_size = icodec->frame_size;
2173 codec->block_align= icodec->block_align;
2174 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2175 codec->block_align= 0;
2176 if(codec->codec_id == CODEC_ID_AC3)
2177 codec->block_align= 0;
2179 case AVMEDIA_TYPE_VIDEO:
2180 codec->pix_fmt = icodec->pix_fmt;
2181 codec->width = icodec->width;
2182 codec->height = icodec->height;
2183 codec->has_b_frames = icodec->has_b_frames;
2185 case AVMEDIA_TYPE_SUBTITLE:
2186 codec->width = icodec->width;
2187 codec->height = icodec->height;
2193 switch(codec->codec_type) {
2194 case AVMEDIA_TYPE_AUDIO:
2195 ost->fifo= av_fifo_alloc(1024);
2198 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2199 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2200 icodec->request_channels = codec->channels;
2201 ist->decoding_needed = 1;
2202 ost->encoding_needed = 1;
2203 ost->resample_sample_fmt = icodec->sample_fmt;
2204 ost->resample_sample_rate = icodec->sample_rate;
2205 ost->resample_channels = icodec->channels;
2207 case AVMEDIA_TYPE_VIDEO:
2208 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2209 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2212 ost->video_resample = (codec->width != icodec->width ||
2213 codec->height != icodec->height ||
2214 (codec->pix_fmt != icodec->pix_fmt));
2215 if (ost->video_resample) {
2216 #if !CONFIG_AVFILTER
2217 avcodec_get_frame_defaults(&ost->pict_tmp);
2218 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2219 codec->width, codec->height)) {
2220 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2223 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2224 ost->img_resample_ctx = sws_getContext(
2231 sws_flags, NULL, NULL, NULL);
2232 if (ost->img_resample_ctx == NULL) {
2233 fprintf(stderr, "Cannot get resampling context\n");
2237 ost->original_height = icodec->height;
2238 ost->original_width = icodec->width;
2240 codec->bits_per_raw_sample= 0;
2242 ost->resample_height = icodec->height;
2243 ost->resample_width = icodec->width;
2244 ost->resample_pix_fmt= icodec->pix_fmt;
2245 ost->encoding_needed = 1;
2246 ist->decoding_needed = 1;
2249 if (configure_filters(ist, ost)) {
2250 fprintf(stderr, "Error opening filters!\n");
2255 case AVMEDIA_TYPE_SUBTITLE:
2256 ost->encoding_needed = 1;
2257 ist->decoding_needed = 1;
2264 if (ost->encoding_needed &&
2265 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2266 char logfilename[1024];
2269 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2270 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2272 if (codec->flags & CODEC_FLAG_PASS1) {
2273 f = fopen(logfilename, "wb");
2275 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2281 size_t logbuffer_size;
2282 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2283 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2286 codec->stats_in = logbuffer;
2290 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2291 int size= codec->width * codec->height;
2292 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2297 bit_buffer = av_malloc(bit_buffer_size);
2299 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2301 ret = AVERROR(ENOMEM);
2305 /* open each encoder */
2306 for(i=0;i<nb_ostreams;i++) {
2308 if (ost->encoding_needed) {
2309 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2310 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2312 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2314 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2315 ost->st->codec->codec_id, ost->file_index, ost->index);
2316 ret = AVERROR(EINVAL);
2319 if (dec->subtitle_header) {
2320 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2321 if (!ost->st->codec->subtitle_header) {
2322 ret = AVERROR(ENOMEM);
2325 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2326 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2328 if (avcodec_open(ost->st->codec, codec) < 0) {
2329 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2330 ost->file_index, ost->index);
2331 ret = AVERROR(EINVAL);
2334 extra_size += ost->st->codec->extradata_size;
2338 /* open each decoder */
2339 for(i=0;i<nb_istreams;i++) {
2341 if (ist->decoding_needed) {
2342 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2344 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2346 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2347 ist->st->codec->codec_id, ist->file_index, ist->index);
2348 ret = AVERROR(EINVAL);
2351 if (avcodec_open(ist->st->codec, codec) < 0) {
2352 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2353 ist->file_index, ist->index);
2354 ret = AVERROR(EINVAL);
2357 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2358 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2363 for(i=0;i<nb_istreams;i++) {
2367 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2368 ist->next_pts = AV_NOPTS_VALUE;
2372 /* set meta data information from input file if required */
2373 for (i=0;i<nb_meta_data_maps;i++) {
2374 AVFormatContext *files[2];
2375 AVMetadata **meta[2];
2378 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2379 if ((index) < 0 || (index) >= (nb_elems)) {\
2380 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2382 ret = AVERROR(EINVAL);\
2386 int out_file_index = meta_data_maps[i][0].file;
2387 int in_file_index = meta_data_maps[i][1].file;
2388 if (in_file_index < 0 || out_file_index < 0)
2390 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2391 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2393 files[0] = output_files[out_file_index];
2394 files[1] = input_files[in_file_index];
2396 for (j = 0; j < 2; j++) {
2397 AVMetaDataMap *map = &meta_data_maps[i][j];
2399 switch (map->type) {
2401 meta[j] = &files[j]->metadata;
2404 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2405 meta[j] = &files[j]->streams[map->index]->metadata;
2408 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2409 meta[j] = &files[j]->chapters[map->index]->metadata;
2412 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2413 meta[j] = &files[j]->programs[map->index]->metadata;
2418 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2421 /* copy global metadata by default */
2422 if (metadata_global_autocopy) {
2424 for (i = 0; i < nb_output_files; i++)
2425 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2426 AV_METADATA_DONT_OVERWRITE);
2429 /* copy chapters according to chapter maps */
2430 for (i = 0; i < nb_chapter_maps; i++) {
2431 int infile = chapter_maps[i].in_file;
2432 int outfile = chapter_maps[i].out_file;
2434 if (infile < 0 || outfile < 0)
2436 if (infile >= nb_input_files) {
2437 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2438 ret = AVERROR(EINVAL);
2441 if (outfile >= nb_output_files) {
2442 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2443 ret = AVERROR(EINVAL);
2446 copy_chapters(infile, outfile);
2449 /* copy chapters from the first input file that has them*/
2450 if (!nb_chapter_maps)
2451 for (i = 0; i < nb_input_files; i++) {
2452 if (!input_files[i]->nb_chapters)
2455 for (j = 0; j < nb_output_files; j++)
2456 if ((ret = copy_chapters(i, j)) < 0)
2461 /* open files and write file headers */
2462 for(i=0;i<nb_output_files;i++) {
2463 os = output_files[i];
2464 if (av_write_header(os) < 0) {
2465 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2466 ret = AVERROR(EINVAL);
2469 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2475 /* dump the file output parameters - cannot be done before in case
2477 for(i=0;i<nb_output_files;i++) {
2478 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2481 /* dump the stream mapping */
2483 fprintf(stderr, "Stream mapping:\n");
2484 for(i=0;i<nb_ostreams;i++) {
2486 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2487 ist_table[ost->source_index]->file_index,
2488 ist_table[ost->source_index]->index,
2491 if (ost->sync_ist != ist_table[ost->source_index])
2492 fprintf(stderr, " [sync #%d.%d]",
2493 ost->sync_ist->file_index,
2494 ost->sync_ist->index);
2495 fprintf(stderr, "\n");
2500 fprintf(stderr, "%s\n", error);
2505 print_sdp(output_files, nb_output_files);
2508 if (!using_stdin && verbose >= 0) {
2509 fprintf(stderr, "Press [q] to stop encoding\n");
2510 url_set_interrupt_cb(decode_interrupt_cb);
2514 timer_start = av_gettime();
2516 for(; received_sigterm == 0;) {
2517 int file_index, ist_index;
2525 /* if 'q' pressed, exits */
2529 /* read_key() returns 0 on EOF */
2535 /* select the stream that we must read now by looking at the
2536 smallest output pts */
2538 for(i=0;i<nb_ostreams;i++) {
2541 os = output_files[ost->file_index];
2542 ist = ist_table[ost->source_index];
2543 if(ist->is_past_recording_time || no_packet[ist->file_index])
2545 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2546 ipts = (double)ist->pts;
2547 if (!file_table[ist->file_index].eof_reached){
2548 if(ipts < ipts_min) {
2550 if(input_sync ) file_index = ist->file_index;
2552 if(opts < opts_min) {
2554 if(!input_sync) file_index = ist->file_index;
2557 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2562 /* if none, if is finished */
2563 if (file_index < 0) {
2564 if(no_packet_count){
2566 memset(no_packet, 0, sizeof(no_packet));
2573 /* finish if limit size exhausted */
2574 if (limit_filesize != 0 && limit_filesize <= url_ftell(output_files[0]->pb))
2577 /* read a frame from it and output it in the fifo */
2578 is = input_files[file_index];
2579 ret= av_read_frame(is, &pkt);
2580 if(ret == AVERROR(EAGAIN)){
2581 no_packet[file_index]=1;
2586 file_table[file_index].eof_reached = 1;
2594 memset(no_packet, 0, sizeof(no_packet));
2597 av_pkt_dump_log(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump);
2599 /* the following test is needed in case new streams appear
2600 dynamically in stream : we ignore them */
2601 if (pkt.stream_index >= file_table[file_index].nb_streams)
2602 goto discard_packet;
2603 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2604 ist = ist_table[ist_index];
2606 goto discard_packet;
2608 if (pkt.dts != AV_NOPTS_VALUE)
2609 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2610 if (pkt.pts != AV_NOPTS_VALUE)
2611 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2613 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2614 && input_files_ts_scale[file_index][pkt.stream_index]){
2615 if(pkt.pts != AV_NOPTS_VALUE)
2616 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2617 if(pkt.dts != AV_NOPTS_VALUE)
2618 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2621 // 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);
2622 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2623 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2624 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2625 int64_t delta= pkt_dts - ist->next_pts;
2626 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2627 input_files_ts_offset[ist->file_index]-= delta;
2629 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2630 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2631 if(pkt.pts != AV_NOPTS_VALUE)
2632 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2636 /* finish if recording time exhausted */
2637 if (recording_time != INT64_MAX &&
2638 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2639 ist->is_past_recording_time = 1;
2640 goto discard_packet;
2643 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2644 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2647 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2648 ist->file_index, ist->index);
2651 av_free_packet(&pkt);
2656 av_free_packet(&pkt);
2658 /* dump report by using the output first video and audio streams */
2659 print_report(output_files, ost_table, nb_ostreams, 0);
2662 /* at the end of stream, we must flush the decoder buffers */
2663 for(i=0;i<nb_istreams;i++) {
2665 if (ist->decoding_needed) {
2666 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2672 /* write the trailer if needed and close file */
2673 for(i=0;i<nb_output_files;i++) {
2674 os = output_files[i];
2675 av_write_trailer(os);
2678 /* dump report by using the first video and audio streams */
2679 print_report(output_files, ost_table, nb_ostreams, 1);
2681 /* close each encoder */
2682 for(i=0;i<nb_ostreams;i++) {
2684 if (ost->encoding_needed) {
2685 av_freep(&ost->st->codec->stats_in);
2686 avcodec_close(ost->st->codec);
2689 avfilter_graph_free(&ost->graph);
2693 /* close each decoder */
2694 for(i=0;i<nb_istreams;i++) {
2696 if (ist->decoding_needed) {
2697 avcodec_close(ist->st->codec);
2705 av_freep(&bit_buffer);
2706 av_free(file_table);
2709 for(i=0;i<nb_istreams;i++) {
2716 for(i=0;i<nb_ostreams;i++) {
2719 if (ost->st->stream_copy)
2720 av_freep(&ost->st->codec->extradata);
2722 fclose(ost->logfile);
2723 ost->logfile = NULL;
2725 av_fifo_free(ost->fifo); /* works even if fifo is not
2726 initialized but set to zero */
2727 av_freep(&ost->st->codec->subtitle_header);
2728 av_free(ost->pict_tmp.data[0]);
2729 av_free(ost->forced_kf_pts);
2730 if (ost->video_resample)
2731 sws_freeContext(ost->img_resample_ctx);
2733 audio_resample_close(ost->resample);
2734 if (ost->reformat_ctx)
2735 av_audio_convert_free(ost->reformat_ctx);
2744 static void opt_format(const char *arg)
2746 last_asked_format = arg;
2749 static void opt_video_rc_override_string(const char *arg)
2751 video_rc_override_string = arg;
2754 static int opt_me_threshold(const char *opt, const char *arg)
2756 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2760 static int opt_verbose(const char *opt, const char *arg)
2762 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2766 static int opt_frame_rate(const char *opt, const char *arg)
2768 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2769 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2775 static int opt_bitrate(const char *opt, const char *arg)
2777 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2779 opt_default(opt, arg);
2781 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2782 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2787 static int opt_frame_crop(const char *opt, const char *arg)
2789 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2790 return AVERROR(EINVAL);
2793 static void opt_frame_size(const char *arg)
2795 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2796 fprintf(stderr, "Incorrect frame size\n");
2801 static int opt_pad(const char *opt, const char *arg) {
2802 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2806 static void opt_frame_pix_fmt(const char *arg)
2808 if (strcmp(arg, "list")) {
2809 frame_pix_fmt = av_get_pix_fmt(arg);
2810 if (frame_pix_fmt == PIX_FMT_NONE) {
2811 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2820 static void opt_frame_aspect_ratio(const char *arg)
2827 p = strchr(arg, ':');
2829 x = strtol(arg, &end, 10);
2831 y = strtol(end+1, &end, 10);
2833 ar = (double)x / (double)y;
2835 ar = strtod(arg, NULL);
2838 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2841 frame_aspect_ratio = ar;
2844 static int opt_metadata(const char *opt, const char *arg)
2846 char *mid= strchr(arg, '=');
2849 fprintf(stderr, "Missing =\n");
2854 av_metadata_set2(&metadata, arg, mid, 0);
2859 static void opt_qscale(const char *arg)
2861 video_qscale = atof(arg);
2862 if (video_qscale <= 0 ||
2863 video_qscale > 255) {
2864 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2869 static void opt_top_field_first(const char *arg)
2871 top_field_first= atoi(arg);
2874 static int opt_thread_count(const char *opt, const char *arg)
2876 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2879 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2884 static void opt_audio_sample_fmt(const char *arg)
2886 if (strcmp(arg, "list")) {
2887 audio_sample_fmt = av_get_sample_fmt(arg);
2888 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2889 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2893 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2898 static int opt_audio_rate(const char *opt, const char *arg)
2900 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2904 static int opt_audio_channels(const char *opt, const char *arg)
2906 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2910 static void opt_video_channel(const char *arg)
2912 video_channel = strtol(arg, NULL, 0);
2915 static void opt_video_standard(const char *arg)
2917 video_standard = av_strdup(arg);
2920 static void opt_codec(int *pstream_copy, char **pcodec_name,
2921 int codec_type, const char *arg)
2923 av_freep(pcodec_name);
2924 if (!strcmp(arg, "copy")) {
2927 *pcodec_name = av_strdup(arg);
2931 static void opt_audio_codec(const char *arg)
2933 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2936 static void opt_video_codec(const char *arg)
2938 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2941 static void opt_subtitle_codec(const char *arg)
2943 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2946 static int opt_codec_tag(const char *opt, const char *arg)
2949 uint32_t *codec_tag;
2951 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2952 !strcmp(opt, "vtag") ? &video_codec_tag :
2953 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2957 *codec_tag = strtol(arg, &tail, 0);
2959 *codec_tag = AV_RL32(arg);
2964 static void opt_map(const char *arg)
2969 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2970 m = &stream_maps[nb_stream_maps-1];
2972 m->file_index = strtol(arg, &p, 0);
2976 m->stream_index = strtol(p, &p, 0);
2979 m->sync_file_index = strtol(p, &p, 0);
2982 m->sync_stream_index = strtol(p, &p, 0);
2984 m->sync_file_index = m->file_index;
2985 m->sync_stream_index = m->stream_index;
2989 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3000 *index = strtol(++arg, endptr, 0);
3003 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3010 static void opt_map_metadata(const char *arg)
3012 AVMetaDataMap *m, *m1;
3015 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3016 &nb_meta_data_maps, nb_meta_data_maps + 1);
3018 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3019 m->file = strtol(arg, &p, 0);
3020 parse_meta_type(p, &m->type, &m->index, &p);
3024 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3025 m1->file = strtol(p, &p, 0);
3026 parse_meta_type(p, &m1->type, &m1->index, &p);
3028 if (m->type == 'g' || m1->type == 'g')
3029 metadata_global_autocopy = 0;
3030 if (m->type == 's' || m1->type == 's')
3031 metadata_streams_autocopy = 0;
3032 if (m->type == 'c' || m1->type == 'c')
3033 metadata_chapters_autocopy = 0;
3036 static void opt_map_meta_data(const char *arg)
3038 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3039 "Use -map_metadata instead.\n");
3040 opt_map_metadata(arg);
3043 static void opt_map_chapters(const char *arg)
3048 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3049 nb_chapter_maps + 1);
3050 c = &chapter_maps[nb_chapter_maps - 1];
3051 c->out_file = strtol(arg, &p, 0);
3055 c->in_file = strtol(p, &p, 0);
3058 static void opt_input_ts_scale(const char *arg)
3060 unsigned int stream;
3064 stream = strtol(arg, &p, 0);
3067 scale= strtod(p, &p);
3069 if(stream >= MAX_STREAMS)
3072 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);
3073 input_files_ts_scale[nb_input_files][stream]= scale;
3076 static int opt_recording_time(const char *opt, const char *arg)
3078 recording_time = parse_time_or_die(opt, arg, 1);
3082 static int opt_start_time(const char *opt, const char *arg)
3084 start_time = parse_time_or_die(opt, arg, 1);
3088 static int opt_recording_timestamp(const char *opt, const char *arg)
3090 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3094 static int opt_input_ts_offset(const char *opt, const char *arg)
3096 input_ts_offset = parse_time_or_die(opt, arg, 1);
3100 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3102 const char *codec_string = encoder ? "encoder" : "decoder";
3106 return CODEC_ID_NONE;
3108 avcodec_find_encoder_by_name(name) :
3109 avcodec_find_decoder_by_name(name);
3111 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3114 if(codec->type != type) {
3115 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3118 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3119 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3120 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3121 "results.\nAdd '-strict experimental' if you want to use it.\n",
3122 codec_string, codec->name);
3124 avcodec_find_encoder(codec->id) :
3125 avcodec_find_decoder(codec->id);
3126 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3127 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3128 codec_string, codec->name);
3134 static void opt_input_file(const char *filename)
3136 AVFormatContext *ic;
3137 AVFormatParameters params, *ap = ¶ms;
3138 AVInputFormat *file_iformat = NULL;
3139 int err, i, ret, rfps, rfps_base;
3142 if (last_asked_format) {
3143 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3144 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3147 last_asked_format = NULL;
3150 if (!strcmp(filename, "-"))
3153 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3154 !strcmp(filename, "/dev/stdin");
3156 /* get default parameters from command line */
3157 ic = avformat_alloc_context();
3159 print_error(filename, AVERROR(ENOMEM));
3163 memset(ap, 0, sizeof(*ap));
3164 ap->prealloced_context = 1;
3165 ap->sample_rate = audio_sample_rate;
3166 ap->channels = audio_channels;
3167 ap->time_base.den = frame_rate.num;
3168 ap->time_base.num = frame_rate.den;
3169 ap->width = frame_width;
3170 ap->height = frame_height;
3171 ap->pix_fmt = frame_pix_fmt;
3172 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3173 ap->channel = video_channel;
3174 ap->standard = video_standard;
3176 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3178 ic->video_codec_id =
3179 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3180 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3181 ic->audio_codec_id =
3182 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3183 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3184 ic->subtitle_codec_id=
3185 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3186 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3187 ic->flags |= AVFMT_FLAG_NONBLOCK;
3189 /* open the input file with generic libav function */
3190 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3192 print_error(filename, err);
3198 for(i=0; i<ic->nb_streams; i++){
3199 ic->streams[i]->discard= AVDISCARD_ALL;
3201 for(i=0; i<ic->nb_programs; i++){
3202 AVProgram *p= ic->programs[i];
3203 if(p->id != opt_programid){
3204 p->discard = AVDISCARD_ALL;
3207 for(j=0; j<p->nb_stream_indexes; j++){
3208 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3213 fprintf(stderr, "Specified program id not found\n");
3219 ic->loop_input = loop_input;
3221 /* If not enough info to get the stream parameters, we decode the
3222 first frames to get it. (used in mpeg case for example) */
3223 ret = av_find_stream_info(ic);
3224 if (ret < 0 && verbose >= 0) {
3225 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3226 av_close_input_file(ic);
3230 timestamp = start_time;
3231 /* add the stream start time */
3232 if (ic->start_time != AV_NOPTS_VALUE)
3233 timestamp += ic->start_time;
3235 /* if seeking requested, we execute it */
3236 if (start_time != 0) {
3237 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3239 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3240 filename, (double)timestamp / AV_TIME_BASE);
3242 /* reset seek info */
3246 /* update the current parameters so that they match the one of the input stream */
3247 for(i=0;i<ic->nb_streams;i++) {
3248 AVStream *st = ic->streams[i];
3249 AVCodecContext *dec = st->codec;
3250 dec->thread_count = thread_count;
3251 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3252 switch (dec->codec_type) {
3253 case AVMEDIA_TYPE_AUDIO:
3254 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3255 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]);
3256 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3257 channel_layout = dec->channel_layout;
3258 audio_channels = dec->channels;
3259 audio_sample_rate = dec->sample_rate;
3260 audio_sample_fmt = dec->sample_fmt;
3262 st->discard= AVDISCARD_ALL;
3263 /* Note that av_find_stream_info can add more streams, and we
3264 * currently have no chance of setting up lowres decoding
3265 * early enough for them. */
3267 audio_sample_rate >>= dec->lowres;
3269 case AVMEDIA_TYPE_VIDEO:
3270 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3271 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]);
3272 frame_height = dec->height;
3273 frame_width = dec->width;
3274 if(ic->streams[i]->sample_aspect_ratio.num)
3275 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3277 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3278 frame_aspect_ratio *= (float) dec->width / dec->height;
3279 frame_pix_fmt = dec->pix_fmt;
3280 rfps = ic->streams[i]->r_frame_rate.num;
3281 rfps_base = ic->streams[i]->r_frame_rate.den;
3283 dec->flags |= CODEC_FLAG_EMU_EDGE;
3284 frame_height >>= dec->lowres;
3285 frame_width >>= dec->lowres;
3286 dec->height = frame_height;
3287 dec->width = frame_width;
3290 dec->debug |= FF_DEBUG_MV;
3292 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3295 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3296 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3298 (float)rfps / rfps_base, rfps, rfps_base);
3300 /* update the current frame rate to match the stream frame rate */
3301 frame_rate.num = rfps;
3302 frame_rate.den = rfps_base;
3305 st->discard= AVDISCARD_ALL;
3306 else if(video_discard)
3307 st->discard= video_discard;
3309 case AVMEDIA_TYPE_DATA:
3311 case AVMEDIA_TYPE_SUBTITLE:
3312 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3313 if(subtitle_disable)
3314 st->discard = AVDISCARD_ALL;
3316 case AVMEDIA_TYPE_ATTACHMENT:
3317 case AVMEDIA_TYPE_UNKNOWN:
3324 input_files[nb_input_files] = ic;
3325 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3326 /* dump the file content */
3328 av_dump_format(ic, nb_input_files, filename, 0);
3334 av_freep(&video_codec_name);
3335 av_freep(&audio_codec_name);
3336 av_freep(&subtitle_codec_name);
3339 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3340 int *has_subtitle_ptr)
3342 int has_video, has_audio, has_subtitle, i, j;
3343 AVFormatContext *ic;
3348 for(j=0;j<nb_input_files;j++) {
3349 ic = input_files[j];
3350 for(i=0;i<ic->nb_streams;i++) {
3351 AVCodecContext *enc = ic->streams[i]->codec;
3352 switch(enc->codec_type) {
3353 case AVMEDIA_TYPE_AUDIO:
3356 case AVMEDIA_TYPE_VIDEO:
3359 case AVMEDIA_TYPE_SUBTITLE:
3362 case AVMEDIA_TYPE_DATA:
3363 case AVMEDIA_TYPE_ATTACHMENT:
3364 case AVMEDIA_TYPE_UNKNOWN:
3371 *has_video_ptr = has_video;
3372 *has_audio_ptr = has_audio;
3373 *has_subtitle_ptr = has_subtitle;
3376 static void new_video_stream(AVFormatContext *oc, int file_idx)
3379 AVOutputStream *ost;
3380 AVCodecContext *video_enc;
3381 enum CodecID codec_id = CODEC_ID_NONE;
3382 AVCodec *codec= NULL;
3385 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3387 fprintf(stderr, "Could not alloc stream\n");
3390 ost = new_output_stream(oc, file_idx);
3392 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3393 if(!video_stream_copy){
3394 if (video_codec_name) {
3395 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3396 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3397 codec = avcodec_find_encoder_by_name(video_codec_name);
3398 output_codecs[nb_output_codecs-1] = codec;
3400 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3401 codec = avcodec_find_encoder(codec_id);
3404 if(frame_aspect_ratio > 0){
3405 i = vfilters ? strlen(vfilters) : 0;
3406 vfilters = av_realloc(vfilters, i+100);
3407 snprintf(vfilters+i, i+100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
3408 frame_aspect_ratio=0;
3411 ost->avfilter= vfilters;
3415 avcodec_get_context_defaults3(st->codec, codec);
3416 ost->bitstream_filters = video_bitstream_filters;
3417 video_bitstream_filters= NULL;
3419 st->codec->thread_count= thread_count;
3421 video_enc = st->codec;
3424 video_enc->codec_tag= video_codec_tag;
3426 if( (video_global_header&1)
3427 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3428 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3429 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3431 if(video_global_header&2){
3432 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3433 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3436 if (video_stream_copy) {
3437 st->stream_copy = 1;
3438 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3439 video_enc->sample_aspect_ratio =
3440 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3444 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3446 video_enc->codec_id = codec_id;
3447 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3449 if (codec && codec->supported_framerates && !force_fps)
3450 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3451 video_enc->time_base.den = fps.num;
3452 video_enc->time_base.num = fps.den;
3454 video_enc->width = frame_width;
3455 video_enc->height = frame_height;
3456 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3457 video_enc->pix_fmt = frame_pix_fmt;
3458 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3460 choose_pixel_fmt(st, codec);
3463 video_enc->gop_size = 0;
3464 if (video_qscale || same_quality) {
3465 video_enc->flags |= CODEC_FLAG_QSCALE;
3466 video_enc->global_quality=
3467 st->quality = FF_QP2LAMBDA * video_qscale;
3471 video_enc->intra_matrix = intra_matrix;
3473 video_enc->inter_matrix = inter_matrix;
3475 p= video_rc_override_string;
3478 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3480 fprintf(stderr, "error parsing rc_override\n");
3483 video_enc->rc_override=
3484 av_realloc(video_enc->rc_override,
3485 sizeof(RcOverride)*(i+1));
3486 video_enc->rc_override[i].start_frame= start;
3487 video_enc->rc_override[i].end_frame = end;
3489 video_enc->rc_override[i].qscale= q;
3490 video_enc->rc_override[i].quality_factor= 1.0;
3493 video_enc->rc_override[i].qscale= 0;
3494 video_enc->rc_override[i].quality_factor= -q/100.0;
3499 video_enc->rc_override_count=i;
3500 if (!video_enc->rc_initial_buffer_occupancy)
3501 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3502 video_enc->me_threshold= me_threshold;
3503 video_enc->intra_dc_precision= intra_dc_precision - 8;
3506 video_enc->flags|= CODEC_FLAG_PSNR;
3511 video_enc->flags |= CODEC_FLAG_PASS1;
3513 video_enc->flags |= CODEC_FLAG_PASS2;
3517 if (forced_key_frames)
3518 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3520 if (video_language) {
3521 av_metadata_set2(&st->metadata, "language", video_language, 0);
3522 av_freep(&video_language);
3525 /* reset some key parameters */
3527 av_freep(&video_codec_name);
3528 av_freep(&forced_key_frames);
3529 video_stream_copy = 0;
3530 frame_pix_fmt = PIX_FMT_NONE;
3533 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3536 AVOutputStream *ost;
3537 AVCodec *codec= NULL;
3538 AVCodecContext *audio_enc;
3539 enum CodecID codec_id = CODEC_ID_NONE;
3541 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3543 fprintf(stderr, "Could not alloc stream\n");
3546 ost = new_output_stream(oc, file_idx);
3548 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3549 if(!audio_stream_copy){
3550 if (audio_codec_name) {
3551 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3552 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3553 codec = avcodec_find_encoder_by_name(audio_codec_name);
3554 output_codecs[nb_output_codecs-1] = codec;
3556 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3557 codec = avcodec_find_encoder(codec_id);
3561 avcodec_get_context_defaults3(st->codec, codec);
3563 ost->bitstream_filters = audio_bitstream_filters;
3564 audio_bitstream_filters= NULL;
3566 st->codec->thread_count= thread_count;
3568 audio_enc = st->codec;
3569 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3572 audio_enc->codec_tag= audio_codec_tag;
3574 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3575 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3576 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3578 if (audio_stream_copy) {
3579 st->stream_copy = 1;
3580 audio_enc->channels = audio_channels;
3581 audio_enc->sample_rate = audio_sample_rate;
3583 audio_enc->codec_id = codec_id;
3584 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3586 if (audio_qscale > QSCALE_NONE) {
3587 audio_enc->flags |= CODEC_FLAG_QSCALE;
3588 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3590 audio_enc->channels = audio_channels;
3591 audio_enc->sample_fmt = audio_sample_fmt;
3592 audio_enc->sample_rate = audio_sample_rate;
3593 audio_enc->channel_layout = channel_layout;
3594 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3595 audio_enc->channel_layout = 0;
3596 choose_sample_fmt(st, codec);
3597 choose_sample_rate(st, codec);
3599 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3600 if (audio_language) {
3601 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3602 av_freep(&audio_language);
3605 /* reset some key parameters */
3607 av_freep(&audio_codec_name);
3608 audio_stream_copy = 0;
3611 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3614 AVOutputStream *ost;
3615 AVCodec *codec=NULL;
3616 AVCodecContext *subtitle_enc;
3617 enum CodecID codec_id = CODEC_ID_NONE;
3619 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3621 fprintf(stderr, "Could not alloc stream\n");
3624 ost = new_output_stream(oc, file_idx);
3625 subtitle_enc = st->codec;
3626 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3627 if(!subtitle_stream_copy){
3628 if (subtitle_codec_name) {
3629 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3630 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3631 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3633 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3634 codec = avcodec_find_encoder(codec_id);
3637 avcodec_get_context_defaults3(st->codec, codec);
3639 ost->bitstream_filters = subtitle_bitstream_filters;
3640 subtitle_bitstream_filters= NULL;
3642 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3644 if(subtitle_codec_tag)
3645 subtitle_enc->codec_tag= subtitle_codec_tag;
3647 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3648 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3649 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3651 if (subtitle_stream_copy) {
3652 st->stream_copy = 1;
3654 subtitle_enc->codec_id = codec_id;
3655 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3658 if (subtitle_language) {
3659 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3660 av_freep(&subtitle_language);
3663 subtitle_disable = 0;
3664 av_freep(&subtitle_codec_name);
3665 subtitle_stream_copy = 0;
3668 static int opt_new_stream(const char *opt, const char *arg)
3670 AVFormatContext *oc;
3671 int file_idx = nb_output_files - 1;
3672 if (nb_output_files <= 0) {
3673 fprintf(stderr, "At least one output file must be specified\n");
3676 oc = output_files[file_idx];
3678 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3679 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3680 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3685 /* arg format is "output-stream-index:streamid-value". */
3686 static int opt_streamid(const char *opt, const char *arg)
3692 strncpy(idx_str, arg, sizeof(idx_str));
3693 idx_str[sizeof(idx_str)-1] = '\0';
3694 p = strchr(idx_str, ':');
3697 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3702 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3703 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3704 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3708 static void opt_output_file(const char *filename)
3710 AVFormatContext *oc;
3711 int err, use_video, use_audio, use_subtitle;
3712 int input_has_video, input_has_audio, input_has_subtitle;
3713 AVFormatParameters params, *ap = ¶ms;
3714 AVOutputFormat *file_oformat;
3716 if (!strcmp(filename, "-"))
3719 oc = avformat_alloc_context();
3721 print_error(filename, AVERROR(ENOMEM));
3725 if (last_asked_format) {
3726 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3727 if (!file_oformat) {
3728 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3731 last_asked_format = NULL;
3733 file_oformat = av_guess_format(NULL, filename, NULL);
3734 if (!file_oformat) {
3735 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3741 oc->oformat = file_oformat;
3742 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3744 if (!strcmp(file_oformat->name, "ffm") &&
3745 av_strstart(filename, "http:", NULL)) {
3746 /* special case for files sent to ffserver: we get the stream
3747 parameters from ffserver */
3748 int err = read_ffserver_streams(oc, filename);
3750 print_error(filename, err);
3754 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3755 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3756 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3758 /* disable if no corresponding type found and at least one
3760 if (nb_input_files > 0) {
3761 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3762 &input_has_subtitle);
3763 if (!input_has_video)
3765 if (!input_has_audio)
3767 if (!input_has_subtitle)
3771 /* manual disable */
3772 if (audio_disable) use_audio = 0;
3773 if (video_disable) use_video = 0;
3774 if (subtitle_disable) use_subtitle = 0;
3776 if (use_video) new_video_stream(oc, nb_output_files);
3777 if (use_audio) new_audio_stream(oc, nb_output_files);
3778 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3780 oc->timestamp = recording_timestamp;
3782 av_metadata_copy(&oc->metadata, metadata, 0);
3783 av_metadata_free(&metadata);
3786 output_files[nb_output_files++] = oc;
3788 /* check filename in case of an image number is expected */
3789 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3790 if (!av_filename_number_test(oc->filename)) {
3791 print_error(oc->filename, AVERROR_NUMEXPECTED);
3796 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3797 /* test if it already exists to avoid loosing precious files */
3798 if (!file_overwrite &&
3799 (strchr(filename, ':') == NULL ||
3800 filename[1] == ':' ||
3801 av_strstart(filename, "file:", NULL))) {
3802 if (url_exist(filename)) {
3804 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3806 if (!read_yesno()) {
3807 fprintf(stderr, "Not overwriting - exiting\n");
3812 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3819 if ((err = url_fopen(&oc->pb, filename, URL_WRONLY)) < 0) {
3820 print_error(filename, err);
3825 memset(ap, 0, sizeof(*ap));
3826 if (av_set_parameters(oc, ap) < 0) {
3827 fprintf(stderr, "%s: Invalid encoding parameters\n",
3832 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3833 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3834 oc->loop_output = loop_output;
3835 oc->flags |= AVFMT_FLAG_NONBLOCK;
3837 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3839 av_freep(&forced_key_frames);
3842 /* same option as mencoder */
3843 static void opt_pass(const char *pass_str)
3846 pass = atoi(pass_str);
3847 if (pass != 1 && pass != 2) {
3848 fprintf(stderr, "pass number can be only 1 or 2\n");
3854 static int64_t getutime(void)
3857 struct rusage rusage;
3859 getrusage(RUSAGE_SELF, &rusage);
3860 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3861 #elif HAVE_GETPROCESSTIMES
3863 FILETIME c, e, k, u;
3864 proc = GetCurrentProcess();
3865 GetProcessTimes(proc, &c, &e, &k, &u);
3866 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3868 return av_gettime();
3872 static int64_t getmaxrss(void)
3874 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3875 struct rusage rusage;
3876 getrusage(RUSAGE_SELF, &rusage);
3877 return (int64_t)rusage.ru_maxrss * 1024;
3878 #elif HAVE_GETPROCESSMEMORYINFO
3880 PROCESS_MEMORY_COUNTERS memcounters;
3881 proc = GetCurrentProcess();
3882 memcounters.cb = sizeof(memcounters);
3883 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3884 return memcounters.PeakPagefileUsage;
3890 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3893 const char *p = str;
3900 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3907 static void opt_inter_matrix(const char *arg)
3909 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3910 parse_matrix_coeffs(inter_matrix, arg);
3913 static void opt_intra_matrix(const char *arg)
3915 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3916 parse_matrix_coeffs(intra_matrix, arg);
3919 static void show_usage(void)
3921 printf("Hyper fast Audio and Video encoder\n");
3922 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3926 static void show_help(void)
3929 AVOutputFormat *oformat = NULL;
3931 av_log_set_callback(log_callback_help);
3933 show_help_options(options, "Main options:\n",
3934 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3935 show_help_options(options, "\nAdvanced options:\n",
3936 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3938 show_help_options(options, "\nVideo options:\n",
3939 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3941 show_help_options(options, "\nAdvanced Video options:\n",
3942 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3943 OPT_VIDEO | OPT_EXPERT);
3944 show_help_options(options, "\nAudio options:\n",
3945 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3947 show_help_options(options, "\nAdvanced Audio options:\n",
3948 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3949 OPT_AUDIO | OPT_EXPERT);
3950 show_help_options(options, "\nSubtitle options:\n",
3951 OPT_SUBTITLE | OPT_GRAB,
3953 show_help_options(options, "\nAudio/Video grab options:\n",
3957 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3960 /* individual codec options */
3962 while ((c = av_codec_next(c))) {
3963 if (c->priv_class) {
3964 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3969 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3972 /* individual muxer options */
3973 while ((oformat = av_oformat_next(oformat))) {
3974 if (oformat->priv_class) {
3975 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3980 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3983 static void opt_target(const char *arg)
3985 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3986 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3988 if(!strncmp(arg, "pal-", 4)) {
3991 } else if(!strncmp(arg, "ntsc-", 5)) {
3994 } else if(!strncmp(arg, "film-", 5)) {
3999 /* Calculate FR via float to avoid int overflow */
4000 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4003 } else if((fr == 29970) || (fr == 23976)) {
4006 /* Try to determine PAL/NTSC by peeking in the input files */
4007 if(nb_input_files) {
4009 for(j = 0; j < nb_input_files; j++) {
4010 for(i = 0; i < input_files[j]->nb_streams; i++) {
4011 AVCodecContext *c = input_files[j]->streams[i]->codec;
4012 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4014 fr = c->time_base.den * 1000 / c->time_base.num;
4018 } else if((fr == 29970) || (fr == 23976)) {
4028 if(verbose && norm != UNKNOWN)
4029 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4032 if(norm == UNKNOWN) {
4033 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4034 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4035 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4039 if(!strcmp(arg, "vcd")) {
4041 opt_video_codec("mpeg1video");
4042 opt_audio_codec("mp2");
4045 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4046 opt_frame_rate(NULL, frame_rates[norm]);
4047 opt_default("g", norm == PAL ? "15" : "18");
4049 opt_default("b", "1150000");
4050 opt_default("maxrate", "1150000");
4051 opt_default("minrate", "1150000");
4052 opt_default("bufsize", "327680"); // 40*1024*8;
4054 opt_default("ab", "224000");
4055 audio_sample_rate = 44100;
4058 opt_default("packetsize", "2324");
4059 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4061 /* We have to offset the PTS, so that it is consistent with the SCR.
4062 SCR starts at 36000, but the first two packs contain only padding
4063 and the first pack from the other stream, respectively, may also have
4064 been written before.
4065 So the real data starts at SCR 36000+3*1200. */
4066 mux_preload= (36000+3*1200) / 90000.0; //0.44
4067 } else if(!strcmp(arg, "svcd")) {
4069 opt_video_codec("mpeg2video");
4070 opt_audio_codec("mp2");
4073 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4074 opt_frame_rate(NULL, frame_rates[norm]);
4075 opt_default("g", norm == PAL ? "15" : "18");
4077 opt_default("b", "2040000");
4078 opt_default("maxrate", "2516000");
4079 opt_default("minrate", "0"); //1145000;
4080 opt_default("bufsize", "1835008"); //224*1024*8;
4081 opt_default("flags", "+scan_offset");
4084 opt_default("ab", "224000");
4085 audio_sample_rate = 44100;
4087 opt_default("packetsize", "2324");
4089 } else if(!strcmp(arg, "dvd")) {
4091 opt_video_codec("mpeg2video");
4092 opt_audio_codec("ac3");
4095 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4096 opt_frame_rate(NULL, frame_rates[norm]);
4097 opt_default("g", norm == PAL ? "15" : "18");
4099 opt_default("b", "6000000");
4100 opt_default("maxrate", "9000000");
4101 opt_default("minrate", "0"); //1500000;
4102 opt_default("bufsize", "1835008"); //224*1024*8;
4104 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4105 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4107 opt_default("ab", "448000");
4108 audio_sample_rate = 48000;
4110 } else if(!strncmp(arg, "dv", 2)) {
4114 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4115 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4116 (norm == PAL ? "yuv420p" : "yuv411p"));
4117 opt_frame_rate(NULL, frame_rates[norm]);
4119 audio_sample_rate = 48000;
4123 fprintf(stderr, "Unknown target: %s\n", arg);
4128 static void opt_vstats_file (const char *arg)
4130 av_free (vstats_filename);
4131 vstats_filename=av_strdup (arg);
4134 static void opt_vstats (void)
4137 time_t today2 = time(NULL);
4138 struct tm *today = localtime(&today2);
4140 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4142 opt_vstats_file(filename);
4145 static int opt_bsf(const char *opt, const char *arg)
4147 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4148 AVBitStreamFilterContext **bsfp;
4151 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4155 bsfp= *opt == 'v' ? &video_bitstream_filters :
4156 *opt == 'a' ? &audio_bitstream_filters :
4157 &subtitle_bitstream_filters;
4159 bsfp= &(*bsfp)->next;
4166 static int opt_preset(const char *opt, const char *arg)
4169 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4170 char *codec_name = *opt == 'v' ? video_codec_name :
4171 *opt == 'a' ? audio_codec_name :
4172 subtitle_codec_name;
4174 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4175 fprintf(stderr, "File for preset '%s' not found\n", arg);
4180 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4181 if(line[0] == '#' && !e)
4183 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4185 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4188 if(!strcmp(tmp, "acodec")){
4189 opt_audio_codec(tmp2);
4190 }else if(!strcmp(tmp, "vcodec")){
4191 opt_video_codec(tmp2);
4192 }else if(!strcmp(tmp, "scodec")){
4193 opt_subtitle_codec(tmp2);
4194 }else if(opt_default(tmp, tmp2) < 0){
4195 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4205 static const OptionDef options[] = {
4207 #include "cmdutils_common_opts.h"
4208 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4209 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4210 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4211 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file:stream[:syncfile:syncstream]" },
4212 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4213 "outfile[,metadata]:infile[,metadata]" },
4214 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4215 "outfile[,metadata]:infile[,metadata]" },
4216 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4217 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4218 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4219 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4220 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4221 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4222 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4223 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4224 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4225 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4226 "add timings for benchmarking" },
4227 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4228 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4229 "dump each input packet" },
4230 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4231 "when dumping packets, also dump the payload" },
4232 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4233 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4234 { "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)", "" },
4235 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4236 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4237 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4238 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4239 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4240 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4241 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4242 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4243 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4244 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4245 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4246 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4247 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4248 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4251 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4252 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4253 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4254 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4255 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4256 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4257 { "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" },
4258 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4259 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4260 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4261 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4262 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4263 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4264 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4265 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4266 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4267 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4268 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4269 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4270 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4271 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4272 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4273 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4274 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4275 "use same video quality as source (implies VBR)" },
4276 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4277 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4278 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4279 "deinterlace pictures" },
4280 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4281 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4282 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4284 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4286 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4287 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4288 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4289 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4290 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4291 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4292 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4293 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4294 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4295 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4296 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4299 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4300 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4301 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4302 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4303 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4304 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4305 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4306 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4307 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4308 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4309 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4310 { "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" },
4312 /* subtitle options */
4313 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4314 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4315 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4316 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4317 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4320 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4321 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4322 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4325 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4326 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4328 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4329 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4330 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4332 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4333 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4334 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4335 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4337 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4341 int main(int argc, char **argv)
4345 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4347 avcodec_register_all();
4349 avdevice_register_all();
4352 avfilter_register_all();
4357 if(isatty(STDIN_FILENO))
4358 url_set_interrupt_cb(decode_interrupt_cb);
4366 parse_options(argc, argv, options, opt_output_file);
4368 if(nb_output_files <= 0 && nb_input_files == 0) {
4370 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4374 /* file converter / grab */
4375 if (nb_output_files <= 0) {
4376 fprintf(stderr, "At least one output file must be specified\n");
4380 if (nb_input_files == 0) {
4381 fprintf(stderr, "At least one input file must be specified\n");
4386 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4387 stream_maps, nb_stream_maps) < 0)
4389 ti = getutime() - ti;
4391 int maxrss = getmaxrss() / 1024;
4392 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4395 return ffmpeg_exit(0);