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
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/pixdesc.h"
44 #include "libavutil/avstring.h"
45 #include "libavutil/libm.h"
46 #include "libavformat/os_support.h"
48 #include "libavformat/ffm.h" // not public API
51 # include "libavfilter/avcodec.h"
52 # include "libavfilter/avfilter.h"
53 # include "libavfilter/avfiltergraph.h"
54 # include "libavfilter/vsink_buffer.h"
55 # include "libavfilter/vsrc_buffer.h"
58 #if HAVE_SYS_RESOURCE_H
59 #include <sys/types.h>
61 #include <sys/resource.h>
62 #elif HAVE_GETPROCESSTIMES
65 #if HAVE_GETPROCESSMEMORYINFO
71 #include <sys/select.h>
76 #include <sys/ioctl.h>
86 #include "libavutil/avassert.h"
88 const char program_name[] = "ffmpeg";
89 const int program_birth_year = 2000;
91 /* select an input stream for an output stream */
92 typedef struct AVStreamMap {
96 int sync_stream_index;
100 * select an input file for an output file
102 typedef struct AVMetaDataMap {
103 int file; //< file index
104 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
105 int index; //< stream/chapter/program number
108 typedef struct AVChapterMap {
113 static const OptionDef options[];
115 #define MAX_FILES 100
116 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
118 static const char *last_asked_format = NULL;
119 static int64_t input_files_ts_offset[MAX_FILES];
120 static double *input_files_ts_scale[MAX_FILES] = {NULL};
121 static AVCodec **input_codecs = NULL;
122 static int nb_input_codecs = 0;
123 static int nb_input_files_ts_scale[MAX_FILES] = {0};
125 static AVFormatContext *output_files[MAX_FILES];
126 static int nb_output_files = 0;
128 static AVStreamMap *stream_maps = NULL;
129 static int nb_stream_maps;
131 /* first item specifies output metadata, second is input */
132 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
133 static int nb_meta_data_maps;
134 static int metadata_global_autocopy = 1;
135 static int metadata_streams_autocopy = 1;
136 static int metadata_chapters_autocopy = 1;
138 static AVChapterMap *chapter_maps = NULL;
139 static int nb_chapter_maps;
141 /* indexed by output file stream index */
142 static int *streamid_map = NULL;
143 static int nb_streamid_map = 0;
145 static int frame_width = 0;
146 static int frame_height = 0;
147 static float frame_aspect_ratio = 0;
148 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
149 static int frame_bits_per_raw_sample = 0;
150 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
151 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
152 static AVRational frame_rate;
153 static float video_qscale = 0;
154 static uint16_t *intra_matrix = NULL;
155 static uint16_t *inter_matrix = NULL;
156 static const char *video_rc_override_string=NULL;
157 static int video_disable = 0;
158 static int video_discard = 0;
159 static char *video_codec_name = NULL;
160 static unsigned int video_codec_tag = 0;
161 static char *video_language = NULL;
162 static int same_quality = 0;
163 static int do_deinterlace = 0;
164 static int top_field_first = -1;
165 static int me_threshold = 0;
166 static int intra_dc_precision = 8;
167 static int loop_input = 0;
168 static int loop_output = AVFMT_NOOUTPUTLOOP;
169 static int qp_hist = 0;
171 static char *vfilters = NULL;
174 static int intra_only = 0;
175 static int audio_sample_rate = 0;
176 static int64_t channel_layout = 0;
177 #define QSCALE_NONE -99999
178 static float audio_qscale = QSCALE_NONE;
179 static int audio_disable = 0;
180 static int audio_channels = 0;
181 static char *audio_codec_name = NULL;
182 static unsigned int audio_codec_tag = 0;
183 static char *audio_language = NULL;
185 static int subtitle_disable = 0;
186 static char *subtitle_codec_name = NULL;
187 static char *subtitle_language = NULL;
188 static unsigned int subtitle_codec_tag = 0;
190 static int data_disable = 0;
191 static char *data_codec_name = NULL;
192 static unsigned int data_codec_tag = 0;
194 static float mux_preload= 0.5;
195 static float mux_max_delay= 0.7;
197 static int64_t recording_time = INT64_MAX;
198 static int64_t start_time = 0;
199 static int64_t recording_timestamp = 0;
200 static int64_t input_ts_offset = 0;
201 static int file_overwrite = 0;
202 static AVDictionary *metadata;
203 static int do_benchmark = 0;
204 static int do_hex_dump = 0;
205 static int do_pkt_dump = 0;
206 static int do_psnr = 0;
207 static int do_pass = 0;
208 static const char *pass_logfilename_prefix;
209 static int audio_stream_copy = 0;
210 static int video_stream_copy = 0;
211 static int subtitle_stream_copy = 0;
212 static int data_stream_copy = 0;
213 static int video_sync_method= -1;
214 static int audio_sync_method= 0;
215 static float audio_drift_threshold= 0.1;
216 static int copy_ts= 0;
217 static int copy_tb= 0;
218 static int opt_shortest = 0;
219 static char *vstats_filename;
220 static FILE *vstats_file;
221 static int opt_programid = 0;
222 static int copy_initial_nonkeyframes = 0;
224 static int rate_emu = 0;
226 static int video_channel = 0;
227 static char *video_standard;
229 static int audio_volume = 256;
231 static int exit_on_error = 0;
232 static int using_stdin = 0;
233 static int verbose = 1;
234 static int run_as_daemon = 0;
235 static int thread_count= 1;
236 static int q_pressed = 0;
237 static int64_t video_size = 0;
238 static int64_t audio_size = 0;
239 static int64_t extra_size = 0;
240 static int nb_frames_dup = 0;
241 static int nb_frames_drop = 0;
242 static int input_sync;
243 static uint64_t limit_filesize = 0;
244 static int force_fps = 0;
245 static char *forced_key_frames = NULL;
247 static float dts_delta_threshold = 10;
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;
282 AVFrame resample_frame; /* temporary frame for image resampling */
283 struct SwsContext *img_resample_ctx; /* for image resampling */
286 int resample_pix_fmt;
287 AVRational frame_rate;
289 float frame_aspect_ratio;
291 /* forced key frames */
292 int64_t *forced_kf_pts;
298 ReSampleContext *resample; /* for audio resampling */
299 int resample_sample_fmt;
300 int resample_channels;
301 int resample_sample_rate;
303 AVAudioConvert *reformat_ctx;
304 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
308 AVFilterContext *output_video_filter;
309 AVFilterContext *input_video_filter;
310 AVFilterBufferRef *picref;
312 AVFilterGraph *graph;
318 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
319 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
321 typedef struct AVInputStream {
324 int discard; /* true if stream data should be discarded */
325 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
326 int64_t sample_index; /* current sample */
328 int64_t start; /* time when read started */
329 int64_t next_pts; /* synthetic pts for cases where pkt.pts
331 int64_t pts; /* current pts */
332 int is_start; /* is 1 at the start and after a discontinuity */
333 int showed_multi_packet_warning;
334 int is_past_recording_time;
336 AVFrame *filter_frame;
337 int has_filter_frame;
341 typedef struct AVInputFile {
342 AVFormatContext *ctx;
343 int eof_reached; /* true if eof reached */
344 int ist_index; /* index of first stream in ist_table */
345 int buffer_size; /* current total buffer size */
350 /* init terminal so that we can grab keys */
351 static struct termios oldtty;
354 static AVInputStream *input_streams = NULL;
355 static int nb_input_streams = 0;
356 static AVInputFile *input_files = NULL;
357 static int nb_input_files = 0;
361 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
363 AVFilterContext *last_filter, *filter;
364 /** filter graph containing all filters including input & output */
365 AVCodecContext *codec = ost->st->codec;
366 AVCodecContext *icodec = ist->st->codec;
367 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
368 AVRational sample_aspect_ratio;
372 ost->graph = avfilter_graph_alloc();
374 if (ist->st->sample_aspect_ratio.num){
375 sample_aspect_ratio = ist->st->sample_aspect_ratio;
377 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
379 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
380 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
381 sample_aspect_ratio.num, sample_aspect_ratio.den);
383 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
384 "src", args, NULL, ost->graph);
387 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
388 "out", NULL, pix_fmts, ost->graph);
391 last_filter = ost->input_video_filter;
393 if (codec->width != icodec->width || codec->height != icodec->height) {
394 snprintf(args, 255, "%d:%d:flags=0x%X",
398 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
399 NULL, args, NULL, ost->graph)) < 0)
401 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
403 last_filter = filter;
406 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
407 ost->graph->scale_sws_opts = av_strdup(args);
410 AVFilterInOut *outputs = avfilter_inout_alloc();
411 AVFilterInOut *inputs = avfilter_inout_alloc();
413 outputs->name = av_strdup("in");
414 outputs->filter_ctx = last_filter;
415 outputs->pad_idx = 0;
416 outputs->next = NULL;
418 inputs->name = av_strdup("out");
419 inputs->filter_ctx = ost->output_video_filter;
423 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
425 av_freep(&ost->avfilter);
427 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
431 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
434 codec->width = ost->output_video_filter->inputs[0]->w;
435 codec->height = ost->output_video_filter->inputs[0]->h;
436 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
437 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
438 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
439 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
443 #endif /* CONFIG_AVFILTER */
445 static void term_exit(void)
447 av_log(NULL, AV_LOG_QUIET, "%s", "");
450 tcsetattr (0, TCSANOW, &oldtty);
454 static volatile int received_sigterm = 0;
457 sigterm_handler(int sig)
459 received_sigterm = sig;
464 static void term_init(void)
474 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
475 |INLCR|IGNCR|ICRNL|IXON);
476 tty.c_oflag |= OPOST;
477 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
478 tty.c_cflag &= ~(CSIZE|PARENB);
483 tcsetattr (0, TCSANOW, &tty);
484 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
488 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
489 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
491 signal(SIGXCPU, sigterm_handler);
495 /* read a key without blocking */
496 static int read_key(void)
511 n = select(1, &rfds, NULL, NULL, &tv);
526 static int decode_interrupt_cb(void)
528 q_pressed += read_key() == 'q';
529 return q_pressed > 1;
532 static int ffmpeg_exit(int ret)
537 for(i=0;i<nb_output_files;i++) {
538 AVFormatContext *s = output_files[i];
539 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
541 avformat_free_context(s);
542 av_free(output_streams_for_file[i]);
544 for(i=0;i<nb_input_files;i++) {
545 av_close_input_file(input_files[i].ctx);
546 av_free(input_files_ts_scale[i]);
549 av_free(intra_matrix);
550 av_free(inter_matrix);
554 av_free(vstats_filename);
556 av_free(streamid_map);
557 av_free(input_codecs);
558 av_free(stream_maps);
559 av_free(meta_data_maps);
561 av_freep(&input_streams);
562 av_freep(&input_files);
564 av_free(video_codec_name);
565 av_free(audio_codec_name);
566 av_free(subtitle_codec_name);
567 av_free(data_codec_name);
569 av_free(video_standard);
574 allocated_audio_buf_size= allocated_audio_out_size= 0;
581 if (received_sigterm) {
583 "Received signal %d: terminating.\n",
584 (int) received_sigterm);
588 exit(ret); /* not all OS-es handle main() return value */
592 /* similar to ff_dynarray_add() and av_fast_realloc() */
593 static void *grow_array(void *array, int elem_size, int *size, int new_size)
595 if (new_size >= INT_MAX / elem_size) {
596 fprintf(stderr, "Array too big.\n");
599 if (*size < new_size) {
600 uint8_t *tmp = av_realloc(array, new_size*elem_size);
602 fprintf(stderr, "Could not alloc buffer.\n");
605 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
612 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
614 if(codec && codec->sample_fmts){
615 const enum AVSampleFormat *p= codec->sample_fmts;
617 if(*p == st->codec->sample_fmt)
621 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
622 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
623 av_log(NULL, AV_LOG_WARNING,
624 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
625 av_get_sample_fmt_name(st->codec->sample_fmt),
627 av_get_sample_fmt_name(codec->sample_fmts[0]));
628 st->codec->sample_fmt = codec->sample_fmts[0];
633 static void choose_sample_rate(AVStream *st, AVCodec *codec)
635 if(codec && codec->supported_samplerates){
636 const int *p= codec->supported_samplerates;
638 int best_dist=INT_MAX;
640 int dist= abs(st->codec->sample_rate - *p);
641 if(dist < best_dist){
647 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
649 st->codec->sample_rate= best;
653 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
655 if(codec && codec->pix_fmts){
656 const enum PixelFormat *p= codec->pix_fmts;
657 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
658 if(st->codec->codec_id==CODEC_ID_MJPEG){
659 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
660 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
661 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};
665 if(*p == st->codec->pix_fmt)
669 if(st->codec->pix_fmt != PIX_FMT_NONE)
670 av_log(NULL, AV_LOG_WARNING,
671 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
672 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
674 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
675 st->codec->pix_fmt = codec->pix_fmts[0];
680 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
682 int idx = oc->nb_streams - 1;
685 output_streams_for_file[file_idx] =
686 grow_array(output_streams_for_file[file_idx],
687 sizeof(*output_streams_for_file[file_idx]),
688 &nb_output_streams_for_file[file_idx],
690 ost = output_streams_for_file[file_idx][idx] =
691 av_mallocz(sizeof(AVOutputStream));
693 fprintf(stderr, "Could not alloc output stream\n");
696 ost->file_index = file_idx;
699 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
703 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
709 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
712 /* copy stream format */
714 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
715 for(i=0;i<ic->nb_streams;i++) {
721 // FIXME: a more elegant solution is needed
722 st = av_mallocz(sizeof(AVStream));
723 memcpy(st, ic->streams[i], sizeof(AVStream));
724 st->info = av_malloc(sizeof(*st->info));
725 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
726 st->codec = avcodec_alloc_context();
728 print_error(filename, AVERROR(ENOMEM));
731 avcodec_copy_context(st->codec, ic->streams[i]->codec);
734 codec = avcodec_find_encoder(st->codec->codec_id);
735 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
736 if (audio_stream_copy) {
739 choose_sample_fmt(st, codec);
740 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
741 if (video_stream_copy) {
744 choose_pixel_fmt(st, codec);
747 if(st->codec->flags & CODEC_FLAG_BITEXACT)
750 new_output_stream(s, nb_output_files);
754 s->timestamp = av_gettime();
756 av_close_input_file(ic);
761 get_sync_ipts(const AVOutputStream *ost)
763 const AVInputStream *ist = ost->sync_ist;
764 return (double)(ist->pts - start_time)/AV_TIME_BASE;
767 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
771 AVPacket new_pkt= *pkt;
772 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
773 &new_pkt.data, &new_pkt.size,
774 pkt->data, pkt->size,
775 pkt->flags & AV_PKT_FLAG_KEY);
778 new_pkt.destruct= av_destruct_packet;
780 fprintf(stderr, "%s failed for stream %d, codec %s",
781 bsfc->filter->name, pkt->stream_index,
782 avctx->codec ? avctx->codec->name : "copy");
792 ret= av_interleaved_write_frame(s, pkt);
794 print_error("av_interleaved_write_frame()", ret);
799 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
801 static void do_audio_out(AVFormatContext *s,
804 unsigned char *buf, int size)
807 int64_t audio_out_size, audio_buf_size;
808 int64_t allocated_for_size= size;
810 int size_out, frame_bytes, ret, resample_changed;
811 AVCodecContext *enc= ost->st->codec;
812 AVCodecContext *dec= ist->st->codec;
813 int osize = av_get_bytes_per_sample(enc->sample_fmt);
814 int isize = av_get_bytes_per_sample(dec->sample_fmt);
815 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
818 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
819 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
820 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
821 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
822 audio_buf_size*= osize*enc->channels;
824 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
825 if(coded_bps > 8*osize)
826 audio_out_size= audio_out_size * coded_bps / (8*osize);
827 audio_out_size += FF_MIN_BUFFER_SIZE;
829 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
830 fprintf(stderr, "Buffer sizes too large\n");
834 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
835 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
836 if (!audio_buf || !audio_out){
837 fprintf(stderr, "Out of memory in do_audio_out\n");
841 if (enc->channels != dec->channels)
842 ost->audio_resample = 1;
844 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
845 ost->resample_channels != dec->channels ||
846 ost->resample_sample_rate != dec->sample_rate;
848 if ((ost->audio_resample && !ost->resample) || resample_changed) {
849 if (resample_changed) {
850 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",
851 ist->file_index, ist->st->index,
852 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
853 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
854 ost->resample_sample_fmt = dec->sample_fmt;
855 ost->resample_channels = dec->channels;
856 ost->resample_sample_rate = dec->sample_rate;
858 audio_resample_close(ost->resample);
860 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
861 if (audio_sync_method <= 1 &&
862 ost->resample_sample_fmt == enc->sample_fmt &&
863 ost->resample_channels == enc->channels &&
864 ost->resample_sample_rate == enc->sample_rate) {
865 ost->resample = NULL;
866 ost->audio_resample = 0;
868 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
869 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
870 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
871 enc->sample_rate, dec->sample_rate,
872 enc->sample_fmt, dec->sample_fmt,
874 if (!ost->resample) {
875 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
876 dec->channels, dec->sample_rate,
877 enc->channels, enc->sample_rate);
883 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
884 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
885 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
886 if (ost->reformat_ctx)
887 av_audio_convert_free(ost->reformat_ctx);
888 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
889 dec->sample_fmt, 1, NULL, 0);
890 if (!ost->reformat_ctx) {
891 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
892 av_get_sample_fmt_name(dec->sample_fmt),
893 av_get_sample_fmt_name(enc->sample_fmt));
896 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
899 if(audio_sync_method){
900 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
901 - av_fifo_size(ost->fifo)/(enc->channels * 2);
902 double idelta= delta*dec->sample_rate / enc->sample_rate;
903 int byte_delta= ((int)idelta)*2*dec->channels;
905 //FIXME resample delay
906 if(fabs(delta) > 50){
907 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
909 byte_delta= FFMAX(byte_delta, -size);
913 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
918 static uint8_t *input_tmp= NULL;
919 input_tmp= av_realloc(input_tmp, byte_delta + size);
921 if(byte_delta > allocated_for_size - size){
922 allocated_for_size= byte_delta + (int64_t)size;
927 memset(input_tmp, 0, byte_delta);
928 memcpy(input_tmp + byte_delta, buf, size);
932 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
934 }else if(audio_sync_method>1){
935 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
936 av_assert0(ost->audio_resample);
938 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
939 // 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));
940 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
944 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
945 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
947 if (ost->audio_resample) {
949 size_out = audio_resample(ost->resample,
950 (short *)buftmp, (short *)buf,
951 size / (dec->channels * isize));
952 size_out = size_out * enc->channels * osize;
958 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
959 const void *ibuf[6]= {buftmp};
960 void *obuf[6]= {audio_buf};
961 int istride[6]= {isize};
962 int ostride[6]= {osize};
963 int len= size_out/istride[0];
964 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
965 printf("av_audio_convert() failed\n");
971 size_out = len*osize;
974 /* now encode as many frames as possible */
975 if (enc->frame_size > 1) {
976 /* output resampled raw samples */
977 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
978 fprintf(stderr, "av_fifo_realloc2() failed\n");
981 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
983 frame_bytes = enc->frame_size * osize * enc->channels;
985 while (av_fifo_size(ost->fifo) >= frame_bytes) {
987 av_init_packet(&pkt);
989 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
991 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
993 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
996 fprintf(stderr, "Audio encoding failed\n");
1000 pkt.stream_index= ost->index;
1001 pkt.data= audio_out;
1003 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1004 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1005 pkt.flags |= AV_PKT_FLAG_KEY;
1006 write_frame(s, &pkt, enc, ost->bitstream_filters);
1008 ost->sync_opts += enc->frame_size;
1012 av_init_packet(&pkt);
1014 ost->sync_opts += size_out / (osize * enc->channels);
1016 /* output a pcm frame */
1017 /* determine the size of the coded buffer */
1020 size_out = size_out*coded_bps/8;
1022 if(size_out > audio_out_size){
1023 fprintf(stderr, "Internal error, buffer size too small\n");
1027 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1028 ret = avcodec_encode_audio(enc, audio_out, size_out,
1031 fprintf(stderr, "Audio encoding failed\n");
1035 pkt.stream_index= ost->index;
1036 pkt.data= audio_out;
1038 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1039 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1040 pkt.flags |= AV_PKT_FLAG_KEY;
1041 write_frame(s, &pkt, enc, ost->bitstream_filters);
1045 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1047 AVCodecContext *dec;
1048 AVPicture *picture2;
1049 AVPicture picture_tmp;
1052 dec = ist->st->codec;
1054 /* deinterlace : must be done before any resize */
1055 if (do_deinterlace) {
1058 /* create temporary picture */
1059 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1060 buf = av_malloc(size);
1064 picture2 = &picture_tmp;
1065 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1067 if(avpicture_deinterlace(picture2, picture,
1068 dec->pix_fmt, dec->width, dec->height) < 0) {
1069 /* if error, do not deinterlace */
1070 fprintf(stderr, "Deinterlacing failed\n");
1079 if (picture != picture2)
1080 *picture = *picture2;
1084 /* we begin to correct av delay at this threshold */
1085 #define AV_DELAY_MAX 0.100
1087 static void do_subtitle_out(AVFormatContext *s,
1088 AVOutputStream *ost,
1093 static uint8_t *subtitle_out = NULL;
1094 int subtitle_out_max_size = 1024 * 1024;
1095 int subtitle_out_size, nb, i;
1096 AVCodecContext *enc;
1099 if (pts == AV_NOPTS_VALUE) {
1100 fprintf(stderr, "Subtitle packets must have a pts\n");
1106 enc = ost->st->codec;
1108 if (!subtitle_out) {
1109 subtitle_out = av_malloc(subtitle_out_max_size);
1112 /* Note: DVB subtitle need one packet to draw them and one other
1113 packet to clear them */
1114 /* XXX: signal it in the codec context ? */
1115 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1120 for(i = 0; i < nb; i++) {
1121 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1122 // start_display_time is required to be 0
1123 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1124 sub->end_display_time -= sub->start_display_time;
1125 sub->start_display_time = 0;
1126 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1127 subtitle_out_max_size, sub);
1128 if (subtitle_out_size < 0) {
1129 fprintf(stderr, "Subtitle encoding failed\n");
1133 av_init_packet(&pkt);
1134 pkt.stream_index = ost->index;
1135 pkt.data = subtitle_out;
1136 pkt.size = subtitle_out_size;
1137 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1138 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1139 /* XXX: the pts correction is handled here. Maybe handling
1140 it in the codec would be better */
1142 pkt.pts += 90 * sub->start_display_time;
1144 pkt.pts += 90 * sub->end_display_time;
1146 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1150 static int bit_buffer_size= 1024*256;
1151 static uint8_t *bit_buffer= NULL;
1153 static void do_video_out(AVFormatContext *s,
1154 AVOutputStream *ost,
1156 AVFrame *in_picture,
1159 int nb_frames, i, ret, av_unused resample_changed;
1160 AVFrame *final_picture, *formatted_picture;
1161 AVCodecContext *enc, *dec;
1164 enc = ost->st->codec;
1165 dec = ist->st->codec;
1167 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1169 /* by default, we output a single frame */
1174 if(video_sync_method){
1175 double vdelta = sync_ipts - ost->sync_opts;
1176 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1179 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1182 }else if(vdelta>0.6)
1183 ost->sync_opts= lrintf(sync_ipts);
1184 }else if (vdelta > 1.1)
1185 nb_frames = lrintf(vdelta);
1186 //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);
1187 if (nb_frames == 0){
1190 fprintf(stderr, "*** drop!\n");
1191 }else if (nb_frames > 1) {
1192 nb_frames_dup += nb_frames - 1;
1194 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1197 ost->sync_opts= lrintf(sync_ipts);
1199 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1203 formatted_picture = in_picture;
1204 final_picture = formatted_picture;
1206 #if !CONFIG_AVFILTER
1207 resample_changed = ost->resample_width != dec->width ||
1208 ost->resample_height != dec->height ||
1209 ost->resample_pix_fmt != dec->pix_fmt;
1211 if (resample_changed) {
1212 av_log(NULL, AV_LOG_INFO,
1213 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1214 ist->file_index, ist->st->index,
1215 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1216 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1217 ost->resample_width = dec->width;
1218 ost->resample_height = dec->height;
1219 ost->resample_pix_fmt = dec->pix_fmt;
1222 ost->video_resample = dec->width != enc->width ||
1223 dec->height != enc->height ||
1224 dec->pix_fmt != enc->pix_fmt;
1226 if (ost->video_resample) {
1227 final_picture = &ost->resample_frame;
1228 if (!ost->img_resample_ctx || resample_changed) {
1229 /* initialize the destination picture */
1230 if (!ost->resample_frame.data[0]) {
1231 avcodec_get_frame_defaults(&ost->resample_frame);
1232 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1233 enc->width, enc->height)) {
1234 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1238 /* initialize a new scaler context */
1239 sws_freeContext(ost->img_resample_ctx);
1240 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1241 enc->width, enc->height, enc->pix_fmt,
1242 ost->sws_flags, NULL, NULL, NULL);
1243 if (ost->img_resample_ctx == NULL) {
1244 fprintf(stderr, "Cannot get resampling context\n");
1248 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1249 0, ost->resample_height, final_picture->data, final_picture->linesize);
1253 /* duplicates frame if needed */
1254 for(i=0;i<nb_frames;i++) {
1256 av_init_packet(&pkt);
1257 pkt.stream_index= ost->index;
1259 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1260 /* raw pictures are written as AVPicture structure to
1261 avoid any copies. We support temorarily the older
1263 AVFrame* old_frame = enc->coded_frame;
1264 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1265 pkt.data= (uint8_t *)final_picture;
1266 pkt.size= sizeof(AVPicture);
1267 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1268 pkt.flags |= AV_PKT_FLAG_KEY;
1270 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1271 enc->coded_frame = old_frame;
1273 AVFrame big_picture;
1275 big_picture= *final_picture;
1276 /* better than nothing: use input picture interlaced
1278 big_picture.interlaced_frame = in_picture->interlaced_frame;
1279 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1280 if(top_field_first == -1)
1281 big_picture.top_field_first = in_picture->top_field_first;
1283 big_picture.top_field_first = top_field_first;
1286 /* handles sameq here. This is not correct because it may
1287 not be a global option */
1288 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1290 big_picture.pict_type = 0;
1291 // big_picture.pts = AV_NOPTS_VALUE;
1292 big_picture.pts= ost->sync_opts;
1293 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1294 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1295 if (ost->forced_kf_index < ost->forced_kf_count &&
1296 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1297 big_picture.pict_type = AV_PICTURE_TYPE_I;
1298 ost->forced_kf_index++;
1300 ret = avcodec_encode_video(enc,
1301 bit_buffer, bit_buffer_size,
1304 fprintf(stderr, "Video encoding failed\n");
1309 pkt.data= bit_buffer;
1311 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1312 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1313 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1314 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1315 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1317 if(enc->coded_frame->key_frame)
1318 pkt.flags |= AV_PKT_FLAG_KEY;
1319 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1322 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1323 // enc->frame_number-1, ret, enc->pict_type);
1324 /* if two pass, output log */
1325 if (ost->logfile && enc->stats_out) {
1326 fprintf(ost->logfile, "%s", enc->stats_out);
1331 ost->frame_number++;
1335 static double psnr(double d){
1336 return -10.0*log(d)/log(10.0);
1339 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1342 AVCodecContext *enc;
1344 double ti1, bitrate, avg_bitrate;
1346 /* this is executed just the first time do_video_stats is called */
1348 vstats_file = fopen(vstats_filename, "w");
1355 enc = ost->st->codec;
1356 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1357 frame_number = ost->frame_number;
1358 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1359 if (enc->flags&CODEC_FLAG_PSNR)
1360 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1362 fprintf(vstats_file,"f_size= %6d ", frame_size);
1363 /* compute pts value */
1364 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1368 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1369 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1370 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1371 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1372 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1376 static void print_report(AVFormatContext **output_files,
1377 AVOutputStream **ost_table, int nb_ostreams,
1381 AVOutputStream *ost;
1382 AVFormatContext *oc;
1384 AVCodecContext *enc;
1385 int frame_number, vid, i;
1387 int64_t pts = INT64_MAX;
1388 static int64_t last_time = -1;
1389 static int qp_histogram[52];
1391 if (!is_last_report) {
1393 /* display the report every 0.5 seconds */
1394 cur_time = av_gettime();
1395 if (last_time == -1) {
1396 last_time = cur_time;
1399 if ((cur_time - last_time) < 500000)
1401 last_time = cur_time;
1405 oc = output_files[0];
1407 total_size = avio_size(oc->pb);
1408 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1409 total_size= avio_tell(oc->pb);
1413 for(i=0;i<nb_ostreams;i++) {
1416 enc = ost->st->codec;
1417 if (!ost->st->stream_copy && enc->coded_frame)
1418 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1419 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1420 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1422 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1423 float t = (av_gettime()-timer_start) / 1000000.0;
1425 frame_number = ost->frame_number;
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1427 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1429 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1433 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1436 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1438 if (enc->flags&CODEC_FLAG_PSNR){
1440 double error, error_sum=0;
1441 double scale, scale_sum=0;
1442 char type[3]= {'Y','U','V'};
1443 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1446 error= enc->error[j];
1447 scale= enc->width*enc->height*255.0*255.0*frame_number;
1449 error= enc->coded_frame->error[j];
1450 scale= enc->width*enc->height*255.0*255.0;
1455 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1457 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1461 /* compute min output value */
1462 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1463 ost->st->time_base, AV_TIME_BASE_Q));
1466 if (verbose > 0 || is_last_report) {
1467 int hours, mins, secs, us;
1468 secs = pts / AV_TIME_BASE;
1469 us = pts % AV_TIME_BASE;
1475 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1477 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1478 "size=%8.0fkB time=", total_size / 1024.0);
1479 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1480 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1481 (100 * us) / AV_TIME_BASE);
1482 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1483 "bitrate=%6.1fkbits/s", bitrate);
1485 if (nb_frames_dup || nb_frames_drop)
1486 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1487 nb_frames_dup, nb_frames_drop);
1490 fprintf(stderr, "%s \r", buf);
1495 if (is_last_report && verbose >= 0){
1496 int64_t raw= audio_size + video_size + extra_size;
1497 fprintf(stderr, "\n");
1498 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1502 100.0*(total_size - raw)/raw
1507 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1509 int fill_char = 0x00;
1510 if (sample_fmt == AV_SAMPLE_FMT_U8)
1512 memset(buf, fill_char, size);
1515 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1516 static int output_packet(AVInputStream *ist, int ist_index,
1517 AVOutputStream **ost_table, int nb_ostreams,
1518 const AVPacket *pkt)
1520 AVFormatContext *os;
1521 AVOutputStream *ost;
1525 void *buffer_to_free = NULL;
1526 static unsigned int samples_size= 0;
1527 AVSubtitle subtitle, *subtitle_to_free;
1528 int64_t pkt_pts = AV_NOPTS_VALUE;
1530 int frame_available;
1534 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1536 if(ist->next_pts == AV_NOPTS_VALUE)
1537 ist->next_pts= ist->pts;
1541 av_init_packet(&avpkt);
1549 if(pkt->dts != AV_NOPTS_VALUE)
1550 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1551 if(pkt->pts != AV_NOPTS_VALUE)
1552 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1554 //while we have more to decode or while the decoder did output something on EOF
1555 while (avpkt.size > 0 || (!pkt && got_output)) {
1556 uint8_t *data_buf, *decoded_data_buf;
1557 int data_size, decoded_data_size;
1559 ist->pts= ist->next_pts;
1561 if(avpkt.size && avpkt.size != pkt->size &&
1562 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1563 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1564 ist->showed_multi_packet_warning=1;
1567 /* decode the packet if needed */
1568 decoded_data_buf = NULL; /* fail safe */
1569 decoded_data_size= 0;
1570 data_buf = avpkt.data;
1571 data_size = avpkt.size;
1572 subtitle_to_free = NULL;
1573 if (ist->decoding_needed) {
1574 switch(ist->st->codec->codec_type) {
1575 case AVMEDIA_TYPE_AUDIO:{
1576 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1577 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1579 samples= av_malloc(samples_size);
1581 decoded_data_size= samples_size;
1582 /* XXX: could avoid copy if PCM 16 bits with same
1583 endianness as CPU */
1584 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1591 got_output = decoded_data_size > 0;
1592 /* Some bug in mpeg audio decoder gives */
1593 /* decoded_data_size < 0, it seems they are overflows */
1595 /* no audio frame */
1598 decoded_data_buf = (uint8_t *)samples;
1599 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1600 (ist->st->codec->sample_rate * ist->st->codec->channels);
1602 case AVMEDIA_TYPE_VIDEO:
1603 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1604 /* XXX: allocate picture correctly */
1605 avcodec_get_frame_defaults(&picture);
1606 avpkt.pts = pkt_pts;
1607 avpkt.dts = ist->pts;
1608 pkt_pts = AV_NOPTS_VALUE;
1610 ret = avcodec_decode_video2(ist->st->codec,
1611 &picture, &got_output, &avpkt);
1612 ist->st->quality= picture.quality;
1616 /* no picture yet */
1617 goto discard_packet;
1619 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1620 if (ist->st->codec->time_base.num != 0) {
1621 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1622 ist->next_pts += ((int64_t)AV_TIME_BASE *
1623 ist->st->codec->time_base.num * ticks) /
1624 ist->st->codec->time_base.den;
1627 buffer_to_free = NULL;
1628 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1630 case AVMEDIA_TYPE_SUBTITLE:
1631 ret = avcodec_decode_subtitle2(ist->st->codec,
1632 &subtitle, &got_output, &avpkt);
1636 goto discard_packet;
1638 subtitle_to_free = &subtitle;
1645 switch(ist->st->codec->codec_type) {
1646 case AVMEDIA_TYPE_AUDIO:
1647 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1648 ist->st->codec->sample_rate;
1650 case AVMEDIA_TYPE_VIDEO:
1651 if (ist->st->codec->time_base.num != 0) {
1652 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1653 ist->next_pts += ((int64_t)AV_TIME_BASE *
1654 ist->st->codec->time_base.num * ticks) /
1655 ist->st->codec->time_base.den;
1664 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1665 if (start_time == 0 || ist->pts >= start_time) {
1666 for(i=0;i<nb_ostreams;i++) {
1668 if (ost->input_video_filter && ost->source_index == ist_index) {
1669 if (!picture.sample_aspect_ratio.num)
1670 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1671 picture.pts = ist->pts;
1673 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1679 // preprocess audio (volume)
1680 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1681 if (audio_volume != 256) {
1684 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1685 int v = ((*volp) * audio_volume + 128) >> 8;
1686 if (v < -32768) v = -32768;
1687 if (v > 32767) v = 32767;
1693 /* frame rate emulation */
1695 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1696 int64_t now = av_gettime() - ist->start;
1700 /* if output time reached then transcode raw format,
1701 encode packets and output them */
1702 if (start_time == 0 || ist->pts >= start_time)
1703 for(i=0;i<nb_ostreams;i++) {
1707 if (ost->source_index == ist_index) {
1709 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1710 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1711 while (frame_available) {
1712 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1713 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1714 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1717 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1718 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1722 os = output_files[ost->file_index];
1724 /* set the input output pts pairs */
1725 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1727 if (ost->encoding_needed) {
1728 av_assert0(ist->decoding_needed);
1729 switch(ost->st->codec->codec_type) {
1730 case AVMEDIA_TYPE_AUDIO:
1731 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1733 case AVMEDIA_TYPE_VIDEO:
1735 if (ost->picref->video && !ost->frame_aspect_ratio)
1736 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1738 do_video_out(os, ost, ist, &picture, &frame_size);
1739 if (vstats_filename && frame_size)
1740 do_video_stats(os, ost, frame_size);
1742 case AVMEDIA_TYPE_SUBTITLE:
1743 do_subtitle_out(os, ost, ist, &subtitle,
1750 AVFrame avframe; //FIXME/XXX remove this
1753 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1755 av_init_packet(&opkt);
1757 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1758 #if !CONFIG_AVFILTER
1764 /* no reencoding needed : output the packet directly */
1765 /* force the input stream PTS */
1767 avcodec_get_frame_defaults(&avframe);
1768 ost->st->codec->coded_frame= &avframe;
1769 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1771 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1772 audio_size += data_size;
1773 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1774 video_size += data_size;
1778 opkt.stream_index= ost->index;
1779 if(pkt->pts != AV_NOPTS_VALUE)
1780 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1782 opkt.pts= AV_NOPTS_VALUE;
1784 if (pkt->dts == AV_NOPTS_VALUE)
1785 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1787 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1788 opkt.dts -= ost_tb_start_time;
1790 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1791 opkt.flags= pkt->flags;
1793 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1794 if( ost->st->codec->codec_id != CODEC_ID_H264
1795 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1796 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1798 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1799 opkt.destruct= av_destruct_packet;
1801 opkt.data = data_buf;
1802 opkt.size = data_size;
1805 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1806 /* store AVPicture in AVPacket, as expected by the output format */
1807 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1808 opkt.data = (uint8_t *)&pict;
1809 opkt.size = sizeof(AVPicture);
1810 opkt.flags |= AV_PKT_FLAG_KEY;
1812 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1813 ost->st->codec->frame_number++;
1814 ost->frame_number++;
1815 av_free_packet(&opkt);
1819 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1820 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1821 avfilter_unref_buffer(ost->picref);
1827 av_free(buffer_to_free);
1828 /* XXX: allocate the subtitles in the codec ? */
1829 if (subtitle_to_free) {
1830 avsubtitle_free(subtitle_to_free);
1831 subtitle_to_free = NULL;
1838 for(i=0;i<nb_ostreams;i++) {
1840 if (ost->source_index == ist_index) {
1841 AVCodecContext *enc= ost->st->codec;
1842 os = output_files[ost->file_index];
1844 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1846 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1849 if (ost->encoding_needed) {
1853 av_init_packet(&pkt);
1854 pkt.stream_index= ost->index;
1856 switch(ost->st->codec->codec_type) {
1857 case AVMEDIA_TYPE_AUDIO:
1858 fifo_bytes = av_fifo_size(ost->fifo);
1860 /* encode any samples remaining in fifo */
1861 if (fifo_bytes > 0) {
1862 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1863 int fs_tmp = enc->frame_size;
1865 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1866 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1867 enc->frame_size = fifo_bytes / (osize * enc->channels);
1869 int frame_bytes = enc->frame_size*osize*enc->channels;
1870 if (allocated_audio_buf_size < frame_bytes)
1872 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1875 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1876 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1877 ost->st->time_base.num, enc->sample_rate);
1878 enc->frame_size = fs_tmp;
1881 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1884 fprintf(stderr, "Audio encoding failed\n");
1888 pkt.flags |= AV_PKT_FLAG_KEY;
1890 case AVMEDIA_TYPE_VIDEO:
1891 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1893 fprintf(stderr, "Video encoding failed\n");
1897 if(enc->coded_frame && enc->coded_frame->key_frame)
1898 pkt.flags |= AV_PKT_FLAG_KEY;
1899 if (ost->logfile && enc->stats_out) {
1900 fprintf(ost->logfile, "%s", enc->stats_out);
1909 pkt.data= bit_buffer;
1911 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1912 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1913 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1925 static void print_sdp(AVFormatContext **avc, int n)
1929 av_sdp_create(avc, n, sdp, sizeof(sdp));
1930 printf("SDP:\n%s\n", sdp);
1934 static int copy_chapters(int infile, int outfile)
1936 AVFormatContext *is = input_files[infile].ctx;
1937 AVFormatContext *os = output_files[outfile];
1940 for (i = 0; i < is->nb_chapters; i++) {
1941 AVChapter *in_ch = is->chapters[i], *out_ch;
1942 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1943 AV_TIME_BASE_Q, in_ch->time_base);
1944 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1945 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1948 if (in_ch->end < ts_off)
1950 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1953 out_ch = av_mallocz(sizeof(AVChapter));
1955 return AVERROR(ENOMEM);
1957 out_ch->id = in_ch->id;
1958 out_ch->time_base = in_ch->time_base;
1959 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1960 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1962 if (metadata_chapters_autocopy)
1963 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1966 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1968 return AVERROR(ENOMEM);
1969 os->chapters[os->nb_chapters - 1] = out_ch;
1974 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1975 AVCodecContext *avctx)
1981 for (p = kf; *p; p++)
1984 ost->forced_kf_count = n;
1985 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1986 if (!ost->forced_kf_pts) {
1987 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1990 for (i = 0; i < n; i++) {
1991 p = i ? strchr(p, ',') + 1 : kf;
1992 t = parse_time_or_die("force_key_frames", p, 1);
1993 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1998 * The following code is the main loop of the file converter
2000 static int transcode(AVFormatContext **output_files,
2001 int nb_output_files,
2002 AVInputFile *input_files,
2004 AVStreamMap *stream_maps, int nb_stream_maps)
2006 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2008 AVFormatContext *is, *os;
2009 AVCodecContext *codec, *icodec;
2010 AVOutputStream *ost, **ost_table = NULL;
2015 uint8_t no_packet[MAX_FILES]={0};
2016 int no_packet_count=0;
2017 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2018 int nb_streams[AVMEDIA_TYPE_NB]={0};
2021 for (i = 0; i < nb_input_streams; i++)
2022 input_streams[i].start = av_gettime();
2024 /* output stream init */
2026 for(i=0;i<nb_output_files;i++) {
2027 os = output_files[i];
2028 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2029 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2030 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2031 ret = AVERROR(EINVAL);
2034 nb_ostreams += os->nb_streams;
2036 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2037 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2038 ret = AVERROR(EINVAL);
2042 /* Sanity check the mapping args -- do the input files & streams exist? */
2043 for(i=0;i<nb_stream_maps;i++) {
2044 int fi = stream_maps[i].file_index;
2045 int si = stream_maps[i].stream_index;
2047 if (fi < 0 || fi > nb_input_files - 1 ||
2048 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2049 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2050 ret = AVERROR(EINVAL);
2053 fi = stream_maps[i].sync_file_index;
2054 si = stream_maps[i].sync_stream_index;
2055 if (fi < 0 || fi > nb_input_files - 1 ||
2056 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2057 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2058 ret = AVERROR(EINVAL);
2063 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2067 for(k=0;k<nb_output_files;k++) {
2068 os = output_files[k];
2069 for(i=0;i<os->nb_streams;i++,n++) {
2070 nb_streams[os->streams[i]->codec->codec_type]++;
2073 for(step=1<<30; step; step>>=1){
2074 int found_streams[AVMEDIA_TYPE_NB]={0};
2075 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2076 nb_frame_threshold[j] += step;
2078 for(j=0; j<nb_input_streams; j++) {
2080 ist = &input_streams[j];
2083 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2085 for(pi=0; pi<f->nb_programs; pi++){
2086 AVProgram *p= f->programs[pi];
2087 if(p->id == opt_programid)
2088 for(si=0; si<p->nb_stream_indexes; si++){
2089 if(f->streams[ p->stream_index[si] ] == ist->st)
2094 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2095 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2096 found_streams[ist->st->codec->codec_type]++;
2099 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2100 if(found_streams[j] < nb_streams[j])
2101 nb_frame_threshold[j] -= step;
2104 for(k=0;k<nb_output_files;k++) {
2105 os = output_files[k];
2106 for(i=0;i<os->nb_streams;i++,n++) {
2108 ost = ost_table[n] = output_streams_for_file[k][i];
2109 ost->st = os->streams[i];
2110 if (nb_stream_maps > 0) {
2111 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2112 stream_maps[n].stream_index;
2114 /* Sanity check that the stream types match */
2115 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2116 int i= ost->file_index;
2117 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2118 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2119 stream_maps[n].file_index, stream_maps[n].stream_index,
2120 ost->file_index, ost->index);
2125 /* get corresponding input stream index : we select the first one with the right type */
2127 for (j = 0; j < nb_input_streams; j++) {
2129 ist = &input_streams[j];
2132 AVFormatContext *f = input_files[ist->file_index].ctx;
2134 for(pi=0; pi<f->nb_programs; pi++){
2135 AVProgram *p= f->programs[pi];
2136 if(p->id == opt_programid)
2137 for(si=0; si<p->nb_stream_indexes; si++){
2138 if(f->streams[ p->stream_index[si] ] == ist->st)
2143 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2144 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2145 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2146 ost->source_index = j;
2153 if(! opt_programid) {
2154 /* try again and reuse existing stream */
2155 for (j = 0; j < nb_input_streams; j++) {
2156 ist = &input_streams[j];
2157 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2158 && ist->st->discard != AVDISCARD_ALL) {
2159 ost->source_index = j;
2165 int i= ost->file_index;
2166 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2167 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2168 ost->file_index, ost->index);
2173 ist = &input_streams[ost->source_index];
2175 ost->sync_ist = (nb_stream_maps > 0) ?
2176 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2177 stream_maps[n].sync_stream_index] : ist;
2181 /* for each output stream, we compute the right encoding parameters */
2182 for(i=0;i<nb_ostreams;i++) {
2184 os = output_files[ost->file_index];
2185 ist = &input_streams[ost->source_index];
2187 codec = ost->st->codec;
2188 icodec = ist->st->codec;
2190 if (metadata_streams_autocopy)
2191 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2192 AV_DICT_DONT_OVERWRITE);
2194 ost->st->disposition = ist->st->disposition;
2195 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2196 codec->chroma_sample_location = icodec->chroma_sample_location;
2198 if (ost->st->stream_copy) {
2199 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2201 if (extra_size > INT_MAX)
2204 /* if stream_copy is selected, no need to decode or encode */
2205 codec->codec_id = icodec->codec_id;
2206 codec->codec_type = icodec->codec_type;
2208 if(!codec->codec_tag){
2209 if( !os->oformat->codec_tag
2210 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2211 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2212 codec->codec_tag = icodec->codec_tag;
2215 codec->bit_rate = icodec->bit_rate;
2216 codec->rc_max_rate = icodec->rc_max_rate;
2217 codec->rc_buffer_size = icodec->rc_buffer_size;
2218 codec->extradata= av_mallocz(extra_size);
2219 if (!codec->extradata)
2221 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2222 codec->extradata_size= icodec->extradata_size;
2223 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){
2224 codec->time_base = icodec->time_base;
2225 codec->time_base.num *= icodec->ticks_per_frame;
2226 av_reduce(&codec->time_base.num, &codec->time_base.den,
2227 codec->time_base.num, codec->time_base.den, INT_MAX);
2229 codec->time_base = ist->st->time_base;
2230 switch(codec->codec_type) {
2231 case AVMEDIA_TYPE_AUDIO:
2232 if(audio_volume != 256) {
2233 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2236 codec->channel_layout = icodec->channel_layout;
2237 codec->sample_rate = icodec->sample_rate;
2238 codec->channels = icodec->channels;
2239 codec->frame_size = icodec->frame_size;
2240 codec->audio_service_type = icodec->audio_service_type;
2241 codec->block_align= icodec->block_align;
2242 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2243 codec->block_align= 0;
2244 if(codec->codec_id == CODEC_ID_AC3)
2245 codec->block_align= 0;
2247 case AVMEDIA_TYPE_VIDEO:
2248 codec->pix_fmt = icodec->pix_fmt;
2249 codec->width = icodec->width;
2250 codec->height = icodec->height;
2251 codec->has_b_frames = icodec->has_b_frames;
2252 if (!codec->sample_aspect_ratio.num) {
2253 codec->sample_aspect_ratio =
2254 ost->st->sample_aspect_ratio =
2255 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2256 ist->st->codec->sample_aspect_ratio.num ?
2257 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2260 case AVMEDIA_TYPE_SUBTITLE:
2261 codec->width = icodec->width;
2262 codec->height = icodec->height;
2264 case AVMEDIA_TYPE_DATA:
2271 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2272 switch(codec->codec_type) {
2273 case AVMEDIA_TYPE_AUDIO:
2274 ost->fifo= av_fifo_alloc(1024);
2277 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2278 if (!codec->sample_rate) {
2279 codec->sample_rate = icodec->sample_rate;
2281 codec->sample_rate >>= icodec->lowres;
2283 choose_sample_rate(ost->st, ost->enc);
2284 codec->time_base = (AVRational){1, codec->sample_rate};
2285 if (!codec->channels) {
2286 codec->channels = icodec->channels;
2287 codec->channel_layout = icodec->channel_layout;
2289 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2290 codec->channel_layout = 0;
2291 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2292 icodec->request_channels = codec->channels;
2293 ist->decoding_needed = 1;
2294 ost->encoding_needed = 1;
2295 ost->resample_sample_fmt = icodec->sample_fmt;
2296 ost->resample_sample_rate = icodec->sample_rate;
2297 ost->resample_channels = icodec->channels;
2299 case AVMEDIA_TYPE_VIDEO:
2300 if (codec->pix_fmt == PIX_FMT_NONE)
2301 codec->pix_fmt = icodec->pix_fmt;
2302 choose_pixel_fmt(ost->st, ost->enc);
2304 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2305 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2308 ost->video_resample = codec->width != icodec->width ||
2309 codec->height != icodec->height ||
2310 codec->pix_fmt != icodec->pix_fmt;
2311 if (ost->video_resample) {
2312 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2314 if (!codec->width || !codec->height) {
2315 codec->width = icodec->width;
2316 codec->height = icodec->height;
2318 ost->resample_height = icodec->height;
2319 ost->resample_width = icodec->width;
2320 ost->resample_pix_fmt= icodec->pix_fmt;
2321 ost->encoding_needed = 1;
2322 ist->decoding_needed = 1;
2324 if (!ost->frame_rate.num)
2325 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2326 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2327 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2328 ost->frame_rate = ost->enc->supported_framerates[idx];
2330 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2331 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2332 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2333 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2334 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2338 if (configure_video_filters(ist, ost)) {
2339 fprintf(stderr, "Error opening filters!\n");
2344 case AVMEDIA_TYPE_SUBTITLE:
2345 ost->encoding_needed = 1;
2346 ist->decoding_needed = 1;
2353 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2354 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2355 char logfilename[1024];
2358 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2359 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2361 if (codec->flags & CODEC_FLAG_PASS1) {
2362 f = fopen(logfilename, "wb");
2364 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2370 size_t logbuffer_size;
2371 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2372 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2375 codec->stats_in = logbuffer;
2379 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2380 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2381 int size= codec->width * codec->height;
2382 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2387 bit_buffer = av_malloc(bit_buffer_size);
2389 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2391 ret = AVERROR(ENOMEM);
2395 /* open each encoder */
2396 for(i=0;i<nb_ostreams;i++) {
2398 if (ost->encoding_needed) {
2399 AVCodec *codec = ost->enc;
2400 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2402 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2403 ost->st->codec->codec_id, ost->file_index, ost->index);
2404 ret = AVERROR(EINVAL);
2407 if (dec->subtitle_header) {
2408 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2409 if (!ost->st->codec->subtitle_header) {
2410 ret = AVERROR(ENOMEM);
2413 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2414 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2416 if (avcodec_open(ost->st->codec, codec) < 0) {
2417 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2418 ost->file_index, ost->index);
2419 ret = AVERROR(EINVAL);
2422 extra_size += ost->st->codec->extradata_size;
2426 /* open each decoder */
2427 for (i = 0; i < nb_input_streams; i++) {
2428 ist = &input_streams[i];
2429 if (ist->decoding_needed) {
2430 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2432 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2434 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2435 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2436 ret = AVERROR(EINVAL);
2439 if (avcodec_open(ist->st->codec, codec) < 0) {
2440 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2441 ist->file_index, ist->st->index);
2442 ret = AVERROR(EINVAL);
2445 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2446 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2451 for (i = 0; i < nb_input_streams; i++) {
2453 ist = &input_streams[i];
2455 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2456 ist->next_pts = AV_NOPTS_VALUE;
2460 /* set meta data information from input file if required */
2461 for (i=0;i<nb_meta_data_maps;i++) {
2462 AVFormatContext *files[2];
2463 AVDictionary **meta[2];
2466 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2467 if ((index) < 0 || (index) >= (nb_elems)) {\
2468 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2470 ret = AVERROR(EINVAL);\
2474 int out_file_index = meta_data_maps[i][0].file;
2475 int in_file_index = meta_data_maps[i][1].file;
2476 if (in_file_index < 0 || out_file_index < 0)
2478 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2479 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2481 files[0] = output_files[out_file_index];
2482 files[1] = input_files[in_file_index].ctx;
2484 for (j = 0; j < 2; j++) {
2485 AVMetaDataMap *map = &meta_data_maps[i][j];
2487 switch (map->type) {
2489 meta[j] = &files[j]->metadata;
2492 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2493 meta[j] = &files[j]->streams[map->index]->metadata;
2496 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2497 meta[j] = &files[j]->chapters[map->index]->metadata;
2500 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2501 meta[j] = &files[j]->programs[map->index]->metadata;
2506 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2509 /* copy global metadata by default */
2510 if (metadata_global_autocopy) {
2512 for (i = 0; i < nb_output_files; i++)
2513 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2514 AV_DICT_DONT_OVERWRITE);
2517 /* copy chapters according to chapter maps */
2518 for (i = 0; i < nb_chapter_maps; i++) {
2519 int infile = chapter_maps[i].in_file;
2520 int outfile = chapter_maps[i].out_file;
2522 if (infile < 0 || outfile < 0)
2524 if (infile >= nb_input_files) {
2525 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2526 ret = AVERROR(EINVAL);
2529 if (outfile >= nb_output_files) {
2530 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2531 ret = AVERROR(EINVAL);
2534 copy_chapters(infile, outfile);
2537 /* copy chapters from the first input file that has them*/
2538 if (!nb_chapter_maps)
2539 for (i = 0; i < nb_input_files; i++) {
2540 if (!input_files[i].ctx->nb_chapters)
2543 for (j = 0; j < nb_output_files; j++)
2544 if ((ret = copy_chapters(i, j)) < 0)
2549 /* open files and write file headers */
2550 for(i=0;i<nb_output_files;i++) {
2551 os = output_files[i];
2552 if (av_write_header(os) < 0) {
2553 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2554 ret = AVERROR(EINVAL);
2557 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2563 /* dump the file output parameters - cannot be done before in case
2565 for(i=0;i<nb_output_files;i++) {
2566 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2569 /* dump the stream mapping */
2571 fprintf(stderr, "Stream mapping:\n");
2572 for(i=0;i<nb_ostreams;i++) {
2574 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2575 input_streams[ost->source_index].file_index,
2576 input_streams[ost->source_index].st->index,
2579 if (ost->sync_ist != &input_streams[ost->source_index])
2580 fprintf(stderr, " [sync #%d.%d]",
2581 ost->sync_ist->file_index,
2582 ost->sync_ist->st->index);
2583 fprintf(stderr, "\n");
2588 fprintf(stderr, "%s\n", error);
2593 print_sdp(output_files, nb_output_files);
2598 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2599 avio_set_interrupt_cb(decode_interrupt_cb);
2603 timer_start = av_gettime();
2605 for(; received_sigterm == 0;) {
2606 int file_index, ist_index;
2614 /* if 'q' pressed, exits */
2618 /* read_key() returns 0 on EOF */
2622 if (key == '+') verbose++;
2623 if (key == '-') verbose--;
2624 if (key == 's') qp_hist ^= 1;
2627 do_hex_dump = do_pkt_dump = 0;
2628 } else if(do_pkt_dump){
2632 av_log_set_level(AV_LOG_DEBUG);
2634 if (key == 'd' || key == 'D'){
2637 debug = input_streams[0].st->codec->debug<<1;
2638 if(!debug) debug = 1;
2639 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2642 scanf("%d", &debug);
2643 for(i=0;i<nb_input_streams;i++) {
2644 input_streams[i].st->codec->debug = debug;
2646 for(i=0;i<nb_ostreams;i++) {
2648 ost->st->codec->debug = debug;
2650 if(debug) av_log_set_level(AV_LOG_DEBUG);
2651 fprintf(stderr,"debug=%d\n", debug);
2654 fprintf(stderr, "key function\n"
2655 "? show this help\n"
2656 "+ increase verbosity\n"
2657 "- decrease verbosity\n"
2658 "D cycle through available debug modes\n"
2659 "h dump packets/hex press to cycle through the 3 states\n"
2661 "s Show QP histogram\n"
2666 /* select the stream that we must read now by looking at the
2667 smallest output pts */
2669 for(i=0;i<nb_ostreams;i++) {
2672 os = output_files[ost->file_index];
2673 ist = &input_streams[ost->source_index];
2674 if(ist->is_past_recording_time || no_packet[ist->file_index])
2676 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2677 ipts = (double)ist->pts;
2678 if (!input_files[ist->file_index].eof_reached){
2679 if(ipts < ipts_min) {
2681 if(input_sync ) file_index = ist->file_index;
2683 if(opts < opts_min) {
2685 if(!input_sync) file_index = ist->file_index;
2688 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2693 /* if none, if is finished */
2694 if (file_index < 0) {
2695 if(no_packet_count){
2697 memset(no_packet, 0, sizeof(no_packet));
2704 /* finish if limit size exhausted */
2705 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2708 /* read a frame from it and output it in the fifo */
2709 is = input_files[file_index].ctx;
2710 ret= av_read_frame(is, &pkt);
2711 if(ret == AVERROR(EAGAIN)){
2712 no_packet[file_index]=1;
2717 input_files[file_index].eof_reached = 1;
2725 memset(no_packet, 0, sizeof(no_packet));
2728 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2729 is->streams[pkt.stream_index]);
2731 /* the following test is needed in case new streams appear
2732 dynamically in stream : we ignore them */
2733 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2734 goto discard_packet;
2735 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2736 ist = &input_streams[ist_index];
2738 goto discard_packet;
2740 if (pkt.dts != AV_NOPTS_VALUE)
2741 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2742 if (pkt.pts != AV_NOPTS_VALUE)
2743 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2745 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2746 && input_files_ts_scale[file_index][pkt.stream_index]){
2747 if(pkt.pts != AV_NOPTS_VALUE)
2748 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2749 if(pkt.dts != AV_NOPTS_VALUE)
2750 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2753 // 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);
2754 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2755 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2756 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2757 int64_t delta= pkt_dts - ist->next_pts;
2758 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2759 input_files_ts_offset[ist->file_index]-= delta;
2761 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2762 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2763 if(pkt.pts != AV_NOPTS_VALUE)
2764 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2768 /* finish if recording time exhausted */
2769 if (recording_time != INT64_MAX &&
2770 (pkt.pts != AV_NOPTS_VALUE ?
2771 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2773 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2775 ist->is_past_recording_time = 1;
2776 goto discard_packet;
2779 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2780 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2783 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2784 ist->file_index, ist->st->index);
2787 av_free_packet(&pkt);
2792 av_free_packet(&pkt);
2794 /* dump report by using the output first video and audio streams */
2795 print_report(output_files, ost_table, nb_ostreams, 0);
2798 /* at the end of stream, we must flush the decoder buffers */
2799 for (i = 0; i < nb_input_streams; i++) {
2800 ist = &input_streams[i];
2801 if (ist->decoding_needed) {
2802 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2808 /* write the trailer if needed and close file */
2809 for(i=0;i<nb_output_files;i++) {
2810 os = output_files[i];
2811 av_write_trailer(os);
2814 /* dump report by using the first video and audio streams */
2815 print_report(output_files, ost_table, nb_ostreams, 1);
2817 /* close each encoder */
2818 for(i=0;i<nb_ostreams;i++) {
2820 if (ost->encoding_needed) {
2821 av_freep(&ost->st->codec->stats_in);
2822 avcodec_close(ost->st->codec);
2825 avfilter_graph_free(&ost->graph);
2829 /* close each decoder */
2830 for (i = 0; i < nb_input_streams; i++) {
2831 ist = &input_streams[i];
2832 if (ist->decoding_needed) {
2833 avcodec_close(ist->st->codec);
2841 av_freep(&bit_buffer);
2844 for(i=0;i<nb_ostreams;i++) {
2847 if (ost->st->stream_copy)
2848 av_freep(&ost->st->codec->extradata);
2850 fclose(ost->logfile);
2851 ost->logfile = NULL;
2853 av_fifo_free(ost->fifo); /* works even if fifo is not
2854 initialized but set to zero */
2855 av_freep(&ost->st->codec->subtitle_header);
2856 av_free(ost->resample_frame.data[0]);
2857 av_free(ost->forced_kf_pts);
2858 if (ost->video_resample)
2859 sws_freeContext(ost->img_resample_ctx);
2861 audio_resample_close(ost->resample);
2862 if (ost->reformat_ctx)
2863 av_audio_convert_free(ost->reformat_ctx);
2872 static int opt_format(const char *opt, const char *arg)
2874 last_asked_format = arg;
2878 static int opt_video_rc_override_string(const char *opt, const char *arg)
2880 video_rc_override_string = arg;
2884 static int opt_me_threshold(const char *opt, const char *arg)
2886 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2890 static int opt_verbose(const char *opt, const char *arg)
2892 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2896 static int opt_frame_rate(const char *opt, const char *arg)
2898 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2899 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2905 static int opt_bitrate(const char *opt, const char *arg)
2907 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2909 opt_default(opt, arg);
2911 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2912 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2917 static int opt_frame_crop(const char *opt, const char *arg)
2919 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2920 return AVERROR(EINVAL);
2923 static int opt_frame_size(const char *opt, const char *arg)
2925 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2926 fprintf(stderr, "Incorrect frame size\n");
2927 return AVERROR(EINVAL);
2932 static int opt_pad(const char *opt, const char *arg) {
2933 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2937 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2939 if (strcmp(arg, "list")) {
2940 frame_pix_fmt = av_get_pix_fmt(arg);
2941 if (frame_pix_fmt == PIX_FMT_NONE) {
2942 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2943 return AVERROR(EINVAL);
2946 opt_pix_fmts(NULL, NULL);
2952 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2959 p = strchr(arg, ':');
2961 x = strtol(arg, &end, 10);
2963 y = strtol(end+1, &end, 10);
2965 ar = (double)x / (double)y;
2967 ar = strtod(arg, NULL);
2970 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2971 return AVERROR(EINVAL);
2973 frame_aspect_ratio = ar;
2977 static int opt_metadata(const char *opt, const char *arg)
2979 char *mid= strchr(arg, '=');
2982 fprintf(stderr, "Missing =\n");
2987 av_dict_set(&metadata, arg, mid, 0);
2992 static int opt_qscale(const char *opt, const char *arg)
2994 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2995 if (video_qscale <= 0 || video_qscale > 255) {
2996 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2997 return AVERROR(EINVAL);
3002 static int opt_top_field_first(const char *opt, const char *arg)
3004 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
3005 opt_default(opt, arg);
3009 static int opt_thread_count(const char *opt, const char *arg)
3011 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3014 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
3019 static int opt_audio_sample_fmt(const char *opt, const char *arg)
3021 if (strcmp(arg, "list")) {
3022 audio_sample_fmt = av_get_sample_fmt(arg);
3023 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
3024 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
3025 return AVERROR(EINVAL);
3030 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
3031 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
3037 static int opt_audio_rate(const char *opt, const char *arg)
3039 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3043 static int opt_audio_channels(const char *opt, const char *arg)
3045 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3049 static int opt_video_channel(const char *opt, const char *arg)
3051 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3055 static int opt_video_standard(const char *opt, const char *arg)
3057 video_standard = av_strdup(arg);
3061 static int opt_codec(const char *opt, const char *arg)
3063 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
3065 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
3066 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
3067 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
3068 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
3070 av_freep(pcodec_name);
3071 if (!strcmp(arg, "copy")) {
3074 *pcodec_name = av_strdup(arg);
3079 static int opt_codec_tag(const char *opt, const char *arg)
3082 uint32_t *codec_tag;
3084 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3085 !strcmp(opt, "vtag") ? &video_codec_tag :
3086 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3090 *codec_tag = strtol(arg, &tail, 0);
3092 *codec_tag = AV_RL32(arg);
3097 static int opt_map(const char *opt, const char *arg)
3102 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3103 m = &stream_maps[nb_stream_maps-1];
3105 m->file_index = strtol(arg, &p, 0);
3109 m->stream_index = strtol(p, &p, 0);
3112 m->sync_file_index = strtol(p, &p, 0);
3115 m->sync_stream_index = strtol(p, &p, 0);
3117 m->sync_file_index = m->file_index;
3118 m->sync_stream_index = m->stream_index;
3123 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3134 *index = strtol(++arg, endptr, 0);
3137 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3144 static int opt_map_metadata(const char *opt, const char *arg)
3146 AVMetaDataMap *m, *m1;
3149 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3150 &nb_meta_data_maps, nb_meta_data_maps + 1);
3152 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3153 m->file = strtol(arg, &p, 0);
3154 parse_meta_type(p, &m->type, &m->index, &p);
3158 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3159 m1->file = strtol(p, &p, 0);
3160 parse_meta_type(p, &m1->type, &m1->index, &p);
3162 if (m->type == 'g' || m1->type == 'g')
3163 metadata_global_autocopy = 0;
3164 if (m->type == 's' || m1->type == 's')
3165 metadata_streams_autocopy = 0;
3166 if (m->type == 'c' || m1->type == 'c')
3167 metadata_chapters_autocopy = 0;
3172 static int opt_map_meta_data(const char *opt, const char *arg)
3174 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3175 "Use -map_metadata instead.\n");
3176 return opt_map_metadata(opt, arg);
3179 static int opt_map_chapters(const char *opt, const char *arg)
3184 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3185 nb_chapter_maps + 1);
3186 c = &chapter_maps[nb_chapter_maps - 1];
3187 c->out_file = strtol(arg, &p, 0);
3191 c->in_file = strtol(p, &p, 0);
3195 static int opt_input_ts_scale(const char *opt, const char *arg)
3197 unsigned int stream;
3201 stream = strtol(arg, &p, 0);
3204 scale= strtod(p, &p);
3206 if(stream >= MAX_STREAMS)
3209 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);
3210 input_files_ts_scale[nb_input_files][stream]= scale;
3214 static int opt_recording_time(const char *opt, const char *arg)
3216 recording_time = parse_time_or_die(opt, arg, 1);
3220 static int opt_start_time(const char *opt, const char *arg)
3222 start_time = parse_time_or_die(opt, arg, 1);
3226 static int opt_recording_timestamp(const char *opt, const char *arg)
3228 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3232 static int opt_input_ts_offset(const char *opt, const char *arg)
3234 input_ts_offset = parse_time_or_die(opt, arg, 1);
3238 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3240 const char *codec_string = encoder ? "encoder" : "decoder";
3244 return CODEC_ID_NONE;
3246 avcodec_find_encoder_by_name(name) :
3247 avcodec_find_decoder_by_name(name);
3249 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3252 if(codec->type != type) {
3253 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3256 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3257 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3258 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3259 "results.\nAdd '-strict experimental' if you want to use it.\n",
3260 codec_string, codec->name);
3262 avcodec_find_encoder(codec->id) :
3263 avcodec_find_decoder(codec->id);
3264 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3265 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3266 codec_string, codec->name);
3272 static int opt_input_file(const char *opt, const char *filename)
3274 AVFormatContext *ic;
3275 AVFormatParameters params, *ap = ¶ms;
3276 AVInputFormat *file_iformat = NULL;
3277 int err, i, ret, rfps, rfps_base;
3280 if (last_asked_format) {
3281 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3282 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3285 last_asked_format = NULL;
3288 if (!strcmp(filename, "-"))
3291 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3292 !strcmp(filename, "/dev/stdin");
3294 /* get default parameters from command line */
3295 ic = avformat_alloc_context();
3297 print_error(filename, AVERROR(ENOMEM));
3301 memset(ap, 0, sizeof(*ap));
3302 ap->prealloced_context = 1;
3303 ap->sample_rate = audio_sample_rate;
3304 ap->channels = audio_channels;
3305 ap->time_base.den = frame_rate.num;
3306 ap->time_base.num = frame_rate.den;
3307 ap->width = frame_width;
3308 ap->height = frame_height;
3309 ap->pix_fmt = frame_pix_fmt;
3310 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3311 ap->channel = video_channel;
3312 ap->standard = video_standard;
3314 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3316 ic->video_codec_id =
3317 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3318 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3319 ic->audio_codec_id =
3320 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3321 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3322 ic->subtitle_codec_id=
3323 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3324 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3325 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3327 /* open the input file with generic libav function */
3328 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3330 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3331 err = av_demuxer_open(ic, ap);
3333 avformat_free_context(ic);
3336 print_error(filename, err);
3342 for(i=0; i<ic->nb_streams; i++){
3343 ic->streams[i]->discard= AVDISCARD_ALL;
3345 for(i=0; i<ic->nb_programs; i++){
3346 AVProgram *p= ic->programs[i];
3347 if(p->id != opt_programid){
3348 p->discard = AVDISCARD_ALL;
3351 for(j=0; j<p->nb_stream_indexes; j++){
3352 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3357 fprintf(stderr, "Specified program id not found\n");
3363 ic->loop_input = loop_input;
3365 /* If not enough info to get the stream parameters, we decode the
3366 first frames to get it. (used in mpeg case for example) */
3367 ret = av_find_stream_info(ic);
3368 if (ret < 0 && verbose >= 0) {
3369 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3370 av_close_input_file(ic);
3374 timestamp = start_time;
3375 /* add the stream start time */
3376 if (ic->start_time != AV_NOPTS_VALUE)
3377 timestamp += ic->start_time;
3379 /* if seeking requested, we execute it */
3380 if (start_time != 0) {
3381 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3383 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3384 filename, (double)timestamp / AV_TIME_BASE);
3386 /* reset seek info */
3390 /* update the current parameters so that they match the one of the input stream */
3391 for(i=0;i<ic->nb_streams;i++) {
3392 AVStream *st = ic->streams[i];
3393 AVCodecContext *dec = st->codec;
3396 dec->thread_count = thread_count;
3397 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3399 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3400 ist = &input_streams[nb_input_streams - 1];
3402 ist->file_index = nb_input_files;
3405 switch (dec->codec_type) {
3406 case AVMEDIA_TYPE_AUDIO:
3407 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3408 if(!input_codecs[nb_input_codecs-1])
3409 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3410 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]);
3411 channel_layout = dec->channel_layout;
3412 audio_sample_fmt = dec->sample_fmt;
3414 st->discard= AVDISCARD_ALL;
3416 case AVMEDIA_TYPE_VIDEO:
3417 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3418 if(!input_codecs[nb_input_codecs-1])
3419 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3420 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]);
3421 rfps = ic->streams[i]->r_frame_rate.num;
3422 rfps_base = ic->streams[i]->r_frame_rate.den;
3424 dec->flags |= CODEC_FLAG_EMU_EDGE;
3425 dec->height >>= dec->lowres;
3426 dec->width >>= dec->lowres;
3429 dec->debug |= FF_DEBUG_MV;
3431 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3434 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3435 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3437 (float)rfps / rfps_base, rfps, rfps_base);
3441 st->discard= AVDISCARD_ALL;
3442 else if(video_discard)
3443 st->discard= video_discard;
3445 case AVMEDIA_TYPE_DATA:
3447 case AVMEDIA_TYPE_SUBTITLE:
3448 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3449 if(!input_codecs[nb_input_codecs-1])
3450 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3451 if(subtitle_disable)
3452 st->discard = AVDISCARD_ALL;
3454 case AVMEDIA_TYPE_ATTACHMENT:
3455 case AVMEDIA_TYPE_UNKNOWN:
3462 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3463 /* dump the file content */
3465 av_dump_format(ic, nb_input_files, filename, 0);
3467 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3468 input_files[nb_input_files - 1].ctx = ic;
3469 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3471 top_field_first = -1;
3473 frame_rate = (AVRational){0, 0};
3474 frame_pix_fmt = PIX_FMT_NONE;
3477 audio_sample_rate = 0;
3480 av_freep(&video_codec_name);
3481 av_freep(&audio_codec_name);
3482 av_freep(&subtitle_codec_name);
3488 static void check_inputs(int *has_video_ptr,
3490 int *has_subtitle_ptr,
3493 int has_video, has_audio, has_subtitle, has_data, i, j;
3494 AVFormatContext *ic;
3501 for(j=0;j<nb_input_files;j++) {
3502 ic = input_files[j].ctx;
3503 for(i=0;i<ic->nb_streams;i++) {
3504 AVCodecContext *enc = ic->streams[i]->codec;
3505 switch(enc->codec_type) {
3506 case AVMEDIA_TYPE_AUDIO:
3509 case AVMEDIA_TYPE_VIDEO:
3512 case AVMEDIA_TYPE_SUBTITLE:
3515 case AVMEDIA_TYPE_DATA:
3516 case AVMEDIA_TYPE_ATTACHMENT:
3517 case AVMEDIA_TYPE_UNKNOWN:
3525 *has_video_ptr = has_video;
3526 *has_audio_ptr = has_audio;
3527 *has_subtitle_ptr = has_subtitle;
3528 *has_data_ptr = has_data;
3531 static void new_video_stream(AVFormatContext *oc, int file_idx)
3534 AVOutputStream *ost;
3535 AVCodecContext *video_enc;
3536 enum CodecID codec_id = CODEC_ID_NONE;
3537 AVCodec *codec= NULL;
3539 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3541 fprintf(stderr, "Could not alloc stream\n");
3544 ost = new_output_stream(oc, file_idx);
3546 if(!video_stream_copy){
3547 if (video_codec_name) {
3548 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3549 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3550 codec = avcodec_find_encoder_by_name(video_codec_name);
3553 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3554 codec = avcodec_find_encoder(codec_id);
3556 ost->frame_aspect_ratio = frame_aspect_ratio;
3557 frame_aspect_ratio = 0;
3559 ost->avfilter = vfilters;
3564 avcodec_get_context_defaults3(st->codec, codec);
3565 ost->bitstream_filters = video_bitstream_filters;
3566 video_bitstream_filters= NULL;
3568 st->codec->thread_count= thread_count;
3570 video_enc = st->codec;
3573 video_enc->codec_tag= video_codec_tag;
3575 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3576 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3577 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3580 if (video_stream_copy) {
3581 st->stream_copy = 1;
3582 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3583 video_enc->sample_aspect_ratio =
3584 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3590 ost->frame_rate = frame_rate;
3591 video_enc->codec_id = codec_id;
3592 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3594 video_enc->width = frame_width;
3595 video_enc->height = frame_height;
3596 video_enc->pix_fmt = frame_pix_fmt;
3597 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3598 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3601 video_enc->gop_size = 0;
3602 if (video_qscale || same_quality) {
3603 video_enc->flags |= CODEC_FLAG_QSCALE;
3604 video_enc->global_quality=
3605 st->quality = FF_QP2LAMBDA * video_qscale;
3609 video_enc->intra_matrix = intra_matrix;
3611 video_enc->inter_matrix = inter_matrix;
3613 p= video_rc_override_string;
3616 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3618 fprintf(stderr, "error parsing rc_override\n");
3621 video_enc->rc_override=
3622 av_realloc(video_enc->rc_override,
3623 sizeof(RcOverride)*(i+1));
3624 video_enc->rc_override[i].start_frame= start;
3625 video_enc->rc_override[i].end_frame = end;
3627 video_enc->rc_override[i].qscale= q;
3628 video_enc->rc_override[i].quality_factor= 1.0;
3631 video_enc->rc_override[i].qscale= 0;
3632 video_enc->rc_override[i].quality_factor= -q/100.0;
3637 video_enc->rc_override_count=i;
3638 if (!video_enc->rc_initial_buffer_occupancy)
3639 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3640 video_enc->me_threshold= me_threshold;
3641 video_enc->intra_dc_precision= intra_dc_precision - 8;
3644 video_enc->flags|= CODEC_FLAG_PSNR;
3649 video_enc->flags |= CODEC_FLAG_PASS1;
3651 video_enc->flags |= CODEC_FLAG_PASS2;
3655 if (forced_key_frames)
3656 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3658 if (video_language) {
3659 av_dict_set(&st->metadata, "language", video_language, 0);
3660 av_freep(&video_language);
3663 /* reset some key parameters */
3665 av_freep(&video_codec_name);
3666 av_freep(&forced_key_frames);
3667 video_stream_copy = 0;
3668 frame_pix_fmt = PIX_FMT_NONE;
3671 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3674 AVOutputStream *ost;
3675 AVCodec *codec= NULL;
3676 AVCodecContext *audio_enc;
3677 enum CodecID codec_id = CODEC_ID_NONE;
3679 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3681 fprintf(stderr, "Could not alloc stream\n");
3684 ost = new_output_stream(oc, file_idx);
3686 if(!audio_stream_copy){
3687 if (audio_codec_name) {
3688 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3689 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3690 codec = avcodec_find_encoder_by_name(audio_codec_name);
3693 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3694 codec = avcodec_find_encoder(codec_id);
3698 avcodec_get_context_defaults3(st->codec, codec);
3700 ost->bitstream_filters = audio_bitstream_filters;
3701 audio_bitstream_filters= NULL;
3703 st->codec->thread_count= thread_count;
3705 audio_enc = st->codec;
3706 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3709 audio_enc->codec_tag= audio_codec_tag;
3711 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3712 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3713 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3715 if (audio_stream_copy) {
3716 st->stream_copy = 1;
3718 audio_enc->codec_id = codec_id;
3719 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3721 if (audio_qscale > QSCALE_NONE) {
3722 audio_enc->flags |= CODEC_FLAG_QSCALE;
3723 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3726 audio_enc->channels = audio_channels;
3727 audio_enc->sample_fmt = audio_sample_fmt;
3728 if (audio_sample_rate)
3729 audio_enc->sample_rate = audio_sample_rate;
3730 audio_enc->channel_layout = channel_layout;
3731 choose_sample_fmt(st, codec);
3733 if (audio_language) {
3734 av_dict_set(&st->metadata, "language", audio_language, 0);
3735 av_freep(&audio_language);
3738 /* reset some key parameters */
3740 av_freep(&audio_codec_name);
3741 audio_stream_copy = 0;
3744 static void new_data_stream(AVFormatContext *oc, int file_idx)
3747 AVCodec *codec=NULL;
3748 AVCodecContext *data_enc;
3750 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3752 fprintf(stderr, "Could not alloc stream\n");
3755 new_output_stream(oc, file_idx);
3756 data_enc = st->codec;
3757 if (!data_stream_copy) {
3758 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3761 avcodec_get_context_defaults3(st->codec, codec);
3763 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3766 data_enc->codec_tag= data_codec_tag;
3768 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3769 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3770 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3772 if (data_stream_copy) {
3773 st->stream_copy = 1;
3777 av_freep(&data_codec_name);
3778 data_stream_copy = 0;
3781 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3784 AVOutputStream *ost;
3785 AVCodec *codec=NULL;
3786 AVCodecContext *subtitle_enc;
3787 enum CodecID codec_id = CODEC_ID_NONE;
3789 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3791 fprintf(stderr, "Could not alloc stream\n");
3794 ost = new_output_stream(oc, file_idx);
3795 subtitle_enc = st->codec;
3796 if(!subtitle_stream_copy){
3797 if (subtitle_codec_name) {
3798 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3799 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3800 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3803 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3804 codec = avcodec_find_encoder(codec_id);
3807 avcodec_get_context_defaults3(st->codec, codec);
3809 ost->bitstream_filters = subtitle_bitstream_filters;
3810 subtitle_bitstream_filters= NULL;
3812 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3814 if(subtitle_codec_tag)
3815 subtitle_enc->codec_tag= subtitle_codec_tag;
3817 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3818 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3819 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3821 if (subtitle_stream_copy) {
3822 st->stream_copy = 1;
3824 subtitle_enc->codec_id = codec_id;
3825 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3828 if (subtitle_language) {
3829 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3830 av_freep(&subtitle_language);
3833 subtitle_disable = 0;
3834 av_freep(&subtitle_codec_name);
3835 subtitle_stream_copy = 0;
3838 static int opt_new_stream(const char *opt, const char *arg)
3840 AVFormatContext *oc;
3841 int file_idx = nb_output_files - 1;
3842 if (nb_output_files <= 0) {
3843 fprintf(stderr, "At least one output file must be specified\n");
3846 oc = output_files[file_idx];
3848 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3849 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3850 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3851 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3856 /* arg format is "output-stream-index:streamid-value". */
3857 static int opt_streamid(const char *opt, const char *arg)
3863 av_strlcpy(idx_str, arg, sizeof(idx_str));
3864 p = strchr(idx_str, ':');
3867 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3872 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3873 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3874 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3878 static int opt_output_file(const char *opt, const char *filename)
3880 AVFormatContext *oc;
3881 int err, use_video, use_audio, use_subtitle, use_data;
3882 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3883 AVFormatParameters params, *ap = ¶ms;
3884 AVOutputFormat *file_oformat;
3886 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3887 fprintf(stderr, "Too many output files\n");
3891 if (!strcmp(filename, "-"))
3894 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3895 last_asked_format = NULL;
3897 print_error(filename, err);
3900 file_oformat= oc->oformat;
3902 if (!strcmp(file_oformat->name, "ffm") &&
3903 av_strstart(filename, "http:", NULL)) {
3904 /* special case for files sent to ffserver: we get the stream
3905 parameters from ffserver */
3906 int err = read_ffserver_streams(oc, filename);
3908 print_error(filename, err);
3912 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3913 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3914 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3915 use_data = data_stream_copy || data_codec_name; /* XXX once generic data codec will be available add a ->data_codec reference and use it here */
3917 /* disable if no corresponding type found and at least one
3919 if (nb_input_files > 0) {
3920 check_inputs(&input_has_video,
3922 &input_has_subtitle,
3925 if (!input_has_video)
3927 if (!input_has_audio)
3929 if (!input_has_subtitle)
3931 if (!input_has_data)
3935 /* manual disable */
3936 if (audio_disable) use_audio = 0;
3937 if (video_disable) use_video = 0;
3938 if (subtitle_disable) use_subtitle = 0;
3939 if (data_disable) use_data = 0;
3941 if (use_video) new_video_stream(oc, nb_output_files);
3942 if (use_audio) new_audio_stream(oc, nb_output_files);
3943 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3944 if (use_data) new_data_stream(oc, nb_output_files);
3946 oc->timestamp = recording_timestamp;
3948 av_dict_copy(&oc->metadata, metadata, 0);
3949 av_dict_free(&metadata);
3952 output_files[nb_output_files++] = oc;
3954 /* check filename in case of an image number is expected */
3955 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3956 if (!av_filename_number_test(oc->filename)) {
3957 print_error(oc->filename, AVERROR(EINVAL));
3962 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3963 /* test if it already exists to avoid loosing precious files */
3964 if (!file_overwrite &&
3965 (strchr(filename, ':') == NULL ||
3966 filename[1] == ':' ||
3967 av_strstart(filename, "file:", NULL))) {
3968 if (avio_check(filename, 0) == 0) {
3970 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3972 if (!read_yesno()) {
3973 fprintf(stderr, "Not overwriting - exiting\n");
3978 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3985 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3986 print_error(filename, err);
3991 memset(ap, 0, sizeof(*ap));
3992 if (av_set_parameters(oc, ap) < 0) {
3993 fprintf(stderr, "%s: Invalid encoding parameters\n",
3998 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3999 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
4000 oc->loop_output = loop_output;
4002 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
4004 frame_rate = (AVRational){0, 0};
4007 audio_sample_rate = 0;
4010 av_freep(&forced_key_frames);
4016 /* same option as mencoder */
4017 static int opt_pass(const char *opt, const char *arg)
4019 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4023 static int64_t getutime(void)
4026 struct rusage rusage;
4028 getrusage(RUSAGE_SELF, &rusage);
4029 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4030 #elif HAVE_GETPROCESSTIMES
4032 FILETIME c, e, k, u;
4033 proc = GetCurrentProcess();
4034 GetProcessTimes(proc, &c, &e, &k, &u);
4035 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4037 return av_gettime();
4041 static int64_t getmaxrss(void)
4043 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4044 struct rusage rusage;
4045 getrusage(RUSAGE_SELF, &rusage);
4046 return (int64_t)rusage.ru_maxrss * 1024;
4047 #elif HAVE_GETPROCESSMEMORYINFO
4049 PROCESS_MEMORY_COUNTERS memcounters;
4050 proc = GetCurrentProcess();
4051 memcounters.cb = sizeof(memcounters);
4052 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4053 return memcounters.PeakPagefileUsage;
4059 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4062 const char *p = str;
4069 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4076 static int opt_inter_matrix(const char *opt, const char *arg)
4078 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4079 parse_matrix_coeffs(inter_matrix, arg);
4083 static int opt_intra_matrix(const char *opt, const char *arg)
4085 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4086 parse_matrix_coeffs(intra_matrix, arg);
4090 static void show_usage(void)
4092 printf("Hyper fast Audio and Video encoder\n");
4093 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4097 static int opt_help(const char *opt, const char *arg)
4100 AVOutputFormat *oformat = NULL;
4102 av_log_set_callback(log_callback_help);
4104 show_help_options(options, "Main options:\n",
4105 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4106 show_help_options(options, "\nAdvanced options:\n",
4107 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4109 show_help_options(options, "\nVideo options:\n",
4110 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4112 show_help_options(options, "\nAdvanced Video options:\n",
4113 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4114 OPT_VIDEO | OPT_EXPERT);
4115 show_help_options(options, "\nAudio options:\n",
4116 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4118 show_help_options(options, "\nAdvanced Audio options:\n",
4119 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4120 OPT_AUDIO | OPT_EXPERT);
4121 show_help_options(options, "\nSubtitle options:\n",
4122 OPT_SUBTITLE | OPT_GRAB,
4124 show_help_options(options, "\nAudio/Video grab options:\n",
4128 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4131 /* individual codec options */
4133 while ((c = av_codec_next(c))) {
4134 if (c->priv_class) {
4135 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4140 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4143 /* individual muxer options */
4144 while ((oformat = av_oformat_next(oformat))) {
4145 if (oformat->priv_class) {
4146 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4151 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4155 static int opt_target(const char *opt, const char *arg)
4157 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4158 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4160 if(!strncmp(arg, "pal-", 4)) {
4163 } else if(!strncmp(arg, "ntsc-", 5)) {
4166 } else if(!strncmp(arg, "film-", 5)) {
4171 /* Calculate FR via float to avoid int overflow */
4172 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4175 } else if((fr == 29970) || (fr == 23976)) {
4178 /* Try to determine PAL/NTSC by peeking in the input files */
4179 if(nb_input_files) {
4181 for (j = 0; j < nb_input_files; j++) {
4182 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4183 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4184 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4186 fr = c->time_base.den * 1000 / c->time_base.num;
4190 } else if((fr == 29970) || (fr == 23976)) {
4200 if(verbose > 0 && norm != UNKNOWN)
4201 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4204 if(norm == UNKNOWN) {
4205 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4206 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4207 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4211 if(!strcmp(arg, "vcd")) {
4212 opt_codec("vcodec", "mpeg1video");
4213 opt_codec("acodec", "mp2");
4214 opt_format("f", "vcd");
4216 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4217 opt_frame_rate("r", frame_rates[norm]);
4218 opt_default("g", norm == PAL ? "15" : "18");
4220 opt_default("b", "1150000");
4221 opt_default("maxrate", "1150000");
4222 opt_default("minrate", "1150000");
4223 opt_default("bufsize", "327680"); // 40*1024*8;
4225 opt_default("ab", "224000");
4226 audio_sample_rate = 44100;
4229 opt_default("packetsize", "2324");
4230 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4232 /* We have to offset the PTS, so that it is consistent with the SCR.
4233 SCR starts at 36000, but the first two packs contain only padding
4234 and the first pack from the other stream, respectively, may also have
4235 been written before.
4236 So the real data starts at SCR 36000+3*1200. */
4237 mux_preload= (36000+3*1200) / 90000.0; //0.44
4238 } else if(!strcmp(arg, "svcd")) {
4240 opt_codec("vcodec", "mpeg2video");
4241 opt_codec("acodec", "mp2");
4242 opt_format("f", "svcd");
4244 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4245 opt_frame_rate("r", frame_rates[norm]);
4246 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4247 opt_default("g", norm == PAL ? "15" : "18");
4249 opt_default("b", "2040000");
4250 opt_default("maxrate", "2516000");
4251 opt_default("minrate", "0"); //1145000;
4252 opt_default("bufsize", "1835008"); //224*1024*8;
4253 opt_default("flags", "+scan_offset");
4256 opt_default("ab", "224000");
4257 audio_sample_rate = 44100;
4259 opt_default("packetsize", "2324");
4261 } else if(!strcmp(arg, "dvd")) {
4263 opt_codec("vcodec", "mpeg2video");
4264 opt_codec("acodec", "ac3");
4265 opt_format("f", "dvd");
4267 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4268 opt_frame_rate("r", frame_rates[norm]);
4269 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4270 opt_default("g", norm == PAL ? "15" : "18");
4272 opt_default("b", "6000000");
4273 opt_default("maxrate", "9000000");
4274 opt_default("minrate", "0"); //1500000;
4275 opt_default("bufsize", "1835008"); //224*1024*8;
4277 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4278 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4280 opt_default("ab", "448000");
4281 audio_sample_rate = 48000;
4283 } else if(!strncmp(arg, "dv", 2)) {
4285 opt_format("f", "dv");
4287 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4288 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4289 norm == PAL ? "yuv420p" : "yuv411p");
4290 opt_frame_rate("r", frame_rates[norm]);
4292 audio_sample_rate = 48000;
4296 fprintf(stderr, "Unknown target: %s\n", arg);
4297 return AVERROR(EINVAL);
4302 static int opt_vstats_file(const char *opt, const char *arg)
4304 av_free (vstats_filename);
4305 vstats_filename=av_strdup (arg);
4309 static int opt_vstats(const char *opt, const char *arg)
4312 time_t today2 = time(NULL);
4313 struct tm *today = localtime(&today2);
4315 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4317 return opt_vstats_file(opt, filename);
4320 static int opt_bsf(const char *opt, const char *arg)
4322 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4323 AVBitStreamFilterContext **bsfp;
4326 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4330 bsfp= *opt == 'v' ? &video_bitstream_filters :
4331 *opt == 'a' ? &audio_bitstream_filters :
4332 &subtitle_bitstream_filters;
4334 bsfp= &(*bsfp)->next;
4341 static int opt_preset(const char *opt, const char *arg)
4344 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4345 char *codec_name = *opt == 'v' ? video_codec_name :
4346 *opt == 'a' ? audio_codec_name :
4347 subtitle_codec_name;
4349 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4350 fprintf(stderr, "File for preset '%s' not found\n", arg);
4355 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4356 if(line[0] == '#' && !e)
4358 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4360 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4363 if (!strcmp(tmp, "acodec") ||
4364 !strcmp(tmp, "vcodec") ||
4365 !strcmp(tmp, "scodec") ||
4366 !strcmp(tmp, "dcodec")) {
4367 opt_codec(tmp, tmp2);
4368 }else if(opt_default(tmp, tmp2) < 0){
4369 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4379 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4383 static int opt_passlogfile(const char *opt, const char *arg)
4385 pass_logfilename_prefix = arg;
4386 opt_default("passlogfile", arg);
4390 static const OptionDef options[] = {
4392 #include "cmdutils_common_opts.h"
4393 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4394 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4395 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4396 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4397 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4398 "outfile[,metadata]:infile[,metadata]" },
4399 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4400 "outfile[,metadata]:infile[,metadata]" },
4401 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4402 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4403 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4404 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4405 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4406 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4407 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4408 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4409 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4410 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4411 "add timings for benchmarking" },
4412 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4413 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4414 "dump each input packet" },
4415 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4416 "when dumping packets, also dump the payload" },
4417 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4418 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4419 { "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)", "" },
4420 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4421 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4422 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4423 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4424 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4425 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4426 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4427 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4428 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4429 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4430 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4431 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4432 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4435 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4436 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4437 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4438 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4439 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4440 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4441 { "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" },
4442 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4443 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4444 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4445 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4446 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4447 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4448 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4449 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4450 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4451 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4452 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4453 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4454 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4455 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4456 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4457 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4458 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4459 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4460 "use same quantizer as source (implies VBR)" },
4461 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4462 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4463 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4464 "deinterlace pictures" },
4465 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4466 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4467 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4469 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4471 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4472 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4473 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4474 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4475 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4476 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4477 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4478 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4479 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4480 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4481 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4484 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4485 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4486 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4487 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4488 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4489 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4490 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4491 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4492 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4493 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4494 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4495 { "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" },
4497 /* subtitle options */
4498 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4499 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4500 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4501 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4502 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4505 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4506 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4507 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4510 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4511 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4513 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4514 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4515 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4517 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4518 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4519 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4520 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4521 /* data codec support */
4522 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
4524 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4528 int main(int argc, char **argv)
4532 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4534 if(argc>1 && !strcmp(argv[1], "-d")){
4537 av_log_set_callback(log_callback_null);
4542 avcodec_register_all();
4544 avdevice_register_all();
4547 avfilter_register_all();
4552 if(isatty(STDIN_FILENO))
4553 avio_set_interrupt_cb(decode_interrupt_cb);
4562 parse_options(argc, argv, options, opt_output_file);
4564 if(nb_output_files <= 0 && nb_input_files == 0) {
4566 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4570 /* file converter / grab */
4571 if (nb_output_files <= 0) {
4572 fprintf(stderr, "At least one output file must be specified\n");
4576 if (nb_input_files == 0) {
4577 fprintf(stderr, "At least one input file must be specified\n");
4582 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4583 stream_maps, nb_stream_maps) < 0)
4585 ti = getutime() - ti;
4587 int maxrss = getmaxrss() / 1024;
4588 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4591 return ffmpeg_exit(0);