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/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
49 #include "libavformat/ffm.h" // not public API
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/vsink_buffer.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "ffmpeg";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct AVStreamMap {
97 int sync_stream_index;
101 * select an input file for an output file
103 typedef struct AVMetaDataMap {
104 int file; //< file index
105 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
106 int index; //< stream/chapter/program number
109 typedef struct AVChapterMap {
114 static const OptionDef options[];
116 #define MAX_FILES 100
117 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
119 static const char *last_asked_format = NULL;
120 static int64_t input_files_ts_offset[MAX_FILES];
121 static double *input_files_ts_scale[MAX_FILES] = {NULL};
122 static AVCodec **input_codecs = NULL;
123 static int nb_input_codecs = 0;
124 static int nb_input_files_ts_scale[MAX_FILES] = {0};
126 static AVFormatContext *output_files[MAX_FILES];
127 static int nb_output_files = 0;
129 static AVStreamMap *stream_maps = NULL;
130 static int nb_stream_maps;
132 /* first item specifies output metadata, second is input */
133 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
134 static int nb_meta_data_maps;
135 static int metadata_global_autocopy = 1;
136 static int metadata_streams_autocopy = 1;
137 static int metadata_chapters_autocopy = 1;
139 static AVChapterMap *chapter_maps = NULL;
140 static int nb_chapter_maps;
142 /* indexed by output file stream index */
143 static int *streamid_map = NULL;
144 static int nb_streamid_map = 0;
146 static int frame_width = 0;
147 static int frame_height = 0;
148 static float frame_aspect_ratio = 0;
149 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
150 static int frame_bits_per_raw_sample = 0;
151 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
152 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
153 static AVRational frame_rate;
154 static float video_qscale = 0;
155 static uint16_t *intra_matrix = NULL;
156 static uint16_t *inter_matrix = NULL;
157 static const char *video_rc_override_string=NULL;
158 static int video_disable = 0;
159 static int video_discard = 0;
160 static char *video_codec_name = NULL;
161 static unsigned int video_codec_tag = 0;
162 static char *video_language = NULL;
163 static int same_quality = 0;
164 static int do_deinterlace = 0;
165 static int top_field_first = -1;
166 static int me_threshold = 0;
167 static int intra_dc_precision = 8;
168 static int loop_input = 0;
169 static int loop_output = AVFMT_NOOUTPUTLOOP;
170 static int qp_hist = 0;
172 static char *vfilters = NULL;
175 static int intra_only = 0;
176 static int audio_sample_rate = 0;
177 static int64_t channel_layout = 0;
178 #define QSCALE_NONE -99999
179 static float audio_qscale = QSCALE_NONE;
180 static int audio_disable = 0;
181 static int audio_channels = 0;
182 static char *audio_codec_name = NULL;
183 static unsigned int audio_codec_tag = 0;
184 static char *audio_language = NULL;
186 static int subtitle_disable = 0;
187 static char *subtitle_codec_name = NULL;
188 static char *subtitle_language = NULL;
189 static unsigned int subtitle_codec_tag = 0;
191 static int data_disable = 0;
192 static char *data_codec_name = NULL;
193 static unsigned int data_codec_tag = 0;
195 static float mux_preload= 0.5;
196 static float mux_max_delay= 0.7;
198 static int64_t recording_time = INT64_MAX;
199 static int64_t start_time = 0;
200 static int64_t recording_timestamp = 0;
201 static int64_t input_ts_offset = 0;
202 static int file_overwrite = 0;
203 static AVDictionary *metadata;
204 static int do_benchmark = 0;
205 static int do_hex_dump = 0;
206 static int do_pkt_dump = 0;
207 static int do_psnr = 0;
208 static int do_pass = 0;
209 static const char *pass_logfilename_prefix;
210 static int audio_stream_copy = 0;
211 static int video_stream_copy = 0;
212 static int subtitle_stream_copy = 0;
213 static int data_stream_copy = 0;
214 static int video_sync_method= -1;
215 static int audio_sync_method= 0;
216 static float audio_drift_threshold= 0.1;
217 static int copy_ts= 0;
218 static int copy_tb= 0;
219 static int opt_shortest = 0;
220 static char *vstats_filename;
221 static FILE *vstats_file;
222 static int opt_programid = 0;
223 static int copy_initial_nonkeyframes = 0;
225 static int rate_emu = 0;
227 static int video_channel = 0;
228 static char *video_standard;
230 static int audio_volume = 256;
232 static int exit_on_error = 0;
233 static int using_stdin = 0;
234 static int verbose = 1;
235 static int run_as_daemon = 0;
236 static int thread_count= 1;
237 static int q_pressed = 0;
238 static int64_t video_size = 0;
239 static int64_t audio_size = 0;
240 static int64_t extra_size = 0;
241 static int nb_frames_dup = 0;
242 static int nb_frames_drop = 0;
243 static int input_sync;
244 static uint64_t limit_filesize = 0;
245 static int force_fps = 0;
246 static char *forced_key_frames = NULL;
248 static float dts_delta_threshold = 10;
250 static int64_t timer_start;
252 static uint8_t *audio_buf;
253 static uint8_t *audio_out;
254 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
256 static short *samples;
258 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
259 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
260 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
262 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
264 struct AVInputStream;
266 typedef struct AVOutputStream {
267 int file_index; /* file index */
268 int index; /* stream index in the output file */
269 int source_index; /* AVInputStream index */
270 AVStream *st; /* stream in the output file */
271 int encoding_needed; /* true if encoding needed for this stream */
273 /* input pts and corresponding output pts
275 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
276 struct AVInputStream *sync_ist; /* input stream to sync against */
277 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
278 AVBitStreamFilterContext *bitstream_filters;
283 AVFrame resample_frame; /* temporary frame for image resampling */
284 struct SwsContext *img_resample_ctx; /* for image resampling */
287 int resample_pix_fmt;
288 AVRational frame_rate;
290 float frame_aspect_ratio;
292 /* forced key frames */
293 int64_t *forced_kf_pts;
299 ReSampleContext *resample; /* for audio resampling */
300 int resample_sample_fmt;
301 int resample_channels;
302 int resample_sample_rate;
304 AVAudioConvert *reformat_ctx;
305 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
309 AVFilterContext *output_video_filter;
310 AVFilterContext *input_video_filter;
311 AVFilterBufferRef *picref;
313 AVFilterGraph *graph;
319 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
320 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
322 typedef struct AVInputStream {
325 int discard; /* true if stream data should be discarded */
326 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
327 int64_t sample_index; /* current sample */
329 int64_t start; /* time when read started */
330 int64_t next_pts; /* synthetic pts for cases where pkt.pts
332 int64_t pts; /* current pts */
333 int is_start; /* is 1 at the start and after a discontinuity */
334 int showed_multi_packet_warning;
335 int is_past_recording_time;
337 AVFrame *filter_frame;
338 int has_filter_frame;
342 typedef struct AVInputFile {
343 AVFormatContext *ctx;
344 int eof_reached; /* true if eof reached */
345 int ist_index; /* index of first stream in ist_table */
346 int buffer_size; /* current total buffer size */
351 /* init terminal so that we can grab keys */
352 static struct termios oldtty;
355 static AVInputStream *input_streams = NULL;
356 static int nb_input_streams = 0;
357 static AVInputFile *input_files = NULL;
358 static int nb_input_files = 0;
362 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
364 AVFilterContext *last_filter, *filter;
365 /** filter graph containing all filters including input & output */
366 AVCodecContext *codec = ost->st->codec;
367 AVCodecContext *icodec = ist->st->codec;
368 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
369 AVRational sample_aspect_ratio;
373 ost->graph = avfilter_graph_alloc();
375 if (ist->st->sample_aspect_ratio.num){
376 sample_aspect_ratio = ist->st->sample_aspect_ratio;
378 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
380 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
381 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
382 sample_aspect_ratio.num, sample_aspect_ratio.den);
384 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
385 "src", args, NULL, ost->graph);
388 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
389 "out", NULL, pix_fmts, ost->graph);
392 last_filter = ost->input_video_filter;
394 if (codec->width != icodec->width || codec->height != icodec->height) {
395 snprintf(args, 255, "%d:%d:flags=0x%X",
399 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
400 NULL, args, NULL, ost->graph)) < 0)
402 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
404 last_filter = filter;
407 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
408 ost->graph->scale_sws_opts = av_strdup(args);
411 AVFilterInOut *outputs = avfilter_inout_alloc();
412 AVFilterInOut *inputs = avfilter_inout_alloc();
414 outputs->name = av_strdup("in");
415 outputs->filter_ctx = last_filter;
416 outputs->pad_idx = 0;
417 outputs->next = NULL;
419 inputs->name = av_strdup("out");
420 inputs->filter_ctx = ost->output_video_filter;
424 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
426 av_freep(&ost->avfilter);
428 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
432 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
435 codec->width = ost->output_video_filter->inputs[0]->w;
436 codec->height = ost->output_video_filter->inputs[0]->h;
437 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
438 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
439 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
440 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
444 #endif /* CONFIG_AVFILTER */
446 static void term_exit(void)
448 av_log(NULL, AV_LOG_QUIET, "%s", "");
451 tcsetattr (0, TCSANOW, &oldtty);
455 static volatile int received_sigterm = 0;
458 sigterm_handler(int sig)
460 received_sigterm = sig;
465 static void term_init(void)
475 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
476 |INLCR|IGNCR|ICRNL|IXON);
477 tty.c_oflag |= OPOST;
478 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
479 tty.c_cflag &= ~(CSIZE|PARENB);
484 tcsetattr (0, TCSANOW, &tty);
485 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
489 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
490 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
492 signal(SIGXCPU, sigterm_handler);
496 /* read a key without blocking */
497 static int read_key(void)
512 n = select(1, &rfds, NULL, NULL, &tv);
527 static int decode_interrupt_cb(void)
529 q_pressed += read_key() == 'q';
530 return q_pressed > 1;
533 static int ffmpeg_exit(int ret)
538 for(i=0;i<nb_output_files;i++) {
539 AVFormatContext *s = output_files[i];
540 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
542 avformat_free_context(s);
543 av_free(output_streams_for_file[i]);
545 for(i=0;i<nb_input_files;i++) {
546 av_close_input_file(input_files[i].ctx);
547 av_free(input_files_ts_scale[i]);
550 av_free(intra_matrix);
551 av_free(inter_matrix);
555 av_free(vstats_filename);
557 av_free(streamid_map);
558 av_free(input_codecs);
559 av_free(stream_maps);
560 av_free(meta_data_maps);
562 av_freep(&input_streams);
563 av_freep(&input_files);
565 av_free(video_codec_name);
566 av_free(audio_codec_name);
567 av_free(subtitle_codec_name);
568 av_free(data_codec_name);
570 av_free(video_standard);
575 allocated_audio_buf_size= allocated_audio_out_size= 0;
582 if (received_sigterm) {
584 "Received signal %d: terminating.\n",
585 (int) received_sigterm);
589 exit(ret); /* not all OS-es handle main() return value */
593 /* similar to ff_dynarray_add() and av_fast_realloc() */
594 static void *grow_array(void *array, int elem_size, int *size, int new_size)
596 if (new_size >= INT_MAX / elem_size) {
597 fprintf(stderr, "Array too big.\n");
600 if (*size < new_size) {
601 uint8_t *tmp = av_realloc(array, new_size*elem_size);
603 fprintf(stderr, "Could not alloc buffer.\n");
606 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
613 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
615 if(codec && codec->sample_fmts){
616 const enum AVSampleFormat *p= codec->sample_fmts;
618 if(*p == st->codec->sample_fmt)
622 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
623 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
624 av_log(NULL, AV_LOG_WARNING,
625 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
626 av_get_sample_fmt_name(st->codec->sample_fmt),
628 av_get_sample_fmt_name(codec->sample_fmts[0]));
629 st->codec->sample_fmt = codec->sample_fmts[0];
634 static void choose_sample_rate(AVStream *st, AVCodec *codec)
636 if(codec && codec->supported_samplerates){
637 const int *p= codec->supported_samplerates;
639 int best_dist=INT_MAX;
641 int dist= abs(st->codec->sample_rate - *p);
642 if(dist < best_dist){
648 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
650 st->codec->sample_rate= best;
654 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
656 if(codec && codec->pix_fmts){
657 const enum PixelFormat *p= codec->pix_fmts;
658 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
659 if(st->codec->codec_id==CODEC_ID_MJPEG){
660 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
661 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
662 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};
666 if(*p == st->codec->pix_fmt)
670 if(st->codec->pix_fmt != PIX_FMT_NONE)
671 av_log(NULL, AV_LOG_WARNING,
672 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
673 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
675 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
676 st->codec->pix_fmt = codec->pix_fmts[0];
681 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
683 int idx = oc->nb_streams - 1;
686 output_streams_for_file[file_idx] =
687 grow_array(output_streams_for_file[file_idx],
688 sizeof(*output_streams_for_file[file_idx]),
689 &nb_output_streams_for_file[file_idx],
691 ost = output_streams_for_file[file_idx][idx] =
692 av_mallocz(sizeof(AVOutputStream));
694 fprintf(stderr, "Could not alloc output stream\n");
697 ost->file_index = file_idx;
700 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
704 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
710 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
713 /* copy stream format */
715 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
716 for(i=0;i<ic->nb_streams;i++) {
722 // FIXME: a more elegant solution is needed
723 st = av_mallocz(sizeof(AVStream));
724 memcpy(st, ic->streams[i], sizeof(AVStream));
725 st->info = av_malloc(sizeof(*st->info));
726 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
727 st->codec = avcodec_alloc_context();
729 print_error(filename, AVERROR(ENOMEM));
732 avcodec_copy_context(st->codec, ic->streams[i]->codec);
735 codec = avcodec_find_encoder(st->codec->codec_id);
736 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
737 if (audio_stream_copy) {
740 choose_sample_fmt(st, codec);
741 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
742 if (video_stream_copy) {
745 choose_pixel_fmt(st, codec);
748 if(st->codec->flags & CODEC_FLAG_BITEXACT)
751 new_output_stream(s, nb_output_files);
755 s->timestamp = av_gettime();
757 av_close_input_file(ic);
762 get_sync_ipts(const AVOutputStream *ost)
764 const AVInputStream *ist = ost->sync_ist;
765 return (double)(ist->pts - start_time)/AV_TIME_BASE;
768 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
772 AVPacket new_pkt= *pkt;
773 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
774 &new_pkt.data, &new_pkt.size,
775 pkt->data, pkt->size,
776 pkt->flags & AV_PKT_FLAG_KEY);
779 new_pkt.destruct= av_destruct_packet;
781 fprintf(stderr, "%s failed for stream %d, codec %s",
782 bsfc->filter->name, pkt->stream_index,
783 avctx->codec ? avctx->codec->name : "copy");
793 ret= av_interleaved_write_frame(s, pkt);
795 print_error("av_interleaved_write_frame()", ret);
800 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
802 static void do_audio_out(AVFormatContext *s,
805 unsigned char *buf, int size)
808 int64_t audio_out_size, audio_buf_size;
809 int64_t allocated_for_size= size;
811 int size_out, frame_bytes, ret, resample_changed;
812 AVCodecContext *enc= ost->st->codec;
813 AVCodecContext *dec= ist->st->codec;
814 int osize = av_get_bytes_per_sample(enc->sample_fmt);
815 int isize = av_get_bytes_per_sample(dec->sample_fmt);
816 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
819 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
820 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
821 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
822 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
823 audio_buf_size*= osize*enc->channels;
825 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
826 if(coded_bps > 8*osize)
827 audio_out_size= audio_out_size * coded_bps / (8*osize);
828 audio_out_size += FF_MIN_BUFFER_SIZE;
830 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
831 fprintf(stderr, "Buffer sizes too large\n");
835 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
836 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
837 if (!audio_buf || !audio_out){
838 fprintf(stderr, "Out of memory in do_audio_out\n");
842 if (enc->channels != dec->channels)
843 ost->audio_resample = 1;
845 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
846 ost->resample_channels != dec->channels ||
847 ost->resample_sample_rate != dec->sample_rate;
849 if ((ost->audio_resample && !ost->resample) || resample_changed) {
850 if (resample_changed) {
851 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",
852 ist->file_index, ist->st->index,
853 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
854 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
855 ost->resample_sample_fmt = dec->sample_fmt;
856 ost->resample_channels = dec->channels;
857 ost->resample_sample_rate = dec->sample_rate;
859 audio_resample_close(ost->resample);
861 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
862 if (audio_sync_method <= 1 &&
863 ost->resample_sample_fmt == enc->sample_fmt &&
864 ost->resample_channels == enc->channels &&
865 ost->resample_sample_rate == enc->sample_rate) {
866 ost->resample = NULL;
867 ost->audio_resample = 0;
869 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
870 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
871 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
872 enc->sample_rate, dec->sample_rate,
873 enc->sample_fmt, dec->sample_fmt,
875 if (!ost->resample) {
876 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
877 dec->channels, dec->sample_rate,
878 enc->channels, enc->sample_rate);
884 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
885 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
886 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
887 if (ost->reformat_ctx)
888 av_audio_convert_free(ost->reformat_ctx);
889 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
890 dec->sample_fmt, 1, NULL, 0);
891 if (!ost->reformat_ctx) {
892 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
893 av_get_sample_fmt_name(dec->sample_fmt),
894 av_get_sample_fmt_name(enc->sample_fmt));
897 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
900 if(audio_sync_method){
901 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
902 - av_fifo_size(ost->fifo)/(enc->channels * 2);
903 double idelta= delta*dec->sample_rate / enc->sample_rate;
904 int byte_delta= ((int)idelta)*2*dec->channels;
906 //FIXME resample delay
907 if(fabs(delta) > 50){
908 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
910 byte_delta= FFMAX(byte_delta, -size);
914 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
919 static uint8_t *input_tmp= NULL;
920 input_tmp= av_realloc(input_tmp, byte_delta + size);
922 if(byte_delta > allocated_for_size - size){
923 allocated_for_size= byte_delta + (int64_t)size;
928 memset(input_tmp, 0, byte_delta);
929 memcpy(input_tmp + byte_delta, buf, size);
933 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
935 }else if(audio_sync_method>1){
936 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
937 av_assert0(ost->audio_resample);
939 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
940 // 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));
941 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
945 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
946 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
948 if (ost->audio_resample) {
950 size_out = audio_resample(ost->resample,
951 (short *)buftmp, (short *)buf,
952 size / (dec->channels * isize));
953 size_out = size_out * enc->channels * osize;
959 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
960 const void *ibuf[6]= {buftmp};
961 void *obuf[6]= {audio_buf};
962 int istride[6]= {isize};
963 int ostride[6]= {osize};
964 int len= size_out/istride[0];
965 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
966 printf("av_audio_convert() failed\n");
972 size_out = len*osize;
975 /* now encode as many frames as possible */
976 if (enc->frame_size > 1) {
977 /* output resampled raw samples */
978 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
979 fprintf(stderr, "av_fifo_realloc2() failed\n");
982 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
984 frame_bytes = enc->frame_size * osize * enc->channels;
986 while (av_fifo_size(ost->fifo) >= frame_bytes) {
988 av_init_packet(&pkt);
990 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
992 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
994 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
997 fprintf(stderr, "Audio encoding failed\n");
1001 pkt.stream_index= ost->index;
1002 pkt.data= audio_out;
1004 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1005 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1006 pkt.flags |= AV_PKT_FLAG_KEY;
1007 write_frame(s, &pkt, enc, ost->bitstream_filters);
1009 ost->sync_opts += enc->frame_size;
1013 av_init_packet(&pkt);
1015 ost->sync_opts += size_out / (osize * enc->channels);
1017 /* output a pcm frame */
1018 /* determine the size of the coded buffer */
1021 size_out = size_out*coded_bps/8;
1023 if(size_out > audio_out_size){
1024 fprintf(stderr, "Internal error, buffer size too small\n");
1028 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1029 ret = avcodec_encode_audio(enc, audio_out, size_out,
1032 fprintf(stderr, "Audio encoding failed\n");
1036 pkt.stream_index= ost->index;
1037 pkt.data= audio_out;
1039 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1040 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1041 pkt.flags |= AV_PKT_FLAG_KEY;
1042 write_frame(s, &pkt, enc, ost->bitstream_filters);
1046 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1048 AVCodecContext *dec;
1049 AVPicture *picture2;
1050 AVPicture picture_tmp;
1053 dec = ist->st->codec;
1055 /* deinterlace : must be done before any resize */
1056 if (do_deinterlace) {
1059 /* create temporary picture */
1060 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1061 buf = av_malloc(size);
1065 picture2 = &picture_tmp;
1066 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1068 if(avpicture_deinterlace(picture2, picture,
1069 dec->pix_fmt, dec->width, dec->height) < 0) {
1070 /* if error, do not deinterlace */
1071 fprintf(stderr, "Deinterlacing failed\n");
1080 if (picture != picture2)
1081 *picture = *picture2;
1085 /* we begin to correct av delay at this threshold */
1086 #define AV_DELAY_MAX 0.100
1088 static void do_subtitle_out(AVFormatContext *s,
1089 AVOutputStream *ost,
1094 static uint8_t *subtitle_out = NULL;
1095 int subtitle_out_max_size = 1024 * 1024;
1096 int subtitle_out_size, nb, i;
1097 AVCodecContext *enc;
1100 if (pts == AV_NOPTS_VALUE) {
1101 fprintf(stderr, "Subtitle packets must have a pts\n");
1107 enc = ost->st->codec;
1109 if (!subtitle_out) {
1110 subtitle_out = av_malloc(subtitle_out_max_size);
1113 /* Note: DVB subtitle need one packet to draw them and one other
1114 packet to clear them */
1115 /* XXX: signal it in the codec context ? */
1116 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1121 for(i = 0; i < nb; i++) {
1122 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1123 // start_display_time is required to be 0
1124 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1125 sub->end_display_time -= sub->start_display_time;
1126 sub->start_display_time = 0;
1127 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1128 subtitle_out_max_size, sub);
1129 if (subtitle_out_size < 0) {
1130 fprintf(stderr, "Subtitle encoding failed\n");
1134 av_init_packet(&pkt);
1135 pkt.stream_index = ost->index;
1136 pkt.data = subtitle_out;
1137 pkt.size = subtitle_out_size;
1138 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1139 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1140 /* XXX: the pts correction is handled here. Maybe handling
1141 it in the codec would be better */
1143 pkt.pts += 90 * sub->start_display_time;
1145 pkt.pts += 90 * sub->end_display_time;
1147 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1151 static int bit_buffer_size= 1024*256;
1152 static uint8_t *bit_buffer= NULL;
1154 static void do_video_out(AVFormatContext *s,
1155 AVOutputStream *ost,
1157 AVFrame *in_picture,
1158 int *frame_size, float quality)
1160 int nb_frames, i, ret, av_unused resample_changed;
1161 AVFrame *final_picture, *formatted_picture;
1162 AVCodecContext *enc, *dec;
1165 enc = ost->st->codec;
1166 dec = ist->st->codec;
1168 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1170 /* by default, we output a single frame */
1175 if(video_sync_method){
1176 double vdelta = sync_ipts - ost->sync_opts;
1177 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1180 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1183 }else if(vdelta>0.6)
1184 ost->sync_opts= lrintf(sync_ipts);
1185 }else if (vdelta > 1.1)
1186 nb_frames = lrintf(vdelta);
1187 //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);
1188 if (nb_frames == 0){
1191 fprintf(stderr, "*** drop!\n");
1192 }else if (nb_frames > 1) {
1193 nb_frames_dup += nb_frames - 1;
1195 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1198 ost->sync_opts= lrintf(sync_ipts);
1200 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1204 formatted_picture = in_picture;
1205 final_picture = formatted_picture;
1207 #if !CONFIG_AVFILTER
1208 resample_changed = ost->resample_width != dec->width ||
1209 ost->resample_height != dec->height ||
1210 ost->resample_pix_fmt != dec->pix_fmt;
1212 if (resample_changed) {
1213 av_log(NULL, AV_LOG_INFO,
1214 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1215 ist->file_index, ist->st->index,
1216 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1217 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1218 ost->resample_width = dec->width;
1219 ost->resample_height = dec->height;
1220 ost->resample_pix_fmt = dec->pix_fmt;
1223 ost->video_resample = dec->width != enc->width ||
1224 dec->height != enc->height ||
1225 dec->pix_fmt != enc->pix_fmt;
1227 if (ost->video_resample) {
1228 final_picture = &ost->resample_frame;
1229 if (!ost->img_resample_ctx || resample_changed) {
1230 /* initialize the destination picture */
1231 if (!ost->resample_frame.data[0]) {
1232 avcodec_get_frame_defaults(&ost->resample_frame);
1233 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1234 enc->width, enc->height)) {
1235 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1239 /* initialize a new scaler context */
1240 sws_freeContext(ost->img_resample_ctx);
1241 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1242 enc->width, enc->height, enc->pix_fmt,
1243 ost->sws_flags, NULL, NULL, NULL);
1244 if (ost->img_resample_ctx == NULL) {
1245 fprintf(stderr, "Cannot get resampling context\n");
1249 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1250 0, ost->resample_height, final_picture->data, final_picture->linesize);
1254 /* duplicates frame if needed */
1255 for(i=0;i<nb_frames;i++) {
1257 av_init_packet(&pkt);
1258 pkt.stream_index= ost->index;
1260 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1261 /* raw pictures are written as AVPicture structure to
1262 avoid any copies. We support temorarily the older
1264 AVFrame* old_frame = enc->coded_frame;
1265 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1266 pkt.data= (uint8_t *)final_picture;
1267 pkt.size= sizeof(AVPicture);
1268 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1269 pkt.flags |= AV_PKT_FLAG_KEY;
1271 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1272 enc->coded_frame = old_frame;
1274 AVFrame big_picture;
1276 big_picture= *final_picture;
1277 /* better than nothing: use input picture interlaced
1279 big_picture.interlaced_frame = in_picture->interlaced_frame;
1280 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1281 if(top_field_first == -1)
1282 big_picture.top_field_first = in_picture->top_field_first;
1284 big_picture.top_field_first = top_field_first;
1287 /* handles sameq here. This is not correct because it may
1288 not be a global option */
1289 big_picture.quality = quality;
1291 big_picture.pict_type = 0;
1292 // big_picture.pts = AV_NOPTS_VALUE;
1293 big_picture.pts= ost->sync_opts;
1294 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1295 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1296 if (ost->forced_kf_index < ost->forced_kf_count &&
1297 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1298 big_picture.pict_type = AV_PICTURE_TYPE_I;
1299 ost->forced_kf_index++;
1301 ret = avcodec_encode_video(enc,
1302 bit_buffer, bit_buffer_size,
1305 fprintf(stderr, "Video encoding failed\n");
1310 pkt.data= bit_buffer;
1312 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1313 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1314 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1315 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1316 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1318 if(enc->coded_frame->key_frame)
1319 pkt.flags |= AV_PKT_FLAG_KEY;
1320 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1323 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1324 // enc->frame_number-1, ret, enc->pict_type);
1325 /* if two pass, output log */
1326 if (ost->logfile && enc->stats_out) {
1327 fprintf(ost->logfile, "%s", enc->stats_out);
1332 ost->frame_number++;
1336 static double psnr(double d){
1337 return -10.0*log(d)/log(10.0);
1340 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1343 AVCodecContext *enc;
1345 double ti1, bitrate, avg_bitrate;
1347 /* this is executed just the first time do_video_stats is called */
1349 vstats_file = fopen(vstats_filename, "w");
1356 enc = ost->st->codec;
1357 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1358 frame_number = ost->frame_number;
1359 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1360 if (enc->flags&CODEC_FLAG_PSNR)
1361 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1363 fprintf(vstats_file,"f_size= %6d ", frame_size);
1364 /* compute pts value */
1365 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1369 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1370 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1371 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1372 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1373 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1377 static void print_report(AVFormatContext **output_files,
1378 AVOutputStream **ost_table, int nb_ostreams,
1382 AVOutputStream *ost;
1383 AVFormatContext *oc;
1385 AVCodecContext *enc;
1386 int frame_number, vid, i;
1388 int64_t pts = INT64_MAX;
1389 static int64_t last_time = -1;
1390 static int qp_histogram[52];
1392 if (!is_last_report) {
1394 /* display the report every 0.5 seconds */
1395 cur_time = av_gettime();
1396 if (last_time == -1) {
1397 last_time = cur_time;
1400 if ((cur_time - last_time) < 500000)
1402 last_time = cur_time;
1406 oc = output_files[0];
1408 total_size = avio_size(oc->pb);
1409 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1410 total_size= avio_tell(oc->pb);
1414 for(i=0;i<nb_ostreams;i++) {
1417 enc = ost->st->codec;
1418 if (!ost->st->stream_copy && enc->coded_frame)
1419 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1420 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1421 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1423 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1424 float t = (av_gettime()-timer_start) / 1000000.0;
1426 frame_number = ost->frame_number;
1427 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1428 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1430 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1434 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1437 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1439 if (enc->flags&CODEC_FLAG_PSNR){
1441 double error, error_sum=0;
1442 double scale, scale_sum=0;
1443 char type[3]= {'Y','U','V'};
1444 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1447 error= enc->error[j];
1448 scale= enc->width*enc->height*255.0*255.0*frame_number;
1450 error= enc->coded_frame->error[j];
1451 scale= enc->width*enc->height*255.0*255.0;
1456 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1458 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1462 /* compute min output value */
1463 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1464 ost->st->time_base, AV_TIME_BASE_Q));
1467 if (verbose > 0 || is_last_report) {
1468 int hours, mins, secs, us;
1469 secs = pts / AV_TIME_BASE;
1470 us = pts % AV_TIME_BASE;
1476 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1478 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1479 "size=%8.0fkB time=", total_size / 1024.0);
1480 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1481 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1482 (100 * us) / AV_TIME_BASE);
1483 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1484 "bitrate=%6.1fkbits/s", bitrate);
1486 if (nb_frames_dup || nb_frames_drop)
1487 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1488 nb_frames_dup, nb_frames_drop);
1491 fprintf(stderr, "%s \r", buf);
1496 if (is_last_report && verbose >= 0){
1497 int64_t raw= audio_size + video_size + extra_size;
1498 fprintf(stderr, "\n");
1499 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1503 100.0*(total_size - raw)/raw
1508 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1510 int fill_char = 0x00;
1511 if (sample_fmt == AV_SAMPLE_FMT_U8)
1513 memset(buf, fill_char, size);
1516 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1517 static int output_packet(AVInputStream *ist, int ist_index,
1518 AVOutputStream **ost_table, int nb_ostreams,
1519 const AVPacket *pkt)
1521 AVFormatContext *os;
1522 AVOutputStream *ost;
1526 void *buffer_to_free = NULL;
1527 static unsigned int samples_size= 0;
1528 AVSubtitle subtitle, *subtitle_to_free;
1529 int64_t pkt_pts = AV_NOPTS_VALUE;
1531 int frame_available;
1536 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1538 if(ist->next_pts == AV_NOPTS_VALUE)
1539 ist->next_pts= ist->pts;
1543 av_init_packet(&avpkt);
1551 if(pkt->dts != AV_NOPTS_VALUE)
1552 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1553 if(pkt->pts != AV_NOPTS_VALUE)
1554 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1556 //while we have more to decode or while the decoder did output something on EOF
1557 while (avpkt.size > 0 || (!pkt && got_output)) {
1558 uint8_t *data_buf, *decoded_data_buf;
1559 int data_size, decoded_data_size;
1561 ist->pts= ist->next_pts;
1563 if(avpkt.size && avpkt.size != pkt->size &&
1564 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1565 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1566 ist->showed_multi_packet_warning=1;
1569 /* decode the packet if needed */
1570 decoded_data_buf = NULL; /* fail safe */
1571 decoded_data_size= 0;
1572 data_buf = avpkt.data;
1573 data_size = avpkt.size;
1574 subtitle_to_free = NULL;
1575 if (ist->decoding_needed) {
1576 switch(ist->st->codec->codec_type) {
1577 case AVMEDIA_TYPE_AUDIO:{
1578 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1579 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1581 samples= av_malloc(samples_size);
1583 decoded_data_size= samples_size;
1584 /* XXX: could avoid copy if PCM 16 bits with same
1585 endianness as CPU */
1586 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1593 got_output = decoded_data_size > 0;
1594 /* Some bug in mpeg audio decoder gives */
1595 /* decoded_data_size < 0, it seems they are overflows */
1597 /* no audio frame */
1600 decoded_data_buf = (uint8_t *)samples;
1601 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1602 (ist->st->codec->sample_rate * ist->st->codec->channels);
1604 case AVMEDIA_TYPE_VIDEO:
1605 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1606 /* XXX: allocate picture correctly */
1607 avcodec_get_frame_defaults(&picture);
1608 avpkt.pts = pkt_pts;
1609 avpkt.dts = ist->pts;
1610 pkt_pts = AV_NOPTS_VALUE;
1612 ret = avcodec_decode_video2(ist->st->codec,
1613 &picture, &got_output, &avpkt);
1614 quality = same_quality ? picture.quality : 0;
1618 /* no picture yet */
1619 goto discard_packet;
1621 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1622 if (ist->st->codec->time_base.num != 0) {
1623 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1624 ist->next_pts += ((int64_t)AV_TIME_BASE *
1625 ist->st->codec->time_base.num * ticks) /
1626 ist->st->codec->time_base.den;
1629 buffer_to_free = NULL;
1630 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1632 case AVMEDIA_TYPE_SUBTITLE:
1633 ret = avcodec_decode_subtitle2(ist->st->codec,
1634 &subtitle, &got_output, &avpkt);
1638 goto discard_packet;
1640 subtitle_to_free = &subtitle;
1647 switch(ist->st->codec->codec_type) {
1648 case AVMEDIA_TYPE_AUDIO:
1649 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1650 ist->st->codec->sample_rate;
1652 case AVMEDIA_TYPE_VIDEO:
1653 if (ist->st->codec->time_base.num != 0) {
1654 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1655 ist->next_pts += ((int64_t)AV_TIME_BASE *
1656 ist->st->codec->time_base.num * ticks) /
1657 ist->st->codec->time_base.den;
1666 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1667 if (start_time == 0 || ist->pts >= start_time) {
1668 for(i=0;i<nb_ostreams;i++) {
1670 if (ost->input_video_filter && ost->source_index == ist_index) {
1671 if (!picture.sample_aspect_ratio.num)
1672 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1673 picture.pts = ist->pts;
1675 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1681 // preprocess audio (volume)
1682 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1683 if (audio_volume != 256) {
1686 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1687 int v = ((*volp) * audio_volume + 128) >> 8;
1688 if (v < -32768) v = -32768;
1689 if (v > 32767) v = 32767;
1695 /* frame rate emulation */
1697 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1698 int64_t now = av_gettime() - ist->start;
1702 /* if output time reached then transcode raw format,
1703 encode packets and output them */
1704 if (start_time == 0 || ist->pts >= start_time)
1705 for(i=0;i<nb_ostreams;i++) {
1709 if (ost->source_index == ist_index) {
1711 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1712 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1713 while (frame_available) {
1714 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1715 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1716 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1719 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1720 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1724 os = output_files[ost->file_index];
1726 /* set the input output pts pairs */
1727 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1729 if (ost->encoding_needed) {
1730 av_assert0(ist->decoding_needed);
1731 switch(ost->st->codec->codec_type) {
1732 case AVMEDIA_TYPE_AUDIO:
1733 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1735 case AVMEDIA_TYPE_VIDEO:
1737 if (ost->picref->video && !ost->frame_aspect_ratio)
1738 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1740 do_video_out(os, ost, ist, &picture, &frame_size,
1741 same_quality ? quality : ost->st->codec->global_quality);
1742 if (vstats_filename && frame_size)
1743 do_video_stats(os, ost, frame_size);
1745 case AVMEDIA_TYPE_SUBTITLE:
1746 do_subtitle_out(os, ost, ist, &subtitle,
1753 AVFrame avframe; //FIXME/XXX remove this
1756 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1758 av_init_packet(&opkt);
1760 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1761 #if !CONFIG_AVFILTER
1767 /* no reencoding needed : output the packet directly */
1768 /* force the input stream PTS */
1770 avcodec_get_frame_defaults(&avframe);
1771 ost->st->codec->coded_frame= &avframe;
1772 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1774 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1775 audio_size += data_size;
1776 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1777 video_size += data_size;
1781 opkt.stream_index= ost->index;
1782 if(pkt->pts != AV_NOPTS_VALUE)
1783 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1785 opkt.pts= AV_NOPTS_VALUE;
1787 if (pkt->dts == AV_NOPTS_VALUE)
1788 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1790 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1791 opkt.dts -= ost_tb_start_time;
1793 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1794 opkt.flags= pkt->flags;
1796 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1797 if( ost->st->codec->codec_id != CODEC_ID_H264
1798 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1799 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1801 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1802 opkt.destruct= av_destruct_packet;
1804 opkt.data = data_buf;
1805 opkt.size = data_size;
1808 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1809 /* store AVPicture in AVPacket, as expected by the output format */
1810 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1811 opkt.data = (uint8_t *)&pict;
1812 opkt.size = sizeof(AVPicture);
1813 opkt.flags |= AV_PKT_FLAG_KEY;
1815 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1816 ost->st->codec->frame_number++;
1817 ost->frame_number++;
1818 av_free_packet(&opkt);
1822 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1823 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1824 avfilter_unref_buffer(ost->picref);
1830 av_free(buffer_to_free);
1831 /* XXX: allocate the subtitles in the codec ? */
1832 if (subtitle_to_free) {
1833 avsubtitle_free(subtitle_to_free);
1834 subtitle_to_free = NULL;
1841 for(i=0;i<nb_ostreams;i++) {
1843 if (ost->source_index == ist_index) {
1844 AVCodecContext *enc= ost->st->codec;
1845 os = output_files[ost->file_index];
1847 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1849 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1852 if (ost->encoding_needed) {
1856 av_init_packet(&pkt);
1857 pkt.stream_index= ost->index;
1859 switch(ost->st->codec->codec_type) {
1860 case AVMEDIA_TYPE_AUDIO:
1861 fifo_bytes = av_fifo_size(ost->fifo);
1863 /* encode any samples remaining in fifo */
1864 if (fifo_bytes > 0) {
1865 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1866 int fs_tmp = enc->frame_size;
1868 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1869 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1870 enc->frame_size = fifo_bytes / (osize * enc->channels);
1872 int frame_bytes = enc->frame_size*osize*enc->channels;
1873 if (allocated_audio_buf_size < frame_bytes)
1875 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1878 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1879 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1880 ost->st->time_base.num, enc->sample_rate);
1881 enc->frame_size = fs_tmp;
1884 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1887 fprintf(stderr, "Audio encoding failed\n");
1891 pkt.flags |= AV_PKT_FLAG_KEY;
1893 case AVMEDIA_TYPE_VIDEO:
1894 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1896 fprintf(stderr, "Video encoding failed\n");
1900 if(enc->coded_frame && enc->coded_frame->key_frame)
1901 pkt.flags |= AV_PKT_FLAG_KEY;
1902 if (ost->logfile && enc->stats_out) {
1903 fprintf(ost->logfile, "%s", enc->stats_out);
1912 pkt.data= bit_buffer;
1914 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1915 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1916 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1928 static void print_sdp(AVFormatContext **avc, int n)
1932 av_sdp_create(avc, n, sdp, sizeof(sdp));
1933 printf("SDP:\n%s\n", sdp);
1937 static int copy_chapters(int infile, int outfile)
1939 AVFormatContext *is = input_files[infile].ctx;
1940 AVFormatContext *os = output_files[outfile];
1943 for (i = 0; i < is->nb_chapters; i++) {
1944 AVChapter *in_ch = is->chapters[i], *out_ch;
1945 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1946 AV_TIME_BASE_Q, in_ch->time_base);
1947 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1948 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1951 if (in_ch->end < ts_off)
1953 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1956 out_ch = av_mallocz(sizeof(AVChapter));
1958 return AVERROR(ENOMEM);
1960 out_ch->id = in_ch->id;
1961 out_ch->time_base = in_ch->time_base;
1962 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1963 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1965 if (metadata_chapters_autocopy)
1966 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1969 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1971 return AVERROR(ENOMEM);
1972 os->chapters[os->nb_chapters - 1] = out_ch;
1977 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1978 AVCodecContext *avctx)
1984 for (p = kf; *p; p++)
1987 ost->forced_kf_count = n;
1988 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1989 if (!ost->forced_kf_pts) {
1990 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1993 for (i = 0; i < n; i++) {
1994 p = i ? strchr(p, ',') + 1 : kf;
1995 t = parse_time_or_die("force_key_frames", p, 1);
1996 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2001 * The following code is the main loop of the file converter
2003 static int transcode(AVFormatContext **output_files,
2004 int nb_output_files,
2005 AVInputFile *input_files,
2007 AVStreamMap *stream_maps, int nb_stream_maps)
2009 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2011 AVFormatContext *is, *os;
2012 AVCodecContext *codec, *icodec;
2013 AVOutputStream *ost, **ost_table = NULL;
2018 uint8_t no_packet[MAX_FILES]={0};
2019 int no_packet_count=0;
2020 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2021 int nb_streams[AVMEDIA_TYPE_NB]={0};
2024 for (i = 0; i < nb_input_streams; i++)
2025 input_streams[i].start = av_gettime();
2027 /* output stream init */
2029 for(i=0;i<nb_output_files;i++) {
2030 os = output_files[i];
2031 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2032 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2033 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2034 ret = AVERROR(EINVAL);
2037 nb_ostreams += os->nb_streams;
2039 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2040 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2041 ret = AVERROR(EINVAL);
2045 /* Sanity check the mapping args -- do the input files & streams exist? */
2046 for(i=0;i<nb_stream_maps;i++) {
2047 int fi = stream_maps[i].file_index;
2048 int si = stream_maps[i].stream_index;
2050 if (fi < 0 || fi > nb_input_files - 1 ||
2051 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2052 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2053 ret = AVERROR(EINVAL);
2056 fi = stream_maps[i].sync_file_index;
2057 si = stream_maps[i].sync_stream_index;
2058 if (fi < 0 || fi > nb_input_files - 1 ||
2059 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2060 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2061 ret = AVERROR(EINVAL);
2066 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2070 for(k=0;k<nb_output_files;k++) {
2071 os = output_files[k];
2072 for(i=0;i<os->nb_streams;i++,n++) {
2073 nb_streams[os->streams[i]->codec->codec_type]++;
2076 for(step=1<<30; step; step>>=1){
2077 int found_streams[AVMEDIA_TYPE_NB]={0};
2078 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2079 nb_frame_threshold[j] += step;
2081 for(j=0; j<nb_input_streams; j++) {
2083 ist = &input_streams[j];
2086 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2088 for(pi=0; pi<f->nb_programs; pi++){
2089 AVProgram *p= f->programs[pi];
2090 if(p->id == opt_programid)
2091 for(si=0; si<p->nb_stream_indexes; si++){
2092 if(f->streams[ p->stream_index[si] ] == ist->st)
2097 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2098 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2099 found_streams[ist->st->codec->codec_type]++;
2102 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2103 if(found_streams[j] < nb_streams[j])
2104 nb_frame_threshold[j] -= step;
2107 for(k=0;k<nb_output_files;k++) {
2108 os = output_files[k];
2109 for(i=0;i<os->nb_streams;i++,n++) {
2111 ost = ost_table[n] = output_streams_for_file[k][i];
2112 ost->st = os->streams[i];
2113 if (nb_stream_maps > 0) {
2114 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2115 stream_maps[n].stream_index;
2117 /* Sanity check that the stream types match */
2118 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2119 int i= ost->file_index;
2120 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2121 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2122 stream_maps[n].file_index, stream_maps[n].stream_index,
2123 ost->file_index, ost->index);
2128 /* get corresponding input stream index : we select the first one with the right type */
2130 for (j = 0; j < nb_input_streams; j++) {
2132 ist = &input_streams[j];
2135 AVFormatContext *f = input_files[ist->file_index].ctx;
2137 for(pi=0; pi<f->nb_programs; pi++){
2138 AVProgram *p= f->programs[pi];
2139 if(p->id == opt_programid)
2140 for(si=0; si<p->nb_stream_indexes; si++){
2141 if(f->streams[ p->stream_index[si] ] == ist->st)
2146 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2147 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2148 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2149 ost->source_index = j;
2156 if(! opt_programid) {
2157 /* try again and reuse existing stream */
2158 for (j = 0; j < nb_input_streams; j++) {
2159 ist = &input_streams[j];
2160 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2161 && ist->st->discard != AVDISCARD_ALL) {
2162 ost->source_index = j;
2168 int i= ost->file_index;
2169 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2170 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2171 ost->file_index, ost->index);
2176 ist = &input_streams[ost->source_index];
2178 ost->sync_ist = (nb_stream_maps > 0) ?
2179 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2180 stream_maps[n].sync_stream_index] : ist;
2184 /* for each output stream, we compute the right encoding parameters */
2185 for(i=0;i<nb_ostreams;i++) {
2187 os = output_files[ost->file_index];
2188 ist = &input_streams[ost->source_index];
2190 codec = ost->st->codec;
2191 icodec = ist->st->codec;
2193 if (metadata_streams_autocopy)
2194 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2195 AV_DICT_DONT_OVERWRITE);
2197 ost->st->disposition = ist->st->disposition;
2198 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2199 codec->chroma_sample_location = icodec->chroma_sample_location;
2201 if (ost->st->stream_copy) {
2202 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2204 if (extra_size > INT_MAX)
2207 /* if stream_copy is selected, no need to decode or encode */
2208 codec->codec_id = icodec->codec_id;
2209 codec->codec_type = icodec->codec_type;
2211 if(!codec->codec_tag){
2212 if( !os->oformat->codec_tag
2213 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2214 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2215 codec->codec_tag = icodec->codec_tag;
2218 codec->bit_rate = icodec->bit_rate;
2219 codec->rc_max_rate = icodec->rc_max_rate;
2220 codec->rc_buffer_size = icodec->rc_buffer_size;
2221 codec->extradata= av_mallocz(extra_size);
2222 if (!codec->extradata)
2224 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2225 codec->extradata_size= icodec->extradata_size;
2226 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){
2227 codec->time_base = icodec->time_base;
2228 codec->time_base.num *= icodec->ticks_per_frame;
2229 av_reduce(&codec->time_base.num, &codec->time_base.den,
2230 codec->time_base.num, codec->time_base.den, INT_MAX);
2232 codec->time_base = ist->st->time_base;
2233 switch(codec->codec_type) {
2234 case AVMEDIA_TYPE_AUDIO:
2235 if(audio_volume != 256) {
2236 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2239 codec->channel_layout = icodec->channel_layout;
2240 codec->sample_rate = icodec->sample_rate;
2241 codec->channels = icodec->channels;
2242 codec->frame_size = icodec->frame_size;
2243 codec->audio_service_type = icodec->audio_service_type;
2244 codec->block_align= icodec->block_align;
2245 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2246 codec->block_align= 0;
2247 if(codec->codec_id == CODEC_ID_AC3)
2248 codec->block_align= 0;
2250 case AVMEDIA_TYPE_VIDEO:
2251 codec->pix_fmt = icodec->pix_fmt;
2252 codec->width = icodec->width;
2253 codec->height = icodec->height;
2254 codec->has_b_frames = icodec->has_b_frames;
2255 if (!codec->sample_aspect_ratio.num) {
2256 codec->sample_aspect_ratio =
2257 ost->st->sample_aspect_ratio =
2258 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2259 ist->st->codec->sample_aspect_ratio.num ?
2260 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2263 case AVMEDIA_TYPE_SUBTITLE:
2264 codec->width = icodec->width;
2265 codec->height = icodec->height;
2267 case AVMEDIA_TYPE_DATA:
2274 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2275 switch(codec->codec_type) {
2276 case AVMEDIA_TYPE_AUDIO:
2277 ost->fifo= av_fifo_alloc(1024);
2280 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2281 if (!codec->sample_rate) {
2282 codec->sample_rate = icodec->sample_rate;
2284 codec->sample_rate >>= icodec->lowres;
2286 choose_sample_rate(ost->st, ost->enc);
2287 codec->time_base = (AVRational){1, codec->sample_rate};
2288 if (!codec->channels) {
2289 codec->channels = icodec->channels;
2290 codec->channel_layout = icodec->channel_layout;
2292 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2293 codec->channel_layout = 0;
2294 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2295 icodec->request_channels = codec->channels;
2296 ist->decoding_needed = 1;
2297 ost->encoding_needed = 1;
2298 ost->resample_sample_fmt = icodec->sample_fmt;
2299 ost->resample_sample_rate = icodec->sample_rate;
2300 ost->resample_channels = icodec->channels;
2302 case AVMEDIA_TYPE_VIDEO:
2303 if (codec->pix_fmt == PIX_FMT_NONE)
2304 codec->pix_fmt = icodec->pix_fmt;
2305 choose_pixel_fmt(ost->st, ost->enc);
2307 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2308 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2311 ost->video_resample = codec->width != icodec->width ||
2312 codec->height != icodec->height ||
2313 codec->pix_fmt != icodec->pix_fmt;
2314 if (ost->video_resample) {
2315 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2317 if (!codec->width || !codec->height) {
2318 codec->width = icodec->width;
2319 codec->height = icodec->height;
2321 ost->resample_height = icodec->height;
2322 ost->resample_width = icodec->width;
2323 ost->resample_pix_fmt= icodec->pix_fmt;
2324 ost->encoding_needed = 1;
2325 ist->decoding_needed = 1;
2327 if (!ost->frame_rate.num)
2328 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2329 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2330 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2331 ost->frame_rate = ost->enc->supported_framerates[idx];
2333 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2334 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2335 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2336 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2337 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2341 if (configure_video_filters(ist, ost)) {
2342 fprintf(stderr, "Error opening filters!\n");
2347 case AVMEDIA_TYPE_SUBTITLE:
2348 ost->encoding_needed = 1;
2349 ist->decoding_needed = 1;
2356 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2357 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2358 char logfilename[1024];
2361 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2362 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2364 if (codec->flags & CODEC_FLAG_PASS1) {
2365 f = fopen(logfilename, "wb");
2367 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2373 size_t logbuffer_size;
2374 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2375 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2378 codec->stats_in = logbuffer;
2382 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2383 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2384 int size= codec->width * codec->height;
2385 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2390 bit_buffer = av_malloc(bit_buffer_size);
2392 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2394 ret = AVERROR(ENOMEM);
2398 /* open each encoder */
2399 for(i=0;i<nb_ostreams;i++) {
2401 if (ost->encoding_needed) {
2402 AVCodec *codec = ost->enc;
2403 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2405 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2406 ost->st->codec->codec_id, ost->file_index, ost->index);
2407 ret = AVERROR(EINVAL);
2410 if (dec->subtitle_header) {
2411 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2412 if (!ost->st->codec->subtitle_header) {
2413 ret = AVERROR(ENOMEM);
2416 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2417 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2419 if (avcodec_open(ost->st->codec, codec) < 0) {
2420 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2421 ost->file_index, ost->index);
2422 ret = AVERROR(EINVAL);
2425 extra_size += ost->st->codec->extradata_size;
2429 /* open each decoder */
2430 for (i = 0; i < nb_input_streams; i++) {
2431 ist = &input_streams[i];
2432 if (ist->decoding_needed) {
2433 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2435 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2437 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2438 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2439 ret = AVERROR(EINVAL);
2442 if (avcodec_open(ist->st->codec, codec) < 0) {
2443 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2444 ist->file_index, ist->st->index);
2445 ret = AVERROR(EINVAL);
2448 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2449 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2454 for (i = 0; i < nb_input_streams; i++) {
2456 ist = &input_streams[i];
2458 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2459 ist->next_pts = AV_NOPTS_VALUE;
2463 /* set meta data information from input file if required */
2464 for (i=0;i<nb_meta_data_maps;i++) {
2465 AVFormatContext *files[2];
2466 AVDictionary **meta[2];
2469 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2470 if ((index) < 0 || (index) >= (nb_elems)) {\
2471 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2473 ret = AVERROR(EINVAL);\
2477 int out_file_index = meta_data_maps[i][0].file;
2478 int in_file_index = meta_data_maps[i][1].file;
2479 if (in_file_index < 0 || out_file_index < 0)
2481 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2482 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2484 files[0] = output_files[out_file_index];
2485 files[1] = input_files[in_file_index].ctx;
2487 for (j = 0; j < 2; j++) {
2488 AVMetaDataMap *map = &meta_data_maps[i][j];
2490 switch (map->type) {
2492 meta[j] = &files[j]->metadata;
2495 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2496 meta[j] = &files[j]->streams[map->index]->metadata;
2499 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2500 meta[j] = &files[j]->chapters[map->index]->metadata;
2503 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2504 meta[j] = &files[j]->programs[map->index]->metadata;
2509 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2512 /* copy global metadata by default */
2513 if (metadata_global_autocopy) {
2515 for (i = 0; i < nb_output_files; i++)
2516 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2517 AV_DICT_DONT_OVERWRITE);
2520 /* copy chapters according to chapter maps */
2521 for (i = 0; i < nb_chapter_maps; i++) {
2522 int infile = chapter_maps[i].in_file;
2523 int outfile = chapter_maps[i].out_file;
2525 if (infile < 0 || outfile < 0)
2527 if (infile >= nb_input_files) {
2528 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2529 ret = AVERROR(EINVAL);
2532 if (outfile >= nb_output_files) {
2533 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2534 ret = AVERROR(EINVAL);
2537 copy_chapters(infile, outfile);
2540 /* copy chapters from the first input file that has them*/
2541 if (!nb_chapter_maps)
2542 for (i = 0; i < nb_input_files; i++) {
2543 if (!input_files[i].ctx->nb_chapters)
2546 for (j = 0; j < nb_output_files; j++)
2547 if ((ret = copy_chapters(i, j)) < 0)
2552 /* open files and write file headers */
2553 for(i=0;i<nb_output_files;i++) {
2554 os = output_files[i];
2555 if (av_write_header(os) < 0) {
2556 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2557 ret = AVERROR(EINVAL);
2560 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2566 /* dump the file output parameters - cannot be done before in case
2568 for(i=0;i<nb_output_files;i++) {
2569 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2572 /* dump the stream mapping */
2574 fprintf(stderr, "Stream mapping:\n");
2575 for(i=0;i<nb_ostreams;i++) {
2577 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2578 input_streams[ost->source_index].file_index,
2579 input_streams[ost->source_index].st->index,
2582 if (ost->sync_ist != &input_streams[ost->source_index])
2583 fprintf(stderr, " [sync #%d.%d]",
2584 ost->sync_ist->file_index,
2585 ost->sync_ist->st->index);
2586 fprintf(stderr, "\n");
2591 fprintf(stderr, "%s\n", error);
2596 print_sdp(output_files, nb_output_files);
2601 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2602 avio_set_interrupt_cb(decode_interrupt_cb);
2606 timer_start = av_gettime();
2608 for(; received_sigterm == 0;) {
2609 int file_index, ist_index;
2617 /* if 'q' pressed, exits */
2621 /* read_key() returns 0 on EOF */
2625 if (key == '+') verbose++;
2626 if (key == '-') verbose--;
2627 if (key == 's') qp_hist ^= 1;
2630 do_hex_dump = do_pkt_dump = 0;
2631 } else if(do_pkt_dump){
2635 av_log_set_level(AV_LOG_DEBUG);
2637 if (key == 'd' || key == 'D'){
2640 debug = input_streams[0].st->codec->debug<<1;
2641 if(!debug) debug = 1;
2642 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2645 scanf("%d", &debug);
2646 for(i=0;i<nb_input_streams;i++) {
2647 input_streams[i].st->codec->debug = debug;
2649 for(i=0;i<nb_ostreams;i++) {
2651 ost->st->codec->debug = debug;
2653 if(debug) av_log_set_level(AV_LOG_DEBUG);
2654 fprintf(stderr,"debug=%d\n", debug);
2657 fprintf(stderr, "key function\n"
2658 "? show this help\n"
2659 "+ increase verbosity\n"
2660 "- decrease verbosity\n"
2661 "D cycle through available debug modes\n"
2662 "h dump packets/hex press to cycle through the 3 states\n"
2664 "s Show QP histogram\n"
2669 /* select the stream that we must read now by looking at the
2670 smallest output pts */
2672 for(i=0;i<nb_ostreams;i++) {
2675 os = output_files[ost->file_index];
2676 ist = &input_streams[ost->source_index];
2677 if(ist->is_past_recording_time || no_packet[ist->file_index])
2679 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2680 ipts = (double)ist->pts;
2681 if (!input_files[ist->file_index].eof_reached){
2682 if(ipts < ipts_min) {
2684 if(input_sync ) file_index = ist->file_index;
2686 if(opts < opts_min) {
2688 if(!input_sync) file_index = ist->file_index;
2691 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2696 /* if none, if is finished */
2697 if (file_index < 0) {
2698 if(no_packet_count){
2700 memset(no_packet, 0, sizeof(no_packet));
2707 /* finish if limit size exhausted */
2708 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2711 /* read a frame from it and output it in the fifo */
2712 is = input_files[file_index].ctx;
2713 ret= av_read_frame(is, &pkt);
2714 if(ret == AVERROR(EAGAIN)){
2715 no_packet[file_index]=1;
2720 input_files[file_index].eof_reached = 1;
2728 memset(no_packet, 0, sizeof(no_packet));
2731 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2732 is->streams[pkt.stream_index]);
2734 /* the following test is needed in case new streams appear
2735 dynamically in stream : we ignore them */
2736 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2737 goto discard_packet;
2738 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2739 ist = &input_streams[ist_index];
2741 goto discard_packet;
2743 if (pkt.dts != AV_NOPTS_VALUE)
2744 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2745 if (pkt.pts != AV_NOPTS_VALUE)
2746 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2748 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2749 && input_files_ts_scale[file_index][pkt.stream_index]){
2750 if(pkt.pts != AV_NOPTS_VALUE)
2751 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2752 if(pkt.dts != AV_NOPTS_VALUE)
2753 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2756 // 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);
2757 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2758 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2759 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2760 int64_t delta= pkt_dts - ist->next_pts;
2761 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2762 input_files_ts_offset[ist->file_index]-= delta;
2764 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2765 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2766 if(pkt.pts != AV_NOPTS_VALUE)
2767 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2771 /* finish if recording time exhausted */
2772 if (recording_time != INT64_MAX &&
2773 (pkt.pts != AV_NOPTS_VALUE ?
2774 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2776 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2778 ist->is_past_recording_time = 1;
2779 goto discard_packet;
2782 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2783 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2786 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2787 ist->file_index, ist->st->index);
2790 av_free_packet(&pkt);
2795 av_free_packet(&pkt);
2797 /* dump report by using the output first video and audio streams */
2798 print_report(output_files, ost_table, nb_ostreams, 0);
2801 /* at the end of stream, we must flush the decoder buffers */
2802 for (i = 0; i < nb_input_streams; i++) {
2803 ist = &input_streams[i];
2804 if (ist->decoding_needed) {
2805 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2811 /* write the trailer if needed and close file */
2812 for(i=0;i<nb_output_files;i++) {
2813 os = output_files[i];
2814 av_write_trailer(os);
2817 /* dump report by using the first video and audio streams */
2818 print_report(output_files, ost_table, nb_ostreams, 1);
2820 /* close each encoder */
2821 for(i=0;i<nb_ostreams;i++) {
2823 if (ost->encoding_needed) {
2824 av_freep(&ost->st->codec->stats_in);
2825 avcodec_close(ost->st->codec);
2828 avfilter_graph_free(&ost->graph);
2832 /* close each decoder */
2833 for (i = 0; i < nb_input_streams; i++) {
2834 ist = &input_streams[i];
2835 if (ist->decoding_needed) {
2836 avcodec_close(ist->st->codec);
2844 av_freep(&bit_buffer);
2847 for(i=0;i<nb_ostreams;i++) {
2850 if (ost->st->stream_copy)
2851 av_freep(&ost->st->codec->extradata);
2853 fclose(ost->logfile);
2854 ost->logfile = NULL;
2856 av_fifo_free(ost->fifo); /* works even if fifo is not
2857 initialized but set to zero */
2858 av_freep(&ost->st->codec->subtitle_header);
2859 av_free(ost->resample_frame.data[0]);
2860 av_free(ost->forced_kf_pts);
2861 if (ost->video_resample)
2862 sws_freeContext(ost->img_resample_ctx);
2864 audio_resample_close(ost->resample);
2865 if (ost->reformat_ctx)
2866 av_audio_convert_free(ost->reformat_ctx);
2875 static int opt_format(const char *opt, const char *arg)
2877 last_asked_format = arg;
2881 static int opt_video_rc_override_string(const char *opt, const char *arg)
2883 video_rc_override_string = arg;
2887 static int opt_me_threshold(const char *opt, const char *arg)
2889 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2893 static int opt_verbose(const char *opt, const char *arg)
2895 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2899 static int opt_frame_rate(const char *opt, const char *arg)
2901 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2902 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2908 static int opt_bitrate(const char *opt, const char *arg)
2910 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2912 opt_default(opt, arg);
2914 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2915 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2920 static int opt_frame_crop(const char *opt, const char *arg)
2922 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2923 return AVERROR(EINVAL);
2926 static int opt_frame_size(const char *opt, const char *arg)
2928 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2929 fprintf(stderr, "Incorrect frame size\n");
2930 return AVERROR(EINVAL);
2935 static int opt_pad(const char *opt, const char *arg) {
2936 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2940 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2942 if (strcmp(arg, "list")) {
2943 frame_pix_fmt = av_get_pix_fmt(arg);
2944 if (frame_pix_fmt == PIX_FMT_NONE) {
2945 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2946 return AVERROR(EINVAL);
2949 opt_pix_fmts(NULL, NULL);
2955 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2962 p = strchr(arg, ':');
2964 x = strtol(arg, &end, 10);
2966 y = strtol(end+1, &end, 10);
2968 ar = (double)x / (double)y;
2970 ar = strtod(arg, NULL);
2973 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2974 return AVERROR(EINVAL);
2976 frame_aspect_ratio = ar;
2980 static int opt_metadata(const char *opt, const char *arg)
2982 char *mid= strchr(arg, '=');
2985 fprintf(stderr, "Missing =\n");
2990 av_dict_set(&metadata, arg, mid, 0);
2995 static int opt_qscale(const char *opt, const char *arg)
2997 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2998 if (video_qscale <= 0 || video_qscale > 255) {
2999 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
3000 return AVERROR(EINVAL);
3005 static int opt_top_field_first(const char *opt, const char *arg)
3007 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
3008 opt_default(opt, arg);
3012 static int opt_thread_count(const char *opt, const char *arg)
3014 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3017 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
3022 static int opt_audio_sample_fmt(const char *opt, const char *arg)
3024 if (strcmp(arg, "list")) {
3025 audio_sample_fmt = av_get_sample_fmt(arg);
3026 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
3027 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
3028 return AVERROR(EINVAL);
3033 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
3034 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
3040 static int opt_audio_rate(const char *opt, const char *arg)
3042 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3046 static int opt_audio_channels(const char *opt, const char *arg)
3048 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3052 static int opt_video_channel(const char *opt, const char *arg)
3054 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3058 static int opt_video_standard(const char *opt, const char *arg)
3060 video_standard = av_strdup(arg);
3064 static int opt_codec(const char *opt, const char *arg)
3066 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
3068 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
3069 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
3070 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
3071 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
3073 av_freep(pcodec_name);
3074 if (!strcmp(arg, "copy")) {
3077 *pcodec_name = av_strdup(arg);
3082 static int opt_codec_tag(const char *opt, const char *arg)
3085 uint32_t *codec_tag;
3087 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3088 !strcmp(opt, "vtag") ? &video_codec_tag :
3089 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3093 *codec_tag = strtol(arg, &tail, 0);
3095 *codec_tag = AV_RL32(arg);
3100 static int opt_map(const char *opt, const char *arg)
3105 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3106 m = &stream_maps[nb_stream_maps-1];
3108 m->file_index = strtol(arg, &p, 0);
3112 m->stream_index = strtol(p, &p, 0);
3115 m->sync_file_index = strtol(p, &p, 0);
3118 m->sync_stream_index = strtol(p, &p, 0);
3120 m->sync_file_index = m->file_index;
3121 m->sync_stream_index = m->stream_index;
3126 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3137 *index = strtol(++arg, endptr, 0);
3140 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3147 static int opt_map_metadata(const char *opt, const char *arg)
3149 AVMetaDataMap *m, *m1;
3152 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3153 &nb_meta_data_maps, nb_meta_data_maps + 1);
3155 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3156 m->file = strtol(arg, &p, 0);
3157 parse_meta_type(p, &m->type, &m->index, &p);
3161 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3162 m1->file = strtol(p, &p, 0);
3163 parse_meta_type(p, &m1->type, &m1->index, &p);
3165 if (m->type == 'g' || m1->type == 'g')
3166 metadata_global_autocopy = 0;
3167 if (m->type == 's' || m1->type == 's')
3168 metadata_streams_autocopy = 0;
3169 if (m->type == 'c' || m1->type == 'c')
3170 metadata_chapters_autocopy = 0;
3175 static int opt_map_meta_data(const char *opt, const char *arg)
3177 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3178 "Use -map_metadata instead.\n");
3179 return opt_map_metadata(opt, arg);
3182 static int opt_map_chapters(const char *opt, const char *arg)
3187 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3188 nb_chapter_maps + 1);
3189 c = &chapter_maps[nb_chapter_maps - 1];
3190 c->out_file = strtol(arg, &p, 0);
3194 c->in_file = strtol(p, &p, 0);
3198 static int opt_input_ts_scale(const char *opt, const char *arg)
3200 unsigned int stream;
3204 stream = strtol(arg, &p, 0);
3207 scale= strtod(p, &p);
3209 if(stream >= MAX_STREAMS)
3212 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);
3213 input_files_ts_scale[nb_input_files][stream]= scale;
3217 static int opt_recording_time(const char *opt, const char *arg)
3219 recording_time = parse_time_or_die(opt, arg, 1);
3223 static int opt_start_time(const char *opt, const char *arg)
3225 start_time = parse_time_or_die(opt, arg, 1);
3229 static int opt_recording_timestamp(const char *opt, const char *arg)
3231 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3235 static int opt_input_ts_offset(const char *opt, const char *arg)
3237 input_ts_offset = parse_time_or_die(opt, arg, 1);
3241 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3243 const char *codec_string = encoder ? "encoder" : "decoder";
3247 return CODEC_ID_NONE;
3249 avcodec_find_encoder_by_name(name) :
3250 avcodec_find_decoder_by_name(name);
3252 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3255 if(codec->type != type) {
3256 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3259 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3260 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3261 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3262 "results.\nAdd '-strict experimental' if you want to use it.\n",
3263 codec_string, codec->name);
3265 avcodec_find_encoder(codec->id) :
3266 avcodec_find_decoder(codec->id);
3267 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3268 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3269 codec_string, codec->name);
3275 static int opt_input_file(const char *opt, const char *filename)
3277 AVFormatContext *ic;
3278 AVFormatParameters params, *ap = ¶ms;
3279 AVInputFormat *file_iformat = NULL;
3280 int err, i, ret, rfps, rfps_base;
3283 if (last_asked_format) {
3284 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3285 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3288 last_asked_format = NULL;
3291 if (!strcmp(filename, "-"))
3294 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3295 !strcmp(filename, "/dev/stdin");
3297 /* get default parameters from command line */
3298 ic = avformat_alloc_context();
3300 print_error(filename, AVERROR(ENOMEM));
3304 memset(ap, 0, sizeof(*ap));
3305 ap->prealloced_context = 1;
3306 ap->sample_rate = audio_sample_rate;
3307 ap->channels = audio_channels;
3308 ap->time_base.den = frame_rate.num;
3309 ap->time_base.num = frame_rate.den;
3310 ap->width = frame_width;
3311 ap->height = frame_height;
3312 ap->pix_fmt = frame_pix_fmt;
3313 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3314 ap->channel = video_channel;
3315 ap->standard = video_standard;
3317 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3319 ic->video_codec_id =
3320 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3321 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3322 ic->audio_codec_id =
3323 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3324 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3325 ic->subtitle_codec_id=
3326 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3327 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3328 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3330 /* open the input file with generic libav function */
3331 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3333 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3334 err = av_demuxer_open(ic, ap);
3336 avformat_free_context(ic);
3339 print_error(filename, err);
3345 for(i=0; i<ic->nb_streams; i++){
3346 ic->streams[i]->discard= AVDISCARD_ALL;
3348 for(i=0; i<ic->nb_programs; i++){
3349 AVProgram *p= ic->programs[i];
3350 if(p->id != opt_programid){
3351 p->discard = AVDISCARD_ALL;
3354 for(j=0; j<p->nb_stream_indexes; j++){
3355 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3360 fprintf(stderr, "Specified program id not found\n");
3366 ic->loop_input = loop_input;
3368 /* If not enough info to get the stream parameters, we decode the
3369 first frames to get it. (used in mpeg case for example) */
3370 ret = av_find_stream_info(ic);
3371 if (ret < 0 && verbose >= 0) {
3372 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3373 av_close_input_file(ic);
3377 timestamp = start_time;
3378 /* add the stream start time */
3379 if (ic->start_time != AV_NOPTS_VALUE)
3380 timestamp += ic->start_time;
3382 /* if seeking requested, we execute it */
3383 if (start_time != 0) {
3384 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3386 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3387 filename, (double)timestamp / AV_TIME_BASE);
3389 /* reset seek info */
3393 /* update the current parameters so that they match the one of the input stream */
3394 for(i=0;i<ic->nb_streams;i++) {
3395 AVStream *st = ic->streams[i];
3396 AVCodecContext *dec = st->codec;
3399 dec->thread_count = thread_count;
3400 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3402 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3403 ist = &input_streams[nb_input_streams - 1];
3405 ist->file_index = nb_input_files;
3408 switch (dec->codec_type) {
3409 case AVMEDIA_TYPE_AUDIO:
3410 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3411 if(!input_codecs[nb_input_codecs-1])
3412 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3413 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]);
3414 channel_layout = dec->channel_layout;
3415 audio_sample_fmt = dec->sample_fmt;
3417 st->discard= AVDISCARD_ALL;
3419 case AVMEDIA_TYPE_VIDEO:
3420 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3421 if(!input_codecs[nb_input_codecs-1])
3422 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3423 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]);
3424 rfps = ic->streams[i]->r_frame_rate.num;
3425 rfps_base = ic->streams[i]->r_frame_rate.den;
3427 dec->flags |= CODEC_FLAG_EMU_EDGE;
3428 dec->height >>= dec->lowres;
3429 dec->width >>= dec->lowres;
3432 dec->debug |= FF_DEBUG_MV;
3434 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3437 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3438 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3440 (float)rfps / rfps_base, rfps, rfps_base);
3444 st->discard= AVDISCARD_ALL;
3445 else if(video_discard)
3446 st->discard= video_discard;
3448 case AVMEDIA_TYPE_DATA:
3450 case AVMEDIA_TYPE_SUBTITLE:
3451 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3452 if(!input_codecs[nb_input_codecs-1])
3453 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3454 if(subtitle_disable)
3455 st->discard = AVDISCARD_ALL;
3457 case AVMEDIA_TYPE_ATTACHMENT:
3458 case AVMEDIA_TYPE_UNKNOWN:
3465 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3466 /* dump the file content */
3468 av_dump_format(ic, nb_input_files, filename, 0);
3470 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3471 input_files[nb_input_files - 1].ctx = ic;
3472 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3474 top_field_first = -1;
3476 frame_rate = (AVRational){0, 0};
3477 frame_pix_fmt = PIX_FMT_NONE;
3480 audio_sample_rate = 0;
3483 av_freep(&video_codec_name);
3484 av_freep(&audio_codec_name);
3485 av_freep(&subtitle_codec_name);
3491 static void check_inputs(int *has_video_ptr,
3493 int *has_subtitle_ptr,
3496 int has_video, has_audio, has_subtitle, has_data, i, j;
3497 AVFormatContext *ic;
3504 for(j=0;j<nb_input_files;j++) {
3505 ic = input_files[j].ctx;
3506 for(i=0;i<ic->nb_streams;i++) {
3507 AVCodecContext *enc = ic->streams[i]->codec;
3508 switch(enc->codec_type) {
3509 case AVMEDIA_TYPE_AUDIO:
3512 case AVMEDIA_TYPE_VIDEO:
3515 case AVMEDIA_TYPE_SUBTITLE:
3518 case AVMEDIA_TYPE_DATA:
3519 case AVMEDIA_TYPE_ATTACHMENT:
3520 case AVMEDIA_TYPE_UNKNOWN:
3528 *has_video_ptr = has_video;
3529 *has_audio_ptr = has_audio;
3530 *has_subtitle_ptr = has_subtitle;
3531 *has_data_ptr = has_data;
3534 static void new_video_stream(AVFormatContext *oc, int file_idx)
3537 AVOutputStream *ost;
3538 AVCodecContext *video_enc;
3539 enum CodecID codec_id = CODEC_ID_NONE;
3540 AVCodec *codec= NULL;
3542 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3544 fprintf(stderr, "Could not alloc stream\n");
3547 ost = new_output_stream(oc, file_idx);
3549 if(!video_stream_copy){
3550 if (video_codec_name) {
3551 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3552 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3553 codec = avcodec_find_encoder_by_name(video_codec_name);
3556 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3557 codec = avcodec_find_encoder(codec_id);
3559 ost->frame_aspect_ratio = frame_aspect_ratio;
3560 frame_aspect_ratio = 0;
3562 ost->avfilter = vfilters;
3567 avcodec_get_context_defaults3(st->codec, codec);
3568 ost->bitstream_filters = video_bitstream_filters;
3569 video_bitstream_filters= NULL;
3571 st->codec->thread_count= thread_count;
3573 video_enc = st->codec;
3576 video_enc->codec_tag= video_codec_tag;
3578 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3579 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3580 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3583 if (video_stream_copy) {
3584 st->stream_copy = 1;
3585 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3586 video_enc->sample_aspect_ratio =
3587 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3593 ost->frame_rate = frame_rate;
3594 video_enc->codec_id = codec_id;
3595 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3597 video_enc->width = frame_width;
3598 video_enc->height = frame_height;
3599 video_enc->pix_fmt = frame_pix_fmt;
3600 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3601 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3604 video_enc->gop_size = 0;
3605 if (video_qscale || same_quality) {
3606 video_enc->flags |= CODEC_FLAG_QSCALE;
3607 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3611 video_enc->intra_matrix = intra_matrix;
3613 video_enc->inter_matrix = inter_matrix;
3615 p= video_rc_override_string;
3618 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3620 fprintf(stderr, "error parsing rc_override\n");
3623 video_enc->rc_override=
3624 av_realloc(video_enc->rc_override,
3625 sizeof(RcOverride)*(i+1));
3626 video_enc->rc_override[i].start_frame= start;
3627 video_enc->rc_override[i].end_frame = end;
3629 video_enc->rc_override[i].qscale= q;
3630 video_enc->rc_override[i].quality_factor= 1.0;
3633 video_enc->rc_override[i].qscale= 0;
3634 video_enc->rc_override[i].quality_factor= -q/100.0;
3639 video_enc->rc_override_count=i;
3640 if (!video_enc->rc_initial_buffer_occupancy)
3641 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3642 video_enc->me_threshold= me_threshold;
3643 video_enc->intra_dc_precision= intra_dc_precision - 8;
3646 video_enc->flags|= CODEC_FLAG_PSNR;
3651 video_enc->flags |= CODEC_FLAG_PASS1;
3653 video_enc->flags |= CODEC_FLAG_PASS2;
3657 if (forced_key_frames)
3658 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3660 if (video_language) {
3661 av_dict_set(&st->metadata, "language", video_language, 0);
3662 av_freep(&video_language);
3665 /* reset some key parameters */
3667 av_freep(&video_codec_name);
3668 av_freep(&forced_key_frames);
3669 video_stream_copy = 0;
3670 frame_pix_fmt = PIX_FMT_NONE;
3673 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3676 AVOutputStream *ost;
3677 AVCodec *codec= NULL;
3678 AVCodecContext *audio_enc;
3679 enum CodecID codec_id = CODEC_ID_NONE;
3681 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3683 fprintf(stderr, "Could not alloc stream\n");
3686 ost = new_output_stream(oc, file_idx);
3688 if(!audio_stream_copy){
3689 if (audio_codec_name) {
3690 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3691 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3692 codec = avcodec_find_encoder_by_name(audio_codec_name);
3695 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3696 codec = avcodec_find_encoder(codec_id);
3700 avcodec_get_context_defaults3(st->codec, codec);
3702 ost->bitstream_filters = audio_bitstream_filters;
3703 audio_bitstream_filters= NULL;
3705 st->codec->thread_count= thread_count;
3707 audio_enc = st->codec;
3708 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3711 audio_enc->codec_tag= audio_codec_tag;
3713 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3714 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3715 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3717 if (audio_stream_copy) {
3718 st->stream_copy = 1;
3720 audio_enc->codec_id = codec_id;
3721 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3723 if (audio_qscale > QSCALE_NONE) {
3724 audio_enc->flags |= CODEC_FLAG_QSCALE;
3725 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3728 audio_enc->channels = audio_channels;
3729 audio_enc->sample_fmt = audio_sample_fmt;
3730 if (audio_sample_rate)
3731 audio_enc->sample_rate = audio_sample_rate;
3732 audio_enc->channel_layout = channel_layout;
3733 choose_sample_fmt(st, codec);
3735 if (audio_language) {
3736 av_dict_set(&st->metadata, "language", audio_language, 0);
3737 av_freep(&audio_language);
3740 /* reset some key parameters */
3742 av_freep(&audio_codec_name);
3743 audio_stream_copy = 0;
3746 static void new_data_stream(AVFormatContext *oc, int file_idx)
3749 AVCodec *codec=NULL;
3750 AVCodecContext *data_enc;
3752 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3754 fprintf(stderr, "Could not alloc stream\n");
3757 new_output_stream(oc, file_idx);
3758 data_enc = st->codec;
3759 if (!data_stream_copy) {
3760 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3763 avcodec_get_context_defaults3(st->codec, codec);
3765 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3768 data_enc->codec_tag= data_codec_tag;
3770 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3771 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3772 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3774 if (data_stream_copy) {
3775 st->stream_copy = 1;
3779 av_freep(&data_codec_name);
3780 data_stream_copy = 0;
3783 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3786 AVOutputStream *ost;
3787 AVCodec *codec=NULL;
3788 AVCodecContext *subtitle_enc;
3789 enum CodecID codec_id = CODEC_ID_NONE;
3791 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3793 fprintf(stderr, "Could not alloc stream\n");
3796 ost = new_output_stream(oc, file_idx);
3797 subtitle_enc = st->codec;
3798 if(!subtitle_stream_copy){
3799 if (subtitle_codec_name) {
3800 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3801 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3802 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3805 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3806 codec = avcodec_find_encoder(codec_id);
3809 avcodec_get_context_defaults3(st->codec, codec);
3811 ost->bitstream_filters = subtitle_bitstream_filters;
3812 subtitle_bitstream_filters= NULL;
3814 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3816 if(subtitle_codec_tag)
3817 subtitle_enc->codec_tag= subtitle_codec_tag;
3819 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3820 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3821 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3823 if (subtitle_stream_copy) {
3824 st->stream_copy = 1;
3826 subtitle_enc->codec_id = codec_id;
3827 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3830 if (subtitle_language) {
3831 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3832 av_freep(&subtitle_language);
3835 subtitle_disable = 0;
3836 av_freep(&subtitle_codec_name);
3837 subtitle_stream_copy = 0;
3840 static int opt_new_stream(const char *opt, const char *arg)
3842 AVFormatContext *oc;
3843 int file_idx = nb_output_files - 1;
3844 if (nb_output_files <= 0) {
3845 fprintf(stderr, "At least one output file must be specified\n");
3848 oc = output_files[file_idx];
3850 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3851 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3852 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3853 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3858 /* arg format is "output-stream-index:streamid-value". */
3859 static int opt_streamid(const char *opt, const char *arg)
3865 av_strlcpy(idx_str, arg, sizeof(idx_str));
3866 p = strchr(idx_str, ':');
3869 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3874 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3875 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3876 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3880 static int opt_output_file(const char *opt, const char *filename)
3882 AVFormatContext *oc;
3883 int err, use_video, use_audio, use_subtitle, use_data;
3884 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3885 AVFormatParameters params, *ap = ¶ms;
3886 AVOutputFormat *file_oformat;
3888 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3889 fprintf(stderr, "Too many output files\n");
3893 if (!strcmp(filename, "-"))
3896 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3897 last_asked_format = NULL;
3899 print_error(filename, err);
3902 file_oformat= oc->oformat;
3904 if (!strcmp(file_oformat->name, "ffm") &&
3905 av_strstart(filename, "http:", NULL)) {
3906 /* special case for files sent to ffserver: we get the stream
3907 parameters from ffserver */
3908 int err = read_ffserver_streams(oc, filename);
3910 print_error(filename, err);
3914 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3915 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3916 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3917 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 */
3919 /* disable if no corresponding type found and at least one
3921 if (nb_input_files > 0) {
3922 check_inputs(&input_has_video,
3924 &input_has_subtitle,
3927 if (!input_has_video)
3929 if (!input_has_audio)
3931 if (!input_has_subtitle)
3933 if (!input_has_data)
3937 /* manual disable */
3938 if (audio_disable) use_audio = 0;
3939 if (video_disable) use_video = 0;
3940 if (subtitle_disable) use_subtitle = 0;
3941 if (data_disable) use_data = 0;
3943 if (use_video) new_video_stream(oc, nb_output_files);
3944 if (use_audio) new_audio_stream(oc, nb_output_files);
3945 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3946 if (use_data) new_data_stream(oc, nb_output_files);
3948 oc->timestamp = recording_timestamp;
3950 av_dict_copy(&oc->metadata, metadata, 0);
3951 av_dict_free(&metadata);
3954 output_files[nb_output_files++] = oc;
3956 /* check filename in case of an image number is expected */
3957 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3958 if (!av_filename_number_test(oc->filename)) {
3959 print_error(oc->filename, AVERROR(EINVAL));
3964 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3965 /* test if it already exists to avoid loosing precious files */
3966 if (!file_overwrite &&
3967 (strchr(filename, ':') == NULL ||
3968 filename[1] == ':' ||
3969 av_strstart(filename, "file:", NULL))) {
3970 if (avio_check(filename, 0) == 0) {
3972 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3974 if (!read_yesno()) {
3975 fprintf(stderr, "Not overwriting - exiting\n");
3980 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3987 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3988 print_error(filename, err);
3993 memset(ap, 0, sizeof(*ap));
3994 if (av_set_parameters(oc, ap) < 0) {
3995 fprintf(stderr, "%s: Invalid encoding parameters\n",
4000 oc->preload= (int)(mux_preload*AV_TIME_BASE);
4001 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
4002 oc->loop_output = loop_output;
4004 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
4006 frame_rate = (AVRational){0, 0};
4009 audio_sample_rate = 0;
4012 av_freep(&forced_key_frames);
4018 /* same option as mencoder */
4019 static int opt_pass(const char *opt, const char *arg)
4021 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4025 static int64_t getutime(void)
4028 struct rusage rusage;
4030 getrusage(RUSAGE_SELF, &rusage);
4031 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4032 #elif HAVE_GETPROCESSTIMES
4034 FILETIME c, e, k, u;
4035 proc = GetCurrentProcess();
4036 GetProcessTimes(proc, &c, &e, &k, &u);
4037 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4039 return av_gettime();
4043 static int64_t getmaxrss(void)
4045 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4046 struct rusage rusage;
4047 getrusage(RUSAGE_SELF, &rusage);
4048 return (int64_t)rusage.ru_maxrss * 1024;
4049 #elif HAVE_GETPROCESSMEMORYINFO
4051 PROCESS_MEMORY_COUNTERS memcounters;
4052 proc = GetCurrentProcess();
4053 memcounters.cb = sizeof(memcounters);
4054 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4055 return memcounters.PeakPagefileUsage;
4061 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4064 const char *p = str;
4071 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4078 static int opt_inter_matrix(const char *opt, const char *arg)
4080 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4081 parse_matrix_coeffs(inter_matrix, arg);
4085 static int opt_intra_matrix(const char *opt, const char *arg)
4087 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4088 parse_matrix_coeffs(intra_matrix, arg);
4092 static void show_usage(void)
4094 printf("Hyper fast Audio and Video encoder\n");
4095 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4099 static int opt_help(const char *opt, const char *arg)
4102 AVOutputFormat *oformat = NULL;
4104 av_log_set_callback(log_callback_help);
4106 show_help_options(options, "Main options:\n",
4107 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4108 show_help_options(options, "\nAdvanced options:\n",
4109 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4111 show_help_options(options, "\nVideo options:\n",
4112 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4114 show_help_options(options, "\nAdvanced Video options:\n",
4115 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4116 OPT_VIDEO | OPT_EXPERT);
4117 show_help_options(options, "\nAudio options:\n",
4118 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4120 show_help_options(options, "\nAdvanced Audio options:\n",
4121 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4122 OPT_AUDIO | OPT_EXPERT);
4123 show_help_options(options, "\nSubtitle options:\n",
4124 OPT_SUBTITLE | OPT_GRAB,
4126 show_help_options(options, "\nAudio/Video grab options:\n",
4130 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4133 /* individual codec options */
4135 while ((c = av_codec_next(c))) {
4136 if (c->priv_class) {
4137 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4142 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4145 /* individual muxer options */
4146 while ((oformat = av_oformat_next(oformat))) {
4147 if (oformat->priv_class) {
4148 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4153 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4157 static int opt_target(const char *opt, const char *arg)
4159 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4160 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4162 if(!strncmp(arg, "pal-", 4)) {
4165 } else if(!strncmp(arg, "ntsc-", 5)) {
4168 } else if(!strncmp(arg, "film-", 5)) {
4173 /* Calculate FR via float to avoid int overflow */
4174 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4177 } else if((fr == 29970) || (fr == 23976)) {
4180 /* Try to determine PAL/NTSC by peeking in the input files */
4181 if(nb_input_files) {
4183 for (j = 0; j < nb_input_files; j++) {
4184 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4185 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4186 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4188 fr = c->time_base.den * 1000 / c->time_base.num;
4192 } else if((fr == 29970) || (fr == 23976)) {
4202 if(verbose > 0 && norm != UNKNOWN)
4203 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4206 if(norm == UNKNOWN) {
4207 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4208 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4209 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4213 if(!strcmp(arg, "vcd")) {
4214 opt_codec("vcodec", "mpeg1video");
4215 opt_codec("acodec", "mp2");
4216 opt_format("f", "vcd");
4218 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4219 opt_frame_rate("r", frame_rates[norm]);
4220 opt_default("g", norm == PAL ? "15" : "18");
4222 opt_default("b", "1150000");
4223 opt_default("maxrate", "1150000");
4224 opt_default("minrate", "1150000");
4225 opt_default("bufsize", "327680"); // 40*1024*8;
4227 opt_default("ab", "224000");
4228 audio_sample_rate = 44100;
4231 opt_default("packetsize", "2324");
4232 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4234 /* We have to offset the PTS, so that it is consistent with the SCR.
4235 SCR starts at 36000, but the first two packs contain only padding
4236 and the first pack from the other stream, respectively, may also have
4237 been written before.
4238 So the real data starts at SCR 36000+3*1200. */
4239 mux_preload= (36000+3*1200) / 90000.0; //0.44
4240 } else if(!strcmp(arg, "svcd")) {
4242 opt_codec("vcodec", "mpeg2video");
4243 opt_codec("acodec", "mp2");
4244 opt_format("f", "svcd");
4246 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4247 opt_frame_rate("r", frame_rates[norm]);
4248 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4249 opt_default("g", norm == PAL ? "15" : "18");
4251 opt_default("b", "2040000");
4252 opt_default("maxrate", "2516000");
4253 opt_default("minrate", "0"); //1145000;
4254 opt_default("bufsize", "1835008"); //224*1024*8;
4255 opt_default("flags", "+scan_offset");
4258 opt_default("ab", "224000");
4259 audio_sample_rate = 44100;
4261 opt_default("packetsize", "2324");
4263 } else if(!strcmp(arg, "dvd")) {
4265 opt_codec("vcodec", "mpeg2video");
4266 opt_codec("acodec", "ac3");
4267 opt_format("f", "dvd");
4269 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4270 opt_frame_rate("r", frame_rates[norm]);
4271 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4272 opt_default("g", norm == PAL ? "15" : "18");
4274 opt_default("b", "6000000");
4275 opt_default("maxrate", "9000000");
4276 opt_default("minrate", "0"); //1500000;
4277 opt_default("bufsize", "1835008"); //224*1024*8;
4279 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4280 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4282 opt_default("ab", "448000");
4283 audio_sample_rate = 48000;
4285 } else if(!strncmp(arg, "dv", 2)) {
4287 opt_format("f", "dv");
4289 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4290 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4291 norm == PAL ? "yuv420p" : "yuv411p");
4292 opt_frame_rate("r", frame_rates[norm]);
4294 audio_sample_rate = 48000;
4298 fprintf(stderr, "Unknown target: %s\n", arg);
4299 return AVERROR(EINVAL);
4304 static int opt_vstats_file(const char *opt, const char *arg)
4306 av_free (vstats_filename);
4307 vstats_filename=av_strdup (arg);
4311 static int opt_vstats(const char *opt, const char *arg)
4314 time_t today2 = time(NULL);
4315 struct tm *today = localtime(&today2);
4317 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4319 return opt_vstats_file(opt, filename);
4322 static int opt_bsf(const char *opt, const char *arg)
4324 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4325 AVBitStreamFilterContext **bsfp;
4328 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4332 bsfp= *opt == 'v' ? &video_bitstream_filters :
4333 *opt == 'a' ? &audio_bitstream_filters :
4334 &subtitle_bitstream_filters;
4336 bsfp= &(*bsfp)->next;
4343 static int opt_preset(const char *opt, const char *arg)
4346 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4347 char *codec_name = *opt == 'v' ? video_codec_name :
4348 *opt == 'a' ? audio_codec_name :
4349 subtitle_codec_name;
4351 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4352 fprintf(stderr, "File for preset '%s' not found\n", arg);
4357 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4358 if(line[0] == '#' && !e)
4360 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4362 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4365 if (!strcmp(tmp, "acodec") ||
4366 !strcmp(tmp, "vcodec") ||
4367 !strcmp(tmp, "scodec") ||
4368 !strcmp(tmp, "dcodec")) {
4369 opt_codec(tmp, tmp2);
4370 }else if(opt_default(tmp, tmp2) < 0){
4371 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4381 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4385 static int opt_passlogfile(const char *opt, const char *arg)
4387 pass_logfilename_prefix = arg;
4388 opt_default("passlogfile", arg);
4392 static const OptionDef options[] = {
4394 #include "cmdutils_common_opts.h"
4395 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4396 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4397 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4398 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4399 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4400 "outfile[,metadata]:infile[,metadata]" },
4401 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4402 "outfile[,metadata]:infile[,metadata]" },
4403 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4404 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4405 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4406 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4407 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4408 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4409 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4410 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4411 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4412 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4413 "add timings for benchmarking" },
4414 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4415 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4416 "dump each input packet" },
4417 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4418 "when dumping packets, also dump the payload" },
4419 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4420 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4421 { "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)", "" },
4422 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4423 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4424 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4425 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4426 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4427 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4428 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4429 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4430 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4431 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4432 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4433 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4434 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4437 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4438 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4439 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4440 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4441 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4442 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4443 { "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" },
4444 { "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" },
4445 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4446 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4447 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4448 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4449 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4450 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4451 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4452 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4453 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4454 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4455 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4456 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4457 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4458 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4459 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4460 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4461 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4462 "use same quantizer as source (implies VBR)" },
4463 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4464 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4465 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4466 "deinterlace pictures" },
4467 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4468 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4469 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4471 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4473 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4474 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4475 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4476 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4477 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4478 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4479 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4480 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4481 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4482 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4483 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4486 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4487 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4488 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4489 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4490 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4491 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4492 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4493 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4494 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4495 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4496 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4497 { "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" },
4499 /* subtitle options */
4500 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4501 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4502 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4503 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4504 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4507 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4508 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4509 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4512 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4513 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4515 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4516 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4517 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4519 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4520 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4521 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4522 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4523 /* data codec support */
4524 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
4526 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4530 int main(int argc, char **argv)
4534 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4536 if(argc>1 && !strcmp(argv[1], "-d")){
4539 av_log_set_callback(log_callback_null);
4544 avcodec_register_all();
4546 avdevice_register_all();
4549 avfilter_register_all();
4554 if(isatty(STDIN_FILENO))
4555 avio_set_interrupt_cb(decode_interrupt_cb);
4564 parse_options(argc, argv, options, opt_output_file);
4566 if(nb_output_files <= 0 && nb_input_files == 0) {
4568 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4572 /* file converter / grab */
4573 if (nb_output_files <= 0) {
4574 fprintf(stderr, "At least one output file must be specified\n");
4578 if (nb_input_files == 0) {
4579 fprintf(stderr, "At least one input file must be specified\n");
4584 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4585 stream_maps, nb_stream_maps) < 0)
4587 ti = getutime() - ti;
4589 int maxrss = getmaxrss() / 1024;
4590 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4593 return ffmpeg_exit(0);