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 StreamMap {
97 int sync_stream_index;
101 * select an input file for an output file
103 typedef struct MetadataMap {
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 ChapterMap {
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 double *ts_scale;
121 static int nb_ts_scale;
123 static AVFormatContext *output_files[MAX_FILES];
124 static int nb_output_files = 0;
126 static StreamMap *stream_maps = NULL;
127 static int nb_stream_maps;
129 /* first item specifies output metadata, second is input */
130 static MetadataMap (*meta_data_maps)[2] = NULL;
131 static int nb_meta_data_maps;
132 static int metadata_global_autocopy = 1;
133 static int metadata_streams_autocopy = 1;
134 static int metadata_chapters_autocopy = 1;
136 static ChapterMap *chapter_maps = NULL;
137 static int nb_chapter_maps;
139 /* indexed by output file stream index */
140 static int *streamid_map = NULL;
141 static int nb_streamid_map = 0;
143 static int frame_width = 0;
144 static int frame_height = 0;
145 static float frame_aspect_ratio = 0;
146 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
147 static int frame_bits_per_raw_sample = 0;
148 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
149 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
150 static AVRational frame_rate;
151 static float video_qscale = 0;
152 static uint16_t *intra_matrix = NULL;
153 static uint16_t *inter_matrix = NULL;
154 static const char *video_rc_override_string=NULL;
155 static int video_disable = 0;
156 static int video_discard = 0;
157 static char *video_codec_name = NULL;
158 static unsigned int video_codec_tag = 0;
159 static char *video_language = NULL;
160 static int same_quality = 0;
161 static int do_deinterlace = 0;
162 static int top_field_first = -1;
163 static int me_threshold = 0;
164 static int intra_dc_precision = 8;
165 static int loop_input = 0;
166 static int loop_output = AVFMT_NOOUTPUTLOOP;
167 static int qp_hist = 0;
169 static char *vfilters = NULL;
172 static int intra_only = 0;
173 static int audio_sample_rate = 0;
174 #define QSCALE_NONE -99999
175 static float audio_qscale = QSCALE_NONE;
176 static int audio_disable = 0;
177 static int audio_channels = 0;
178 static char *audio_codec_name = NULL;
179 static unsigned int audio_codec_tag = 0;
180 static char *audio_language = NULL;
182 static int subtitle_disable = 0;
183 static char *subtitle_codec_name = NULL;
184 static char *subtitle_language = NULL;
185 static unsigned int subtitle_codec_tag = 0;
187 static int data_disable = 0;
188 static char *data_codec_name = NULL;
189 static unsigned int data_codec_tag = 0;
191 static float mux_preload= 0.5;
192 static float mux_max_delay= 0.7;
194 static int64_t recording_time = INT64_MAX;
195 static int64_t start_time = 0;
196 static int64_t input_ts_offset = 0;
197 static int file_overwrite = 0;
198 static AVDictionary *metadata;
199 static int do_benchmark = 0;
200 static int do_hex_dump = 0;
201 static int do_pkt_dump = 0;
202 static int do_psnr = 0;
203 static int do_pass = 0;
204 static const char *pass_logfilename_prefix;
205 static int audio_stream_copy = 0;
206 static int video_stream_copy = 0;
207 static int subtitle_stream_copy = 0;
208 static int data_stream_copy = 0;
209 static int video_sync_method= -1;
210 static int audio_sync_method= 0;
211 static float audio_drift_threshold= 0.1;
212 static int copy_ts= 0;
213 static int copy_tb= 0;
214 static int opt_shortest = 0;
215 static char *vstats_filename;
216 static FILE *vstats_file;
217 static int opt_programid = 0;
218 static int copy_initial_nonkeyframes = 0;
220 static int rate_emu = 0;
222 static int video_channel = 0;
223 static char *video_standard;
225 static int audio_volume = 256;
227 static int exit_on_error = 0;
228 static int using_stdin = 0;
229 static int verbose = 1;
230 static int run_as_daemon = 0;
231 static int thread_count= 1;
232 static int q_pressed = 0;
233 static int64_t video_size = 0;
234 static int64_t audio_size = 0;
235 static int64_t extra_size = 0;
236 static int nb_frames_dup = 0;
237 static int nb_frames_drop = 0;
238 static int input_sync;
239 static uint64_t limit_filesize = 0;
240 static int force_fps = 0;
241 static char *forced_key_frames = NULL;
243 static float dts_delta_threshold = 10;
245 static int64_t timer_start;
247 static uint8_t *audio_buf;
248 static uint8_t *audio_out;
249 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
251 static short *samples;
253 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
254 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
255 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
257 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
261 typedef struct OutputStream {
262 int file_index; /* file index */
263 int index; /* stream index in the output file */
264 int source_index; /* InputStream index */
265 AVStream *st; /* stream in the output file */
266 int encoding_needed; /* true if encoding needed for this stream */
268 /* input pts and corresponding output pts
270 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
271 struct InputStream *sync_ist; /* input stream to sync against */
272 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
273 AVBitStreamFilterContext *bitstream_filters;
278 AVFrame resample_frame; /* temporary frame for image resampling */
279 struct SwsContext *img_resample_ctx; /* for image resampling */
282 int resample_pix_fmt;
283 AVRational frame_rate;
285 float frame_aspect_ratio;
287 /* forced key frames */
288 int64_t *forced_kf_pts;
294 ReSampleContext *resample; /* for audio resampling */
295 int resample_sample_fmt;
296 int resample_channels;
297 int resample_sample_rate;
299 AVAudioConvert *reformat_ctx;
300 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
304 AVFilterContext *output_video_filter;
305 AVFilterContext *input_video_filter;
306 AVFilterBufferRef *picref;
308 AVFilterGraph *graph;
314 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
315 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
317 typedef struct InputStream {
320 int discard; /* true if stream data should be discarded */
321 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
324 int64_t start; /* time when read started */
325 int64_t next_pts; /* synthetic pts for cases where pkt.pts
327 int64_t pts; /* current pts */
329 int is_start; /* is 1 at the start and after a discontinuity */
330 int showed_multi_packet_warning;
331 int is_past_recording_time;
334 typedef struct InputFile {
335 AVFormatContext *ctx;
336 int eof_reached; /* true if eof reached */
337 int ist_index; /* index of first stream in ist_table */
338 int buffer_size; /* current total buffer size */
344 /* init terminal so that we can grab keys */
345 static struct termios oldtty;
348 static InputStream *input_streams = NULL;
349 static int nb_input_streams = 0;
350 static InputFile *input_files = NULL;
351 static int nb_input_files = 0;
355 static int configure_video_filters(InputStream *ist, OutputStream *ost)
357 AVFilterContext *last_filter, *filter;
358 /** filter graph containing all filters including input & output */
359 AVCodecContext *codec = ost->st->codec;
360 AVCodecContext *icodec = ist->st->codec;
361 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
362 AVRational sample_aspect_ratio;
366 ost->graph = avfilter_graph_alloc();
368 if (ist->st->sample_aspect_ratio.num){
369 sample_aspect_ratio = ist->st->sample_aspect_ratio;
371 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
373 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
374 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
375 sample_aspect_ratio.num, sample_aspect_ratio.den);
377 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
378 "src", args, NULL, ost->graph);
381 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
382 "out", NULL, pix_fmts, ost->graph);
385 last_filter = ost->input_video_filter;
387 if (codec->width != icodec->width || codec->height != icodec->height) {
388 snprintf(args, 255, "%d:%d:flags=0x%X",
392 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
393 NULL, args, NULL, ost->graph)) < 0)
395 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
397 last_filter = filter;
400 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
401 ost->graph->scale_sws_opts = av_strdup(args);
404 AVFilterInOut *outputs = avfilter_inout_alloc();
405 AVFilterInOut *inputs = avfilter_inout_alloc();
407 outputs->name = av_strdup("in");
408 outputs->filter_ctx = last_filter;
409 outputs->pad_idx = 0;
410 outputs->next = NULL;
412 inputs->name = av_strdup("out");
413 inputs->filter_ctx = ost->output_video_filter;
417 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
419 av_freep(&ost->avfilter);
421 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
425 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
428 codec->width = ost->output_video_filter->inputs[0]->w;
429 codec->height = ost->output_video_filter->inputs[0]->h;
430 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
431 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
432 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
433 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
437 #endif /* CONFIG_AVFILTER */
439 static void term_exit(void)
441 av_log(NULL, AV_LOG_QUIET, "%s", "");
444 tcsetattr (0, TCSANOW, &oldtty);
448 static volatile int received_sigterm = 0;
451 sigterm_handler(int sig)
453 received_sigterm = sig;
458 static void term_init(void)
468 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
469 |INLCR|IGNCR|ICRNL|IXON);
470 tty.c_oflag |= OPOST;
471 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
472 tty.c_cflag &= ~(CSIZE|PARENB);
477 tcsetattr (0, TCSANOW, &tty);
478 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
482 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
483 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
485 signal(SIGXCPU, sigterm_handler);
489 /* read a key without blocking */
490 static int read_key(void)
505 n = select(1, &rfds, NULL, NULL, &tv);
520 static int decode_interrupt_cb(void)
522 q_pressed += read_key() == 'q';
523 return q_pressed > 1;
526 static int ffmpeg_exit(int ret)
531 for(i=0;i<nb_output_files;i++) {
532 AVFormatContext *s = output_files[i];
533 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
535 avformat_free_context(s);
536 av_free(output_streams_for_file[i]);
538 for(i=0;i<nb_input_files;i++) {
539 av_close_input_file(input_files[i].ctx);
542 av_free(intra_matrix);
543 av_free(inter_matrix);
547 av_free(vstats_filename);
549 av_free(streamid_map);
550 av_free(stream_maps);
551 av_free(meta_data_maps);
553 av_freep(&input_streams);
554 av_freep(&input_files);
556 av_free(video_codec_name);
557 av_free(audio_codec_name);
558 av_free(subtitle_codec_name);
559 av_free(data_codec_name);
561 av_free(video_standard);
566 allocated_audio_buf_size= allocated_audio_out_size= 0;
573 if (received_sigterm) {
575 "Received signal %d: terminating.\n",
576 (int) received_sigterm);
580 exit(ret); /* not all OS-es handle main() return value */
584 /* similar to ff_dynarray_add() and av_fast_realloc() */
585 static void *grow_array(void *array, int elem_size, int *size, int new_size)
587 if (new_size >= INT_MAX / elem_size) {
588 fprintf(stderr, "Array too big.\n");
591 if (*size < new_size) {
592 uint8_t *tmp = av_realloc(array, new_size*elem_size);
594 fprintf(stderr, "Could not alloc buffer.\n");
597 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
604 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
606 if(codec && codec->sample_fmts){
607 const enum AVSampleFormat *p= codec->sample_fmts;
609 if(*p == st->codec->sample_fmt)
613 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
614 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
615 av_log(NULL, AV_LOG_WARNING,
616 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
617 av_get_sample_fmt_name(st->codec->sample_fmt),
619 av_get_sample_fmt_name(codec->sample_fmts[0]));
620 st->codec->sample_fmt = codec->sample_fmts[0];
625 static void choose_sample_rate(AVStream *st, AVCodec *codec)
627 if(codec && codec->supported_samplerates){
628 const int *p= codec->supported_samplerates;
630 int best_dist=INT_MAX;
632 int dist= abs(st->codec->sample_rate - *p);
633 if(dist < best_dist){
639 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
641 st->codec->sample_rate= best;
645 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
647 if(codec && codec->pix_fmts){
648 const enum PixelFormat *p= codec->pix_fmts;
649 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
650 if(st->codec->codec_id==CODEC_ID_MJPEG){
651 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
652 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
653 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};
657 if(*p == st->codec->pix_fmt)
661 if(st->codec->pix_fmt != PIX_FMT_NONE)
662 av_log(NULL, AV_LOG_WARNING,
663 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
664 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
666 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
667 st->codec->pix_fmt = codec->pix_fmts[0];
672 static OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, AVCodec *codec)
675 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
676 int idx = oc->nb_streams - 1;
679 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
683 output_streams_for_file[file_idx] =
684 grow_array(output_streams_for_file[file_idx],
685 sizeof(*output_streams_for_file[file_idx]),
686 &nb_output_streams_for_file[file_idx],
688 ost = output_streams_for_file[file_idx][idx] =
689 av_mallocz(sizeof(OutputStream));
691 fprintf(stderr, "Could not alloc output stream\n");
694 ost->file_index = file_idx;
699 avcodec_get_context_defaults3(st->codec, codec);
701 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
705 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
711 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
714 /* copy stream format */
715 for(i=0;i<ic->nb_streams;i++) {
720 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
721 ost = new_output_stream(s, nb_output_files, codec);
724 // FIXME: a more elegant solution is needed
725 memcpy(st, ic->streams[i], sizeof(AVStream));
726 st->info = av_malloc(sizeof(*st->info));
727 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
728 avcodec_copy_context(st->codec, ic->streams[i]->codec);
730 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
731 if (audio_stream_copy) {
734 choose_sample_fmt(st, codec);
735 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
736 if (video_stream_copy) {
739 choose_pixel_fmt(st, codec);
742 if(st->codec->flags & CODEC_FLAG_BITEXACT)
746 av_close_input_file(ic);
751 get_sync_ipts(const OutputStream *ost)
753 const InputStream *ist = ost->sync_ist;
754 return (double)(ist->pts - start_time)/AV_TIME_BASE;
757 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
761 AVPacket new_pkt= *pkt;
762 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
763 &new_pkt.data, &new_pkt.size,
764 pkt->data, pkt->size,
765 pkt->flags & AV_PKT_FLAG_KEY);
768 new_pkt.destruct= av_destruct_packet;
770 fprintf(stderr, "%s failed for stream %d, codec %s",
771 bsfc->filter->name, pkt->stream_index,
772 avctx->codec ? avctx->codec->name : "copy");
782 ret= av_interleaved_write_frame(s, pkt);
784 print_error("av_interleaved_write_frame()", ret);
789 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
791 static void do_audio_out(AVFormatContext *s,
794 unsigned char *buf, int size)
797 int64_t audio_out_size, audio_buf_size;
798 int64_t allocated_for_size= size;
800 int size_out, frame_bytes, ret, resample_changed;
801 AVCodecContext *enc= ost->st->codec;
802 AVCodecContext *dec= ist->st->codec;
803 int osize = av_get_bytes_per_sample(enc->sample_fmt);
804 int isize = av_get_bytes_per_sample(dec->sample_fmt);
805 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
808 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
809 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
810 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
811 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
812 audio_buf_size*= osize*enc->channels;
814 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
815 if(coded_bps > 8*osize)
816 audio_out_size= audio_out_size * coded_bps / (8*osize);
817 audio_out_size += FF_MIN_BUFFER_SIZE;
819 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
820 fprintf(stderr, "Buffer sizes too large\n");
824 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
825 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
826 if (!audio_buf || !audio_out){
827 fprintf(stderr, "Out of memory in do_audio_out\n");
831 if (enc->channels != dec->channels)
832 ost->audio_resample = 1;
834 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
835 ost->resample_channels != dec->channels ||
836 ost->resample_sample_rate != dec->sample_rate;
838 if ((ost->audio_resample && !ost->resample) || resample_changed) {
839 if (resample_changed) {
840 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",
841 ist->file_index, ist->st->index,
842 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
843 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
844 ost->resample_sample_fmt = dec->sample_fmt;
845 ost->resample_channels = dec->channels;
846 ost->resample_sample_rate = dec->sample_rate;
848 audio_resample_close(ost->resample);
850 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
851 if (audio_sync_method <= 1 &&
852 ost->resample_sample_fmt == enc->sample_fmt &&
853 ost->resample_channels == enc->channels &&
854 ost->resample_sample_rate == enc->sample_rate) {
855 ost->resample = NULL;
856 ost->audio_resample = 0;
858 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
859 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
860 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
861 enc->sample_rate, dec->sample_rate,
862 enc->sample_fmt, dec->sample_fmt,
864 if (!ost->resample) {
865 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
866 dec->channels, dec->sample_rate,
867 enc->channels, enc->sample_rate);
873 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
874 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
875 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
876 if (ost->reformat_ctx)
877 av_audio_convert_free(ost->reformat_ctx);
878 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
879 dec->sample_fmt, 1, NULL, 0);
880 if (!ost->reformat_ctx) {
881 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
882 av_get_sample_fmt_name(dec->sample_fmt),
883 av_get_sample_fmt_name(enc->sample_fmt));
886 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
889 if(audio_sync_method){
890 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
891 - av_fifo_size(ost->fifo)/(enc->channels * 2);
892 double idelta= delta*dec->sample_rate / enc->sample_rate;
893 int byte_delta= ((int)idelta)*2*dec->channels;
895 //FIXME resample delay
896 if(fabs(delta) > 50){
897 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
899 byte_delta= FFMAX(byte_delta, -size);
903 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
908 static uint8_t *input_tmp= NULL;
909 input_tmp= av_realloc(input_tmp, byte_delta + size);
911 if(byte_delta > allocated_for_size - size){
912 allocated_for_size= byte_delta + (int64_t)size;
917 memset(input_tmp, 0, byte_delta);
918 memcpy(input_tmp + byte_delta, buf, size);
922 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
924 }else if(audio_sync_method>1){
925 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
926 av_assert0(ost->audio_resample);
928 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
929 // 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));
930 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
934 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
935 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
937 if (ost->audio_resample) {
939 size_out = audio_resample(ost->resample,
940 (short *)buftmp, (short *)buf,
941 size / (dec->channels * isize));
942 size_out = size_out * enc->channels * osize;
948 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
949 const void *ibuf[6]= {buftmp};
950 void *obuf[6]= {audio_buf};
951 int istride[6]= {isize};
952 int ostride[6]= {osize};
953 int len= size_out/istride[0];
954 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
955 printf("av_audio_convert() failed\n");
961 size_out = len*osize;
964 /* now encode as many frames as possible */
965 if (enc->frame_size > 1) {
966 /* output resampled raw samples */
967 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
968 fprintf(stderr, "av_fifo_realloc2() failed\n");
971 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
973 frame_bytes = enc->frame_size * osize * enc->channels;
975 while (av_fifo_size(ost->fifo) >= frame_bytes) {
977 av_init_packet(&pkt);
979 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
981 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
983 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
986 fprintf(stderr, "Audio encoding failed\n");
990 pkt.stream_index= ost->index;
993 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
994 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
995 pkt.flags |= AV_PKT_FLAG_KEY;
996 write_frame(s, &pkt, enc, ost->bitstream_filters);
998 ost->sync_opts += enc->frame_size;
1002 av_init_packet(&pkt);
1004 ost->sync_opts += size_out / (osize * enc->channels);
1006 /* output a pcm frame */
1007 /* determine the size of the coded buffer */
1010 size_out = size_out*coded_bps/8;
1012 if(size_out > audio_out_size){
1013 fprintf(stderr, "Internal error, buffer size too small\n");
1017 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1018 ret = avcodec_encode_audio(enc, audio_out, size_out,
1021 fprintf(stderr, "Audio encoding failed\n");
1025 pkt.stream_index= ost->index;
1026 pkt.data= audio_out;
1028 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1029 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1030 pkt.flags |= AV_PKT_FLAG_KEY;
1031 write_frame(s, &pkt, enc, ost->bitstream_filters);
1035 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1037 AVCodecContext *dec;
1038 AVPicture *picture2;
1039 AVPicture picture_tmp;
1042 dec = ist->st->codec;
1044 /* deinterlace : must be done before any resize */
1045 if (do_deinterlace) {
1048 /* create temporary picture */
1049 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1050 buf = av_malloc(size);
1054 picture2 = &picture_tmp;
1055 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1057 if(avpicture_deinterlace(picture2, picture,
1058 dec->pix_fmt, dec->width, dec->height) < 0) {
1059 /* if error, do not deinterlace */
1060 fprintf(stderr, "Deinterlacing failed\n");
1069 if (picture != picture2)
1070 *picture = *picture2;
1074 /* we begin to correct av delay at this threshold */
1075 #define AV_DELAY_MAX 0.100
1077 static void do_subtitle_out(AVFormatContext *s,
1083 static uint8_t *subtitle_out = NULL;
1084 int subtitle_out_max_size = 1024 * 1024;
1085 int subtitle_out_size, nb, i;
1086 AVCodecContext *enc;
1089 if (pts == AV_NOPTS_VALUE) {
1090 fprintf(stderr, "Subtitle packets must have a pts\n");
1096 enc = ost->st->codec;
1098 if (!subtitle_out) {
1099 subtitle_out = av_malloc(subtitle_out_max_size);
1102 /* Note: DVB subtitle need one packet to draw them and one other
1103 packet to clear them */
1104 /* XXX: signal it in the codec context ? */
1105 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1110 for(i = 0; i < nb; i++) {
1111 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1112 // start_display_time is required to be 0
1113 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1114 sub->end_display_time -= sub->start_display_time;
1115 sub->start_display_time = 0;
1116 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1117 subtitle_out_max_size, sub);
1118 if (subtitle_out_size < 0) {
1119 fprintf(stderr, "Subtitle encoding failed\n");
1123 av_init_packet(&pkt);
1124 pkt.stream_index = ost->index;
1125 pkt.data = subtitle_out;
1126 pkt.size = subtitle_out_size;
1127 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1128 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1129 /* XXX: the pts correction is handled here. Maybe handling
1130 it in the codec would be better */
1132 pkt.pts += 90 * sub->start_display_time;
1134 pkt.pts += 90 * sub->end_display_time;
1136 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1140 static int bit_buffer_size= 1024*256;
1141 static uint8_t *bit_buffer= NULL;
1143 static void do_video_out(AVFormatContext *s,
1146 AVFrame *in_picture,
1147 int *frame_size, float quality)
1149 int nb_frames, i, ret, av_unused resample_changed;
1150 AVFrame *final_picture, *formatted_picture;
1151 AVCodecContext *enc, *dec;
1154 enc = ost->st->codec;
1155 dec = ist->st->codec;
1157 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1159 /* by default, we output a single frame */
1164 if(video_sync_method){
1165 double vdelta = sync_ipts - ost->sync_opts;
1166 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1169 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1172 }else if(vdelta>0.6)
1173 ost->sync_opts= lrintf(sync_ipts);
1174 }else if (vdelta > 1.1)
1175 nb_frames = lrintf(vdelta);
1176 //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);
1177 if (nb_frames == 0){
1180 fprintf(stderr, "*** drop!\n");
1181 }else if (nb_frames > 1) {
1182 nb_frames_dup += nb_frames - 1;
1184 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1187 ost->sync_opts= lrintf(sync_ipts);
1189 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1193 formatted_picture = in_picture;
1194 final_picture = formatted_picture;
1196 #if !CONFIG_AVFILTER
1197 resample_changed = ost->resample_width != dec->width ||
1198 ost->resample_height != dec->height ||
1199 ost->resample_pix_fmt != dec->pix_fmt;
1201 if (resample_changed) {
1202 av_log(NULL, AV_LOG_INFO,
1203 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1204 ist->file_index, ist->st->index,
1205 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1206 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1207 ost->resample_width = dec->width;
1208 ost->resample_height = dec->height;
1209 ost->resample_pix_fmt = dec->pix_fmt;
1212 ost->video_resample = dec->width != enc->width ||
1213 dec->height != enc->height ||
1214 dec->pix_fmt != enc->pix_fmt;
1216 if (ost->video_resample) {
1217 final_picture = &ost->resample_frame;
1218 if (!ost->img_resample_ctx || resample_changed) {
1219 /* initialize the destination picture */
1220 if (!ost->resample_frame.data[0]) {
1221 avcodec_get_frame_defaults(&ost->resample_frame);
1222 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1223 enc->width, enc->height)) {
1224 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1228 /* initialize a new scaler context */
1229 sws_freeContext(ost->img_resample_ctx);
1230 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1231 enc->width, enc->height, enc->pix_fmt,
1232 ost->sws_flags, NULL, NULL, NULL);
1233 if (ost->img_resample_ctx == NULL) {
1234 fprintf(stderr, "Cannot get resampling context\n");
1238 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1239 0, ost->resample_height, final_picture->data, final_picture->linesize);
1243 /* duplicates frame if needed */
1244 for(i=0;i<nb_frames;i++) {
1246 av_init_packet(&pkt);
1247 pkt.stream_index= ost->index;
1249 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1250 /* raw pictures are written as AVPicture structure to
1251 avoid any copies. We support temorarily the older
1253 AVFrame* old_frame = enc->coded_frame;
1254 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1255 pkt.data= (uint8_t *)final_picture;
1256 pkt.size= sizeof(AVPicture);
1257 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1258 pkt.flags |= AV_PKT_FLAG_KEY;
1260 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1261 enc->coded_frame = old_frame;
1263 AVFrame big_picture;
1265 big_picture= *final_picture;
1266 /* better than nothing: use input picture interlaced
1268 big_picture.interlaced_frame = in_picture->interlaced_frame;
1269 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1270 if(top_field_first == -1)
1271 big_picture.top_field_first = in_picture->top_field_first;
1273 big_picture.top_field_first = top_field_first;
1276 /* handles sameq here. This is not correct because it may
1277 not be a global option */
1278 big_picture.quality = quality;
1280 big_picture.pict_type = 0;
1281 // big_picture.pts = AV_NOPTS_VALUE;
1282 big_picture.pts= ost->sync_opts;
1283 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1284 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1285 if (ost->forced_kf_index < ost->forced_kf_count &&
1286 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1287 big_picture.pict_type = AV_PICTURE_TYPE_I;
1288 ost->forced_kf_index++;
1290 ret = avcodec_encode_video(enc,
1291 bit_buffer, bit_buffer_size,
1294 fprintf(stderr, "Video encoding failed\n");
1299 pkt.data= bit_buffer;
1301 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1302 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1303 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1304 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1305 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1307 if(enc->coded_frame->key_frame)
1308 pkt.flags |= AV_PKT_FLAG_KEY;
1309 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1312 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1313 // enc->frame_number-1, ret, enc->pict_type);
1314 /* if two pass, output log */
1315 if (ost->logfile && enc->stats_out) {
1316 fprintf(ost->logfile, "%s", enc->stats_out);
1321 ost->frame_number++;
1325 static double psnr(double d){
1326 return -10.0*log(d)/log(10.0);
1329 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1332 AVCodecContext *enc;
1334 double ti1, bitrate, avg_bitrate;
1336 /* this is executed just the first time do_video_stats is called */
1338 vstats_file = fopen(vstats_filename, "w");
1345 enc = ost->st->codec;
1346 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1347 frame_number = ost->frame_number;
1348 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1349 if (enc->flags&CODEC_FLAG_PSNR)
1350 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1352 fprintf(vstats_file,"f_size= %6d ", frame_size);
1353 /* compute pts value */
1354 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1358 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1359 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1360 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1361 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1362 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1366 static void print_report(AVFormatContext **output_files,
1367 OutputStream **ost_table, int nb_ostreams,
1372 AVFormatContext *oc;
1374 AVCodecContext *enc;
1375 int frame_number, vid, i;
1377 int64_t pts = INT64_MAX;
1378 static int64_t last_time = -1;
1379 static int qp_histogram[52];
1381 if (!is_last_report) {
1383 /* display the report every 0.5 seconds */
1384 cur_time = av_gettime();
1385 if (last_time == -1) {
1386 last_time = cur_time;
1389 if ((cur_time - last_time) < 500000)
1391 last_time = cur_time;
1395 oc = output_files[0];
1397 total_size = avio_size(oc->pb);
1398 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1399 total_size= avio_tell(oc->pb);
1403 for(i=0;i<nb_ostreams;i++) {
1406 enc = ost->st->codec;
1407 if (!ost->st->stream_copy && enc->coded_frame)
1408 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1409 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1412 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1413 float t = (av_gettime()-timer_start) / 1000000.0;
1415 frame_number = ost->frame_number;
1416 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1417 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1423 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1428 if (enc->flags&CODEC_FLAG_PSNR){
1430 double error, error_sum=0;
1431 double scale, scale_sum=0;
1432 char type[3]= {'Y','U','V'};
1433 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1436 error= enc->error[j];
1437 scale= enc->width*enc->height*255.0*255.0*frame_number;
1439 error= enc->coded_frame->error[j];
1440 scale= enc->width*enc->height*255.0*255.0;
1445 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1447 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1451 /* compute min output value */
1452 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1453 ost->st->time_base, AV_TIME_BASE_Q));
1456 if (verbose > 0 || is_last_report) {
1457 int hours, mins, secs, us;
1458 secs = pts / AV_TIME_BASE;
1459 us = pts % AV_TIME_BASE;
1465 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1467 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1468 "size=%8.0fkB time=", total_size / 1024.0);
1469 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1470 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1471 (100 * us) / AV_TIME_BASE);
1472 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1473 "bitrate=%6.1fkbits/s", bitrate);
1475 if (nb_frames_dup || nb_frames_drop)
1476 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1477 nb_frames_dup, nb_frames_drop);
1480 fprintf(stderr, "%s \r", buf);
1485 if (is_last_report && verbose >= 0){
1486 int64_t raw= audio_size + video_size + extra_size;
1487 fprintf(stderr, "\n");
1488 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1492 100.0*(total_size - raw)/raw
1497 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1499 int fill_char = 0x00;
1500 if (sample_fmt == AV_SAMPLE_FMT_U8)
1502 memset(buf, fill_char, size);
1505 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1506 static int output_packet(InputStream *ist, int ist_index,
1507 OutputStream **ost_table, int nb_ostreams,
1508 const AVPacket *pkt)
1510 AVFormatContext *os;
1515 void *buffer_to_free = NULL;
1516 static unsigned int samples_size= 0;
1517 AVSubtitle subtitle, *subtitle_to_free;
1518 int64_t pkt_pts = AV_NOPTS_VALUE;
1520 int frame_available;
1525 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1527 if(ist->next_pts == AV_NOPTS_VALUE)
1528 ist->next_pts= ist->pts;
1532 av_init_packet(&avpkt);
1540 if(pkt->dts != AV_NOPTS_VALUE)
1541 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1542 if(pkt->pts != AV_NOPTS_VALUE)
1543 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1545 //while we have more to decode or while the decoder did output something on EOF
1546 while (avpkt.size > 0 || (!pkt && got_output)) {
1547 uint8_t *data_buf, *decoded_data_buf;
1548 int data_size, decoded_data_size;
1550 ist->pts= ist->next_pts;
1552 if(avpkt.size && avpkt.size != pkt->size &&
1553 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1554 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1555 ist->showed_multi_packet_warning=1;
1558 /* decode the packet if needed */
1559 decoded_data_buf = NULL; /* fail safe */
1560 decoded_data_size= 0;
1561 data_buf = avpkt.data;
1562 data_size = avpkt.size;
1563 subtitle_to_free = NULL;
1564 if (ist->decoding_needed) {
1565 switch(ist->st->codec->codec_type) {
1566 case AVMEDIA_TYPE_AUDIO:{
1567 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1568 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1570 samples= av_malloc(samples_size);
1572 decoded_data_size= samples_size;
1573 /* XXX: could avoid copy if PCM 16 bits with same
1574 endianness as CPU */
1575 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1582 got_output = decoded_data_size > 0;
1583 /* Some bug in mpeg audio decoder gives */
1584 /* decoded_data_size < 0, it seems they are overflows */
1586 /* no audio frame */
1589 decoded_data_buf = (uint8_t *)samples;
1590 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1591 (ist->st->codec->sample_rate * ist->st->codec->channels);
1593 case AVMEDIA_TYPE_VIDEO:
1594 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1595 /* XXX: allocate picture correctly */
1596 avcodec_get_frame_defaults(&picture);
1597 avpkt.pts = pkt_pts;
1598 avpkt.dts = ist->pts;
1599 pkt_pts = AV_NOPTS_VALUE;
1601 ret = avcodec_decode_video2(ist->st->codec,
1602 &picture, &got_output, &avpkt);
1603 quality = same_quality ? picture.quality : 0;
1607 /* no picture yet */
1608 goto discard_packet;
1610 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1611 if (ist->st->codec->time_base.num != 0) {
1612 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1613 ist->next_pts += ((int64_t)AV_TIME_BASE *
1614 ist->st->codec->time_base.num * ticks) /
1615 ist->st->codec->time_base.den;
1618 buffer_to_free = NULL;
1619 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1621 case AVMEDIA_TYPE_SUBTITLE:
1622 ret = avcodec_decode_subtitle2(ist->st->codec,
1623 &subtitle, &got_output, &avpkt);
1627 goto discard_packet;
1629 subtitle_to_free = &subtitle;
1636 switch(ist->st->codec->codec_type) {
1637 case AVMEDIA_TYPE_AUDIO:
1638 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1639 ist->st->codec->sample_rate;
1641 case AVMEDIA_TYPE_VIDEO:
1642 if (ist->st->codec->time_base.num != 0) {
1643 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1644 ist->next_pts += ((int64_t)AV_TIME_BASE *
1645 ist->st->codec->time_base.num * ticks) /
1646 ist->st->codec->time_base.den;
1655 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1656 if (start_time == 0 || ist->pts >= start_time) {
1657 for(i=0;i<nb_ostreams;i++) {
1659 if (ost->input_video_filter && ost->source_index == ist_index) {
1660 if (!picture.sample_aspect_ratio.num)
1661 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1662 picture.pts = ist->pts;
1664 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1670 // preprocess audio (volume)
1671 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1672 if (audio_volume != 256) {
1675 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1676 int v = ((*volp) * audio_volume + 128) >> 8;
1677 if (v < -32768) v = -32768;
1678 if (v > 32767) v = 32767;
1684 /* frame rate emulation */
1686 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1687 int64_t now = av_gettime() - ist->start;
1691 /* if output time reached then transcode raw format,
1692 encode packets and output them */
1693 if (start_time == 0 || ist->pts >= start_time)
1694 for(i=0;i<nb_ostreams;i++) {
1698 if (ost->source_index == ist_index) {
1700 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1701 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1702 while (frame_available) {
1703 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1704 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1705 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1708 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1709 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1713 os = output_files[ost->file_index];
1715 /* set the input output pts pairs */
1716 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1718 if (ost->encoding_needed) {
1719 av_assert0(ist->decoding_needed);
1720 switch(ost->st->codec->codec_type) {
1721 case AVMEDIA_TYPE_AUDIO:
1722 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1724 case AVMEDIA_TYPE_VIDEO:
1726 if (ost->picref->video && !ost->frame_aspect_ratio)
1727 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1729 do_video_out(os, ost, ist, &picture, &frame_size,
1730 same_quality ? quality : ost->st->codec->global_quality);
1731 if (vstats_filename && frame_size)
1732 do_video_stats(os, ost, frame_size);
1734 case AVMEDIA_TYPE_SUBTITLE:
1735 do_subtitle_out(os, ost, ist, &subtitle,
1742 AVFrame avframe; //FIXME/XXX remove this
1745 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1747 av_init_packet(&opkt);
1749 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1750 #if !CONFIG_AVFILTER
1756 /* no reencoding needed : output the packet directly */
1757 /* force the input stream PTS */
1759 avcodec_get_frame_defaults(&avframe);
1760 ost->st->codec->coded_frame= &avframe;
1761 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1763 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1764 audio_size += data_size;
1765 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1766 video_size += data_size;
1770 opkt.stream_index= ost->index;
1771 if(pkt->pts != AV_NOPTS_VALUE)
1772 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1774 opkt.pts= AV_NOPTS_VALUE;
1776 if (pkt->dts == AV_NOPTS_VALUE)
1777 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1779 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1780 opkt.dts -= ost_tb_start_time;
1782 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1783 opkt.flags= pkt->flags;
1785 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1786 if( ost->st->codec->codec_id != CODEC_ID_H264
1787 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1788 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1790 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1791 opkt.destruct= av_destruct_packet;
1793 opkt.data = data_buf;
1794 opkt.size = data_size;
1797 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1798 /* store AVPicture in AVPacket, as expected by the output format */
1799 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1800 opkt.data = (uint8_t *)&pict;
1801 opkt.size = sizeof(AVPicture);
1802 opkt.flags |= AV_PKT_FLAG_KEY;
1804 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1805 ost->st->codec->frame_number++;
1806 ost->frame_number++;
1807 av_free_packet(&opkt);
1811 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1812 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1813 avfilter_unref_buffer(ost->picref);
1819 av_free(buffer_to_free);
1820 /* XXX: allocate the subtitles in the codec ? */
1821 if (subtitle_to_free) {
1822 avsubtitle_free(subtitle_to_free);
1823 subtitle_to_free = NULL;
1830 for(i=0;i<nb_ostreams;i++) {
1832 if (ost->source_index == ist_index) {
1833 AVCodecContext *enc= ost->st->codec;
1834 os = output_files[ost->file_index];
1836 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1838 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1841 if (ost->encoding_needed) {
1845 av_init_packet(&pkt);
1846 pkt.stream_index= ost->index;
1848 switch(ost->st->codec->codec_type) {
1849 case AVMEDIA_TYPE_AUDIO:
1850 fifo_bytes = av_fifo_size(ost->fifo);
1852 /* encode any samples remaining in fifo */
1853 if (fifo_bytes > 0) {
1854 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1855 int fs_tmp = enc->frame_size;
1857 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1858 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1859 enc->frame_size = fifo_bytes / (osize * enc->channels);
1861 int frame_bytes = enc->frame_size*osize*enc->channels;
1862 if (allocated_audio_buf_size < frame_bytes)
1864 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1867 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1868 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1869 ost->st->time_base.num, enc->sample_rate);
1870 enc->frame_size = fs_tmp;
1873 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1876 fprintf(stderr, "Audio encoding failed\n");
1880 pkt.flags |= AV_PKT_FLAG_KEY;
1882 case AVMEDIA_TYPE_VIDEO:
1883 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1885 fprintf(stderr, "Video encoding failed\n");
1889 if(enc->coded_frame && enc->coded_frame->key_frame)
1890 pkt.flags |= AV_PKT_FLAG_KEY;
1891 if (ost->logfile && enc->stats_out) {
1892 fprintf(ost->logfile, "%s", enc->stats_out);
1901 pkt.data= bit_buffer;
1903 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1904 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1905 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1917 static void print_sdp(AVFormatContext **avc, int n)
1921 av_sdp_create(avc, n, sdp, sizeof(sdp));
1922 printf("SDP:\n%s\n", sdp);
1926 static int copy_chapters(int infile, int outfile)
1928 AVFormatContext *is = input_files[infile].ctx;
1929 AVFormatContext *os = output_files[outfile];
1932 for (i = 0; i < is->nb_chapters; i++) {
1933 AVChapter *in_ch = is->chapters[i], *out_ch;
1934 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
1935 AV_TIME_BASE_Q, in_ch->time_base);
1936 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1937 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1940 if (in_ch->end < ts_off)
1942 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1945 out_ch = av_mallocz(sizeof(AVChapter));
1947 return AVERROR(ENOMEM);
1949 out_ch->id = in_ch->id;
1950 out_ch->time_base = in_ch->time_base;
1951 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1952 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1954 if (metadata_chapters_autocopy)
1955 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1958 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1960 return AVERROR(ENOMEM);
1961 os->chapters[os->nb_chapters - 1] = out_ch;
1966 static void parse_forced_key_frames(char *kf, OutputStream *ost,
1967 AVCodecContext *avctx)
1973 for (p = kf; *p; p++)
1976 ost->forced_kf_count = n;
1977 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1978 if (!ost->forced_kf_pts) {
1979 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1982 for (i = 0; i < n; i++) {
1983 p = i ? strchr(p, ',') + 1 : kf;
1984 t = parse_time_or_die("force_key_frames", p, 1);
1985 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1990 * The following code is the main loop of the file converter
1992 static int transcode(AVFormatContext **output_files,
1993 int nb_output_files,
1994 InputFile *input_files,
1996 StreamMap *stream_maps, int nb_stream_maps)
1998 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2000 AVFormatContext *is, *os;
2001 AVCodecContext *codec, *icodec;
2002 OutputStream *ost, **ost_table = NULL;
2007 uint8_t no_packet[MAX_FILES]={0};
2008 int no_packet_count=0;
2009 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2010 int nb_streams[AVMEDIA_TYPE_NB]={0};
2013 for (i = 0; i < nb_input_streams; i++)
2014 input_streams[i].start = av_gettime();
2016 /* output stream init */
2018 for(i=0;i<nb_output_files;i++) {
2019 os = output_files[i];
2020 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2021 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2022 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2023 ret = AVERROR(EINVAL);
2026 nb_ostreams += os->nb_streams;
2028 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2029 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2030 ret = AVERROR(EINVAL);
2034 /* Sanity check the mapping args -- do the input files & streams exist? */
2035 for(i=0;i<nb_stream_maps;i++) {
2036 int fi = stream_maps[i].file_index;
2037 int si = stream_maps[i].stream_index;
2039 if (fi < 0 || fi > nb_input_files - 1 ||
2040 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2041 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2042 ret = AVERROR(EINVAL);
2045 fi = stream_maps[i].sync_file_index;
2046 si = stream_maps[i].sync_stream_index;
2047 if (fi < 0 || fi > nb_input_files - 1 ||
2048 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2049 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2050 ret = AVERROR(EINVAL);
2055 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
2059 for(k=0;k<nb_output_files;k++) {
2060 os = output_files[k];
2061 for(i=0;i<os->nb_streams;i++,n++) {
2062 nb_streams[os->streams[i]->codec->codec_type]++;
2065 for(step=1<<30; step; step>>=1){
2066 int found_streams[AVMEDIA_TYPE_NB]={0};
2067 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2068 nb_frame_threshold[j] += step;
2070 for(j=0; j<nb_input_streams; j++) {
2072 ist = &input_streams[j];
2075 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2077 for(pi=0; pi<f->nb_programs; pi++){
2078 AVProgram *p= f->programs[pi];
2079 if(p->id == opt_programid)
2080 for(si=0; si<p->nb_stream_indexes; si++){
2081 if(f->streams[ p->stream_index[si] ] == ist->st)
2086 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2087 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2088 found_streams[ist->st->codec->codec_type]++;
2091 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2092 if(found_streams[j] < nb_streams[j])
2093 nb_frame_threshold[j] -= step;
2096 for(k=0;k<nb_output_files;k++) {
2097 os = output_files[k];
2098 for(i=0;i<os->nb_streams;i++,n++) {
2100 ost = ost_table[n] = output_streams_for_file[k][i];
2101 if (nb_stream_maps > 0) {
2102 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2103 stream_maps[n].stream_index;
2105 /* Sanity check that the stream types match */
2106 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2107 int i= ost->file_index;
2108 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2109 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2110 stream_maps[n].file_index, stream_maps[n].stream_index,
2111 ost->file_index, ost->index);
2116 /* get corresponding input stream index : we select the first one with the right type */
2118 for (j = 0; j < nb_input_streams; j++) {
2120 ist = &input_streams[j];
2123 AVFormatContext *f = input_files[ist->file_index].ctx;
2125 for(pi=0; pi<f->nb_programs; pi++){
2126 AVProgram *p= f->programs[pi];
2127 if(p->id == opt_programid)
2128 for(si=0; si<p->nb_stream_indexes; si++){
2129 if(f->streams[ p->stream_index[si] ] == ist->st)
2134 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2135 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2136 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2137 ost->source_index = j;
2144 if(! opt_programid) {
2145 /* try again and reuse existing stream */
2146 for (j = 0; j < nb_input_streams; j++) {
2147 ist = &input_streams[j];
2148 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2149 && ist->st->discard != AVDISCARD_ALL) {
2150 ost->source_index = j;
2156 int i= ost->file_index;
2157 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2158 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2159 ost->file_index, ost->index);
2164 ist = &input_streams[ost->source_index];
2166 ost->sync_ist = (nb_stream_maps > 0) ?
2167 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2168 stream_maps[n].sync_stream_index] : ist;
2172 /* for each output stream, we compute the right encoding parameters */
2173 for(i=0;i<nb_ostreams;i++) {
2175 os = output_files[ost->file_index];
2176 ist = &input_streams[ost->source_index];
2178 codec = ost->st->codec;
2179 icodec = ist->st->codec;
2181 if (metadata_streams_autocopy)
2182 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2183 AV_DICT_DONT_OVERWRITE);
2185 ost->st->disposition = ist->st->disposition;
2186 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2187 codec->chroma_sample_location = icodec->chroma_sample_location;
2189 if (ost->st->stream_copy) {
2190 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2192 if (extra_size > INT_MAX)
2195 /* if stream_copy is selected, no need to decode or encode */
2196 codec->codec_id = icodec->codec_id;
2197 codec->codec_type = icodec->codec_type;
2199 if(!codec->codec_tag){
2200 if( !os->oformat->codec_tag
2201 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2202 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2203 codec->codec_tag = icodec->codec_tag;
2206 codec->bit_rate = icodec->bit_rate;
2207 codec->rc_max_rate = icodec->rc_max_rate;
2208 codec->rc_buffer_size = icodec->rc_buffer_size;
2209 codec->extradata= av_mallocz(extra_size);
2210 if (!codec->extradata)
2212 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2213 codec->extradata_size= icodec->extradata_size;
2214 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){
2215 codec->time_base = icodec->time_base;
2216 codec->time_base.num *= icodec->ticks_per_frame;
2217 av_reduce(&codec->time_base.num, &codec->time_base.den,
2218 codec->time_base.num, codec->time_base.den, INT_MAX);
2220 codec->time_base = ist->st->time_base;
2221 switch(codec->codec_type) {
2222 case AVMEDIA_TYPE_AUDIO:
2223 if(audio_volume != 256) {
2224 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2227 codec->channel_layout = icodec->channel_layout;
2228 codec->sample_rate = icodec->sample_rate;
2229 codec->channels = icodec->channels;
2230 codec->frame_size = icodec->frame_size;
2231 codec->audio_service_type = icodec->audio_service_type;
2232 codec->block_align= icodec->block_align;
2233 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2234 codec->block_align= 0;
2235 if(codec->codec_id == CODEC_ID_AC3)
2236 codec->block_align= 0;
2238 case AVMEDIA_TYPE_VIDEO:
2239 codec->pix_fmt = icodec->pix_fmt;
2240 codec->width = icodec->width;
2241 codec->height = icodec->height;
2242 codec->has_b_frames = icodec->has_b_frames;
2243 if (!codec->sample_aspect_ratio.num) {
2244 codec->sample_aspect_ratio =
2245 ost->st->sample_aspect_ratio =
2246 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2247 ist->st->codec->sample_aspect_ratio.num ?
2248 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2251 case AVMEDIA_TYPE_SUBTITLE:
2252 codec->width = icodec->width;
2253 codec->height = icodec->height;
2255 case AVMEDIA_TYPE_DATA:
2262 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2263 switch(codec->codec_type) {
2264 case AVMEDIA_TYPE_AUDIO:
2265 ost->fifo= av_fifo_alloc(1024);
2268 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2269 if (!codec->sample_rate) {
2270 codec->sample_rate = icodec->sample_rate;
2272 codec->sample_rate >>= icodec->lowres;
2274 choose_sample_rate(ost->st, ost->enc);
2275 codec->time_base = (AVRational){1, codec->sample_rate};
2276 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2277 codec->sample_fmt = icodec->sample_fmt;
2278 choose_sample_fmt(ost->st, ost->enc);
2279 if (!codec->channels) {
2280 codec->channels = icodec->channels;
2281 codec->channel_layout = icodec->channel_layout;
2283 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2284 codec->channel_layout = 0;
2285 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2286 icodec->request_channels = codec->channels;
2287 ist->decoding_needed = 1;
2288 ost->encoding_needed = 1;
2289 ost->resample_sample_fmt = icodec->sample_fmt;
2290 ost->resample_sample_rate = icodec->sample_rate;
2291 ost->resample_channels = icodec->channels;
2293 case AVMEDIA_TYPE_VIDEO:
2294 if (codec->pix_fmt == PIX_FMT_NONE)
2295 codec->pix_fmt = icodec->pix_fmt;
2296 choose_pixel_fmt(ost->st, ost->enc);
2298 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2299 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2302 ost->video_resample = codec->width != icodec->width ||
2303 codec->height != icodec->height ||
2304 codec->pix_fmt != icodec->pix_fmt;
2305 if (ost->video_resample) {
2306 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2308 if (!codec->width || !codec->height) {
2309 codec->width = icodec->width;
2310 codec->height = icodec->height;
2312 ost->resample_height = icodec->height;
2313 ost->resample_width = icodec->width;
2314 ost->resample_pix_fmt= icodec->pix_fmt;
2315 ost->encoding_needed = 1;
2316 ist->decoding_needed = 1;
2318 if (!ost->frame_rate.num)
2319 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2320 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2321 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2322 ost->frame_rate = ost->enc->supported_framerates[idx];
2324 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2325 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2326 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2327 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2328 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2332 if (configure_video_filters(ist, ost)) {
2333 fprintf(stderr, "Error opening filters!\n");
2338 case AVMEDIA_TYPE_SUBTITLE:
2339 ost->encoding_needed = 1;
2340 ist->decoding_needed = 1;
2347 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2348 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2349 char logfilename[1024];
2352 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2353 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2355 if (codec->flags & CODEC_FLAG_PASS1) {
2356 f = fopen(logfilename, "wb");
2358 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2364 size_t logbuffer_size;
2365 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2366 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2369 codec->stats_in = logbuffer;
2373 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2374 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2375 int size= codec->width * codec->height;
2376 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2381 bit_buffer = av_malloc(bit_buffer_size);
2383 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2385 ret = AVERROR(ENOMEM);
2389 /* open each encoder */
2390 for(i=0;i<nb_ostreams;i++) {
2392 if (ost->encoding_needed) {
2393 AVCodec *codec = ost->enc;
2394 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2396 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2397 ost->st->codec->codec_id, ost->file_index, ost->index);
2398 ret = AVERROR(EINVAL);
2401 if (dec->subtitle_header) {
2402 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2403 if (!ost->st->codec->subtitle_header) {
2404 ret = AVERROR(ENOMEM);
2407 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2408 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2410 if (avcodec_open(ost->st->codec, codec) < 0) {
2411 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2412 ost->file_index, ost->index);
2413 ret = AVERROR(EINVAL);
2416 extra_size += ost->st->codec->extradata_size;
2420 /* open each decoder */
2421 for (i = 0; i < nb_input_streams; i++) {
2422 ist = &input_streams[i];
2423 if (ist->decoding_needed) {
2424 AVCodec *codec = ist->dec;
2426 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2428 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2429 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2430 ret = AVERROR(EINVAL);
2433 if (avcodec_open(ist->st->codec, codec) < 0) {
2434 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2435 ist->file_index, ist->st->index);
2436 ret = AVERROR(EINVAL);
2439 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2440 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2445 for (i = 0; i < nb_input_streams; i++) {
2447 ist = &input_streams[i];
2449 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2450 ist->next_pts = AV_NOPTS_VALUE;
2454 /* set meta data information from input file if required */
2455 for (i=0;i<nb_meta_data_maps;i++) {
2456 AVFormatContext *files[2];
2457 AVDictionary **meta[2];
2460 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2461 if ((index) < 0 || (index) >= (nb_elems)) {\
2462 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2464 ret = AVERROR(EINVAL);\
2468 int out_file_index = meta_data_maps[i][0].file;
2469 int in_file_index = meta_data_maps[i][1].file;
2470 if (in_file_index < 0 || out_file_index < 0)
2472 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2473 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2475 files[0] = output_files[out_file_index];
2476 files[1] = input_files[in_file_index].ctx;
2478 for (j = 0; j < 2; j++) {
2479 MetadataMap *map = &meta_data_maps[i][j];
2481 switch (map->type) {
2483 meta[j] = &files[j]->metadata;
2486 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2487 meta[j] = &files[j]->streams[map->index]->metadata;
2490 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2491 meta[j] = &files[j]->chapters[map->index]->metadata;
2494 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2495 meta[j] = &files[j]->programs[map->index]->metadata;
2500 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2503 /* copy global metadata by default */
2504 if (metadata_global_autocopy) {
2506 for (i = 0; i < nb_output_files; i++)
2507 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2508 AV_DICT_DONT_OVERWRITE);
2511 /* copy chapters according to chapter maps */
2512 for (i = 0; i < nb_chapter_maps; i++) {
2513 int infile = chapter_maps[i].in_file;
2514 int outfile = chapter_maps[i].out_file;
2516 if (infile < 0 || outfile < 0)
2518 if (infile >= nb_input_files) {
2519 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2520 ret = AVERROR(EINVAL);
2523 if (outfile >= nb_output_files) {
2524 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2525 ret = AVERROR(EINVAL);
2528 copy_chapters(infile, outfile);
2531 /* copy chapters from the first input file that has them*/
2532 if (!nb_chapter_maps)
2533 for (i = 0; i < nb_input_files; i++) {
2534 if (!input_files[i].ctx->nb_chapters)
2537 for (j = 0; j < nb_output_files; j++)
2538 if ((ret = copy_chapters(i, j)) < 0)
2543 /* open files and write file headers */
2544 for(i=0;i<nb_output_files;i++) {
2545 os = output_files[i];
2546 if (av_write_header(os) < 0) {
2547 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2548 ret = AVERROR(EINVAL);
2551 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2557 /* dump the file output parameters - cannot be done before in case
2559 for(i=0;i<nb_output_files;i++) {
2560 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2563 /* dump the stream mapping */
2565 fprintf(stderr, "Stream mapping:\n");
2566 for(i=0;i<nb_ostreams;i++) {
2568 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2569 input_streams[ost->source_index].file_index,
2570 input_streams[ost->source_index].st->index,
2573 if (ost->sync_ist != &input_streams[ost->source_index])
2574 fprintf(stderr, " [sync #%d.%d]",
2575 ost->sync_ist->file_index,
2576 ost->sync_ist->st->index);
2577 fprintf(stderr, "\n");
2582 fprintf(stderr, "%s\n", error);
2587 print_sdp(output_files, nb_output_files);
2592 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2593 avio_set_interrupt_cb(decode_interrupt_cb);
2597 timer_start = av_gettime();
2599 for(; received_sigterm == 0;) {
2600 int file_index, ist_index;
2608 /* if 'q' pressed, exits */
2612 /* read_key() returns 0 on EOF */
2616 if (key == '+') verbose++;
2617 if (key == '-') verbose--;
2618 if (key == 's') qp_hist ^= 1;
2621 do_hex_dump = do_pkt_dump = 0;
2622 } else if(do_pkt_dump){
2626 av_log_set_level(AV_LOG_DEBUG);
2628 if (key == 'd' || key == 'D'){
2631 debug = input_streams[0].st->codec->debug<<1;
2632 if(!debug) debug = 1;
2633 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2636 scanf("%d", &debug);
2637 for(i=0;i<nb_input_streams;i++) {
2638 input_streams[i].st->codec->debug = debug;
2640 for(i=0;i<nb_ostreams;i++) {
2642 ost->st->codec->debug = debug;
2644 if(debug) av_log_set_level(AV_LOG_DEBUG);
2645 fprintf(stderr,"debug=%d\n", debug);
2648 fprintf(stderr, "key function\n"
2649 "? show this help\n"
2650 "+ increase verbosity\n"
2651 "- decrease verbosity\n"
2652 "D cycle through available debug modes\n"
2653 "h dump packets/hex press to cycle through the 3 states\n"
2655 "s Show QP histogram\n"
2660 /* select the stream that we must read now by looking at the
2661 smallest output pts */
2663 for(i=0;i<nb_ostreams;i++) {
2666 os = output_files[ost->file_index];
2667 ist = &input_streams[ost->source_index];
2668 if(ist->is_past_recording_time || no_packet[ist->file_index])
2670 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2671 ipts = (double)ist->pts;
2672 if (!input_files[ist->file_index].eof_reached){
2673 if(ipts < ipts_min) {
2675 if(input_sync ) file_index = ist->file_index;
2677 if(opts < opts_min) {
2679 if(!input_sync) file_index = ist->file_index;
2682 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2687 /* if none, if is finished */
2688 if (file_index < 0) {
2689 if(no_packet_count){
2691 memset(no_packet, 0, sizeof(no_packet));
2698 /* finish if limit size exhausted */
2699 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2702 /* read a frame from it and output it in the fifo */
2703 is = input_files[file_index].ctx;
2704 ret= av_read_frame(is, &pkt);
2705 if(ret == AVERROR(EAGAIN)){
2706 no_packet[file_index]=1;
2711 input_files[file_index].eof_reached = 1;
2719 memset(no_packet, 0, sizeof(no_packet));
2722 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2723 is->streams[pkt.stream_index]);
2725 /* the following test is needed in case new streams appear
2726 dynamically in stream : we ignore them */
2727 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2728 goto discard_packet;
2729 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2730 ist = &input_streams[ist_index];
2732 goto discard_packet;
2734 if (pkt.dts != AV_NOPTS_VALUE)
2735 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2736 if (pkt.pts != AV_NOPTS_VALUE)
2737 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2739 if (ist->ts_scale) {
2740 if(pkt.pts != AV_NOPTS_VALUE)
2741 pkt.pts *= ist->ts_scale;
2742 if(pkt.dts != AV_NOPTS_VALUE)
2743 pkt.dts *= ist->ts_scale;
2746 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2747 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2748 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2749 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2750 int64_t delta= pkt_dts - ist->next_pts;
2751 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2752 input_files[ist->file_index].ts_offset -= delta;
2754 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2755 delta, input_files[ist->file_index].ts_offset);
2756 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2757 if(pkt.pts != AV_NOPTS_VALUE)
2758 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2762 /* finish if recording time exhausted */
2763 if (recording_time != INT64_MAX &&
2764 (pkt.pts != AV_NOPTS_VALUE ?
2765 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2767 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2769 ist->is_past_recording_time = 1;
2770 goto discard_packet;
2773 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2774 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2777 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2778 ist->file_index, ist->st->index);
2781 av_free_packet(&pkt);
2786 av_free_packet(&pkt);
2788 /* dump report by using the output first video and audio streams */
2789 print_report(output_files, ost_table, nb_ostreams, 0);
2792 /* at the end of stream, we must flush the decoder buffers */
2793 for (i = 0; i < nb_input_streams; i++) {
2794 ist = &input_streams[i];
2795 if (ist->decoding_needed) {
2796 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2802 /* write the trailer if needed and close file */
2803 for(i=0;i<nb_output_files;i++) {
2804 os = output_files[i];
2805 av_write_trailer(os);
2808 /* dump report by using the first video and audio streams */
2809 print_report(output_files, ost_table, nb_ostreams, 1);
2811 /* close each encoder */
2812 for(i=0;i<nb_ostreams;i++) {
2814 if (ost->encoding_needed) {
2815 av_freep(&ost->st->codec->stats_in);
2816 avcodec_close(ost->st->codec);
2819 avfilter_graph_free(&ost->graph);
2823 /* close each decoder */
2824 for (i = 0; i < nb_input_streams; i++) {
2825 ist = &input_streams[i];
2826 if (ist->decoding_needed) {
2827 avcodec_close(ist->st->codec);
2835 av_freep(&bit_buffer);
2838 for(i=0;i<nb_ostreams;i++) {
2841 if (ost->st->stream_copy)
2842 av_freep(&ost->st->codec->extradata);
2844 fclose(ost->logfile);
2845 ost->logfile = NULL;
2847 av_fifo_free(ost->fifo); /* works even if fifo is not
2848 initialized but set to zero */
2849 av_freep(&ost->st->codec->subtitle_header);
2850 av_free(ost->resample_frame.data[0]);
2851 av_free(ost->forced_kf_pts);
2852 if (ost->video_resample)
2853 sws_freeContext(ost->img_resample_ctx);
2855 audio_resample_close(ost->resample);
2856 if (ost->reformat_ctx)
2857 av_audio_convert_free(ost->reformat_ctx);
2866 static int opt_format(const char *opt, const char *arg)
2868 last_asked_format = arg;
2872 static int opt_video_rc_override_string(const char *opt, const char *arg)
2874 video_rc_override_string = arg;
2878 static int opt_me_threshold(const char *opt, const char *arg)
2880 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2884 static int opt_verbose(const char *opt, const char *arg)
2886 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2890 static int opt_frame_rate(const char *opt, const char *arg)
2892 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2893 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2899 static int opt_bitrate(const char *opt, const char *arg)
2901 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2903 opt_default(opt, arg);
2905 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2906 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2911 static int opt_frame_crop(const char *opt, const char *arg)
2913 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2914 return AVERROR(EINVAL);
2917 static int opt_frame_size(const char *opt, const char *arg)
2919 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2920 fprintf(stderr, "Incorrect frame size\n");
2921 return AVERROR(EINVAL);
2926 static int opt_pad(const char *opt, const char *arg) {
2927 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2931 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2933 if (strcmp(arg, "list")) {
2934 frame_pix_fmt = av_get_pix_fmt(arg);
2935 if (frame_pix_fmt == PIX_FMT_NONE) {
2936 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2937 return AVERROR(EINVAL);
2940 opt_pix_fmts(NULL, NULL);
2946 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2953 p = strchr(arg, ':');
2955 x = strtol(arg, &end, 10);
2957 y = strtol(end+1, &end, 10);
2959 ar = (double)x / (double)y;
2961 ar = strtod(arg, NULL);
2964 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2965 return AVERROR(EINVAL);
2967 frame_aspect_ratio = ar;
2971 static int opt_metadata(const char *opt, const char *arg)
2973 char *mid= strchr(arg, '=');
2976 fprintf(stderr, "Missing =\n");
2981 av_dict_set(&metadata, arg, mid, 0);
2986 static int opt_qscale(const char *opt, const char *arg)
2988 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2989 if (video_qscale <= 0 || video_qscale > 255) {
2990 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2991 return AVERROR(EINVAL);
2996 static int opt_top_field_first(const char *opt, const char *arg)
2998 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2999 opt_default(opt, arg);
3003 static int opt_thread_count(const char *opt, const char *arg)
3005 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3008 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
3013 static int opt_audio_sample_fmt(const char *opt, const char *arg)
3015 if (strcmp(arg, "list")) {
3016 audio_sample_fmt = av_get_sample_fmt(arg);
3017 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
3018 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
3019 return AVERROR(EINVAL);
3024 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
3025 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
3031 static int opt_audio_rate(const char *opt, const char *arg)
3033 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3037 static int opt_audio_channels(const char *opt, const char *arg)
3039 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3043 static int opt_video_channel(const char *opt, const char *arg)
3045 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3049 static int opt_video_standard(const char *opt, const char *arg)
3051 video_standard = av_strdup(arg);
3055 static int opt_codec(const char *opt, const char *arg)
3057 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
3059 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
3060 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
3061 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
3062 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
3064 av_freep(pcodec_name);
3065 if (!strcmp(arg, "copy")) {
3068 *pcodec_name = av_strdup(arg);
3073 static int opt_codec_tag(const char *opt, const char *arg)
3076 uint32_t *codec_tag;
3078 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3079 !strcmp(opt, "vtag") ? &video_codec_tag :
3080 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3084 *codec_tag = strtol(arg, &tail, 0);
3086 *codec_tag = AV_RL32(arg);
3091 static int opt_map(const char *opt, const char *arg)
3096 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3097 m = &stream_maps[nb_stream_maps-1];
3099 m->file_index = strtol(arg, &p, 0);
3103 m->stream_index = strtol(p, &p, 0);
3106 m->sync_file_index = strtol(p, &p, 0);
3109 m->sync_stream_index = strtol(p, &p, 0);
3111 m->sync_file_index = m->file_index;
3112 m->sync_stream_index = m->stream_index;
3117 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3128 *index = strtol(++arg, endptr, 0);
3131 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3138 static int opt_map_metadata(const char *opt, const char *arg)
3140 MetadataMap *m, *m1;
3143 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3144 &nb_meta_data_maps, nb_meta_data_maps + 1);
3146 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3147 m->file = strtol(arg, &p, 0);
3148 parse_meta_type(p, &m->type, &m->index, &p);
3152 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3153 m1->file = strtol(p, &p, 0);
3154 parse_meta_type(p, &m1->type, &m1->index, &p);
3156 if (m->type == 'g' || m1->type == 'g')
3157 metadata_global_autocopy = 0;
3158 if (m->type == 's' || m1->type == 's')
3159 metadata_streams_autocopy = 0;
3160 if (m->type == 'c' || m1->type == 'c')
3161 metadata_chapters_autocopy = 0;
3166 static int opt_map_meta_data(const char *opt, const char *arg)
3168 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3169 "Use -map_metadata instead.\n");
3170 return opt_map_metadata(opt, arg);
3173 static int opt_map_chapters(const char *opt, const char *arg)
3178 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3179 nb_chapter_maps + 1);
3180 c = &chapter_maps[nb_chapter_maps - 1];
3181 c->out_file = strtol(arg, &p, 0);
3185 c->in_file = strtol(p, &p, 0);
3189 static int opt_input_ts_scale(const char *opt, const char *arg)
3191 unsigned int stream;
3195 stream = strtol(arg, &p, 0);
3198 scale= strtod(p, &p);
3200 if(stream >= MAX_STREAMS)
3203 ts_scale = grow_array(ts_scale, sizeof(*ts_scale), &nb_ts_scale, stream + 1);
3204 ts_scale[stream] = scale;
3208 static int opt_recording_time(const char *opt, const char *arg)
3210 recording_time = parse_time_or_die(opt, arg, 1);
3214 static int opt_start_time(const char *opt, const char *arg)
3216 start_time = parse_time_or_die(opt, arg, 1);
3220 static int opt_recording_timestamp(const char *opt, const char *arg)
3223 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
3224 struct tm time = *gmtime((time_t*)&recording_timestamp);
3225 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
3226 opt_metadata("metadata", buf);
3228 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
3229 "tag instead.\n", opt);
3233 static int opt_input_ts_offset(const char *opt, const char *arg)
3235 input_ts_offset = parse_time_or_die(opt, arg, 1);
3239 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3241 const char *codec_string = encoder ? "encoder" : "decoder";
3245 return CODEC_ID_NONE;
3247 avcodec_find_encoder_by_name(name) :
3248 avcodec_find_decoder_by_name(name);
3250 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3253 if(codec->type != type) {
3254 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3257 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3258 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3259 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3260 "results.\nAdd '-strict experimental' if you want to use it.\n",
3261 codec_string, codec->name);
3263 avcodec_find_encoder(codec->id) :
3264 avcodec_find_decoder(codec->id);
3265 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3266 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3267 codec_string, codec->name);
3273 static int opt_input_file(const char *opt, const char *filename)
3275 AVFormatContext *ic;
3276 AVFormatParameters params, *ap = ¶ms;
3277 AVInputFormat *file_iformat = NULL;
3278 int err, i, ret, rfps, rfps_base;
3281 if (last_asked_format) {
3282 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3283 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3286 last_asked_format = NULL;
3289 if (!strcmp(filename, "-"))
3292 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3293 !strcmp(filename, "/dev/stdin");
3295 /* get default parameters from command line */
3296 ic = avformat_alloc_context();
3298 print_error(filename, AVERROR(ENOMEM));
3302 memset(ap, 0, sizeof(*ap));
3303 ap->prealloced_context = 1;
3304 ap->sample_rate = audio_sample_rate;
3305 ap->channels = audio_channels;
3306 ap->time_base.den = frame_rate.num;
3307 ap->time_base.num = frame_rate.den;
3308 ap->width = frame_width;
3309 ap->height = frame_height;
3310 ap->pix_fmt = frame_pix_fmt;
3311 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3312 ap->channel = video_channel;
3313 ap->standard = video_standard;
3315 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3317 ic->video_codec_id =
3318 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3319 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3320 ic->audio_codec_id =
3321 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3322 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3323 ic->subtitle_codec_id=
3324 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3325 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3326 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3328 /* open the input file with generic libav function */
3329 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3331 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3332 err = av_demuxer_open(ic, ap);
3334 avformat_free_context(ic);
3337 print_error(filename, err);
3343 for(i=0; i<ic->nb_streams; i++){
3344 ic->streams[i]->discard= AVDISCARD_ALL;
3346 for(i=0; i<ic->nb_programs; i++){
3347 AVProgram *p= ic->programs[i];
3348 if(p->id != opt_programid){
3349 p->discard = AVDISCARD_ALL;
3352 for(j=0; j<p->nb_stream_indexes; j++){
3353 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3358 fprintf(stderr, "Specified program id not found\n");
3365 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3366 ic->loop_input = loop_input;
3369 /* If not enough info to get the stream parameters, we decode the
3370 first frames to get it. (used in mpeg case for example) */
3371 ret = av_find_stream_info(ic);
3372 if (ret < 0 && verbose >= 0) {
3373 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3374 av_close_input_file(ic);
3378 timestamp = start_time;
3379 /* add the stream start time */
3380 if (ic->start_time != AV_NOPTS_VALUE)
3381 timestamp += ic->start_time;
3383 /* if seeking requested, we execute it */
3384 if (start_time != 0) {
3385 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3387 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3388 filename, (double)timestamp / AV_TIME_BASE);
3390 /* reset seek info */
3394 /* update the current parameters so that they match the one of the input stream */
3395 for(i=0;i<ic->nb_streams;i++) {
3396 AVStream *st = ic->streams[i];
3397 AVCodecContext *dec = st->codec;
3400 dec->thread_count = thread_count;
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 if (i < nb_ts_scale)
3409 ist->ts_scale = ts_scale[i];
3411 switch (dec->codec_type) {
3412 case AVMEDIA_TYPE_AUDIO:
3413 ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
3415 ist->dec = avcodec_find_decoder(dec->codec_id);
3416 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
3418 st->discard= AVDISCARD_ALL;
3420 case AVMEDIA_TYPE_VIDEO:
3421 ist->dec= avcodec_find_decoder_by_name(video_codec_name);
3423 ist->dec = avcodec_find_decoder(dec->codec_id);
3424 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
3425 rfps = ic->streams[i]->r_frame_rate.num;
3426 rfps_base = ic->streams[i]->r_frame_rate.den;
3428 dec->flags |= CODEC_FLAG_EMU_EDGE;
3429 dec->height >>= dec->lowres;
3430 dec->width >>= dec->lowres;
3433 dec->debug |= FF_DEBUG_MV;
3435 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3438 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3439 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3441 (float)rfps / rfps_base, rfps, rfps_base);
3445 st->discard= AVDISCARD_ALL;
3446 else if(video_discard)
3447 st->discard= video_discard;
3449 case AVMEDIA_TYPE_DATA:
3451 case AVMEDIA_TYPE_SUBTITLE:
3452 ist->dec = avcodec_find_decoder_by_name(subtitle_codec_name);
3454 ist->dec = avcodec_find_decoder(dec->codec_id);
3455 if(subtitle_disable)
3456 st->discard = AVDISCARD_ALL;
3458 case AVMEDIA_TYPE_ATTACHMENT:
3459 case AVMEDIA_TYPE_UNKNOWN:
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;
3473 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3475 top_field_first = -1;
3477 frame_rate = (AVRational){0, 0};
3478 frame_pix_fmt = PIX_FMT_NONE;
3481 audio_sample_rate = 0;
3483 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3484 av_freep(&ts_scale);
3487 av_freep(&video_codec_name);
3488 av_freep(&audio_codec_name);
3489 av_freep(&subtitle_codec_name);
3495 static void check_inputs(int *has_video_ptr,
3497 int *has_subtitle_ptr,
3500 int has_video, has_audio, has_subtitle, has_data, i, j;
3501 AVFormatContext *ic;
3508 for(j=0;j<nb_input_files;j++) {
3509 ic = input_files[j].ctx;
3510 for(i=0;i<ic->nb_streams;i++) {
3511 AVCodecContext *enc = ic->streams[i]->codec;
3512 switch(enc->codec_type) {
3513 case AVMEDIA_TYPE_AUDIO:
3516 case AVMEDIA_TYPE_VIDEO:
3519 case AVMEDIA_TYPE_SUBTITLE:
3522 case AVMEDIA_TYPE_DATA:
3523 case AVMEDIA_TYPE_ATTACHMENT:
3524 case AVMEDIA_TYPE_UNKNOWN:
3532 *has_video_ptr = has_video;
3533 *has_audio_ptr = has_audio;
3534 *has_subtitle_ptr = has_subtitle;
3535 *has_data_ptr = has_data;
3538 static void new_video_stream(AVFormatContext *oc, int file_idx)
3542 AVCodecContext *video_enc;
3543 enum CodecID codec_id = CODEC_ID_NONE;
3544 AVCodec *codec= NULL;
3546 if(!video_stream_copy){
3547 if (video_codec_name) {
3548 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3549 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3550 codec = avcodec_find_encoder_by_name(video_codec_name);
3552 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3553 codec = avcodec_find_encoder(codec_id);
3557 ost = new_output_stream(oc, file_idx, codec);
3559 if (!video_stream_copy) {
3560 ost->frame_aspect_ratio = frame_aspect_ratio;
3561 frame_aspect_ratio = 0;
3563 ost->avfilter = vfilters;
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)
3677 AVCodec *codec= NULL;
3678 AVCodecContext *audio_enc;
3679 enum CodecID codec_id = CODEC_ID_NONE;
3681 if(!audio_stream_copy){
3682 if (audio_codec_name) {
3683 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3684 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3685 codec = avcodec_find_encoder_by_name(audio_codec_name);
3687 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3688 codec = avcodec_find_encoder(codec_id);
3691 ost = new_output_stream(oc, file_idx, codec);
3694 ost->bitstream_filters = audio_bitstream_filters;
3695 audio_bitstream_filters= NULL;
3697 st->codec->thread_count= thread_count;
3699 audio_enc = st->codec;
3700 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3703 audio_enc->codec_tag= audio_codec_tag;
3705 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3706 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3707 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3709 if (audio_stream_copy) {
3710 st->stream_copy = 1;
3712 audio_enc->codec_id = codec_id;
3713 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3715 if (audio_qscale > QSCALE_NONE) {
3716 audio_enc->flags |= CODEC_FLAG_QSCALE;
3717 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3720 audio_enc->channels = audio_channels;
3721 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3722 audio_enc->sample_fmt = audio_sample_fmt;
3723 if (audio_sample_rate)
3724 audio_enc->sample_rate = audio_sample_rate;
3726 if (audio_language) {
3727 av_dict_set(&st->metadata, "language", audio_language, 0);
3728 av_freep(&audio_language);
3731 /* reset some key parameters */
3733 av_freep(&audio_codec_name);
3734 audio_stream_copy = 0;
3737 static void new_data_stream(AVFormatContext *oc, int file_idx)
3741 AVCodecContext *data_enc;
3743 ost = new_output_stream(oc, file_idx, NULL);
3745 data_enc = st->codec;
3746 if (!data_stream_copy) {
3747 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3751 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3754 data_enc->codec_tag= data_codec_tag;
3756 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3757 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3758 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3760 if (data_stream_copy) {
3761 st->stream_copy = 1;
3765 av_freep(&data_codec_name);
3766 data_stream_copy = 0;
3769 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3773 AVCodec *codec=NULL;
3774 AVCodecContext *subtitle_enc;
3775 enum CodecID codec_id = CODEC_ID_NONE;
3777 if(!subtitle_stream_copy){
3778 if (subtitle_codec_name) {
3779 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3780 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3781 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3783 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3784 codec = avcodec_find_encoder(codec_id);
3787 ost = new_output_stream(oc, file_idx, codec);
3789 subtitle_enc = st->codec;
3791 ost->bitstream_filters = subtitle_bitstream_filters;
3792 subtitle_bitstream_filters= NULL;
3794 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3796 if(subtitle_codec_tag)
3797 subtitle_enc->codec_tag= subtitle_codec_tag;
3799 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3800 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3801 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3803 if (subtitle_stream_copy) {
3804 st->stream_copy = 1;
3806 subtitle_enc->codec_id = codec_id;
3807 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3810 if (subtitle_language) {
3811 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3812 av_freep(&subtitle_language);
3815 subtitle_disable = 0;
3816 av_freep(&subtitle_codec_name);
3817 subtitle_stream_copy = 0;
3820 static int opt_new_stream(const char *opt, const char *arg)
3822 AVFormatContext *oc;
3823 int file_idx = nb_output_files - 1;
3824 if (nb_output_files <= 0) {
3825 fprintf(stderr, "At least one output file must be specified\n");
3828 oc = output_files[file_idx];
3830 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3831 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3832 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3833 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3838 /* arg format is "output-stream-index:streamid-value". */
3839 static int opt_streamid(const char *opt, const char *arg)
3845 av_strlcpy(idx_str, arg, sizeof(idx_str));
3846 p = strchr(idx_str, ':');
3849 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3854 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3855 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3856 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3860 static int opt_output_file(const char *opt, const char *filename)
3862 AVFormatContext *oc;
3863 int err, use_video, use_audio, use_subtitle, use_data;
3864 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3865 AVFormatParameters params, *ap = ¶ms;
3866 AVOutputFormat *file_oformat;
3868 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3869 fprintf(stderr, "Too many output files\n");
3873 if (!strcmp(filename, "-"))
3876 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3877 last_asked_format = NULL;
3879 print_error(filename, err);
3882 file_oformat= oc->oformat;
3884 if (!strcmp(file_oformat->name, "ffm") &&
3885 av_strstart(filename, "http:", NULL)) {
3886 /* special case for files sent to ffserver: we get the stream
3887 parameters from ffserver */
3888 int err = read_ffserver_streams(oc, filename);
3890 print_error(filename, err);
3894 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3895 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3896 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3897 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 */
3899 /* disable if no corresponding type found */
3900 check_inputs(&input_has_video,
3902 &input_has_subtitle,
3905 if (!input_has_video)
3907 if (!input_has_audio)
3909 if (!input_has_subtitle)
3911 if (!input_has_data)
3914 /* manual disable */
3915 if (audio_disable) use_audio = 0;
3916 if (video_disable) use_video = 0;
3917 if (subtitle_disable) use_subtitle = 0;
3918 if (data_disable) use_data = 0;
3920 if (use_video) new_video_stream(oc, nb_output_files);
3921 if (use_audio) new_audio_stream(oc, nb_output_files);
3922 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3923 if (use_data) new_data_stream(oc, nb_output_files);
3925 av_dict_copy(&oc->metadata, metadata, 0);
3926 av_dict_free(&metadata);
3929 output_files[nb_output_files++] = oc;
3931 /* check filename in case of an image number is expected */
3932 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3933 if (!av_filename_number_test(oc->filename)) {
3934 print_error(oc->filename, AVERROR(EINVAL));
3939 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3940 /* test if it already exists to avoid loosing precious files */
3941 if (!file_overwrite &&
3942 (strchr(filename, ':') == NULL ||
3943 filename[1] == ':' ||
3944 av_strstart(filename, "file:", NULL))) {
3945 if (avio_check(filename, 0) == 0) {
3947 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3949 if (!read_yesno()) {
3950 fprintf(stderr, "Not overwriting - exiting\n");
3955 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3962 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3963 print_error(filename, err);
3968 memset(ap, 0, sizeof(*ap));
3969 if (av_set_parameters(oc, ap) < 0) {
3970 fprintf(stderr, "%s: Invalid encoding parameters\n",
3975 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3976 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3978 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3979 if (loop_output >= 0) {
3980 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3981 oc->loop_output = loop_output;
3983 oc->flags |= AVFMT_FLAG_NONBLOCK;
3985 frame_rate = (AVRational){0, 0};
3988 audio_sample_rate = 0;
3990 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3992 av_freep(&forced_key_frames);
3998 /* same option as mencoder */
3999 static int opt_pass(const char *opt, const char *arg)
4001 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
4005 static int64_t getutime(void)
4008 struct rusage rusage;
4010 getrusage(RUSAGE_SELF, &rusage);
4011 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4012 #elif HAVE_GETPROCESSTIMES
4014 FILETIME c, e, k, u;
4015 proc = GetCurrentProcess();
4016 GetProcessTimes(proc, &c, &e, &k, &u);
4017 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4019 return av_gettime();
4023 static int64_t getmaxrss(void)
4025 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4026 struct rusage rusage;
4027 getrusage(RUSAGE_SELF, &rusage);
4028 return (int64_t)rusage.ru_maxrss * 1024;
4029 #elif HAVE_GETPROCESSMEMORYINFO
4031 PROCESS_MEMORY_COUNTERS memcounters;
4032 proc = GetCurrentProcess();
4033 memcounters.cb = sizeof(memcounters);
4034 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4035 return memcounters.PeakPagefileUsage;
4041 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4044 const char *p = str;
4051 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4058 static int opt_inter_matrix(const char *opt, const char *arg)
4060 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4061 parse_matrix_coeffs(inter_matrix, arg);
4065 static int opt_intra_matrix(const char *opt, const char *arg)
4067 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4068 parse_matrix_coeffs(intra_matrix, arg);
4072 static void show_usage(void)
4074 printf("Hyper fast Audio and Video encoder\n");
4075 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4079 static int opt_help(const char *opt, const char *arg)
4082 AVOutputFormat *oformat = NULL;
4084 av_log_set_callback(log_callback_help);
4086 show_help_options(options, "Main options:\n",
4087 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4088 show_help_options(options, "\nAdvanced options:\n",
4089 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4091 show_help_options(options, "\nVideo options:\n",
4092 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4094 show_help_options(options, "\nAdvanced Video options:\n",
4095 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4096 OPT_VIDEO | OPT_EXPERT);
4097 show_help_options(options, "\nAudio options:\n",
4098 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4100 show_help_options(options, "\nAdvanced Audio options:\n",
4101 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4102 OPT_AUDIO | OPT_EXPERT);
4103 show_help_options(options, "\nSubtitle options:\n",
4104 OPT_SUBTITLE | OPT_GRAB,
4106 show_help_options(options, "\nAudio/Video grab options:\n",
4110 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4113 /* individual codec options */
4115 while ((c = av_codec_next(c))) {
4116 if (c->priv_class) {
4117 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4122 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4125 /* individual muxer options */
4126 while ((oformat = av_oformat_next(oformat))) {
4127 if (oformat->priv_class) {
4128 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4133 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4137 static int opt_target(const char *opt, const char *arg)
4139 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4140 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4142 if(!strncmp(arg, "pal-", 4)) {
4145 } else if(!strncmp(arg, "ntsc-", 5)) {
4148 } else if(!strncmp(arg, "film-", 5)) {
4153 /* Calculate FR via float to avoid int overflow */
4154 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4157 } else if((fr == 29970) || (fr == 23976)) {
4160 /* Try to determine PAL/NTSC by peeking in the input files */
4161 if(nb_input_files) {
4163 for (j = 0; j < nb_input_files; j++) {
4164 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4165 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4166 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4168 fr = c->time_base.den * 1000 / c->time_base.num;
4172 } else if((fr == 29970) || (fr == 23976)) {
4182 if(verbose > 0 && norm != UNKNOWN)
4183 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4186 if(norm == UNKNOWN) {
4187 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4188 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4189 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4193 if(!strcmp(arg, "vcd")) {
4194 opt_codec("vcodec", "mpeg1video");
4195 opt_codec("acodec", "mp2");
4196 opt_format("f", "vcd");
4198 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4199 opt_frame_rate("r", frame_rates[norm]);
4200 opt_default("g", norm == PAL ? "15" : "18");
4202 opt_default("b", "1150000");
4203 opt_default("maxrate", "1150000");
4204 opt_default("minrate", "1150000");
4205 opt_default("bufsize", "327680"); // 40*1024*8;
4207 opt_default("ab", "224000");
4208 audio_sample_rate = 44100;
4211 opt_default("packetsize", "2324");
4212 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4214 /* We have to offset the PTS, so that it is consistent with the SCR.
4215 SCR starts at 36000, but the first two packs contain only padding
4216 and the first pack from the other stream, respectively, may also have
4217 been written before.
4218 So the real data starts at SCR 36000+3*1200. */
4219 mux_preload= (36000+3*1200) / 90000.0; //0.44
4220 } else if(!strcmp(arg, "svcd")) {
4222 opt_codec("vcodec", "mpeg2video");
4223 opt_codec("acodec", "mp2");
4224 opt_format("f", "svcd");
4226 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4227 opt_frame_rate("r", frame_rates[norm]);
4228 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4229 opt_default("g", norm == PAL ? "15" : "18");
4231 opt_default("b", "2040000");
4232 opt_default("maxrate", "2516000");
4233 opt_default("minrate", "0"); //1145000;
4234 opt_default("bufsize", "1835008"); //224*1024*8;
4235 opt_default("flags", "+scan_offset");
4238 opt_default("ab", "224000");
4239 audio_sample_rate = 44100;
4241 opt_default("packetsize", "2324");
4243 } else if(!strcmp(arg, "dvd")) {
4245 opt_codec("vcodec", "mpeg2video");
4246 opt_codec("acodec", "ac3");
4247 opt_format("f", "dvd");
4249 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4250 opt_frame_rate("r", frame_rates[norm]);
4251 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4252 opt_default("g", norm == PAL ? "15" : "18");
4254 opt_default("b", "6000000");
4255 opt_default("maxrate", "9000000");
4256 opt_default("minrate", "0"); //1500000;
4257 opt_default("bufsize", "1835008"); //224*1024*8;
4259 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4260 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4262 opt_default("ab", "448000");
4263 audio_sample_rate = 48000;
4265 } else if(!strncmp(arg, "dv", 2)) {
4267 opt_format("f", "dv");
4269 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4270 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4271 norm == PAL ? "yuv420p" : "yuv411p");
4272 opt_frame_rate("r", frame_rates[norm]);
4274 audio_sample_rate = 48000;
4278 fprintf(stderr, "Unknown target: %s\n", arg);
4279 return AVERROR(EINVAL);
4284 static int opt_vstats_file(const char *opt, const char *arg)
4286 av_free (vstats_filename);
4287 vstats_filename=av_strdup (arg);
4291 static int opt_vstats(const char *opt, const char *arg)
4294 time_t today2 = time(NULL);
4295 struct tm *today = localtime(&today2);
4297 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4299 return opt_vstats_file(opt, filename);
4302 static int opt_bsf(const char *opt, const char *arg)
4304 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4305 AVBitStreamFilterContext **bsfp;
4308 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4312 bsfp= *opt == 'v' ? &video_bitstream_filters :
4313 *opt == 'a' ? &audio_bitstream_filters :
4314 &subtitle_bitstream_filters;
4316 bsfp= &(*bsfp)->next;
4323 static int opt_preset(const char *opt, const char *arg)
4326 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4327 char *codec_name = *opt == 'v' ? video_codec_name :
4328 *opt == 'a' ? audio_codec_name :
4329 subtitle_codec_name;
4331 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4332 fprintf(stderr, "File for preset '%s' not found\n", arg);
4337 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4338 if(line[0] == '#' && !e)
4340 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4342 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4345 if (!strcmp(tmp, "acodec") ||
4346 !strcmp(tmp, "vcodec") ||
4347 !strcmp(tmp, "scodec") ||
4348 !strcmp(tmp, "dcodec")) {
4349 opt_codec(tmp, tmp2);
4350 }else if(opt_default(tmp, tmp2) < 0){
4351 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4361 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4365 static int opt_passlogfile(const char *opt, const char *arg)
4367 pass_logfilename_prefix = arg;
4368 opt_default("passlogfile", arg);
4372 static const OptionDef options[] = {
4374 #include "cmdutils_common_opts.h"
4375 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4376 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4377 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4378 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4379 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4380 "outfile[,metadata]:infile[,metadata]" },
4381 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4382 "outfile[,metadata]:infile[,metadata]" },
4383 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4384 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4385 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4386 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4387 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4388 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4389 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4390 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4391 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4392 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4393 "add timings for benchmarking" },
4394 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4395 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4396 "dump each input packet" },
4397 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4398 "when dumping packets, also dump the payload" },
4399 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4400 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4401 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4402 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4403 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4404 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4405 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4406 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4407 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4408 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4409 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4410 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4411 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4412 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4413 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4414 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4417 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4418 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4419 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4420 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4421 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4422 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4423 { "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" },
4424 { "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" },
4425 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4426 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4427 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4428 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4429 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4430 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4431 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4432 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4433 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4434 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4435 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4436 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4437 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4438 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4439 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4440 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4441 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4442 "use same quantizer as source (implies VBR)" },
4443 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4444 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4445 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4446 "deinterlace pictures" },
4447 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4448 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4449 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4451 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4453 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4454 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4455 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4456 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4457 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4458 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4459 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4460 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4461 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4462 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4463 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4466 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4467 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4468 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4469 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4470 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4471 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4472 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4473 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4474 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4475 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4476 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4477 { "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" },
4479 /* subtitle options */
4480 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4481 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4482 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4483 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4484 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4487 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4488 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4489 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4492 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4493 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4495 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4496 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4497 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4499 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4500 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4501 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4502 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4503 /* data codec support */
4504 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
4506 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4510 int main(int argc, char **argv)
4514 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4516 if(argc>1 && !strcmp(argv[1], "-d")){
4519 av_log_set_callback(log_callback_null);
4524 avcodec_register_all();
4526 avdevice_register_all();
4529 avfilter_register_all();
4534 if(isatty(STDIN_FILENO))
4535 avio_set_interrupt_cb(decode_interrupt_cb);
4544 parse_options(argc, argv, options, opt_output_file);
4546 if(nb_output_files <= 0 && nb_input_files == 0) {
4548 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4552 /* file converter / grab */
4553 if (nb_output_files <= 0) {
4554 fprintf(stderr, "At least one output file must be specified\n");
4558 if (nb_input_files == 0) {
4559 fprintf(stderr, "At least one input file must be specified\n");
4564 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4565 stream_maps, nb_stream_maps) < 0)
4567 ti = getutime() - ti;
4569 int maxrss = getmaxrss() / 1024;
4570 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4573 return ffmpeg_exit(0);