3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavcodec/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
50 #include "libavformat/ffm.h" // not public API
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/vsrc_buffer.h"
58 #if HAVE_SYS_RESOURCE_H
59 #include <sys/types.h>
61 #include <sys/resource.h>
62 #elif HAVE_GETPROCESSTIMES
65 #if HAVE_GETPROCESSMEMORYINFO
71 #include <sys/select.h>
76 #include <sys/ioctl.h>
86 #include "libavutil/avassert.h"
88 const char program_name[] = "FFmpeg";
89 const int program_birth_year = 2000;
91 /* select an input stream for an output stream */
92 typedef struct AVStreamMap {
96 int sync_stream_index;
100 * select an input file for an output file
102 typedef struct AVMetaDataMap {
103 int file; //< file index
104 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
105 int index; //< stream/chapter/program number
108 typedef struct AVChapterMap {
113 static const OptionDef options[];
115 #define MAX_FILES 100
116 #if !FF_API_MAX_STREAMS
117 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
120 static const char *last_asked_format = NULL;
121 static AVFormatContext *input_files[MAX_FILES];
122 static int64_t input_files_ts_offset[MAX_FILES];
123 static double *input_files_ts_scale[MAX_FILES] = {NULL};
124 static AVCodec **input_codecs = NULL;
125 static int nb_input_files = 0;
126 static int nb_input_codecs = 0;
127 static int nb_input_files_ts_scale[MAX_FILES] = {0};
129 static AVFormatContext *output_files[MAX_FILES];
130 static AVCodec **output_codecs = NULL;
131 static int nb_output_files = 0;
132 static int nb_output_codecs = 0;
134 static AVStreamMap *stream_maps = NULL;
135 static int nb_stream_maps;
137 /* first item specifies output metadata, second is input */
138 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
139 static int nb_meta_data_maps;
140 static int metadata_global_autocopy = 1;
141 static int metadata_streams_autocopy = 1;
142 static int metadata_chapters_autocopy = 1;
144 static AVChapterMap *chapter_maps = NULL;
145 static int nb_chapter_maps;
147 /* indexed by output file stream index */
148 static int *streamid_map = NULL;
149 static int nb_streamid_map = 0;
151 static int frame_width = 0;
152 static int frame_height = 0;
153 static float frame_aspect_ratio = 0;
154 static int frame_aspect_ratio_override = 0;
155 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
156 static int frame_bits_per_raw_sample = 0;
157 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
158 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
159 static AVRational frame_rate;
160 static float video_qscale = 0;
161 static uint16_t *intra_matrix = NULL;
162 static uint16_t *inter_matrix = NULL;
163 static const char *video_rc_override_string=NULL;
164 static int video_disable = 0;
165 static int video_discard = 0;
166 static char *video_codec_name = NULL;
167 static unsigned int video_codec_tag = 0;
168 static char *video_language = NULL;
169 static int same_quality = 0;
170 static int do_deinterlace = 0;
171 static int top_field_first = -1;
172 static int me_threshold = 0;
173 static int intra_dc_precision = 8;
174 static int loop_input = 0;
175 static int loop_output = AVFMT_NOOUTPUTLOOP;
176 static int qp_hist = 0;
178 static char *vfilters = NULL;
180 static unsigned int sws_flags = SWS_BICUBIC;
183 static int intra_only = 0;
184 static int audio_sample_rate = 44100;
185 static int64_t channel_layout = 0;
186 #define QSCALE_NONE -99999
187 static float audio_qscale = QSCALE_NONE;
188 static int audio_disable = 0;
189 static int audio_channels = 1;
190 static char *audio_codec_name = NULL;
191 static unsigned int audio_codec_tag = 0;
192 static char *audio_language = NULL;
194 static int subtitle_disable = 0;
195 static char *subtitle_codec_name = NULL;
196 static char *subtitle_language = NULL;
197 static unsigned int subtitle_codec_tag = 0;
199 static float mux_preload= 0.5;
200 static float mux_max_delay= 0.7;
202 static int64_t recording_time = INT64_MAX;
203 static int64_t start_time = 0;
204 static int64_t recording_timestamp = 0;
205 static int64_t input_ts_offset = 0;
206 static int file_overwrite = 0;
207 static AVMetadata *metadata;
208 static int do_benchmark = 0;
209 static int do_hex_dump = 0;
210 static int do_pkt_dump = 0;
211 static int do_psnr = 0;
212 static int do_pass = 0;
213 static char *pass_logfilename_prefix = NULL;
214 static int audio_stream_copy = 0;
215 static int video_stream_copy = 0;
216 static int subtitle_stream_copy = 0;
217 static int video_sync_method= -1;
218 static int audio_sync_method= 0;
219 static float audio_drift_threshold= 0.1;
220 static int copy_ts= 0;
222 static int opt_shortest = 0;
223 static int video_global_header = 0;
224 static char *vstats_filename;
225 static FILE *vstats_file;
226 static int opt_programid = 0;
227 static int copy_initial_nonkeyframes = 0;
229 static int rate_emu = 0;
231 static int video_channel = 0;
232 static char *video_standard;
234 static int audio_volume = 256;
236 static int exit_on_error = 0;
237 static int using_stdin = 0;
238 static int verbose = 1;
239 static int thread_count= 1;
240 static int q_pressed = 0;
241 static int64_t video_size = 0;
242 static int64_t audio_size = 0;
243 static int64_t extra_size = 0;
244 static int nb_frames_dup = 0;
245 static int nb_frames_drop = 0;
246 static int input_sync;
247 static uint64_t limit_filesize = 0;
248 static int force_fps = 0;
249 static char *forced_key_frames = NULL;
251 static float dts_delta_threshold = 10;
253 static int64_t timer_start;
255 static uint8_t *audio_buf;
256 static uint8_t *audio_out;
257 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
259 static short *samples;
261 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
262 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
263 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
265 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
267 struct AVInputStream;
269 typedef struct AVOutputStream {
270 int file_index; /* file index */
271 int index; /* stream index in the output file */
272 int source_index; /* AVInputStream index */
273 AVStream *st; /* stream in the output file */
274 int encoding_needed; /* true if encoding needed for this stream */
276 /* input pts and corresponding output pts
278 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
279 struct AVInputStream *sync_ist; /* input stream to sync against */
280 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
281 AVBitStreamFilterContext *bitstream_filters;
284 AVFrame pict_tmp; /* temporary image for resampling */
285 struct SwsContext *img_resample_ctx; /* for image resampling */
288 int resample_pix_fmt;
290 /* full frame size of first frame */
294 /* forced key frames */
295 int64_t *forced_kf_pts;
301 ReSampleContext *resample; /* for audio resampling */
302 int resample_sample_fmt;
303 int resample_channels;
304 int resample_sample_rate;
306 AVAudioConvert *reformat_ctx;
307 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
311 AVFilterContext *output_video_filter;
312 AVFilterContext *input_video_filter;
313 AVFilterBufferRef *picref;
315 AVFilterGraph *graph;
319 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
320 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
322 typedef struct AVInputStream {
326 int discard; /* true if stream data should be discarded */
327 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
328 int64_t sample_index; /* current sample */
330 int64_t start; /* time when read started */
331 int64_t next_pts; /* synthetic pts for cases where pkt.pts
333 int64_t pts; /* current pts */
334 int is_start; /* is 1 at the start and after a discontinuity */
335 int showed_multi_packet_warning;
336 int is_past_recording_time;
338 AVFrame *filter_frame;
339 int has_filter_frame;
343 typedef struct AVInputFile {
344 int eof_reached; /* true if eof reached */
345 int ist_index; /* index of first stream in ist_table */
346 int buffer_size; /* current total buffer size */
347 int nb_streams; /* nb streams we are aware of */
352 /* init terminal so that we can grab keys */
353 static struct termios oldtty;
358 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
360 AVFilterContext *last_filter, *filter;
361 /** filter graph containing all filters including input & output */
362 AVCodecContext *codec = ost->st->codec;
363 AVCodecContext *icodec = ist->st->codec;
364 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
365 AVRational sample_aspect_ratio;
369 ost->graph = avfilter_graph_alloc();
371 if (ist->st->sample_aspect_ratio.num){
372 sample_aspect_ratio = ist->st->sample_aspect_ratio;
374 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
376 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
377 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
378 sample_aspect_ratio.num, sample_aspect_ratio.den);
380 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
381 "src", args, NULL, ost->graph);
384 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
385 "out", NULL, &ffsink_ctx, ost->graph);
388 last_filter = ost->input_video_filter;
390 if (codec->width != icodec->width || codec->height != icodec->height) {
391 snprintf(args, 255, "%d:%d:flags=0x%X",
394 (int)av_get_int(sws_opts, "sws_flags", NULL));
395 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
396 NULL, args, NULL, ost->graph)) < 0)
398 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
400 last_filter = filter;
403 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
404 ost->graph->scale_sws_opts = av_strdup(args);
407 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
408 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
410 outputs->name = av_strdup("in");
411 outputs->filter_ctx = last_filter;
412 outputs->pad_idx = 0;
413 outputs->next = NULL;
415 inputs->name = av_strdup("out");
416 inputs->filter_ctx = ost->output_video_filter;
420 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
422 av_freep(&ost->avfilter);
424 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
428 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
431 codec->width = ost->output_video_filter->inputs[0]->w;
432 codec->height = ost->output_video_filter->inputs[0]->h;
433 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
434 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
438 #endif /* CONFIG_AVFILTER */
440 static void term_exit(void)
442 av_log(NULL, AV_LOG_QUIET, "");
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)
467 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
468 |INLCR|IGNCR|ICRNL|IXON);
469 tty.c_oflag |= OPOST;
470 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
471 tty.c_cflag &= ~(CSIZE|PARENB);
476 tcsetattr (0, TCSANOW, &tty);
477 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
480 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
481 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
483 signal(SIGXCPU, sigterm_handler);
487 /* read a key without blocking */
488 static int read_key(void)
500 n = select(1, &rfds, NULL, NULL, &tv);
515 static int decode_interrupt_cb(void)
517 q_pressed += read_key() == 'q';
518 return q_pressed > 1;
521 static int ffmpeg_exit(int ret)
526 for(i=0;i<nb_output_files;i++) {
527 AVFormatContext *s = output_files[i];
528 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
530 avformat_free_context(s);
531 av_free(output_streams_for_file[i]);
533 for(i=0;i<nb_input_files;i++) {
534 av_close_input_file(input_files[i]);
535 av_free(input_files_ts_scale[i]);
538 av_free(intra_matrix);
539 av_free(inter_matrix);
543 av_free(vstats_filename);
545 av_free(streamid_map);
546 av_free(input_codecs);
547 av_free(output_codecs);
548 av_free(stream_maps);
549 av_free(meta_data_maps);
551 av_free(video_codec_name);
552 av_free(audio_codec_name);
553 av_free(subtitle_codec_name);
555 av_free(video_standard);
560 allocated_audio_buf_size= allocated_audio_out_size= 0;
567 if (received_sigterm) {
569 "Received signal %d: terminating.\n",
570 (int) received_sigterm);
574 exit(ret); /* not all OS-es handle main() return value */
578 /* similar to ff_dynarray_add() and av_fast_realloc() */
579 static void *grow_array(void *array, int elem_size, int *size, int new_size)
581 if (new_size >= INT_MAX / elem_size) {
582 fprintf(stderr, "Array too big.\n");
585 if (*size < new_size) {
586 uint8_t *tmp = av_realloc(array, new_size*elem_size);
588 fprintf(stderr, "Could not alloc buffer.\n");
591 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
598 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
600 if(codec && codec->sample_fmts){
601 const enum AVSampleFormat *p= codec->sample_fmts;
603 if(*p == st->codec->sample_fmt)
607 av_log(NULL, AV_LOG_WARNING,
608 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
609 av_get_sample_fmt_name(st->codec->sample_fmt),
611 av_get_sample_fmt_name(codec->sample_fmts[0]));
612 st->codec->sample_fmt = codec->sample_fmts[0];
617 static void choose_sample_rate(AVStream *st, AVCodec *codec)
619 if(codec && codec->supported_samplerates){
620 const int *p= codec->supported_samplerates;
622 int best_dist=INT_MAX;
624 int dist= abs(st->codec->sample_rate - *p);
625 if(dist < best_dist){
631 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
633 st->codec->sample_rate= best;
637 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
639 if(codec && codec->pix_fmts){
640 const enum PixelFormat *p= codec->pix_fmts;
641 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
642 if(st->codec->codec_id==CODEC_ID_MJPEG){
643 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
644 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
645 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};
649 if(*p == st->codec->pix_fmt)
653 if(st->codec->pix_fmt != PIX_FMT_NONE)
654 av_log(NULL, AV_LOG_WARNING,
655 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
656 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
658 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
659 st->codec->pix_fmt = codec->pix_fmts[0];
664 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
666 int idx = oc->nb_streams - 1;
669 output_streams_for_file[file_idx] =
670 grow_array(output_streams_for_file[file_idx],
671 sizeof(*output_streams_for_file[file_idx]),
672 &nb_output_streams_for_file[file_idx],
674 ost = output_streams_for_file[file_idx][idx] =
675 av_mallocz(sizeof(AVOutputStream));
677 fprintf(stderr, "Could not alloc output stream\n");
680 ost->file_index = file_idx;
685 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
691 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
694 /* copy stream format */
696 for(i=0;i<ic->nb_streams;i++) {
702 // FIXME: a more elegant solution is needed
703 st = av_mallocz(sizeof(AVStream));
704 memcpy(st, ic->streams[i], sizeof(AVStream));
705 st->codec = avcodec_alloc_context();
707 print_error(filename, AVERROR(ENOMEM));
710 avcodec_copy_context(st->codec, ic->streams[i]->codec);
713 codec = avcodec_find_encoder(st->codec->codec_id);
714 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
715 if (audio_stream_copy) {
718 choose_sample_fmt(st, codec);
719 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
720 if (video_stream_copy) {
723 choose_pixel_fmt(st, codec);
726 if(st->codec->flags & CODEC_FLAG_BITEXACT)
729 new_output_stream(s, nb_output_files);
733 s->timestamp = av_gettime();
735 av_close_input_file(ic);
740 get_sync_ipts(const AVOutputStream *ost)
742 const AVInputStream *ist = ost->sync_ist;
743 return (double)(ist->pts - start_time)/AV_TIME_BASE;
746 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
750 AVPacket new_pkt= *pkt;
751 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
752 &new_pkt.data, &new_pkt.size,
753 pkt->data, pkt->size,
754 pkt->flags & AV_PKT_FLAG_KEY);
757 new_pkt.destruct= av_destruct_packet;
759 fprintf(stderr, "%s failed for stream %d, codec %s",
760 bsfc->filter->name, pkt->stream_index,
761 avctx->codec ? avctx->codec->name : "copy");
771 ret= av_interleaved_write_frame(s, pkt);
773 print_error("av_interleaved_write_frame()", ret);
778 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
780 static void do_audio_out(AVFormatContext *s,
783 unsigned char *buf, int size)
786 int64_t audio_out_size, audio_buf_size;
787 int64_t allocated_for_size= size;
789 int size_out, frame_bytes, ret, resample_changed;
790 AVCodecContext *enc= ost->st->codec;
791 AVCodecContext *dec= ist->st->codec;
792 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
793 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
794 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
797 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
798 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
799 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
800 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
801 audio_buf_size*= osize*enc->channels;
803 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
804 if(coded_bps > 8*osize)
805 audio_out_size= audio_out_size * coded_bps / (8*osize);
806 audio_out_size += FF_MIN_BUFFER_SIZE;
808 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
809 fprintf(stderr, "Buffer sizes too large\n");
813 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
814 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
815 if (!audio_buf || !audio_out){
816 fprintf(stderr, "Out of memory in do_audio_out\n");
820 if (enc->channels != dec->channels)
821 ost->audio_resample = 1;
823 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
824 ost->resample_channels != dec->channels ||
825 ost->resample_sample_rate != dec->sample_rate;
827 if ((ost->audio_resample && !ost->resample) || resample_changed) {
828 if (resample_changed) {
829 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",
830 ist->file_index, ist->index,
831 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
832 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
833 ost->resample_sample_fmt = dec->sample_fmt;
834 ost->resample_channels = dec->channels;
835 ost->resample_sample_rate = dec->sample_rate;
837 audio_resample_close(ost->resample);
839 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
840 if (audio_sync_method <= 1 &&
841 ost->resample_sample_fmt == enc->sample_fmt &&
842 ost->resample_channels == enc->channels &&
843 ost->resample_sample_rate == enc->sample_rate) {
844 ost->resample = NULL;
845 ost->audio_resample = 0;
847 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
848 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
849 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
850 enc->sample_rate, dec->sample_rate,
851 enc->sample_fmt, dec->sample_fmt,
853 if (!ost->resample) {
854 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
855 dec->channels, dec->sample_rate,
856 enc->channels, enc->sample_rate);
862 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
863 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
864 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
865 if (ost->reformat_ctx)
866 av_audio_convert_free(ost->reformat_ctx);
867 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
868 dec->sample_fmt, 1, NULL, 0);
869 if (!ost->reformat_ctx) {
870 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
871 av_get_sample_fmt_name(dec->sample_fmt),
872 av_get_sample_fmt_name(enc->sample_fmt));
875 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
878 if(audio_sync_method){
879 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
880 - av_fifo_size(ost->fifo)/(enc->channels * 2);
881 double idelta= delta*dec->sample_rate / enc->sample_rate;
882 int byte_delta= ((int)idelta)*2*dec->channels;
884 //FIXME resample delay
885 if(fabs(delta) > 50){
886 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
888 byte_delta= FFMAX(byte_delta, -size);
892 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
897 static uint8_t *input_tmp= NULL;
898 input_tmp= av_realloc(input_tmp, byte_delta + size);
900 if(byte_delta > allocated_for_size - size){
901 allocated_for_size= byte_delta + (int64_t)size;
906 memset(input_tmp, 0, byte_delta);
907 memcpy(input_tmp + byte_delta, buf, size);
911 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
913 }else if(audio_sync_method>1){
914 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
915 av_assert0(ost->audio_resample);
917 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
918 // 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));
919 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
923 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
924 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
926 if (ost->audio_resample) {
928 size_out = audio_resample(ost->resample,
929 (short *)buftmp, (short *)buf,
930 size / (dec->channels * isize));
931 size_out = size_out * enc->channels * osize;
937 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
938 const void *ibuf[6]= {buftmp};
939 void *obuf[6]= {audio_buf};
940 int istride[6]= {isize};
941 int ostride[6]= {osize};
942 int len= size_out/istride[0];
943 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
944 printf("av_audio_convert() failed\n");
950 size_out = len*osize;
953 /* now encode as many frames as possible */
954 if (enc->frame_size > 1) {
955 /* output resampled raw samples */
956 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
957 fprintf(stderr, "av_fifo_realloc2() failed\n");
960 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
962 frame_bytes = enc->frame_size * osize * enc->channels;
964 while (av_fifo_size(ost->fifo) >= frame_bytes) {
966 av_init_packet(&pkt);
968 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
970 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
972 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
975 fprintf(stderr, "Audio encoding failed\n");
979 pkt.stream_index= ost->index;
982 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
983 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
984 pkt.flags |= AV_PKT_FLAG_KEY;
985 write_frame(s, &pkt, enc, ost->bitstream_filters);
987 ost->sync_opts += enc->frame_size;
991 av_init_packet(&pkt);
993 ost->sync_opts += size_out / (osize * enc->channels);
995 /* output a pcm frame */
996 /* determine the size of the coded buffer */
999 size_out = size_out*coded_bps/8;
1001 if(size_out > audio_out_size){
1002 fprintf(stderr, "Internal error, buffer size too small\n");
1006 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1007 ret = avcodec_encode_audio(enc, audio_out, size_out,
1010 fprintf(stderr, "Audio encoding failed\n");
1014 pkt.stream_index= ost->index;
1015 pkt.data= audio_out;
1017 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1018 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1019 pkt.flags |= AV_PKT_FLAG_KEY;
1020 write_frame(s, &pkt, enc, ost->bitstream_filters);
1024 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1026 AVCodecContext *dec;
1027 AVPicture *picture2;
1028 AVPicture picture_tmp;
1031 dec = ist->st->codec;
1033 /* deinterlace : must be done before any resize */
1034 if (do_deinterlace) {
1037 /* create temporary picture */
1038 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1039 buf = av_malloc(size);
1043 picture2 = &picture_tmp;
1044 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1046 if(avpicture_deinterlace(picture2, picture,
1047 dec->pix_fmt, dec->width, dec->height) < 0) {
1048 /* if error, do not deinterlace */
1049 fprintf(stderr, "Deinterlacing failed\n");
1058 if (picture != picture2)
1059 *picture = *picture2;
1063 /* we begin to correct av delay at this threshold */
1064 #define AV_DELAY_MAX 0.100
1066 static void do_subtitle_out(AVFormatContext *s,
1067 AVOutputStream *ost,
1072 static uint8_t *subtitle_out = NULL;
1073 int subtitle_out_max_size = 1024 * 1024;
1074 int subtitle_out_size, nb, i;
1075 AVCodecContext *enc;
1078 if (pts == AV_NOPTS_VALUE) {
1079 fprintf(stderr, "Subtitle packets must have a pts\n");
1085 enc = ost->st->codec;
1087 if (!subtitle_out) {
1088 subtitle_out = av_malloc(subtitle_out_max_size);
1091 /* Note: DVB subtitle need one packet to draw them and one other
1092 packet to clear them */
1093 /* XXX: signal it in the codec context ? */
1094 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1099 for(i = 0; i < nb; i++) {
1100 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1101 // start_display_time is required to be 0
1102 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1103 sub->end_display_time -= sub->start_display_time;
1104 sub->start_display_time = 0;
1105 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1106 subtitle_out_max_size, sub);
1107 if (subtitle_out_size < 0) {
1108 fprintf(stderr, "Subtitle encoding failed\n");
1112 av_init_packet(&pkt);
1113 pkt.stream_index = ost->index;
1114 pkt.data = subtitle_out;
1115 pkt.size = subtitle_out_size;
1116 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1117 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1118 /* XXX: the pts correction is handled here. Maybe handling
1119 it in the codec would be better */
1121 pkt.pts += 90 * sub->start_display_time;
1123 pkt.pts += 90 * sub->end_display_time;
1125 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1129 static int bit_buffer_size= 1024*256;
1130 static uint8_t *bit_buffer= NULL;
1132 static void do_video_out(AVFormatContext *s,
1133 AVOutputStream *ost,
1135 AVFrame *in_picture,
1138 int nb_frames, i, ret;
1139 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1140 AVCodecContext *enc, *dec;
1143 enc = ost->st->codec;
1144 dec = ist->st->codec;
1146 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1148 /* by default, we output a single frame */
1153 if(video_sync_method){
1154 double vdelta = sync_ipts - ost->sync_opts;
1155 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1158 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1161 }else if(vdelta>0.6)
1162 ost->sync_opts= lrintf(sync_ipts);
1163 }else if (vdelta > 1.1)
1164 nb_frames = lrintf(vdelta);
1165 //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);
1166 if (nb_frames == 0){
1169 fprintf(stderr, "*** drop!\n");
1170 }else if (nb_frames > 1) {
1171 nb_frames_dup += nb_frames - 1;
1173 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1176 ost->sync_opts= lrintf(sync_ipts);
1178 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1182 formatted_picture = in_picture;
1183 final_picture = formatted_picture;
1184 padding_src = formatted_picture;
1185 resampling_dst = &ost->pict_tmp;
1187 if ( ost->resample_height != ist->st->codec->height
1188 || ost->resample_width != ist->st->codec->width
1189 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1191 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1192 if(!ost->video_resample)
1196 #if !CONFIG_AVFILTER
1197 if (ost->video_resample) {
1199 final_picture = &ost->pict_tmp;
1200 if( ost->resample_height != ist->st->codec->height
1201 || ost->resample_width != ist->st->codec->width
1202 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1204 /* initialize a new scaler context */
1205 sws_freeContext(ost->img_resample_ctx);
1206 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1207 ost->img_resample_ctx = sws_getContext(
1208 ist->st->codec->width,
1209 ist->st->codec->height,
1210 ist->st->codec->pix_fmt,
1211 ost->st->codec->width,
1212 ost->st->codec->height,
1213 ost->st->codec->pix_fmt,
1214 sws_flags, NULL, NULL, NULL);
1215 if (ost->img_resample_ctx == NULL) {
1216 fprintf(stderr, "Cannot get resampling context\n");
1220 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1221 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1225 /* duplicates frame if needed */
1226 for(i=0;i<nb_frames;i++) {
1228 av_init_packet(&pkt);
1229 pkt.stream_index= ost->index;
1231 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1232 /* raw pictures are written as AVPicture structure to
1233 avoid any copies. We support temorarily the older
1235 AVFrame* old_frame = enc->coded_frame;
1236 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1237 pkt.data= (uint8_t *)final_picture;
1238 pkt.size= sizeof(AVPicture);
1239 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1240 pkt.flags |= AV_PKT_FLAG_KEY;
1242 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1243 enc->coded_frame = old_frame;
1245 AVFrame big_picture;
1247 big_picture= *final_picture;
1248 /* better than nothing: use input picture interlaced
1250 big_picture.interlaced_frame = in_picture->interlaced_frame;
1251 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1252 if(top_field_first == -1)
1253 big_picture.top_field_first = in_picture->top_field_first;
1255 big_picture.top_field_first = top_field_first;
1258 /* handles sameq here. This is not correct because it may
1259 not be a global option */
1260 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1262 big_picture.pict_type = 0;
1263 // big_picture.pts = AV_NOPTS_VALUE;
1264 big_picture.pts= ost->sync_opts;
1265 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1266 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1267 if (ost->forced_kf_index < ost->forced_kf_count &&
1268 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1269 big_picture.pict_type = FF_I_TYPE;
1270 ost->forced_kf_index++;
1272 ret = avcodec_encode_video(enc,
1273 bit_buffer, bit_buffer_size,
1276 fprintf(stderr, "Video encoding failed\n");
1281 pkt.data= bit_buffer;
1283 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1284 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1285 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1286 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1287 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1289 if(enc->coded_frame->key_frame)
1290 pkt.flags |= AV_PKT_FLAG_KEY;
1291 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1294 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1295 // enc->frame_number-1, ret, enc->pict_type);
1296 /* if two pass, output log */
1297 if (ost->logfile && enc->stats_out) {
1298 fprintf(ost->logfile, "%s", enc->stats_out);
1303 ost->frame_number++;
1307 static double psnr(double d){
1308 return -10.0*log(d)/log(10.0);
1311 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1314 AVCodecContext *enc;
1316 double ti1, bitrate, avg_bitrate;
1318 /* this is executed just the first time do_video_stats is called */
1320 vstats_file = fopen(vstats_filename, "w");
1327 enc = ost->st->codec;
1328 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1329 frame_number = ost->frame_number;
1330 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1331 if (enc->flags&CODEC_FLAG_PSNR)
1332 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1334 fprintf(vstats_file,"f_size= %6d ", frame_size);
1335 /* compute pts value */
1336 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1340 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1341 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1342 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1343 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1344 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1348 static void print_report(AVFormatContext **output_files,
1349 AVOutputStream **ost_table, int nb_ostreams,
1353 AVOutputStream *ost;
1354 AVFormatContext *oc;
1356 AVCodecContext *enc;
1357 int frame_number, vid, i;
1358 double bitrate, ti1, pts;
1359 static int64_t last_time = -1;
1360 static int qp_histogram[52];
1362 if (!is_last_report) {
1364 /* display the report every 0.5 seconds */
1365 cur_time = av_gettime();
1366 if (last_time == -1) {
1367 last_time = cur_time;
1370 if ((cur_time - last_time) < 500000)
1372 last_time = cur_time;
1376 oc = output_files[0];
1378 total_size = avio_size(oc->pb);
1379 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1380 total_size= avio_tell(oc->pb);
1385 for(i=0;i<nb_ostreams;i++) {
1388 enc = ost->st->codec;
1389 if(!ost->st->stream_copy && enc->coded_frame)
1390 q= enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1391 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1392 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1394 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1395 float t = (av_gettime()-timer_start) / 1000000.0;
1397 frame_number = ost->frame_number;
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1399 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1401 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1405 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1408 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1410 if (enc->flags&CODEC_FLAG_PSNR){
1412 double error, error_sum=0;
1413 double scale, scale_sum=0;
1414 char type[3]= {'Y','U','V'};
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1418 error= enc->error[j];
1419 scale= enc->width*enc->height*255.0*255.0*frame_number;
1421 error= enc->coded_frame->error[j];
1422 scale= enc->width*enc->height*255.0*255.0;
1427 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1429 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1433 /* compute min output value */
1434 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1435 if ((pts < ti1) && (pts > 0))
1441 if (verbose || is_last_report) {
1442 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1444 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1445 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1446 (double)total_size / 1024, ti1, bitrate);
1448 if (nb_frames_dup || nb_frames_drop)
1449 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1450 nb_frames_dup, nb_frames_drop);
1453 fprintf(stderr, "%s \r", buf);
1458 if (is_last_report && verbose >= 0){
1459 int64_t raw= audio_size + video_size + extra_size;
1460 fprintf(stderr, "\n");
1461 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1465 100.0*(total_size - raw)/raw
1470 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1472 int fill_char = 0x00;
1473 if (sample_fmt == AV_SAMPLE_FMT_U8)
1475 memset(buf, fill_char, size);
1478 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1479 static int output_packet(AVInputStream *ist, int ist_index,
1480 AVOutputStream **ost_table, int nb_ostreams,
1481 const AVPacket *pkt)
1483 AVFormatContext *os;
1484 AVOutputStream *ost;
1488 void *buffer_to_free;
1489 static unsigned int samples_size= 0;
1490 AVSubtitle subtitle, *subtitle_to_free;
1491 int64_t pkt_pts = AV_NOPTS_VALUE;
1493 int frame_available;
1497 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1499 if(ist->next_pts == AV_NOPTS_VALUE)
1500 ist->next_pts= ist->pts;
1504 av_init_packet(&avpkt);
1512 if(pkt->dts != AV_NOPTS_VALUE)
1513 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1514 if(pkt->pts != AV_NOPTS_VALUE)
1515 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1517 //while we have more to decode or while the decoder did output something on EOF
1518 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1519 uint8_t *data_buf, *decoded_data_buf;
1520 int data_size, decoded_data_size;
1522 ist->pts= ist->next_pts;
1524 if(avpkt.size && avpkt.size != pkt->size &&
1525 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1526 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1527 ist->showed_multi_packet_warning=1;
1530 /* decode the packet if needed */
1531 decoded_data_buf = NULL; /* fail safe */
1532 decoded_data_size= 0;
1533 data_buf = avpkt.data;
1534 data_size = avpkt.size;
1535 subtitle_to_free = NULL;
1536 if (ist->decoding_needed) {
1537 switch(ist->st->codec->codec_type) {
1538 case AVMEDIA_TYPE_AUDIO:{
1539 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1540 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1542 samples= av_malloc(samples_size);
1544 decoded_data_size= samples_size;
1545 /* XXX: could avoid copy if PCM 16 bits with same
1546 endianness as CPU */
1547 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1554 /* Some bug in mpeg audio decoder gives */
1555 /* decoded_data_size < 0, it seems they are overflows */
1556 if (decoded_data_size <= 0) {
1557 /* no audio frame */
1560 decoded_data_buf = (uint8_t *)samples;
1561 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1562 (ist->st->codec->sample_rate * ist->st->codec->channels);
1564 case AVMEDIA_TYPE_VIDEO:
1565 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1566 /* XXX: allocate picture correctly */
1567 avcodec_get_frame_defaults(&picture);
1568 avpkt.pts = pkt_pts;
1569 avpkt.dts = ist->pts;
1570 pkt_pts = AV_NOPTS_VALUE;
1572 ret = avcodec_decode_video2(ist->st->codec,
1573 &picture, &got_picture, &avpkt);
1574 ist->st->quality= picture.quality;
1578 /* no picture yet */
1579 goto discard_packet;
1581 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1582 if (ist->st->codec->time_base.num != 0) {
1583 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1584 ist->next_pts += ((int64_t)AV_TIME_BASE *
1585 ist->st->codec->time_base.num * ticks) /
1586 ist->st->codec->time_base.den;
1590 case AVMEDIA_TYPE_SUBTITLE:
1591 ret = avcodec_decode_subtitle2(ist->st->codec,
1592 &subtitle, &got_picture, &avpkt);
1596 goto discard_packet;
1598 subtitle_to_free = &subtitle;
1605 switch(ist->st->codec->codec_type) {
1606 case AVMEDIA_TYPE_AUDIO:
1607 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1608 ist->st->codec->sample_rate;
1610 case AVMEDIA_TYPE_VIDEO:
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;
1623 buffer_to_free = NULL;
1624 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1625 pre_process_video_frame(ist, (AVPicture *)&picture,
1630 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
1631 for(i=0;i<nb_ostreams;i++) {
1633 if (ost->input_video_filter && ost->source_index == ist_index) {
1635 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1636 else sar = ist->st->codec->sample_aspect_ratio;
1637 // add it to be filtered
1638 av_vsrc_buffer_add_frame2(ost->input_video_filter, &picture,
1640 sar, ist->st->codec->width, ist->st->codec->height,
1641 ist->st->codec->pix_fmt, "0:0"); //TODO user setable params
1647 // preprocess audio (volume)
1648 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1649 if (audio_volume != 256) {
1652 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1653 int v = ((*volp) * audio_volume + 128) >> 8;
1654 if (v < -32768) v = -32768;
1655 if (v > 32767) v = 32767;
1661 /* frame rate emulation */
1663 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1664 int64_t now = av_gettime() - ist->start;
1668 /* if output time reached then transcode raw format,
1669 encode packets and output them */
1670 if (start_time == 0 || ist->pts >= start_time)
1671 for(i=0;i<nb_ostreams;i++) {
1675 if (ost->source_index == ist_index) {
1677 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1678 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1679 while (frame_available) {
1680 AVRational ist_pts_tb;
1681 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1682 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1684 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1686 os = output_files[ost->file_index];
1688 /* set the input output pts pairs */
1689 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1691 if (ost->encoding_needed) {
1692 av_assert0(ist->decoding_needed);
1693 switch(ost->st->codec->codec_type) {
1694 case AVMEDIA_TYPE_AUDIO:
1695 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1697 case AVMEDIA_TYPE_VIDEO:
1699 if (ost->picref->video)
1700 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1702 do_video_out(os, ost, ist, &picture, &frame_size);
1703 if (vstats_filename && frame_size)
1704 do_video_stats(os, ost, frame_size);
1706 case AVMEDIA_TYPE_SUBTITLE:
1707 do_subtitle_out(os, ost, ist, &subtitle,
1714 AVFrame avframe; //FIXME/XXX remove this
1716 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1718 av_init_packet(&opkt);
1720 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1721 #if !CONFIG_AVFILTER
1727 /* no reencoding needed : output the packet directly */
1728 /* force the input stream PTS */
1730 avcodec_get_frame_defaults(&avframe);
1731 ost->st->codec->coded_frame= &avframe;
1732 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1734 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1735 audio_size += data_size;
1736 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1737 video_size += data_size;
1741 opkt.stream_index= ost->index;
1742 if(pkt->pts != AV_NOPTS_VALUE)
1743 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1745 opkt.pts= AV_NOPTS_VALUE;
1747 if (pkt->dts == AV_NOPTS_VALUE)
1748 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1750 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1751 opkt.dts -= ost_tb_start_time;
1753 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1754 opkt.flags= pkt->flags;
1756 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1757 if( ost->st->codec->codec_id != CODEC_ID_H264
1758 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1759 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1761 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1762 opkt.destruct= av_destruct_packet;
1764 opkt.data = data_buf;
1765 opkt.size = data_size;
1768 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1769 ost->st->codec->frame_number++;
1770 ost->frame_number++;
1771 av_free_packet(&opkt);
1775 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1776 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1778 avfilter_unref_buffer(ost->picref);
1784 av_free(buffer_to_free);
1785 /* XXX: allocate the subtitles in the codec ? */
1786 if (subtitle_to_free) {
1787 avsubtitle_free(subtitle_to_free);
1788 subtitle_to_free = NULL;
1795 for(i=0;i<nb_ostreams;i++) {
1797 if (ost->source_index == ist_index) {
1798 AVCodecContext *enc= ost->st->codec;
1799 os = output_files[ost->file_index];
1801 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1803 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1806 if (ost->encoding_needed) {
1810 av_init_packet(&pkt);
1811 pkt.stream_index= ost->index;
1813 switch(ost->st->codec->codec_type) {
1814 case AVMEDIA_TYPE_AUDIO:
1815 fifo_bytes = av_fifo_size(ost->fifo);
1817 /* encode any samples remaining in fifo */
1818 if (fifo_bytes > 0) {
1819 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1820 int fs_tmp = enc->frame_size;
1822 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1823 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1824 enc->frame_size = fifo_bytes / (osize * enc->channels);
1826 int frame_bytes = enc->frame_size*osize*enc->channels;
1827 if (allocated_audio_buf_size < frame_bytes)
1829 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1832 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1833 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1834 ost->st->time_base.num, enc->sample_rate);
1835 enc->frame_size = fs_tmp;
1838 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1841 fprintf(stderr, "Audio encoding failed\n");
1845 pkt.flags |= AV_PKT_FLAG_KEY;
1847 case AVMEDIA_TYPE_VIDEO:
1848 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1850 fprintf(stderr, "Video encoding failed\n");
1854 if(enc->coded_frame && enc->coded_frame->key_frame)
1855 pkt.flags |= AV_PKT_FLAG_KEY;
1856 if (ost->logfile && enc->stats_out) {
1857 fprintf(ost->logfile, "%s", enc->stats_out);
1866 pkt.data= bit_buffer;
1868 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1869 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1870 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1882 static void print_sdp(AVFormatContext **avc, int n)
1886 av_sdp_create(avc, n, sdp, sizeof(sdp));
1887 printf("SDP:\n%s\n", sdp);
1891 static int copy_chapters(int infile, int outfile)
1893 AVFormatContext *is = input_files[infile];
1894 AVFormatContext *os = output_files[outfile];
1897 for (i = 0; i < is->nb_chapters; i++) {
1898 AVChapter *in_ch = is->chapters[i], *out_ch;
1899 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1900 AV_TIME_BASE_Q, in_ch->time_base);
1901 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1902 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1905 if (in_ch->end < ts_off)
1907 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1910 out_ch = av_mallocz(sizeof(AVChapter));
1912 return AVERROR(ENOMEM);
1914 out_ch->id = in_ch->id;
1915 out_ch->time_base = in_ch->time_base;
1916 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1917 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1919 if (metadata_chapters_autocopy)
1920 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1923 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1925 return AVERROR(ENOMEM);
1926 os->chapters[os->nb_chapters - 1] = out_ch;
1931 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1932 AVCodecContext *avctx)
1938 for (p = kf; *p; p++)
1941 ost->forced_kf_count = n;
1942 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1943 if (!ost->forced_kf_pts) {
1944 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1947 for (i = 0; i < n; i++) {
1948 p = i ? strchr(p, ',') + 1 : kf;
1949 t = parse_time_or_die("force_key_frames", p, 1);
1950 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1955 * The following code is the main loop of the file converter
1957 static int transcode(AVFormatContext **output_files,
1958 int nb_output_files,
1959 AVFormatContext **input_files,
1961 AVStreamMap *stream_maps, int nb_stream_maps)
1963 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0, step;
1964 AVFormatContext *is, *os;
1965 AVCodecContext *codec, *icodec;
1966 AVOutputStream *ost, **ost_table = NULL;
1967 AVInputStream *ist, **ist_table = NULL;
1968 AVInputFile *file_table;
1972 uint8_t no_packet[MAX_FILES]={0};
1973 int no_packet_count=0;
1974 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
1975 int nb_streams[AVMEDIA_TYPE_NB]={0};
1977 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1981 /* input stream init */
1983 for(i=0;i<nb_input_files;i++) {
1984 is = input_files[i];
1985 file_table[i].ist_index = j;
1986 file_table[i].nb_streams = is->nb_streams;
1987 j += is->nb_streams;
1991 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1995 for(i=0;i<nb_istreams;i++) {
1996 ist = av_mallocz(sizeof(AVInputStream));
2002 for(i=0;i<nb_input_files;i++) {
2003 is = input_files[i];
2004 for(k=0;k<is->nb_streams;k++) {
2005 ist = ist_table[j++];
2006 ist->st = is->streams[k];
2007 ist->file_index = i;
2009 ist->discard = 1; /* the stream is discarded by default
2013 ist->start = av_gettime();
2018 /* output stream init */
2020 for(i=0;i<nb_output_files;i++) {
2021 os = output_files[i];
2022 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2023 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2024 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2025 ret = AVERROR(EINVAL);
2028 nb_ostreams += os->nb_streams;
2030 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2031 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2032 ret = AVERROR(EINVAL);
2036 /* Sanity check the mapping args -- do the input files & streams exist? */
2037 for(i=0;i<nb_stream_maps;i++) {
2038 int fi = stream_maps[i].file_index;
2039 int si = stream_maps[i].stream_index;
2041 if (fi < 0 || fi > nb_input_files - 1 ||
2042 si < 0 || si > file_table[fi].nb_streams - 1) {
2043 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2044 ret = AVERROR(EINVAL);
2047 fi = stream_maps[i].sync_file_index;
2048 si = stream_maps[i].sync_stream_index;
2049 if (fi < 0 || fi > nb_input_files - 1 ||
2050 si < 0 || si > file_table[fi].nb_streams - 1) {
2051 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2052 ret = AVERROR(EINVAL);
2057 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2061 for(k=0;k<nb_output_files;k++) {
2062 os = output_files[k];
2063 for(i=0;i<os->nb_streams;i++,n++) {
2064 nb_streams[os->streams[i]->codec->codec_type]++;
2067 for(step=1<<30; step; step>>=1){
2068 int found_streams[AVMEDIA_TYPE_NB]={0};
2069 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2070 nb_frame_threshold[j] += step;
2072 for(j=0; j<nb_istreams; j++) {
2077 AVFormatContext *f= input_files[ ist->file_index ];
2079 for(pi=0; pi<f->nb_programs; pi++){
2080 AVProgram *p= f->programs[pi];
2081 if(p->id == opt_programid)
2082 for(si=0; si<p->nb_stream_indexes; si++){
2083 if(f->streams[ p->stream_index[si] ] == ist->st)
2088 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2089 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2090 found_streams[ist->st->codec->codec_type]++;
2093 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2094 if(found_streams[j] < nb_streams[j])
2095 nb_frame_threshold[j] -= step;
2098 for(k=0;k<nb_output_files;k++) {
2099 os = output_files[k];
2100 for(i=0;i<os->nb_streams;i++,n++) {
2102 ost = ost_table[n] = output_streams_for_file[k][i];
2103 ost->st = os->streams[i];
2104 if (nb_stream_maps > 0) {
2105 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2106 stream_maps[n].stream_index;
2108 /* Sanity check that the stream types match */
2109 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2110 int i= ost->file_index;
2111 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2112 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2113 stream_maps[n].file_index, stream_maps[n].stream_index,
2114 ost->file_index, ost->index);
2119 /* get corresponding input stream index : we select the first one with the right type */
2121 for(j=0;j<nb_istreams;j++) {
2126 AVFormatContext *f= input_files[ ist->file_index ];
2128 for(pi=0; pi<f->nb_programs; pi++){
2129 AVProgram *p= f->programs[pi];
2130 if(p->id == opt_programid)
2131 for(si=0; si<p->nb_stream_indexes; si++){
2132 if(f->streams[ p->stream_index[si] ] == ist->st)
2137 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2138 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2139 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2140 ost->source_index = j;
2147 if(! opt_programid) {
2148 /* try again and reuse existing stream */
2149 for(j=0;j<nb_istreams;j++) {
2151 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2152 && ist->st->discard != AVDISCARD_ALL) {
2153 ost->source_index = j;
2159 int i= ost->file_index;
2160 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2161 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2162 ost->file_index, ost->index);
2167 ist = ist_table[ost->source_index];
2169 ost->sync_ist = (nb_stream_maps > 0) ?
2170 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2171 stream_maps[n].sync_stream_index] : ist;
2175 /* for each output stream, we compute the right encoding parameters */
2176 for(i=0;i<nb_ostreams;i++) {
2178 os = output_files[ost->file_index];
2179 ist = ist_table[ost->source_index];
2181 codec = ost->st->codec;
2182 icodec = ist->st->codec;
2184 if (metadata_streams_autocopy)
2185 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2186 AV_METADATA_DONT_OVERWRITE);
2188 ost->st->disposition = ist->st->disposition;
2189 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2190 codec->chroma_sample_location = icodec->chroma_sample_location;
2192 if (ost->st->stream_copy) {
2193 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2195 if (extra_size > INT_MAX)
2198 /* if stream_copy is selected, no need to decode or encode */
2199 codec->codec_id = icodec->codec_id;
2200 codec->codec_type = icodec->codec_type;
2202 if(!codec->codec_tag){
2203 if( !os->oformat->codec_tag
2204 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2205 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2206 codec->codec_tag = icodec->codec_tag;
2209 codec->bit_rate = icodec->bit_rate;
2210 codec->rc_max_rate = icodec->rc_max_rate;
2211 codec->rc_buffer_size = icodec->rc_buffer_size;
2212 codec->extradata= av_mallocz(extra_size);
2213 if (!codec->extradata)
2215 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2216 codec->extradata_size= icodec->extradata_size;
2217 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){
2218 codec->time_base = icodec->time_base;
2219 codec->time_base.num *= icodec->ticks_per_frame;
2220 av_reduce(&codec->time_base.num, &codec->time_base.den,
2221 codec->time_base.num, codec->time_base.den, INT_MAX);
2223 codec->time_base = ist->st->time_base;
2224 switch(codec->codec_type) {
2225 case AVMEDIA_TYPE_AUDIO:
2226 if(audio_volume != 256) {
2227 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2230 codec->channel_layout = icodec->channel_layout;
2231 codec->sample_rate = icodec->sample_rate;
2232 codec->channels = icodec->channels;
2233 codec->frame_size = icodec->frame_size;
2234 codec->audio_service_type = icodec->audio_service_type;
2235 codec->block_align= icodec->block_align;
2236 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2237 codec->block_align= 0;
2238 if(codec->codec_id == CODEC_ID_AC3)
2239 codec->block_align= 0;
2241 case AVMEDIA_TYPE_VIDEO:
2242 codec->pix_fmt = icodec->pix_fmt;
2243 codec->width = icodec->width;
2244 codec->height = icodec->height;
2245 codec->has_b_frames = icodec->has_b_frames;
2247 case AVMEDIA_TYPE_SUBTITLE:
2248 codec->width = icodec->width;
2249 codec->height = icodec->height;
2255 switch(codec->codec_type) {
2256 case AVMEDIA_TYPE_AUDIO:
2257 ost->fifo= av_fifo_alloc(1024);
2260 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2261 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2262 icodec->request_channels = codec->channels;
2263 ist->decoding_needed = 1;
2264 ost->encoding_needed = 1;
2265 ost->resample_sample_fmt = icodec->sample_fmt;
2266 ost->resample_sample_rate = icodec->sample_rate;
2267 ost->resample_channels = icodec->channels;
2269 case AVMEDIA_TYPE_VIDEO:
2270 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2271 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2274 ost->video_resample = (codec->width != icodec->width ||
2275 codec->height != icodec->height ||
2276 (codec->pix_fmt != icodec->pix_fmt));
2277 if (ost->video_resample) {
2278 #if !CONFIG_AVFILTER
2279 avcodec_get_frame_defaults(&ost->pict_tmp);
2280 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2281 codec->width, codec->height)) {
2282 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2285 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2286 ost->img_resample_ctx = sws_getContext(
2293 sws_flags, NULL, NULL, NULL);
2294 if (ost->img_resample_ctx == NULL) {
2295 fprintf(stderr, "Cannot get resampling context\n");
2299 ost->original_height = icodec->height;
2300 ost->original_width = icodec->width;
2302 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2304 ost->resample_height = icodec->height;
2305 ost->resample_width = icodec->width;
2306 ost->resample_pix_fmt= icodec->pix_fmt;
2307 ost->encoding_needed = 1;
2308 ist->decoding_needed = 1;
2311 if (configure_filters(ist, ost)) {
2312 fprintf(stderr, "Error opening filters!\n");
2317 case AVMEDIA_TYPE_SUBTITLE:
2318 ost->encoding_needed = 1;
2319 ist->decoding_needed = 1;
2326 if (ost->encoding_needed &&
2327 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2328 char logfilename[1024];
2331 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2332 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2334 if (codec->flags & CODEC_FLAG_PASS1) {
2335 f = fopen(logfilename, "wb");
2337 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2343 size_t logbuffer_size;
2344 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2345 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2348 codec->stats_in = logbuffer;
2352 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2353 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2354 int size= codec->width * codec->height;
2355 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2360 bit_buffer = av_malloc(bit_buffer_size);
2362 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2364 ret = AVERROR(ENOMEM);
2368 /* open each encoder */
2369 for(i=0;i<nb_ostreams;i++) {
2371 if (ost->encoding_needed) {
2372 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2373 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2375 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2377 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2378 ost->st->codec->codec_id, ost->file_index, ost->index);
2379 ret = AVERROR(EINVAL);
2382 if (dec->subtitle_header) {
2383 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2384 if (!ost->st->codec->subtitle_header) {
2385 ret = AVERROR(ENOMEM);
2388 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2389 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2391 if (avcodec_open(ost->st->codec, codec) < 0) {
2392 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2393 ost->file_index, ost->index);
2394 ret = AVERROR(EINVAL);
2397 extra_size += ost->st->codec->extradata_size;
2401 /* open each decoder */
2402 for(i=0;i<nb_istreams;i++) {
2404 if (ist->decoding_needed) {
2405 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2407 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2409 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2410 ist->st->codec->codec_id, ist->file_index, ist->index);
2411 ret = AVERROR(EINVAL);
2414 if (avcodec_open(ist->st->codec, codec) < 0) {
2415 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2416 ist->file_index, ist->index);
2417 ret = AVERROR(EINVAL);
2420 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2421 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2426 for(i=0;i<nb_istreams;i++) {
2430 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2431 ist->next_pts = AV_NOPTS_VALUE;
2435 /* set meta data information from input file if required */
2436 for (i=0;i<nb_meta_data_maps;i++) {
2437 AVFormatContext *files[2];
2438 AVMetadata **meta[2];
2441 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2442 if ((index) < 0 || (index) >= (nb_elems)) {\
2443 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2445 ret = AVERROR(EINVAL);\
2449 int out_file_index = meta_data_maps[i][0].file;
2450 int in_file_index = meta_data_maps[i][1].file;
2451 if (in_file_index < 0 || out_file_index < 0)
2453 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2454 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2456 files[0] = output_files[out_file_index];
2457 files[1] = input_files[in_file_index];
2459 for (j = 0; j < 2; j++) {
2460 AVMetaDataMap *map = &meta_data_maps[i][j];
2462 switch (map->type) {
2464 meta[j] = &files[j]->metadata;
2467 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2468 meta[j] = &files[j]->streams[map->index]->metadata;
2471 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2472 meta[j] = &files[j]->chapters[map->index]->metadata;
2475 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2476 meta[j] = &files[j]->programs[map->index]->metadata;
2481 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2484 /* copy global metadata by default */
2485 if (metadata_global_autocopy) {
2487 for (i = 0; i < nb_output_files; i++)
2488 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2489 AV_METADATA_DONT_OVERWRITE);
2492 /* copy chapters according to chapter maps */
2493 for (i = 0; i < nb_chapter_maps; i++) {
2494 int infile = chapter_maps[i].in_file;
2495 int outfile = chapter_maps[i].out_file;
2497 if (infile < 0 || outfile < 0)
2499 if (infile >= nb_input_files) {
2500 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2501 ret = AVERROR(EINVAL);
2504 if (outfile >= nb_output_files) {
2505 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2506 ret = AVERROR(EINVAL);
2509 copy_chapters(infile, outfile);
2512 /* copy chapters from the first input file that has them*/
2513 if (!nb_chapter_maps)
2514 for (i = 0; i < nb_input_files; i++) {
2515 if (!input_files[i]->nb_chapters)
2518 for (j = 0; j < nb_output_files; j++)
2519 if ((ret = copy_chapters(i, j)) < 0)
2524 /* open files and write file headers */
2525 for(i=0;i<nb_output_files;i++) {
2526 os = output_files[i];
2527 if (av_write_header(os) < 0) {
2528 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2529 ret = AVERROR(EINVAL);
2532 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2538 /* dump the file output parameters - cannot be done before in case
2540 for(i=0;i<nb_output_files;i++) {
2541 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2544 /* dump the stream mapping */
2546 fprintf(stderr, "Stream mapping:\n");
2547 for(i=0;i<nb_ostreams;i++) {
2549 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2550 ist_table[ost->source_index]->file_index,
2551 ist_table[ost->source_index]->index,
2554 if (ost->sync_ist != ist_table[ost->source_index])
2555 fprintf(stderr, " [sync #%d.%d]",
2556 ost->sync_ist->file_index,
2557 ost->sync_ist->index);
2558 fprintf(stderr, "\n");
2563 fprintf(stderr, "%s\n", error);
2568 print_sdp(output_files, nb_output_files);
2573 fprintf(stderr, "Press [q] to stop encoding\n");
2574 avio_set_interrupt_cb(decode_interrupt_cb);
2578 timer_start = av_gettime();
2580 for(; received_sigterm == 0;) {
2581 int file_index, ist_index;
2589 /* if 'q' pressed, exits */
2593 /* read_key() returns 0 on EOF */
2599 /* select the stream that we must read now by looking at the
2600 smallest output pts */
2602 for(i=0;i<nb_ostreams;i++) {
2605 os = output_files[ost->file_index];
2606 ist = ist_table[ost->source_index];
2607 if(ist->is_past_recording_time || no_packet[ist->file_index])
2609 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2610 ipts = (double)ist->pts;
2611 if (!file_table[ist->file_index].eof_reached){
2612 if(ipts < ipts_min) {
2614 if(input_sync ) file_index = ist->file_index;
2616 if(opts < opts_min) {
2618 if(!input_sync) file_index = ist->file_index;
2621 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2626 /* if none, if is finished */
2627 if (file_index < 0) {
2628 if(no_packet_count){
2630 memset(no_packet, 0, sizeof(no_packet));
2637 /* finish if limit size exhausted */
2638 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2641 /* read a frame from it and output it in the fifo */
2642 is = input_files[file_index];
2643 ret= av_read_frame(is, &pkt);
2644 if(ret == AVERROR(EAGAIN)){
2645 no_packet[file_index]=1;
2650 file_table[file_index].eof_reached = 1;
2658 memset(no_packet, 0, sizeof(no_packet));
2661 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2662 is->streams[pkt.stream_index]);
2664 /* the following test is needed in case new streams appear
2665 dynamically in stream : we ignore them */
2666 if (pkt.stream_index >= file_table[file_index].nb_streams)
2667 goto discard_packet;
2668 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2669 ist = ist_table[ist_index];
2671 goto discard_packet;
2673 if (pkt.dts != AV_NOPTS_VALUE)
2674 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2675 if (pkt.pts != AV_NOPTS_VALUE)
2676 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2678 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2679 && input_files_ts_scale[file_index][pkt.stream_index]){
2680 if(pkt.pts != AV_NOPTS_VALUE)
2681 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2682 if(pkt.dts != AV_NOPTS_VALUE)
2683 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2686 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2687 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2688 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2689 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2690 int64_t delta= pkt_dts - ist->next_pts;
2691 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2692 input_files_ts_offset[ist->file_index]-= delta;
2694 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2695 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2696 if(pkt.pts != AV_NOPTS_VALUE)
2697 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2701 /* finish if recording time exhausted */
2702 if (recording_time != INT64_MAX &&
2703 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2704 ist->is_past_recording_time = 1;
2705 goto discard_packet;
2708 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2709 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2712 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2713 ist->file_index, ist->index);
2716 av_free_packet(&pkt);
2721 av_free_packet(&pkt);
2723 /* dump report by using the output first video and audio streams */
2724 print_report(output_files, ost_table, nb_ostreams, 0);
2727 /* at the end of stream, we must flush the decoder buffers */
2728 for(i=0;i<nb_istreams;i++) {
2730 if (ist->decoding_needed) {
2731 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2737 /* write the trailer if needed and close file */
2738 for(i=0;i<nb_output_files;i++) {
2739 os = output_files[i];
2740 av_write_trailer(os);
2743 /* dump report by using the first video and audio streams */
2744 print_report(output_files, ost_table, nb_ostreams, 1);
2746 /* close each encoder */
2747 for(i=0;i<nb_ostreams;i++) {
2749 if (ost->encoding_needed) {
2750 av_freep(&ost->st->codec->stats_in);
2751 avcodec_close(ost->st->codec);
2754 avfilter_graph_free(&ost->graph);
2758 /* close each decoder */
2759 for(i=0;i<nb_istreams;i++) {
2761 if (ist->decoding_needed) {
2762 avcodec_close(ist->st->codec);
2770 av_freep(&bit_buffer);
2771 av_free(file_table);
2774 for(i=0;i<nb_istreams;i++) {
2781 for(i=0;i<nb_ostreams;i++) {
2784 if (ost->st->stream_copy)
2785 av_freep(&ost->st->codec->extradata);
2787 fclose(ost->logfile);
2788 ost->logfile = NULL;
2790 av_fifo_free(ost->fifo); /* works even if fifo is not
2791 initialized but set to zero */
2792 av_freep(&ost->st->codec->subtitle_header);
2793 av_free(ost->pict_tmp.data[0]);
2794 av_free(ost->forced_kf_pts);
2795 if (ost->video_resample)
2796 sws_freeContext(ost->img_resample_ctx);
2798 audio_resample_close(ost->resample);
2799 if (ost->reformat_ctx)
2800 av_audio_convert_free(ost->reformat_ctx);
2809 static void opt_format(const char *arg)
2811 last_asked_format = arg;
2814 static void opt_video_rc_override_string(const char *arg)
2816 video_rc_override_string = arg;
2819 static int opt_me_threshold(const char *opt, const char *arg)
2821 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2825 static int opt_verbose(const char *opt, const char *arg)
2827 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2831 static int opt_frame_rate(const char *opt, const char *arg)
2833 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2834 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2840 static int opt_bitrate(const char *opt, const char *arg)
2842 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2844 opt_default(opt, arg);
2846 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2847 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2852 static int opt_frame_crop(const char *opt, const char *arg)
2854 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2855 return AVERROR(EINVAL);
2858 static void opt_frame_size(const char *arg)
2860 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2861 fprintf(stderr, "Incorrect frame size\n");
2866 static int opt_pad(const char *opt, const char *arg) {
2867 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2871 static void opt_frame_pix_fmt(const char *arg)
2873 if (strcmp(arg, "list")) {
2874 frame_pix_fmt = av_get_pix_fmt(arg);
2875 if (frame_pix_fmt == PIX_FMT_NONE) {
2876 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2885 static void opt_frame_aspect_ratio(const char *arg)
2892 p = strchr(arg, ':');
2894 x = strtol(arg, &end, 10);
2896 y = strtol(end+1, &end, 10);
2898 ar = (double)x / (double)y;
2900 ar = strtod(arg, NULL);
2903 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2906 frame_aspect_ratio = ar;
2907 frame_aspect_ratio_override = 1;
2910 static int opt_metadata(const char *opt, const char *arg)
2912 char *mid= strchr(arg, '=');
2915 fprintf(stderr, "Missing =\n");
2920 av_metadata_set2(&metadata, arg, mid, 0);
2925 static void opt_qscale(const char *arg)
2927 video_qscale = atof(arg);
2928 if (video_qscale <= 0 ||
2929 video_qscale > 255) {
2930 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2935 static void opt_top_field_first(const char *arg)
2937 top_field_first= atoi(arg);
2940 static int opt_thread_count(const char *opt, const char *arg)
2942 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2945 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2950 static void opt_audio_sample_fmt(const char *arg)
2952 if (strcmp(arg, "list")) {
2953 audio_sample_fmt = av_get_sample_fmt(arg);
2954 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2955 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2961 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2962 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2967 static int opt_audio_rate(const char *opt, const char *arg)
2969 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2973 static int opt_audio_channels(const char *opt, const char *arg)
2975 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2979 static void opt_video_channel(const char *arg)
2981 video_channel = strtol(arg, NULL, 0);
2984 static void opt_video_standard(const char *arg)
2986 video_standard = av_strdup(arg);
2989 static void opt_codec(int *pstream_copy, char **pcodec_name,
2990 int codec_type, const char *arg)
2992 av_freep(pcodec_name);
2993 if (!strcmp(arg, "copy")) {
2996 *pcodec_name = av_strdup(arg);
3000 static void opt_audio_codec(const char *arg)
3002 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
3005 static void opt_video_codec(const char *arg)
3007 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
3010 static void opt_subtitle_codec(const char *arg)
3012 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
3015 static int opt_codec_tag(const char *opt, const char *arg)
3018 uint32_t *codec_tag;
3020 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3021 !strcmp(opt, "vtag") ? &video_codec_tag :
3022 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3026 *codec_tag = strtol(arg, &tail, 0);
3028 *codec_tag = AV_RL32(arg);
3033 static void opt_map(const char *arg)
3038 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3039 m = &stream_maps[nb_stream_maps-1];
3041 m->file_index = strtol(arg, &p, 0);
3045 m->stream_index = strtol(p, &p, 0);
3048 m->sync_file_index = strtol(p, &p, 0);
3051 m->sync_stream_index = strtol(p, &p, 0);
3053 m->sync_file_index = m->file_index;
3054 m->sync_stream_index = m->stream_index;
3058 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3069 *index = strtol(++arg, endptr, 0);
3072 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3079 static void opt_map_metadata(const char *arg)
3081 AVMetaDataMap *m, *m1;
3084 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3085 &nb_meta_data_maps, nb_meta_data_maps + 1);
3087 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3088 m->file = strtol(arg, &p, 0);
3089 parse_meta_type(p, &m->type, &m->index, &p);
3093 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3094 m1->file = strtol(p, &p, 0);
3095 parse_meta_type(p, &m1->type, &m1->index, &p);
3097 if (m->type == 'g' || m1->type == 'g')
3098 metadata_global_autocopy = 0;
3099 if (m->type == 's' || m1->type == 's')
3100 metadata_streams_autocopy = 0;
3101 if (m->type == 'c' || m1->type == 'c')
3102 metadata_chapters_autocopy = 0;
3105 static void opt_map_meta_data(const char *arg)
3107 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3108 "Use -map_metadata instead.\n");
3109 opt_map_metadata(arg);
3112 static void opt_map_chapters(const char *arg)
3117 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3118 nb_chapter_maps + 1);
3119 c = &chapter_maps[nb_chapter_maps - 1];
3120 c->out_file = strtol(arg, &p, 0);
3124 c->in_file = strtol(p, &p, 0);
3127 static void opt_input_ts_scale(const char *arg)
3129 unsigned int stream;
3133 stream = strtol(arg, &p, 0);
3136 scale= strtod(p, &p);
3138 if(stream >= MAX_STREAMS)
3141 input_files_ts_scale[nb_input_files] = grow_array(input_files_ts_scale[nb_input_files], sizeof(*input_files_ts_scale[nb_input_files]), &nb_input_files_ts_scale[nb_input_files], stream + 1);
3142 input_files_ts_scale[nb_input_files][stream]= scale;
3145 static int opt_recording_time(const char *opt, const char *arg)
3147 recording_time = parse_time_or_die(opt, arg, 1);
3151 static int opt_start_time(const char *opt, const char *arg)
3153 start_time = parse_time_or_die(opt, arg, 1);
3157 static int opt_recording_timestamp(const char *opt, const char *arg)
3159 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3163 static int opt_input_ts_offset(const char *opt, const char *arg)
3165 input_ts_offset = parse_time_or_die(opt, arg, 1);
3169 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3171 const char *codec_string = encoder ? "encoder" : "decoder";
3175 return CODEC_ID_NONE;
3177 avcodec_find_encoder_by_name(name) :
3178 avcodec_find_decoder_by_name(name);
3180 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3183 if(codec->type != type) {
3184 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3187 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3188 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3189 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3190 "results.\nAdd '-strict experimental' if you want to use it.\n",
3191 codec_string, codec->name);
3193 avcodec_find_encoder(codec->id) :
3194 avcodec_find_decoder(codec->id);
3195 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3196 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3197 codec_string, codec->name);
3203 static void opt_input_file(const char *filename)
3205 AVFormatContext *ic;
3206 AVFormatParameters params, *ap = ¶ms;
3207 AVInputFormat *file_iformat = NULL;
3208 int err, i, ret, rfps, rfps_base;
3211 if (last_asked_format) {
3212 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3213 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3216 last_asked_format = NULL;
3219 if (!strcmp(filename, "-"))
3222 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3223 !strcmp(filename, "/dev/stdin");
3225 /* get default parameters from command line */
3226 ic = avformat_alloc_context();
3228 print_error(filename, AVERROR(ENOMEM));
3232 memset(ap, 0, sizeof(*ap));
3233 ap->prealloced_context = 1;
3234 ap->sample_rate = audio_sample_rate;
3235 ap->channels = audio_channels;
3236 ap->time_base.den = frame_rate.num;
3237 ap->time_base.num = frame_rate.den;
3238 ap->width = frame_width;
3239 ap->height = frame_height;
3240 ap->pix_fmt = frame_pix_fmt;
3241 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3242 ap->channel = video_channel;
3243 ap->standard = video_standard;
3245 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3247 ic->video_codec_id =
3248 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3249 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3250 ic->audio_codec_id =
3251 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3252 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3253 ic->subtitle_codec_id=
3254 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3255 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3256 ic->flags |= AVFMT_FLAG_NONBLOCK;
3258 /* open the input file with generic libav function */
3259 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3261 print_error(filename, err);
3267 for(i=0; i<ic->nb_streams; i++){
3268 ic->streams[i]->discard= AVDISCARD_ALL;
3270 for(i=0; i<ic->nb_programs; i++){
3271 AVProgram *p= ic->programs[i];
3272 if(p->id != opt_programid){
3273 p->discard = AVDISCARD_ALL;
3276 for(j=0; j<p->nb_stream_indexes; j++){
3277 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3282 fprintf(stderr, "Specified program id not found\n");
3288 ic->loop_input = loop_input;
3290 /* If not enough info to get the stream parameters, we decode the
3291 first frames to get it. (used in mpeg case for example) */
3292 ret = av_find_stream_info(ic);
3293 if (ret < 0 && verbose >= 0) {
3294 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3295 av_close_input_file(ic);
3299 timestamp = start_time;
3300 /* add the stream start time */
3301 if (ic->start_time != AV_NOPTS_VALUE)
3302 timestamp += ic->start_time;
3304 /* if seeking requested, we execute it */
3305 if (start_time != 0) {
3306 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3308 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3309 filename, (double)timestamp / AV_TIME_BASE);
3311 /* reset seek info */
3315 /* update the current parameters so that they match the one of the input stream */
3316 for(i=0;i<ic->nb_streams;i++) {
3317 AVStream *st = ic->streams[i];
3318 AVCodecContext *dec = st->codec;
3319 dec->thread_count = thread_count;
3320 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3321 switch (dec->codec_type) {
3322 case AVMEDIA_TYPE_AUDIO:
3323 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3324 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3325 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3326 channel_layout = dec->channel_layout;
3327 audio_channels = dec->channels;
3328 audio_sample_rate = dec->sample_rate;
3329 audio_sample_fmt = dec->sample_fmt;
3331 st->discard= AVDISCARD_ALL;
3332 /* Note that av_find_stream_info can add more streams, and we
3333 * currently have no chance of setting up lowres decoding
3334 * early enough for them. */
3336 audio_sample_rate >>= dec->lowres;
3338 case AVMEDIA_TYPE_VIDEO:
3339 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3340 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3341 frame_height = dec->height;
3342 frame_width = dec->width;
3343 if(ic->streams[i]->sample_aspect_ratio.num)
3344 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3346 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3347 frame_aspect_ratio *= (float) dec->width / dec->height;
3348 frame_aspect_ratio_override = 0;
3349 frame_pix_fmt = dec->pix_fmt;
3350 rfps = ic->streams[i]->r_frame_rate.num;
3351 rfps_base = ic->streams[i]->r_frame_rate.den;
3353 dec->flags |= CODEC_FLAG_EMU_EDGE;
3354 frame_height >>= dec->lowres;
3355 frame_width >>= dec->lowres;
3356 dec->height = frame_height;
3357 dec->width = frame_width;
3360 dec->debug |= FF_DEBUG_MV;
3362 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3365 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3366 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3368 (float)rfps / rfps_base, rfps, rfps_base);
3370 /* update the current frame rate to match the stream frame rate */
3371 frame_rate.num = rfps;
3372 frame_rate.den = rfps_base;
3375 st->discard= AVDISCARD_ALL;
3376 else if(video_discard)
3377 st->discard= video_discard;
3379 case AVMEDIA_TYPE_DATA:
3381 case AVMEDIA_TYPE_SUBTITLE:
3382 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3383 if(subtitle_disable)
3384 st->discard = AVDISCARD_ALL;
3386 case AVMEDIA_TYPE_ATTACHMENT:
3387 case AVMEDIA_TYPE_UNKNOWN:
3394 input_files[nb_input_files] = ic;
3395 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3396 /* dump the file content */
3398 av_dump_format(ic, nb_input_files, filename, 0);
3404 av_freep(&video_codec_name);
3405 av_freep(&audio_codec_name);
3406 av_freep(&subtitle_codec_name);
3409 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3410 int *has_subtitle_ptr)
3412 int has_video, has_audio, has_subtitle, i, j;
3413 AVFormatContext *ic;
3418 for(j=0;j<nb_input_files;j++) {
3419 ic = input_files[j];
3420 for(i=0;i<ic->nb_streams;i++) {
3421 AVCodecContext *enc = ic->streams[i]->codec;
3422 switch(enc->codec_type) {
3423 case AVMEDIA_TYPE_AUDIO:
3426 case AVMEDIA_TYPE_VIDEO:
3429 case AVMEDIA_TYPE_SUBTITLE:
3432 case AVMEDIA_TYPE_DATA:
3433 case AVMEDIA_TYPE_ATTACHMENT:
3434 case AVMEDIA_TYPE_UNKNOWN:
3441 *has_video_ptr = has_video;
3442 *has_audio_ptr = has_audio;
3443 *has_subtitle_ptr = has_subtitle;
3446 static void new_video_stream(AVFormatContext *oc, int file_idx)
3449 AVOutputStream *ost;
3450 AVCodecContext *video_enc;
3451 enum CodecID codec_id = CODEC_ID_NONE;
3452 AVCodec *codec= NULL;
3455 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3457 fprintf(stderr, "Could not alloc stream\n");
3460 ost = new_output_stream(oc, file_idx);
3462 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3463 if(!video_stream_copy){
3464 if (video_codec_name) {
3465 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3466 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3467 codec = avcodec_find_encoder_by_name(video_codec_name);
3468 output_codecs[nb_output_codecs-1] = codec;
3470 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3471 codec = avcodec_find_encoder(codec_id);
3474 if(frame_aspect_ratio_override){
3475 i = vfilters ? strlen(vfilters) : 0;
3476 vfilters = av_realloc(vfilters, i+100);
3477 snprintf(vfilters+i, 100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
3478 frame_aspect_ratio=0;
3479 frame_aspect_ratio_override=0;
3482 ost->avfilter= vfilters;
3487 avcodec_get_context_defaults3(st->codec, codec);
3488 ost->bitstream_filters = video_bitstream_filters;
3489 video_bitstream_filters= NULL;
3491 st->codec->thread_count= thread_count;
3493 video_enc = st->codec;
3496 video_enc->codec_tag= video_codec_tag;
3498 if( (video_global_header&1)
3499 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3500 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3501 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3503 if(video_global_header&2){
3504 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3505 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3508 if (video_stream_copy) {
3509 st->stream_copy = 1;
3510 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3511 video_enc->sample_aspect_ratio =
3512 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3516 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3518 video_enc->codec_id = codec_id;
3519 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3521 if (codec && codec->supported_framerates && !force_fps)
3522 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3523 video_enc->time_base.den = fps.num;
3524 video_enc->time_base.num = fps.den;
3526 video_enc->width = frame_width;
3527 video_enc->height = frame_height;
3528 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3529 video_enc->pix_fmt = frame_pix_fmt;
3530 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3531 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3533 choose_pixel_fmt(st, codec);
3536 video_enc->gop_size = 0;
3537 if (video_qscale || same_quality) {
3538 video_enc->flags |= CODEC_FLAG_QSCALE;
3539 video_enc->global_quality=
3540 st->quality = FF_QP2LAMBDA * video_qscale;
3544 video_enc->intra_matrix = intra_matrix;
3546 video_enc->inter_matrix = inter_matrix;
3548 p= video_rc_override_string;
3551 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3553 fprintf(stderr, "error parsing rc_override\n");
3556 video_enc->rc_override=
3557 av_realloc(video_enc->rc_override,
3558 sizeof(RcOverride)*(i+1));
3559 video_enc->rc_override[i].start_frame= start;
3560 video_enc->rc_override[i].end_frame = end;
3562 video_enc->rc_override[i].qscale= q;
3563 video_enc->rc_override[i].quality_factor= 1.0;
3566 video_enc->rc_override[i].qscale= 0;
3567 video_enc->rc_override[i].quality_factor= -q/100.0;
3572 video_enc->rc_override_count=i;
3573 if (!video_enc->rc_initial_buffer_occupancy)
3574 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3575 video_enc->me_threshold= me_threshold;
3576 video_enc->intra_dc_precision= intra_dc_precision - 8;
3579 video_enc->flags|= CODEC_FLAG_PSNR;
3584 video_enc->flags |= CODEC_FLAG_PASS1;
3586 video_enc->flags |= CODEC_FLAG_PASS2;
3590 if (forced_key_frames)
3591 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3593 if (video_language) {
3594 av_metadata_set2(&st->metadata, "language", video_language, 0);
3595 av_freep(&video_language);
3598 /* reset some key parameters */
3600 av_freep(&video_codec_name);
3601 av_freep(&forced_key_frames);
3602 video_stream_copy = 0;
3603 frame_pix_fmt = PIX_FMT_NONE;
3606 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3609 AVOutputStream *ost;
3610 AVCodec *codec= NULL;
3611 AVCodecContext *audio_enc;
3612 enum CodecID codec_id = CODEC_ID_NONE;
3614 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3616 fprintf(stderr, "Could not alloc stream\n");
3619 ost = new_output_stream(oc, file_idx);
3621 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3622 if(!audio_stream_copy){
3623 if (audio_codec_name) {
3624 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3625 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3626 codec = avcodec_find_encoder_by_name(audio_codec_name);
3627 output_codecs[nb_output_codecs-1] = codec;
3629 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3630 codec = avcodec_find_encoder(codec_id);
3634 avcodec_get_context_defaults3(st->codec, codec);
3636 ost->bitstream_filters = audio_bitstream_filters;
3637 audio_bitstream_filters= NULL;
3639 st->codec->thread_count= thread_count;
3641 audio_enc = st->codec;
3642 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3645 audio_enc->codec_tag= audio_codec_tag;
3647 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3648 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3649 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3651 if (audio_stream_copy) {
3652 st->stream_copy = 1;
3653 audio_enc->channels = audio_channels;
3654 audio_enc->sample_rate = audio_sample_rate;
3656 audio_enc->codec_id = codec_id;
3657 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3659 if (audio_qscale > QSCALE_NONE) {
3660 audio_enc->flags |= CODEC_FLAG_QSCALE;
3661 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3663 audio_enc->channels = audio_channels;
3664 audio_enc->sample_fmt = audio_sample_fmt;
3665 audio_enc->sample_rate = audio_sample_rate;
3666 audio_enc->channel_layout = channel_layout;
3667 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3668 audio_enc->channel_layout = 0;
3669 choose_sample_fmt(st, codec);
3670 choose_sample_rate(st, codec);
3672 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3673 if (audio_language) {
3674 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3675 av_freep(&audio_language);
3678 /* reset some key parameters */
3680 av_freep(&audio_codec_name);
3681 audio_stream_copy = 0;
3684 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3687 AVOutputStream *ost;
3688 AVCodec *codec=NULL;
3689 AVCodecContext *subtitle_enc;
3690 enum CodecID codec_id = CODEC_ID_NONE;
3692 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3694 fprintf(stderr, "Could not alloc stream\n");
3697 ost = new_output_stream(oc, file_idx);
3698 subtitle_enc = st->codec;
3699 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3700 if(!subtitle_stream_copy){
3701 if (subtitle_codec_name) {
3702 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3703 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3704 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3706 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3707 codec = avcodec_find_encoder(codec_id);
3710 avcodec_get_context_defaults3(st->codec, codec);
3712 ost->bitstream_filters = subtitle_bitstream_filters;
3713 subtitle_bitstream_filters= NULL;
3715 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3717 if(subtitle_codec_tag)
3718 subtitle_enc->codec_tag= subtitle_codec_tag;
3720 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3721 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3722 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3724 if (subtitle_stream_copy) {
3725 st->stream_copy = 1;
3727 subtitle_enc->codec_id = codec_id;
3728 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3731 if (subtitle_language) {
3732 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3733 av_freep(&subtitle_language);
3736 subtitle_disable = 0;
3737 av_freep(&subtitle_codec_name);
3738 subtitle_stream_copy = 0;
3741 static int opt_new_stream(const char *opt, const char *arg)
3743 AVFormatContext *oc;
3744 int file_idx = nb_output_files - 1;
3745 if (nb_output_files <= 0) {
3746 fprintf(stderr, "At least one output file must be specified\n");
3749 oc = output_files[file_idx];
3751 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3752 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3753 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3758 /* arg format is "output-stream-index:streamid-value". */
3759 static int opt_streamid(const char *opt, const char *arg)
3765 strncpy(idx_str, arg, sizeof(idx_str));
3766 idx_str[sizeof(idx_str)-1] = '\0';
3767 p = strchr(idx_str, ':');
3770 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3775 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3776 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3777 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3781 static void opt_output_file(const char *filename)
3783 AVFormatContext *oc;
3784 int err, use_video, use_audio, use_subtitle;
3785 int input_has_video, input_has_audio, input_has_subtitle;
3786 AVFormatParameters params, *ap = ¶ms;
3787 AVOutputFormat *file_oformat;
3789 if (!strcmp(filename, "-"))
3792 oc = avformat_alloc_context();
3794 print_error(filename, AVERROR(ENOMEM));
3798 if (last_asked_format) {
3799 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3800 if (!file_oformat) {
3801 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3804 last_asked_format = NULL;
3806 file_oformat = av_guess_format(NULL, filename, NULL);
3807 if (!file_oformat) {
3808 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3814 oc->oformat = file_oformat;
3815 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3817 if (!strcmp(file_oformat->name, "ffm") &&
3818 av_strstart(filename, "http:", NULL)) {
3819 /* special case for files sent to ffserver: we get the stream
3820 parameters from ffserver */
3821 int err = read_ffserver_streams(oc, filename);
3823 print_error(filename, err);
3827 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3828 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3829 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3831 /* disable if no corresponding type found and at least one
3833 if (nb_input_files > 0) {
3834 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3835 &input_has_subtitle);
3836 if (!input_has_video)
3838 if (!input_has_audio)
3840 if (!input_has_subtitle)
3844 /* manual disable */
3845 if (audio_disable) use_audio = 0;
3846 if (video_disable) use_video = 0;
3847 if (subtitle_disable) use_subtitle = 0;
3849 if (use_video) new_video_stream(oc, nb_output_files);
3850 if (use_audio) new_audio_stream(oc, nb_output_files);
3851 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3853 oc->timestamp = recording_timestamp;
3855 av_metadata_copy(&oc->metadata, metadata, 0);
3856 av_metadata_free(&metadata);
3859 output_files[nb_output_files++] = oc;
3861 /* check filename in case of an image number is expected */
3862 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3863 if (!av_filename_number_test(oc->filename)) {
3864 print_error(oc->filename, AVERROR_NUMEXPECTED);
3869 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3870 /* test if it already exists to avoid loosing precious files */
3871 if (!file_overwrite &&
3872 (strchr(filename, ':') == NULL ||
3873 filename[1] == ':' ||
3874 av_strstart(filename, "file:", NULL))) {
3875 if (url_exist(filename)) {
3877 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3879 if (!read_yesno()) {
3880 fprintf(stderr, "Not overwriting - exiting\n");
3885 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3892 if ((err = avio_open(&oc->pb, filename, AVIO_WRONLY)) < 0) {
3893 print_error(filename, err);
3898 memset(ap, 0, sizeof(*ap));
3899 if (av_set_parameters(oc, ap) < 0) {
3900 fprintf(stderr, "%s: Invalid encoding parameters\n",
3905 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3906 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3907 oc->loop_output = loop_output;
3909 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3911 av_freep(&forced_key_frames);
3914 /* same option as mencoder */
3915 static void opt_pass(const char *pass_str)
3918 pass = atoi(pass_str);
3919 if (pass != 1 && pass != 2) {
3920 fprintf(stderr, "pass number can be only 1 or 2\n");
3926 static int64_t getutime(void)
3929 struct rusage rusage;
3931 getrusage(RUSAGE_SELF, &rusage);
3932 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3933 #elif HAVE_GETPROCESSTIMES
3935 FILETIME c, e, k, u;
3936 proc = GetCurrentProcess();
3937 GetProcessTimes(proc, &c, &e, &k, &u);
3938 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3940 return av_gettime();
3944 static int64_t getmaxrss(void)
3946 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3947 struct rusage rusage;
3948 getrusage(RUSAGE_SELF, &rusage);
3949 return (int64_t)rusage.ru_maxrss * 1024;
3950 #elif HAVE_GETPROCESSMEMORYINFO
3952 PROCESS_MEMORY_COUNTERS memcounters;
3953 proc = GetCurrentProcess();
3954 memcounters.cb = sizeof(memcounters);
3955 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3956 return memcounters.PeakPagefileUsage;
3962 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3965 const char *p = str;
3972 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3979 static void opt_inter_matrix(const char *arg)
3981 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3982 parse_matrix_coeffs(inter_matrix, arg);
3985 static void opt_intra_matrix(const char *arg)
3987 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3988 parse_matrix_coeffs(intra_matrix, arg);
3991 static void show_usage(void)
3993 printf("Hyper fast Audio and Video encoder\n");
3994 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3998 static void show_help(void)
4001 AVOutputFormat *oformat = NULL;
4003 av_log_set_callback(log_callback_help);
4005 show_help_options(options, "Main options:\n",
4006 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4007 show_help_options(options, "\nAdvanced options:\n",
4008 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4010 show_help_options(options, "\nVideo options:\n",
4011 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4013 show_help_options(options, "\nAdvanced Video options:\n",
4014 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4015 OPT_VIDEO | OPT_EXPERT);
4016 show_help_options(options, "\nAudio options:\n",
4017 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4019 show_help_options(options, "\nAdvanced Audio options:\n",
4020 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4021 OPT_AUDIO | OPT_EXPERT);
4022 show_help_options(options, "\nSubtitle options:\n",
4023 OPT_SUBTITLE | OPT_GRAB,
4025 show_help_options(options, "\nAudio/Video grab options:\n",
4029 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4032 /* individual codec options */
4034 while ((c = av_codec_next(c))) {
4035 if (c->priv_class) {
4036 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4041 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4044 /* individual muxer options */
4045 while ((oformat = av_oformat_next(oformat))) {
4046 if (oformat->priv_class) {
4047 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4052 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4055 static void opt_target(const char *arg)
4057 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4058 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4060 if(!strncmp(arg, "pal-", 4)) {
4063 } else if(!strncmp(arg, "ntsc-", 5)) {
4066 } else if(!strncmp(arg, "film-", 5)) {
4071 /* Calculate FR via float to avoid int overflow */
4072 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4075 } else if((fr == 29970) || (fr == 23976)) {
4078 /* Try to determine PAL/NTSC by peeking in the input files */
4079 if(nb_input_files) {
4081 for(j = 0; j < nb_input_files; j++) {
4082 for(i = 0; i < input_files[j]->nb_streams; i++) {
4083 AVCodecContext *c = input_files[j]->streams[i]->codec;
4084 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4086 fr = c->time_base.den * 1000 / c->time_base.num;
4090 } else if((fr == 29970) || (fr == 23976)) {
4100 if(verbose && norm != UNKNOWN)
4101 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4104 if(norm == UNKNOWN) {
4105 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4106 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4107 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4111 if(!strcmp(arg, "vcd")) {
4113 opt_video_codec("mpeg1video");
4114 opt_audio_codec("mp2");
4117 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4118 opt_frame_rate(NULL, frame_rates[norm]);
4119 opt_default("g", norm == PAL ? "15" : "18");
4121 opt_default("b", "1150000");
4122 opt_default("maxrate", "1150000");
4123 opt_default("minrate", "1150000");
4124 opt_default("bufsize", "327680"); // 40*1024*8;
4126 opt_default("ab", "224000");
4127 audio_sample_rate = 44100;
4130 opt_default("packetsize", "2324");
4131 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4133 /* We have to offset the PTS, so that it is consistent with the SCR.
4134 SCR starts at 36000, but the first two packs contain only padding
4135 and the first pack from the other stream, respectively, may also have
4136 been written before.
4137 So the real data starts at SCR 36000+3*1200. */
4138 mux_preload= (36000+3*1200) / 90000.0; //0.44
4139 } else if(!strcmp(arg, "svcd")) {
4141 opt_video_codec("mpeg2video");
4142 opt_audio_codec("mp2");
4145 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4146 opt_frame_rate(NULL, frame_rates[norm]);
4147 opt_default("g", norm == PAL ? "15" : "18");
4149 opt_default("b", "2040000");
4150 opt_default("maxrate", "2516000");
4151 opt_default("minrate", "0"); //1145000;
4152 opt_default("bufsize", "1835008"); //224*1024*8;
4153 opt_default("flags", "+scan_offset");
4156 opt_default("ab", "224000");
4157 audio_sample_rate = 44100;
4159 opt_default("packetsize", "2324");
4161 } else if(!strcmp(arg, "dvd")) {
4163 opt_video_codec("mpeg2video");
4164 opt_audio_codec("ac3");
4167 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4168 opt_frame_rate(NULL, frame_rates[norm]);
4169 opt_default("g", norm == PAL ? "15" : "18");
4171 opt_default("b", "6000000");
4172 opt_default("maxrate", "9000000");
4173 opt_default("minrate", "0"); //1500000;
4174 opt_default("bufsize", "1835008"); //224*1024*8;
4176 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4177 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4179 opt_default("ab", "448000");
4180 audio_sample_rate = 48000;
4182 } else if(!strncmp(arg, "dv", 2)) {
4186 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4187 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4188 (norm == PAL ? "yuv420p" : "yuv411p"));
4189 opt_frame_rate(NULL, frame_rates[norm]);
4191 audio_sample_rate = 48000;
4195 fprintf(stderr, "Unknown target: %s\n", arg);
4200 static void opt_vstats_file (const char *arg)
4202 av_free (vstats_filename);
4203 vstats_filename=av_strdup (arg);
4206 static void opt_vstats (void)
4209 time_t today2 = time(NULL);
4210 struct tm *today = localtime(&today2);
4212 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4214 opt_vstats_file(filename);
4217 static int opt_bsf(const char *opt, const char *arg)
4219 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4220 AVBitStreamFilterContext **bsfp;
4223 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4227 bsfp= *opt == 'v' ? &video_bitstream_filters :
4228 *opt == 'a' ? &audio_bitstream_filters :
4229 &subtitle_bitstream_filters;
4231 bsfp= &(*bsfp)->next;
4238 static int opt_preset(const char *opt, const char *arg)
4241 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4242 char *codec_name = *opt == 'v' ? video_codec_name :
4243 *opt == 'a' ? audio_codec_name :
4244 subtitle_codec_name;
4246 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4247 fprintf(stderr, "File for preset '%s' not found\n", arg);
4252 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4253 if(line[0] == '#' && !e)
4255 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4257 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4260 if(!strcmp(tmp, "acodec")){
4261 opt_audio_codec(tmp2);
4262 }else if(!strcmp(tmp, "vcodec")){
4263 opt_video_codec(tmp2);
4264 }else if(!strcmp(tmp, "scodec")){
4265 opt_subtitle_codec(tmp2);
4266 }else if(opt_default(tmp, tmp2) < 0){
4267 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4277 static const OptionDef options[] = {
4279 #include "cmdutils_common_opts.h"
4280 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4281 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4282 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4283 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4284 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4285 "outfile[,metadata]:infile[,metadata]" },
4286 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4287 "outfile[,metadata]:infile[,metadata]" },
4288 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4289 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4290 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4291 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4292 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4293 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4294 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4295 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4296 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4297 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4298 "add timings for benchmarking" },
4299 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4300 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4301 "dump each input packet" },
4302 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4303 "when dumping packets, also dump the payload" },
4304 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4305 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4306 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4307 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4308 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4309 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4310 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4311 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4312 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4313 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4314 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4315 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4316 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4317 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4318 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4319 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4320 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4323 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4324 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4325 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4326 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4327 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4328 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4329 { "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" },
4330 { "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" },
4331 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4332 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4333 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4334 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4335 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4336 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4337 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4338 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4339 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4340 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4341 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4342 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4343 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4344 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4345 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4346 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4347 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4348 "use same quantizer as source (implies VBR)" },
4349 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4350 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4351 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4352 "deinterlace pictures" },
4353 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4354 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4355 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4357 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4359 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4360 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4361 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4362 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4363 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4364 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4365 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4366 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4367 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4368 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4369 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4372 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4373 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4374 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4375 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4376 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4377 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4378 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4379 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4380 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4381 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4382 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4383 { "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" },
4385 /* subtitle options */
4386 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4387 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4388 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4389 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4390 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4393 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4394 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4395 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4398 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4399 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4401 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4402 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4403 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4405 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4406 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4407 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4408 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4410 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4414 int main(int argc, char **argv)
4418 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4420 avcodec_register_all();
4422 avdevice_register_all();
4425 avfilter_register_all();
4430 if(isatty(STDIN_FILENO))
4431 avio_set_interrupt_cb(decode_interrupt_cb);
4439 parse_options(argc, argv, options, opt_output_file);
4441 if(nb_output_files <= 0 && nb_input_files == 0) {
4443 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4447 /* file converter / grab */
4448 if (nb_output_files <= 0) {
4449 fprintf(stderr, "At least one output file must be specified\n");
4453 if (nb_input_files == 0) {
4454 fprintf(stderr, "At least one input file must be specified\n");
4459 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4460 stream_maps, nb_stream_maps) < 0)
4462 ti = getutime() - ti;
4464 int maxrss = getmaxrss() / 1024;
4465 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4468 return ffmpeg_exit(0);