3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/pixdesc.h"
43 #include "libavutil/avstring.h"
44 #include "libavutil/libm.h"
45 #include "libavformat/os_support.h"
47 #include "libavformat/ffm.h" // not public API
50 # include "libavfilter/avcodec.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
74 #include <sys/ioctl.h>
84 #include "libavutil/avassert.h"
86 const char program_name[] = "ffmpeg";
87 const int program_birth_year = 2000;
89 /* select an input stream for an output stream */
90 typedef struct AVStreamMap {
94 int sync_stream_index;
98 * select an input file for an output file
100 typedef struct AVMetaDataMap {
101 int file; //< file index
102 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
103 int index; //< stream/chapter/program number
106 typedef struct AVChapterMap {
111 static const OptionDef options[];
113 #define MAX_FILES 100
114 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
116 static const char *last_asked_format = NULL;
117 static int64_t input_files_ts_offset[MAX_FILES];
118 static double *input_files_ts_scale[MAX_FILES] = {NULL};
119 static AVCodec **input_codecs = NULL;
120 static int nb_input_codecs = 0;
121 static int nb_input_files_ts_scale[MAX_FILES] = {0};
123 static AVFormatContext *output_files[MAX_FILES];
124 static AVCodec **output_codecs = NULL;
125 static int nb_output_files = 0;
126 static int nb_output_codecs = 0;
128 static AVStreamMap *stream_maps = NULL;
129 static int nb_stream_maps;
131 /* first item specifies output metadata, second is input */
132 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
133 static int nb_meta_data_maps;
134 static int metadata_global_autocopy = 1;
135 static int metadata_streams_autocopy = 1;
136 static int metadata_chapters_autocopy = 1;
138 static AVChapterMap *chapter_maps = NULL;
139 static int nb_chapter_maps;
141 /* indexed by output file stream index */
142 static int *streamid_map = NULL;
143 static int nb_streamid_map = 0;
145 static int frame_width = 0;
146 static int frame_height = 0;
147 static float frame_aspect_ratio = 0;
148 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
149 static int frame_bits_per_raw_sample = 0;
150 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
151 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
152 static AVRational frame_rate;
153 static float video_qscale = 0;
154 static uint16_t *intra_matrix = NULL;
155 static uint16_t *inter_matrix = NULL;
156 static const char *video_rc_override_string=NULL;
157 static int video_disable = 0;
158 static int video_discard = 0;
159 static char *video_codec_name = NULL;
160 static unsigned int video_codec_tag = 0;
161 static char *video_language = NULL;
162 static int same_quality = 0;
163 static int do_deinterlace = 0;
164 static int top_field_first = -1;
165 static int me_threshold = 0;
166 static int intra_dc_precision = 8;
167 static int loop_input = 0;
168 static int loop_output = AVFMT_NOOUTPUTLOOP;
169 static int qp_hist = 0;
171 static char *vfilters = NULL;
174 static int intra_only = 0;
175 static int audio_sample_rate = 44100;
176 static int64_t channel_layout = 0;
177 #define QSCALE_NONE -99999
178 static float audio_qscale = QSCALE_NONE;
179 static int audio_disable = 0;
180 static int audio_channels = 1;
181 static char *audio_codec_name = NULL;
182 static unsigned int audio_codec_tag = 0;
183 static char *audio_language = NULL;
185 static int subtitle_disable = 0;
186 static char *subtitle_codec_name = NULL;
187 static char *subtitle_language = NULL;
188 static unsigned int subtitle_codec_tag = 0;
190 static int data_disable = 0;
191 static char *data_codec_name = NULL;
192 static unsigned int data_codec_tag = 0;
194 static float mux_preload= 0.5;
195 static float mux_max_delay= 0.7;
197 static int64_t recording_time = INT64_MAX;
198 static int64_t start_time = 0;
199 static int64_t recording_timestamp = 0;
200 static int64_t input_ts_offset = 0;
201 static int file_overwrite = 0;
202 static AVMetadata *metadata;
203 static int do_benchmark = 0;
204 static int do_hex_dump = 0;
205 static int do_pkt_dump = 0;
206 static int do_psnr = 0;
207 static int do_pass = 0;
208 static const char *pass_logfilename_prefix;
209 static int audio_stream_copy = 0;
210 static int video_stream_copy = 0;
211 static int subtitle_stream_copy = 0;
212 static int data_stream_copy = 0;
213 static int video_sync_method= -1;
214 static int audio_sync_method= 0;
215 static float audio_drift_threshold= 0.1;
216 static int copy_ts= 0;
217 static int copy_tb= 0;
218 static int opt_shortest = 0;
219 static char *vstats_filename;
220 static FILE *vstats_file;
221 static int opt_programid = 0;
222 static int copy_initial_nonkeyframes = 0;
224 static int rate_emu = 0;
226 static int video_channel = 0;
227 static char *video_standard;
229 static int audio_volume = 256;
231 static int exit_on_error = 0;
232 static int using_stdin = 0;
233 static int verbose = 1;
234 static int run_as_daemon = 0;
235 static int thread_count= 1;
236 static int q_pressed = 0;
237 static int64_t video_size = 0;
238 static int64_t audio_size = 0;
239 static int64_t extra_size = 0;
240 static int nb_frames_dup = 0;
241 static int nb_frames_drop = 0;
242 static int input_sync;
243 static uint64_t limit_filesize = 0;
244 static int force_fps = 0;
245 static char *forced_key_frames = NULL;
247 static float dts_delta_threshold = 10;
249 static int64_t timer_start;
251 static uint8_t *audio_buf;
252 static uint8_t *audio_out;
253 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
255 static short *samples;
257 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
258 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
259 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
261 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
263 struct AVInputStream;
265 typedef struct AVOutputStream {
266 int file_index; /* file index */
267 int index; /* stream index in the output file */
268 int source_index; /* AVInputStream index */
269 AVStream *st; /* stream in the output file */
270 int encoding_needed; /* true if encoding needed for this stream */
272 /* input pts and corresponding output pts
274 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
275 struct AVInputStream *sync_ist; /* input stream to sync against */
276 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
277 AVBitStreamFilterContext *bitstream_filters;
280 AVFrame resample_frame; /* temporary frame for image resampling */
281 struct SwsContext *img_resample_ctx; /* for image resampling */
284 int resample_pix_fmt;
286 float frame_aspect_ratio;
288 /* forced key frames */
289 int64_t *forced_kf_pts;
295 ReSampleContext *resample; /* for audio resampling */
296 int resample_sample_fmt;
297 int resample_channels;
298 int resample_sample_rate;
300 AVAudioConvert *reformat_ctx;
301 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
305 AVFilterContext *output_video_filter;
306 AVFilterContext *input_video_filter;
307 AVFilterBufferRef *picref;
309 AVFilterGraph *graph;
315 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
316 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
318 typedef struct AVInputStream {
321 int discard; /* true if stream data should be discarded */
322 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
323 int64_t sample_index; /* current sample */
325 int64_t start; /* time when read started */
326 int64_t next_pts; /* synthetic pts for cases where pkt.pts
328 int64_t pts; /* current pts */
329 int is_start; /* is 1 at the start and after a discontinuity */
330 int showed_multi_packet_warning;
331 int is_past_recording_time;
333 AVFrame *filter_frame;
334 int has_filter_frame;
338 typedef struct AVInputFile {
339 AVFormatContext *ctx;
340 int eof_reached; /* true if eof reached */
341 int ist_index; /* index of first stream in ist_table */
342 int buffer_size; /* current total buffer size */
347 /* init terminal so that we can grab keys */
348 static struct termios oldtty;
351 static AVInputStream *input_streams = NULL;
352 static int nb_input_streams = 0;
353 static AVInputFile *input_files = NULL;
354 static int nb_input_files = 0;
358 static int configure_video_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",
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", ost->sws_flags);
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->frame_aspect_ratio ? // overriden by the -aspect cli option
435 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
436 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
440 #endif /* CONFIG_AVFILTER */
442 static void term_exit(void)
444 av_log(NULL, AV_LOG_QUIET, "");
447 tcsetattr (0, TCSANOW, &oldtty);
451 static volatile int received_sigterm = 0;
454 sigterm_handler(int sig)
456 received_sigterm = sig;
461 static void term_init(void)
471 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
472 |INLCR|IGNCR|ICRNL|IXON);
473 tty.c_oflag |= OPOST;
474 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
475 tty.c_cflag &= ~(CSIZE|PARENB);
480 tcsetattr (0, TCSANOW, &tty);
481 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
485 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
486 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
488 signal(SIGXCPU, sigterm_handler);
492 /* read a key without blocking */
493 static int read_key(void)
508 n = select(1, &rfds, NULL, NULL, &tv);
523 static int decode_interrupt_cb(void)
525 q_pressed += read_key() == 'q';
526 return q_pressed > 1;
529 static int ffmpeg_exit(int ret)
534 for(i=0;i<nb_output_files;i++) {
535 AVFormatContext *s = output_files[i];
536 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
538 avformat_free_context(s);
539 av_free(output_streams_for_file[i]);
541 for(i=0;i<nb_input_files;i++) {
542 av_close_input_file(input_files[i].ctx);
543 av_free(input_files_ts_scale[i]);
546 av_free(intra_matrix);
547 av_free(inter_matrix);
551 av_free(vstats_filename);
553 av_free(streamid_map);
554 av_free(input_codecs);
555 av_free(output_codecs);
556 av_free(stream_maps);
557 av_free(meta_data_maps);
559 av_freep(&input_streams);
560 av_freep(&input_files);
562 av_free(video_codec_name);
563 av_free(audio_codec_name);
564 av_free(subtitle_codec_name);
565 av_free(data_codec_name);
567 av_free(video_standard);
572 allocated_audio_buf_size= allocated_audio_out_size= 0;
579 if (received_sigterm) {
581 "Received signal %d: terminating.\n",
582 (int) received_sigterm);
586 exit(ret); /* not all OS-es handle main() return value */
590 /* similar to ff_dynarray_add() and av_fast_realloc() */
591 static void *grow_array(void *array, int elem_size, int *size, int new_size)
593 if (new_size >= INT_MAX / elem_size) {
594 fprintf(stderr, "Array too big.\n");
597 if (*size < new_size) {
598 uint8_t *tmp = av_realloc(array, new_size*elem_size);
600 fprintf(stderr, "Could not alloc buffer.\n");
603 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
610 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
612 if(codec && codec->sample_fmts){
613 const enum AVSampleFormat *p= codec->sample_fmts;
615 if(*p == st->codec->sample_fmt)
619 av_log(NULL, AV_LOG_WARNING,
620 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
621 av_get_sample_fmt_name(st->codec->sample_fmt),
623 av_get_sample_fmt_name(codec->sample_fmts[0]));
624 st->codec->sample_fmt = codec->sample_fmts[0];
629 static void choose_sample_rate(AVStream *st, AVCodec *codec)
631 if(codec && codec->supported_samplerates){
632 const int *p= codec->supported_samplerates;
634 int best_dist=INT_MAX;
636 int dist= abs(st->codec->sample_rate - *p);
637 if(dist < best_dist){
643 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
645 st->codec->sample_rate= best;
649 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
651 if(codec && codec->pix_fmts){
652 const enum PixelFormat *p= codec->pix_fmts;
653 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
654 if(st->codec->codec_id==CODEC_ID_MJPEG){
655 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
656 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
657 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};
661 if(*p == st->codec->pix_fmt)
665 if(st->codec->pix_fmt != PIX_FMT_NONE)
666 av_log(NULL, AV_LOG_WARNING,
667 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
668 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
670 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
671 st->codec->pix_fmt = codec->pix_fmts[0];
676 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
678 int idx = oc->nb_streams - 1;
681 output_streams_for_file[file_idx] =
682 grow_array(output_streams_for_file[file_idx],
683 sizeof(*output_streams_for_file[file_idx]),
684 &nb_output_streams_for_file[file_idx],
686 ost = output_streams_for_file[file_idx][idx] =
687 av_mallocz(sizeof(AVOutputStream));
689 fprintf(stderr, "Could not alloc output stream\n");
692 ost->file_index = file_idx;
695 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
699 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
705 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
708 /* copy stream format */
710 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
711 for(i=0;i<ic->nb_streams;i++) {
717 // FIXME: a more elegant solution is needed
718 st = av_mallocz(sizeof(AVStream));
719 memcpy(st, ic->streams[i], sizeof(AVStream));
720 st->info = av_malloc(sizeof(*st->info));
721 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
722 st->codec = avcodec_alloc_context();
724 print_error(filename, AVERROR(ENOMEM));
727 avcodec_copy_context(st->codec, ic->streams[i]->codec);
730 codec = avcodec_find_encoder(st->codec->codec_id);
731 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
732 if (audio_stream_copy) {
735 choose_sample_fmt(st, codec);
736 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
737 if (video_stream_copy) {
740 choose_pixel_fmt(st, codec);
743 if(st->codec->flags & CODEC_FLAG_BITEXACT)
746 new_output_stream(s, nb_output_files);
750 s->timestamp = av_gettime();
752 av_close_input_file(ic);
757 get_sync_ipts(const AVOutputStream *ost)
759 const AVInputStream *ist = ost->sync_ist;
760 return (double)(ist->pts - start_time)/AV_TIME_BASE;
763 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
767 AVPacket new_pkt= *pkt;
768 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
769 &new_pkt.data, &new_pkt.size,
770 pkt->data, pkt->size,
771 pkt->flags & AV_PKT_FLAG_KEY);
774 new_pkt.destruct= av_destruct_packet;
776 fprintf(stderr, "%s failed for stream %d, codec %s",
777 bsfc->filter->name, pkt->stream_index,
778 avctx->codec ? avctx->codec->name : "copy");
788 ret= av_interleaved_write_frame(s, pkt);
790 print_error("av_interleaved_write_frame()", ret);
795 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
797 static void do_audio_out(AVFormatContext *s,
800 unsigned char *buf, int size)
803 int64_t audio_out_size, audio_buf_size;
804 int64_t allocated_for_size= size;
806 int size_out, frame_bytes, ret, resample_changed;
807 AVCodecContext *enc= ost->st->codec;
808 AVCodecContext *dec= ist->st->codec;
809 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
810 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
811 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
814 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
815 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
816 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
817 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
818 audio_buf_size*= osize*enc->channels;
820 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
821 if(coded_bps > 8*osize)
822 audio_out_size= audio_out_size * coded_bps / (8*osize);
823 audio_out_size += FF_MIN_BUFFER_SIZE;
825 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
826 fprintf(stderr, "Buffer sizes too large\n");
830 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
831 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
832 if (!audio_buf || !audio_out){
833 fprintf(stderr, "Out of memory in do_audio_out\n");
837 if (enc->channels != dec->channels)
838 ost->audio_resample = 1;
840 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
841 ost->resample_channels != dec->channels ||
842 ost->resample_sample_rate != dec->sample_rate;
844 if ((ost->audio_resample && !ost->resample) || resample_changed) {
845 if (resample_changed) {
846 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",
847 ist->file_index, ist->st->index,
848 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
849 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
850 ost->resample_sample_fmt = dec->sample_fmt;
851 ost->resample_channels = dec->channels;
852 ost->resample_sample_rate = dec->sample_rate;
854 audio_resample_close(ost->resample);
856 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
857 if (audio_sync_method <= 1 &&
858 ost->resample_sample_fmt == enc->sample_fmt &&
859 ost->resample_channels == enc->channels &&
860 ost->resample_sample_rate == enc->sample_rate) {
861 ost->resample = NULL;
862 ost->audio_resample = 0;
864 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
865 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
866 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
867 enc->sample_rate, dec->sample_rate,
868 enc->sample_fmt, dec->sample_fmt,
870 if (!ost->resample) {
871 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
872 dec->channels, dec->sample_rate,
873 enc->channels, enc->sample_rate);
879 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
880 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
881 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
882 if (ost->reformat_ctx)
883 av_audio_convert_free(ost->reformat_ctx);
884 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
885 dec->sample_fmt, 1, NULL, 0);
886 if (!ost->reformat_ctx) {
887 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
888 av_get_sample_fmt_name(dec->sample_fmt),
889 av_get_sample_fmt_name(enc->sample_fmt));
892 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
895 if(audio_sync_method){
896 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
897 - av_fifo_size(ost->fifo)/(enc->channels * 2);
898 double idelta= delta*dec->sample_rate / enc->sample_rate;
899 int byte_delta= ((int)idelta)*2*dec->channels;
901 //FIXME resample delay
902 if(fabs(delta) > 50){
903 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
905 byte_delta= FFMAX(byte_delta, -size);
909 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
914 static uint8_t *input_tmp= NULL;
915 input_tmp= av_realloc(input_tmp, byte_delta + size);
917 if(byte_delta > allocated_for_size - size){
918 allocated_for_size= byte_delta + (int64_t)size;
923 memset(input_tmp, 0, byte_delta);
924 memcpy(input_tmp + byte_delta, buf, size);
928 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
930 }else if(audio_sync_method>1){
931 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
932 av_assert0(ost->audio_resample);
934 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
935 // 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));
936 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
940 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
941 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
943 if (ost->audio_resample) {
945 size_out = audio_resample(ost->resample,
946 (short *)buftmp, (short *)buf,
947 size / (dec->channels * isize));
948 size_out = size_out * enc->channels * osize;
954 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
955 const void *ibuf[6]= {buftmp};
956 void *obuf[6]= {audio_buf};
957 int istride[6]= {isize};
958 int ostride[6]= {osize};
959 int len= size_out/istride[0];
960 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
961 printf("av_audio_convert() failed\n");
967 size_out = len*osize;
970 /* now encode as many frames as possible */
971 if (enc->frame_size > 1) {
972 /* output resampled raw samples */
973 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
974 fprintf(stderr, "av_fifo_realloc2() failed\n");
977 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
979 frame_bytes = enc->frame_size * osize * enc->channels;
981 while (av_fifo_size(ost->fifo) >= frame_bytes) {
983 av_init_packet(&pkt);
985 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
987 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
989 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
992 fprintf(stderr, "Audio encoding failed\n");
996 pkt.stream_index= ost->index;
999 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1000 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1001 pkt.flags |= AV_PKT_FLAG_KEY;
1002 write_frame(s, &pkt, enc, ost->bitstream_filters);
1004 ost->sync_opts += enc->frame_size;
1008 av_init_packet(&pkt);
1010 ost->sync_opts += size_out / (osize * enc->channels);
1012 /* output a pcm frame */
1013 /* determine the size of the coded buffer */
1016 size_out = size_out*coded_bps/8;
1018 if(size_out > audio_out_size){
1019 fprintf(stderr, "Internal error, buffer size too small\n");
1023 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1024 ret = avcodec_encode_audio(enc, audio_out, size_out,
1027 fprintf(stderr, "Audio encoding failed\n");
1031 pkt.stream_index= ost->index;
1032 pkt.data= audio_out;
1034 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1035 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1036 pkt.flags |= AV_PKT_FLAG_KEY;
1037 write_frame(s, &pkt, enc, ost->bitstream_filters);
1041 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1043 AVCodecContext *dec;
1044 AVPicture *picture2;
1045 AVPicture picture_tmp;
1048 dec = ist->st->codec;
1050 /* deinterlace : must be done before any resize */
1051 if (do_deinterlace) {
1054 /* create temporary picture */
1055 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1056 buf = av_malloc(size);
1060 picture2 = &picture_tmp;
1061 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1063 if(avpicture_deinterlace(picture2, picture,
1064 dec->pix_fmt, dec->width, dec->height) < 0) {
1065 /* if error, do not deinterlace */
1066 fprintf(stderr, "Deinterlacing failed\n");
1075 if (picture != picture2)
1076 *picture = *picture2;
1080 /* we begin to correct av delay at this threshold */
1081 #define AV_DELAY_MAX 0.100
1083 static void do_subtitle_out(AVFormatContext *s,
1084 AVOutputStream *ost,
1089 static uint8_t *subtitle_out = NULL;
1090 int subtitle_out_max_size = 1024 * 1024;
1091 int subtitle_out_size, nb, i;
1092 AVCodecContext *enc;
1095 if (pts == AV_NOPTS_VALUE) {
1096 fprintf(stderr, "Subtitle packets must have a pts\n");
1102 enc = ost->st->codec;
1104 if (!subtitle_out) {
1105 subtitle_out = av_malloc(subtitle_out_max_size);
1108 /* Note: DVB subtitle need one packet to draw them and one other
1109 packet to clear them */
1110 /* XXX: signal it in the codec context ? */
1111 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1116 for(i = 0; i < nb; i++) {
1117 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1118 // start_display_time is required to be 0
1119 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1120 sub->end_display_time -= sub->start_display_time;
1121 sub->start_display_time = 0;
1122 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1123 subtitle_out_max_size, sub);
1124 if (subtitle_out_size < 0) {
1125 fprintf(stderr, "Subtitle encoding failed\n");
1129 av_init_packet(&pkt);
1130 pkt.stream_index = ost->index;
1131 pkt.data = subtitle_out;
1132 pkt.size = subtitle_out_size;
1133 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1134 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1135 /* XXX: the pts correction is handled here. Maybe handling
1136 it in the codec would be better */
1138 pkt.pts += 90 * sub->start_display_time;
1140 pkt.pts += 90 * sub->end_display_time;
1142 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1146 static int bit_buffer_size= 1024*256;
1147 static uint8_t *bit_buffer= NULL;
1149 static void do_video_out(AVFormatContext *s,
1150 AVOutputStream *ost,
1152 AVFrame *in_picture,
1155 int nb_frames, i, ret, av_unused resample_changed;
1156 AVFrame *final_picture, *formatted_picture;
1157 AVCodecContext *enc, *dec;
1160 enc = ost->st->codec;
1161 dec = ist->st->codec;
1163 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1165 /* by default, we output a single frame */
1170 if(video_sync_method){
1171 double vdelta = sync_ipts - ost->sync_opts;
1172 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1175 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1178 }else if(vdelta>0.6)
1179 ost->sync_opts= lrintf(sync_ipts);
1180 }else if (vdelta > 1.1)
1181 nb_frames = lrintf(vdelta);
1182 //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);
1183 if (nb_frames == 0){
1186 fprintf(stderr, "*** drop!\n");
1187 }else if (nb_frames > 1) {
1188 nb_frames_dup += nb_frames - 1;
1190 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1193 ost->sync_opts= lrintf(sync_ipts);
1195 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1199 formatted_picture = in_picture;
1200 final_picture = formatted_picture;
1202 #if !CONFIG_AVFILTER
1203 resample_changed = ost->resample_width != dec->width ||
1204 ost->resample_height != dec->height ||
1205 ost->resample_pix_fmt != dec->pix_fmt;
1207 if (resample_changed) {
1208 av_log(NULL, AV_LOG_INFO,
1209 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1210 ist->file_index, ist->st->index,
1211 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1212 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1213 ost->resample_width = dec->width;
1214 ost->resample_height = dec->height;
1215 ost->resample_pix_fmt = dec->pix_fmt;
1218 ost->video_resample = dec->width != enc->width ||
1219 dec->height != enc->height ||
1220 dec->pix_fmt != enc->pix_fmt;
1222 if (ost->video_resample) {
1223 final_picture = &ost->resample_frame;
1224 if (!ost->img_resample_ctx || resample_changed) {
1225 /* initialize the destination picture */
1226 if (!ost->resample_frame.data[0]) {
1227 avcodec_get_frame_defaults(&ost->resample_frame);
1228 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1229 enc->width, enc->height)) {
1230 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1234 /* initialize a new scaler context */
1235 sws_freeContext(ost->img_resample_ctx);
1236 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1237 enc->width, enc->height, enc->pix_fmt,
1238 ost->sws_flags, NULL, NULL, NULL);
1239 if (ost->img_resample_ctx == NULL) {
1240 fprintf(stderr, "Cannot get resampling context\n");
1244 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1245 0, ost->resample_height, final_picture->data, final_picture->linesize);
1249 /* duplicates frame if needed */
1250 for(i=0;i<nb_frames;i++) {
1252 av_init_packet(&pkt);
1253 pkt.stream_index= ost->index;
1255 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1256 /* raw pictures are written as AVPicture structure to
1257 avoid any copies. We support temorarily the older
1259 AVFrame* old_frame = enc->coded_frame;
1260 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1261 pkt.data= (uint8_t *)final_picture;
1262 pkt.size= sizeof(AVPicture);
1263 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1264 pkt.flags |= AV_PKT_FLAG_KEY;
1266 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1267 enc->coded_frame = old_frame;
1269 AVFrame big_picture;
1271 big_picture= *final_picture;
1272 /* better than nothing: use input picture interlaced
1274 big_picture.interlaced_frame = in_picture->interlaced_frame;
1275 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1276 if(top_field_first == -1)
1277 big_picture.top_field_first = in_picture->top_field_first;
1279 big_picture.top_field_first = top_field_first;
1282 /* handles sameq here. This is not correct because it may
1283 not be a global option */
1284 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1286 big_picture.pict_type = 0;
1287 // big_picture.pts = AV_NOPTS_VALUE;
1288 big_picture.pts= ost->sync_opts;
1289 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1290 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1291 if (ost->forced_kf_index < ost->forced_kf_count &&
1292 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1293 big_picture.pict_type = AV_PICTURE_TYPE_I;
1294 ost->forced_kf_index++;
1296 ret = avcodec_encode_video(enc,
1297 bit_buffer, bit_buffer_size,
1300 fprintf(stderr, "Video encoding failed\n");
1305 pkt.data= bit_buffer;
1307 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1308 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1309 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1310 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1311 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1313 if(enc->coded_frame->key_frame)
1314 pkt.flags |= AV_PKT_FLAG_KEY;
1315 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1318 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1319 // enc->frame_number-1, ret, enc->pict_type);
1320 /* if two pass, output log */
1321 if (ost->logfile && enc->stats_out) {
1322 fprintf(ost->logfile, "%s", enc->stats_out);
1327 ost->frame_number++;
1331 static double psnr(double d){
1332 return -10.0*log(d)/log(10.0);
1335 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1338 AVCodecContext *enc;
1340 double ti1, bitrate, avg_bitrate;
1342 /* this is executed just the first time do_video_stats is called */
1344 vstats_file = fopen(vstats_filename, "w");
1351 enc = ost->st->codec;
1352 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1353 frame_number = ost->frame_number;
1354 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1355 if (enc->flags&CODEC_FLAG_PSNR)
1356 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1358 fprintf(vstats_file,"f_size= %6d ", frame_size);
1359 /* compute pts value */
1360 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1364 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1365 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1366 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1367 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1368 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1372 static void print_report(AVFormatContext **output_files,
1373 AVOutputStream **ost_table, int nb_ostreams,
1377 AVOutputStream *ost;
1378 AVFormatContext *oc;
1380 AVCodecContext *enc;
1381 int frame_number, vid, i;
1383 int64_t pts = INT64_MAX;
1384 static int64_t last_time = -1;
1385 static int qp_histogram[52];
1387 if (!is_last_report) {
1389 /* display the report every 0.5 seconds */
1390 cur_time = av_gettime();
1391 if (last_time == -1) {
1392 last_time = cur_time;
1395 if ((cur_time - last_time) < 500000)
1397 last_time = cur_time;
1401 oc = output_files[0];
1403 total_size = avio_size(oc->pb);
1404 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1405 total_size= avio_tell(oc->pb);
1409 for(i=0;i<nb_ostreams;i++) {
1412 enc = ost->st->codec;
1413 if (!ost->st->stream_copy && enc->coded_frame)
1414 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1415 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1416 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1418 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1419 float t = (av_gettime()-timer_start) / 1000000.0;
1421 frame_number = ost->frame_number;
1422 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1423 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1425 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1429 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1432 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1434 if (enc->flags&CODEC_FLAG_PSNR){
1436 double error, error_sum=0;
1437 double scale, scale_sum=0;
1438 char type[3]= {'Y','U','V'};
1439 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1442 error= enc->error[j];
1443 scale= enc->width*enc->height*255.0*255.0*frame_number;
1445 error= enc->coded_frame->error[j];
1446 scale= enc->width*enc->height*255.0*255.0;
1451 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1453 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1457 /* compute min output value */
1458 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1459 ost->st->time_base, AV_TIME_BASE_Q));
1462 if (verbose > 0 || is_last_report) {
1463 int hours, mins, secs, us;
1464 secs = pts / AV_TIME_BASE;
1465 us = pts % AV_TIME_BASE;
1471 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1473 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1474 "size=%8.0fkB time=", total_size / 1024.0);
1475 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1476 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1477 (100 * us) / AV_TIME_BASE);
1478 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1479 "bitrate=%6.1fkbits/s", bitrate);
1481 if (nb_frames_dup || nb_frames_drop)
1482 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1483 nb_frames_dup, nb_frames_drop);
1486 fprintf(stderr, "%s \r", buf);
1491 if (is_last_report && verbose >= 0){
1492 int64_t raw= audio_size + video_size + extra_size;
1493 fprintf(stderr, "\n");
1494 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1498 100.0*(total_size - raw)/raw
1503 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1505 int fill_char = 0x00;
1506 if (sample_fmt == AV_SAMPLE_FMT_U8)
1508 memset(buf, fill_char, size);
1511 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1512 static int output_packet(AVInputStream *ist, int ist_index,
1513 AVOutputStream **ost_table, int nb_ostreams,
1514 const AVPacket *pkt)
1516 AVFormatContext *os;
1517 AVOutputStream *ost;
1521 void *buffer_to_free = NULL;
1522 static unsigned int samples_size= 0;
1523 AVSubtitle subtitle, *subtitle_to_free;
1524 int64_t pkt_pts = AV_NOPTS_VALUE;
1526 int frame_available;
1530 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1532 if(ist->next_pts == AV_NOPTS_VALUE)
1533 ist->next_pts= ist->pts;
1537 av_init_packet(&avpkt);
1545 if(pkt->dts != AV_NOPTS_VALUE)
1546 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1547 if(pkt->pts != AV_NOPTS_VALUE)
1548 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1550 //while we have more to decode or while the decoder did output something on EOF
1551 while (avpkt.size > 0 || (!pkt && got_output)) {
1552 uint8_t *data_buf, *decoded_data_buf;
1553 int data_size, decoded_data_size;
1555 ist->pts= ist->next_pts;
1557 if(avpkt.size && avpkt.size != pkt->size &&
1558 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1559 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1560 ist->showed_multi_packet_warning=1;
1563 /* decode the packet if needed */
1564 decoded_data_buf = NULL; /* fail safe */
1565 decoded_data_size= 0;
1566 data_buf = avpkt.data;
1567 data_size = avpkt.size;
1568 subtitle_to_free = NULL;
1569 if (ist->decoding_needed) {
1570 switch(ist->st->codec->codec_type) {
1571 case AVMEDIA_TYPE_AUDIO:{
1572 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1573 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1575 samples= av_malloc(samples_size);
1577 decoded_data_size= samples_size;
1578 /* XXX: could avoid copy if PCM 16 bits with same
1579 endianness as CPU */
1580 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1587 got_output = decoded_data_size > 0;
1588 /* Some bug in mpeg audio decoder gives */
1589 /* decoded_data_size < 0, it seems they are overflows */
1591 /* no audio frame */
1594 decoded_data_buf = (uint8_t *)samples;
1595 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1596 (ist->st->codec->sample_rate * ist->st->codec->channels);
1598 case AVMEDIA_TYPE_VIDEO:
1599 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1600 /* XXX: allocate picture correctly */
1601 avcodec_get_frame_defaults(&picture);
1602 avpkt.pts = pkt_pts;
1603 avpkt.dts = ist->pts;
1604 pkt_pts = AV_NOPTS_VALUE;
1606 ret = avcodec_decode_video2(ist->st->codec,
1607 &picture, &got_output, &avpkt);
1608 ist->st->quality= picture.quality;
1612 /* no picture yet */
1613 goto discard_packet;
1615 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1616 if (ist->st->codec->time_base.num != 0) {
1617 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1618 ist->next_pts += ((int64_t)AV_TIME_BASE *
1619 ist->st->codec->time_base.num * ticks) /
1620 ist->st->codec->time_base.den;
1623 buffer_to_free = NULL;
1624 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1626 case AVMEDIA_TYPE_SUBTITLE:
1627 ret = avcodec_decode_subtitle2(ist->st->codec,
1628 &subtitle, &got_output, &avpkt);
1632 goto discard_packet;
1634 subtitle_to_free = &subtitle;
1641 switch(ist->st->codec->codec_type) {
1642 case AVMEDIA_TYPE_AUDIO:
1643 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1644 ist->st->codec->sample_rate;
1646 case AVMEDIA_TYPE_VIDEO:
1647 if (ist->st->codec->time_base.num != 0) {
1648 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1649 ist->next_pts += ((int64_t)AV_TIME_BASE *
1650 ist->st->codec->time_base.num * ticks) /
1651 ist->st->codec->time_base.den;
1660 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1661 if (start_time == 0 || ist->pts >= start_time) {
1662 for(i=0;i<nb_ostreams;i++) {
1664 if (ost->input_video_filter && ost->source_index == ist_index) {
1665 if (!picture.sample_aspect_ratio.num)
1666 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1667 picture.pts = ist->pts;
1669 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1675 // preprocess audio (volume)
1676 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1677 if (audio_volume != 256) {
1680 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1681 int v = ((*volp) * audio_volume + 128) >> 8;
1682 if (v < -32768) v = -32768;
1683 if (v > 32767) v = 32767;
1689 /* frame rate emulation */
1691 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1692 int64_t now = av_gettime() - ist->start;
1696 /* if output time reached then transcode raw format,
1697 encode packets and output them */
1698 if (start_time == 0 || ist->pts >= start_time)
1699 for(i=0;i<nb_ostreams;i++) {
1703 if (ost->source_index == ist_index) {
1705 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1706 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1707 while (frame_available) {
1708 AVRational ist_pts_tb;
1709 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1710 if (get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb) < 0)
1713 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1715 os = output_files[ost->file_index];
1717 /* set the input output pts pairs */
1718 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1720 if (ost->encoding_needed) {
1721 av_assert0(ist->decoding_needed);
1722 switch(ost->st->codec->codec_type) {
1723 case AVMEDIA_TYPE_AUDIO:
1724 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1726 case AVMEDIA_TYPE_VIDEO:
1728 if (ost->picref->video && !ost->frame_aspect_ratio)
1729 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1731 do_video_out(os, ost, ist, &picture, &frame_size);
1732 if (vstats_filename && frame_size)
1733 do_video_stats(os, ost, frame_size);
1735 case AVMEDIA_TYPE_SUBTITLE:
1736 do_subtitle_out(os, ost, ist, &subtitle,
1743 AVFrame avframe; //FIXME/XXX remove this
1746 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1748 av_init_packet(&opkt);
1750 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1751 #if !CONFIG_AVFILTER
1757 /* no reencoding needed : output the packet directly */
1758 /* force the input stream PTS */
1760 avcodec_get_frame_defaults(&avframe);
1761 ost->st->codec->coded_frame= &avframe;
1762 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1764 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1765 audio_size += data_size;
1766 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1767 video_size += data_size;
1771 opkt.stream_index= ost->index;
1772 if(pkt->pts != AV_NOPTS_VALUE)
1773 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1775 opkt.pts= AV_NOPTS_VALUE;
1777 if (pkt->dts == AV_NOPTS_VALUE)
1778 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1780 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1781 opkt.dts -= ost_tb_start_time;
1783 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1784 opkt.flags= pkt->flags;
1786 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1787 if( ost->st->codec->codec_id != CODEC_ID_H264
1788 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1789 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1791 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1792 opkt.destruct= av_destruct_packet;
1794 opkt.data = data_buf;
1795 opkt.size = data_size;
1798 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1799 /* store AVPicture in AVPacket, as expected by the output format */
1800 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1801 opkt.data = (uint8_t *)&pict;
1802 opkt.size = sizeof(AVPicture);
1803 opkt.flags |= AV_PKT_FLAG_KEY;
1805 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1806 ost->st->codec->frame_number++;
1807 ost->frame_number++;
1808 av_free_packet(&opkt);
1812 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1813 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1814 avfilter_unref_buffer(ost->picref);
1820 av_free(buffer_to_free);
1821 /* XXX: allocate the subtitles in the codec ? */
1822 if (subtitle_to_free) {
1823 avsubtitle_free(subtitle_to_free);
1824 subtitle_to_free = NULL;
1831 for(i=0;i<nb_ostreams;i++) {
1833 if (ost->source_index == ist_index) {
1834 AVCodecContext *enc= ost->st->codec;
1835 os = output_files[ost->file_index];
1837 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1839 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1842 if (ost->encoding_needed) {
1846 av_init_packet(&pkt);
1847 pkt.stream_index= ost->index;
1849 switch(ost->st->codec->codec_type) {
1850 case AVMEDIA_TYPE_AUDIO:
1851 fifo_bytes = av_fifo_size(ost->fifo);
1853 /* encode any samples remaining in fifo */
1854 if (fifo_bytes > 0) {
1855 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1856 int fs_tmp = enc->frame_size;
1858 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1859 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1860 enc->frame_size = fifo_bytes / (osize * enc->channels);
1862 int frame_bytes = enc->frame_size*osize*enc->channels;
1863 if (allocated_audio_buf_size < frame_bytes)
1865 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1868 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1869 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1870 ost->st->time_base.num, enc->sample_rate);
1871 enc->frame_size = fs_tmp;
1874 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1877 fprintf(stderr, "Audio encoding failed\n");
1881 pkt.flags |= AV_PKT_FLAG_KEY;
1883 case AVMEDIA_TYPE_VIDEO:
1884 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1886 fprintf(stderr, "Video encoding failed\n");
1890 if(enc->coded_frame && enc->coded_frame->key_frame)
1891 pkt.flags |= AV_PKT_FLAG_KEY;
1892 if (ost->logfile && enc->stats_out) {
1893 fprintf(ost->logfile, "%s", enc->stats_out);
1902 pkt.data= bit_buffer;
1904 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1905 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1906 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1918 static void print_sdp(AVFormatContext **avc, int n)
1922 av_sdp_create(avc, n, sdp, sizeof(sdp));
1923 printf("SDP:\n%s\n", sdp);
1927 static int copy_chapters(int infile, int outfile)
1929 AVFormatContext *is = input_files[infile].ctx;
1930 AVFormatContext *os = output_files[outfile];
1933 for (i = 0; i < is->nb_chapters; i++) {
1934 AVChapter *in_ch = is->chapters[i], *out_ch;
1935 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1936 AV_TIME_BASE_Q, in_ch->time_base);
1937 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1938 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1941 if (in_ch->end < ts_off)
1943 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1946 out_ch = av_mallocz(sizeof(AVChapter));
1948 return AVERROR(ENOMEM);
1950 out_ch->id = in_ch->id;
1951 out_ch->time_base = in_ch->time_base;
1952 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1953 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1955 if (metadata_chapters_autocopy)
1956 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1959 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1961 return AVERROR(ENOMEM);
1962 os->chapters[os->nb_chapters - 1] = out_ch;
1967 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1968 AVCodecContext *avctx)
1974 for (p = kf; *p; p++)
1977 ost->forced_kf_count = n;
1978 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1979 if (!ost->forced_kf_pts) {
1980 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1983 for (i = 0; i < n; i++) {
1984 p = i ? strchr(p, ',') + 1 : kf;
1985 t = parse_time_or_die("force_key_frames", p, 1);
1986 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1991 * The following code is the main loop of the file converter
1993 static int transcode(AVFormatContext **output_files,
1994 int nb_output_files,
1995 AVInputFile *input_files,
1997 AVStreamMap *stream_maps, int nb_stream_maps)
1999 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
2001 AVFormatContext *is, *os;
2002 AVCodecContext *codec, *icodec;
2003 AVOutputStream *ost, **ost_table = NULL;
2008 uint8_t no_packet[MAX_FILES]={0};
2009 int no_packet_count=0;
2010 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2011 int nb_streams[AVMEDIA_TYPE_NB]={0};
2014 for (i = 0; i < nb_input_streams; i++)
2015 input_streams[i].start = av_gettime();
2017 /* output stream init */
2019 for(i=0;i<nb_output_files;i++) {
2020 os = output_files[i];
2021 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2022 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2023 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2024 ret = AVERROR(EINVAL);
2027 nb_ostreams += os->nb_streams;
2029 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2030 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2031 ret = AVERROR(EINVAL);
2035 /* Sanity check the mapping args -- do the input files & streams exist? */
2036 for(i=0;i<nb_stream_maps;i++) {
2037 int fi = stream_maps[i].file_index;
2038 int si = stream_maps[i].stream_index;
2040 if (fi < 0 || fi > nb_input_files - 1 ||
2041 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2042 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2043 ret = AVERROR(EINVAL);
2046 fi = stream_maps[i].sync_file_index;
2047 si = stream_maps[i].sync_stream_index;
2048 if (fi < 0 || fi > nb_input_files - 1 ||
2049 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2050 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2051 ret = AVERROR(EINVAL);
2056 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2060 for(k=0;k<nb_output_files;k++) {
2061 os = output_files[k];
2062 for(i=0;i<os->nb_streams;i++,n++) {
2063 nb_streams[os->streams[i]->codec->codec_type]++;
2066 for(step=1<<30; step; step>>=1){
2067 int found_streams[AVMEDIA_TYPE_NB]={0};
2068 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2069 nb_frame_threshold[j] += step;
2071 for(j=0; j<nb_input_streams; j++) {
2073 ist = &input_streams[j];
2076 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2078 for(pi=0; pi<f->nb_programs; pi++){
2079 AVProgram *p= f->programs[pi];
2080 if(p->id == opt_programid)
2081 for(si=0; si<p->nb_stream_indexes; si++){
2082 if(f->streams[ p->stream_index[si] ] == ist->st)
2087 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2088 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2089 found_streams[ist->st->codec->codec_type]++;
2092 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2093 if(found_streams[j] < nb_streams[j])
2094 nb_frame_threshold[j] -= step;
2097 for(k=0;k<nb_output_files;k++) {
2098 os = output_files[k];
2099 for(i=0;i<os->nb_streams;i++,n++) {
2101 ost = ost_table[n] = output_streams_for_file[k][i];
2102 ost->st = os->streams[i];
2103 if (nb_stream_maps > 0) {
2104 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2105 stream_maps[n].stream_index;
2107 /* Sanity check that the stream types match */
2108 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2109 int i= ost->file_index;
2110 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2111 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2112 stream_maps[n].file_index, stream_maps[n].stream_index,
2113 ost->file_index, ost->index);
2118 /* get corresponding input stream index : we select the first one with the right type */
2120 for (j = 0; j < nb_input_streams; j++) {
2122 ist = &input_streams[j];
2125 AVFormatContext *f = input_files[ist->file_index].ctx;
2127 for(pi=0; pi<f->nb_programs; pi++){
2128 AVProgram *p= f->programs[pi];
2129 if(p->id == opt_programid)
2130 for(si=0; si<p->nb_stream_indexes; si++){
2131 if(f->streams[ p->stream_index[si] ] == ist->st)
2136 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2137 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2138 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2139 ost->source_index = j;
2146 if(! opt_programid) {
2147 /* try again and reuse existing stream */
2148 for (j = 0; j < nb_input_streams; j++) {
2149 ist = &input_streams[j];
2150 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2151 && ist->st->discard != AVDISCARD_ALL) {
2152 ost->source_index = j;
2158 int i= ost->file_index;
2159 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2160 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2161 ost->file_index, ost->index);
2166 ist = &input_streams[ost->source_index];
2168 ost->sync_ist = (nb_stream_maps > 0) ?
2169 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2170 stream_maps[n].sync_stream_index] : ist;
2174 /* for each output stream, we compute the right encoding parameters */
2175 for(i=0;i<nb_ostreams;i++) {
2177 os = output_files[ost->file_index];
2178 ist = &input_streams[ost->source_index];
2180 codec = ost->st->codec;
2181 icodec = ist->st->codec;
2183 if (metadata_streams_autocopy)
2184 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2185 AV_METADATA_DONT_OVERWRITE);
2187 ost->st->disposition = ist->st->disposition;
2188 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2189 codec->chroma_sample_location = icodec->chroma_sample_location;
2191 if (ost->st->stream_copy) {
2192 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2194 if (extra_size > INT_MAX)
2197 /* if stream_copy is selected, no need to decode or encode */
2198 codec->codec_id = icodec->codec_id;
2199 codec->codec_type = icodec->codec_type;
2201 if(!codec->codec_tag){
2202 if( !os->oformat->codec_tag
2203 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2204 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2205 codec->codec_tag = icodec->codec_tag;
2208 codec->bit_rate = icodec->bit_rate;
2209 codec->rc_max_rate = icodec->rc_max_rate;
2210 codec->rc_buffer_size = icodec->rc_buffer_size;
2211 codec->extradata= av_mallocz(extra_size);
2212 if (!codec->extradata)
2214 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2215 codec->extradata_size= icodec->extradata_size;
2216 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){
2217 codec->time_base = icodec->time_base;
2218 codec->time_base.num *= icodec->ticks_per_frame;
2219 av_reduce(&codec->time_base.num, &codec->time_base.den,
2220 codec->time_base.num, codec->time_base.den, INT_MAX);
2222 codec->time_base = ist->st->time_base;
2223 switch(codec->codec_type) {
2224 case AVMEDIA_TYPE_AUDIO:
2225 if(audio_volume != 256) {
2226 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2229 codec->channel_layout = icodec->channel_layout;
2230 codec->sample_rate = icodec->sample_rate;
2231 codec->channels = icodec->channels;
2232 codec->frame_size = icodec->frame_size;
2233 codec->audio_service_type = icodec->audio_service_type;
2234 codec->block_align= icodec->block_align;
2235 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2236 codec->block_align= 0;
2237 if(codec->codec_id == CODEC_ID_AC3)
2238 codec->block_align= 0;
2240 case AVMEDIA_TYPE_VIDEO:
2241 codec->pix_fmt = icodec->pix_fmt;
2242 codec->width = icodec->width;
2243 codec->height = icodec->height;
2244 codec->has_b_frames = icodec->has_b_frames;
2245 if (!codec->sample_aspect_ratio.num) {
2246 codec->sample_aspect_ratio =
2247 ost->st->sample_aspect_ratio =
2248 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2249 ist->st->codec->sample_aspect_ratio.num ?
2250 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2253 case AVMEDIA_TYPE_SUBTITLE:
2254 codec->width = icodec->width;
2255 codec->height = icodec->height;
2257 case AVMEDIA_TYPE_DATA:
2263 switch(codec->codec_type) {
2264 case AVMEDIA_TYPE_AUDIO:
2265 ost->fifo= av_fifo_alloc(1024);
2268 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2269 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2270 icodec->request_channels = codec->channels;
2271 ist->decoding_needed = 1;
2272 ost->encoding_needed = 1;
2273 ost->resample_sample_fmt = icodec->sample_fmt;
2274 ost->resample_sample_rate = icodec->sample_rate;
2275 ost->resample_channels = icodec->channels;
2277 case AVMEDIA_TYPE_VIDEO:
2278 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2279 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2282 ost->video_resample = codec->width != icodec->width ||
2283 codec->height != icodec->height ||
2284 codec->pix_fmt != icodec->pix_fmt;
2285 if (ost->video_resample) {
2286 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2288 ost->resample_height = icodec->height;
2289 ost->resample_width = icodec->width;
2290 ost->resample_pix_fmt= icodec->pix_fmt;
2291 ost->encoding_needed = 1;
2292 ist->decoding_needed = 1;
2295 if (configure_video_filters(ist, ost)) {
2296 fprintf(stderr, "Error opening filters!\n");
2301 case AVMEDIA_TYPE_SUBTITLE:
2302 ost->encoding_needed = 1;
2303 ist->decoding_needed = 1;
2310 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2311 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2312 char logfilename[1024];
2315 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2316 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2318 if (codec->flags & CODEC_FLAG_PASS1) {
2319 f = fopen(logfilename, "wb");
2321 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2327 size_t logbuffer_size;
2328 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2329 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2332 codec->stats_in = logbuffer;
2336 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2337 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2338 int size= codec->width * codec->height;
2339 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2344 bit_buffer = av_malloc(bit_buffer_size);
2346 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2348 ret = AVERROR(ENOMEM);
2352 /* open each encoder */
2353 for(i=0;i<nb_ostreams;i++) {
2355 if (ost->encoding_needed) {
2356 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2357 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2359 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2361 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2362 ost->st->codec->codec_id, ost->file_index, ost->index);
2363 ret = AVERROR(EINVAL);
2366 if (dec->subtitle_header) {
2367 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2368 if (!ost->st->codec->subtitle_header) {
2369 ret = AVERROR(ENOMEM);
2372 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2373 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2375 if (avcodec_open(ost->st->codec, codec) < 0) {
2376 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2377 ost->file_index, ost->index);
2378 ret = AVERROR(EINVAL);
2381 extra_size += ost->st->codec->extradata_size;
2385 /* open each decoder */
2386 for (i = 0; i < nb_input_streams; i++) {
2387 ist = &input_streams[i];
2388 if (ist->decoding_needed) {
2389 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2391 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2393 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2394 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2395 ret = AVERROR(EINVAL);
2398 if (avcodec_open(ist->st->codec, codec) < 0) {
2399 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2400 ist->file_index, ist->st->index);
2401 ret = AVERROR(EINVAL);
2404 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2405 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2410 for (i = 0; i < nb_input_streams; i++) {
2412 ist = &input_streams[i];
2414 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2415 ist->next_pts = AV_NOPTS_VALUE;
2419 /* set meta data information from input file if required */
2420 for (i=0;i<nb_meta_data_maps;i++) {
2421 AVFormatContext *files[2];
2422 AVMetadata **meta[2];
2425 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2426 if ((index) < 0 || (index) >= (nb_elems)) {\
2427 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2429 ret = AVERROR(EINVAL);\
2433 int out_file_index = meta_data_maps[i][0].file;
2434 int in_file_index = meta_data_maps[i][1].file;
2435 if (in_file_index < 0 || out_file_index < 0)
2437 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2438 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2440 files[0] = output_files[out_file_index];
2441 files[1] = input_files[in_file_index].ctx;
2443 for (j = 0; j < 2; j++) {
2444 AVMetaDataMap *map = &meta_data_maps[i][j];
2446 switch (map->type) {
2448 meta[j] = &files[j]->metadata;
2451 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2452 meta[j] = &files[j]->streams[map->index]->metadata;
2455 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2456 meta[j] = &files[j]->chapters[map->index]->metadata;
2459 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2460 meta[j] = &files[j]->programs[map->index]->metadata;
2465 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2468 /* copy global metadata by default */
2469 if (metadata_global_autocopy) {
2471 for (i = 0; i < nb_output_files; i++)
2472 av_metadata_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2473 AV_METADATA_DONT_OVERWRITE);
2476 /* copy chapters according to chapter maps */
2477 for (i = 0; i < nb_chapter_maps; i++) {
2478 int infile = chapter_maps[i].in_file;
2479 int outfile = chapter_maps[i].out_file;
2481 if (infile < 0 || outfile < 0)
2483 if (infile >= nb_input_files) {
2484 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2485 ret = AVERROR(EINVAL);
2488 if (outfile >= nb_output_files) {
2489 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2490 ret = AVERROR(EINVAL);
2493 copy_chapters(infile, outfile);
2496 /* copy chapters from the first input file that has them*/
2497 if (!nb_chapter_maps)
2498 for (i = 0; i < nb_input_files; i++) {
2499 if (!input_files[i].ctx->nb_chapters)
2502 for (j = 0; j < nb_output_files; j++)
2503 if ((ret = copy_chapters(i, j)) < 0)
2508 /* open files and write file headers */
2509 for(i=0;i<nb_output_files;i++) {
2510 os = output_files[i];
2511 if (av_write_header(os) < 0) {
2512 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2513 ret = AVERROR(EINVAL);
2516 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2522 /* dump the file output parameters - cannot be done before in case
2524 for(i=0;i<nb_output_files;i++) {
2525 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2528 /* dump the stream mapping */
2530 fprintf(stderr, "Stream mapping:\n");
2531 for(i=0;i<nb_ostreams;i++) {
2533 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2534 input_streams[ost->source_index].file_index,
2535 input_streams[ost->source_index].st->index,
2538 if (ost->sync_ist != &input_streams[ost->source_index])
2539 fprintf(stderr, " [sync #%d.%d]",
2540 ost->sync_ist->file_index,
2541 ost->sync_ist->st->index);
2542 fprintf(stderr, "\n");
2547 fprintf(stderr, "%s\n", error);
2552 print_sdp(output_files, nb_output_files);
2557 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2558 avio_set_interrupt_cb(decode_interrupt_cb);
2562 timer_start = av_gettime();
2564 for(; received_sigterm == 0;) {
2565 int file_index, ist_index;
2573 /* if 'q' pressed, exits */
2577 /* read_key() returns 0 on EOF */
2581 if (key == '+') verbose++;
2582 if (key == '-') verbose--;
2583 if (key == 's') qp_hist ^= 1;
2586 do_hex_dump = do_pkt_dump = 0;
2587 } else if(do_pkt_dump){
2591 av_log_set_level(AV_LOG_DEBUG);
2593 if (key == 'd' || key == 'D'){
2596 debug = input_streams[0].st->codec->debug<<1;
2597 if(!debug) debug = 1;
2598 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2601 scanf("%d", &debug);
2602 for(i=0;i<nb_input_streams;i++) {
2603 input_streams[i].st->codec->debug = debug;
2605 for(i=0;i<nb_ostreams;i++) {
2607 ost->st->codec->debug = debug;
2609 if(debug) av_log_set_level(AV_LOG_DEBUG);
2610 fprintf(stderr,"debug=%d\n", debug);
2613 fprintf(stderr, "key function\n"
2614 "? show this help\n"
2615 "+ increase verbosity\n"
2616 "- decrease verbosity\n"
2617 "D cycle through available debug modes\n"
2618 "h dump packets/hex press to cycle through the 3 states\n"
2620 "s Show QP histogram\n"
2625 /* select the stream that we must read now by looking at the
2626 smallest output pts */
2628 for(i=0;i<nb_ostreams;i++) {
2631 os = output_files[ost->file_index];
2632 ist = &input_streams[ost->source_index];
2633 if(ist->is_past_recording_time || no_packet[ist->file_index])
2635 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2636 ipts = (double)ist->pts;
2637 if (!input_files[ist->file_index].eof_reached){
2638 if(ipts < ipts_min) {
2640 if(input_sync ) file_index = ist->file_index;
2642 if(opts < opts_min) {
2644 if(!input_sync) file_index = ist->file_index;
2647 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2652 /* if none, if is finished */
2653 if (file_index < 0) {
2654 if(no_packet_count){
2656 memset(no_packet, 0, sizeof(no_packet));
2663 /* finish if limit size exhausted */
2664 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2667 /* read a frame from it and output it in the fifo */
2668 is = input_files[file_index].ctx;
2669 ret= av_read_frame(is, &pkt);
2670 if(ret == AVERROR(EAGAIN)){
2671 no_packet[file_index]=1;
2676 input_files[file_index].eof_reached = 1;
2684 memset(no_packet, 0, sizeof(no_packet));
2687 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2688 is->streams[pkt.stream_index]);
2690 /* the following test is needed in case new streams appear
2691 dynamically in stream : we ignore them */
2692 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2693 goto discard_packet;
2694 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2695 ist = &input_streams[ist_index];
2697 goto discard_packet;
2699 if (pkt.dts != AV_NOPTS_VALUE)
2700 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2701 if (pkt.pts != AV_NOPTS_VALUE)
2702 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2704 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2705 && input_files_ts_scale[file_index][pkt.stream_index]){
2706 if(pkt.pts != AV_NOPTS_VALUE)
2707 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2708 if(pkt.dts != AV_NOPTS_VALUE)
2709 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2712 // 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);
2713 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2714 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2715 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2716 int64_t delta= pkt_dts - ist->next_pts;
2717 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2718 input_files_ts_offset[ist->file_index]-= delta;
2720 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2721 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2722 if(pkt.pts != AV_NOPTS_VALUE)
2723 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2727 /* finish if recording time exhausted */
2728 if (recording_time != INT64_MAX &&
2729 (pkt.pts != AV_NOPTS_VALUE || pkt.dts != AV_NOPTS_VALUE ?
2730 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2732 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2734 ist->is_past_recording_time = 1;
2735 goto discard_packet;
2738 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2739 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2742 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2743 ist->file_index, ist->st->index);
2746 av_free_packet(&pkt);
2751 av_free_packet(&pkt);
2753 /* dump report by using the output first video and audio streams */
2754 print_report(output_files, ost_table, nb_ostreams, 0);
2757 /* at the end of stream, we must flush the decoder buffers */
2758 for (i = 0; i < nb_input_streams; i++) {
2759 ist = &input_streams[i];
2760 if (ist->decoding_needed) {
2761 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2767 /* write the trailer if needed and close file */
2768 for(i=0;i<nb_output_files;i++) {
2769 os = output_files[i];
2770 av_write_trailer(os);
2773 /* dump report by using the first video and audio streams */
2774 print_report(output_files, ost_table, nb_ostreams, 1);
2776 /* close each encoder */
2777 for(i=0;i<nb_ostreams;i++) {
2779 if (ost->encoding_needed) {
2780 av_freep(&ost->st->codec->stats_in);
2781 avcodec_close(ost->st->codec);
2784 avfilter_graph_free(&ost->graph);
2788 /* close each decoder */
2789 for (i = 0; i < nb_input_streams; i++) {
2790 ist = &input_streams[i];
2791 if (ist->decoding_needed) {
2792 avcodec_close(ist->st->codec);
2800 av_freep(&bit_buffer);
2803 for(i=0;i<nb_ostreams;i++) {
2806 if (ost->st->stream_copy)
2807 av_freep(&ost->st->codec->extradata);
2809 fclose(ost->logfile);
2810 ost->logfile = NULL;
2812 av_fifo_free(ost->fifo); /* works even if fifo is not
2813 initialized but set to zero */
2814 av_freep(&ost->st->codec->subtitle_header);
2815 av_free(ost->resample_frame.data[0]);
2816 av_free(ost->forced_kf_pts);
2817 if (ost->video_resample)
2818 sws_freeContext(ost->img_resample_ctx);
2820 audio_resample_close(ost->resample);
2821 if (ost->reformat_ctx)
2822 av_audio_convert_free(ost->reformat_ctx);
2831 static int opt_format(const char *opt, const char *arg)
2833 last_asked_format = arg;
2837 static int opt_video_rc_override_string(const char *opt, const char *arg)
2839 video_rc_override_string = arg;
2843 static int opt_me_threshold(const char *opt, const char *arg)
2845 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2849 static int opt_verbose(const char *opt, const char *arg)
2851 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2855 static int opt_frame_rate(const char *opt, const char *arg)
2857 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2858 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2864 static int opt_bitrate(const char *opt, const char *arg)
2866 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2868 opt_default(opt, arg);
2870 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2871 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2876 static int opt_frame_crop(const char *opt, const char *arg)
2878 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2879 return AVERROR(EINVAL);
2882 static int opt_frame_size(const char *opt, const char *arg)
2884 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2885 fprintf(stderr, "Incorrect frame size\n");
2886 return AVERROR(EINVAL);
2891 static int opt_pad(const char *opt, const char *arg) {
2892 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2896 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2898 if (strcmp(arg, "list")) {
2899 frame_pix_fmt = av_get_pix_fmt(arg);
2900 if (frame_pix_fmt == PIX_FMT_NONE) {
2901 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2902 return AVERROR(EINVAL);
2911 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2918 p = strchr(arg, ':');
2920 x = strtol(arg, &end, 10);
2922 y = strtol(end+1, &end, 10);
2924 ar = (double)x / (double)y;
2926 ar = strtod(arg, NULL);
2929 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2930 return AVERROR(EINVAL);
2932 frame_aspect_ratio = ar;
2936 static int opt_metadata(const char *opt, const char *arg)
2938 char *mid= strchr(arg, '=');
2941 fprintf(stderr, "Missing =\n");
2946 av_metadata_set2(&metadata, arg, mid, 0);
2951 static int opt_qscale(const char *opt, const char *arg)
2953 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2954 if (video_qscale <= 0 || video_qscale > 255) {
2955 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2956 return AVERROR(EINVAL);
2961 static int opt_top_field_first(const char *opt, const char *arg)
2963 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2964 opt_default(opt, arg);
2968 static int opt_thread_count(const char *opt, const char *arg)
2970 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2973 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2978 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2980 if (strcmp(arg, "list")) {
2981 audio_sample_fmt = av_get_sample_fmt(arg);
2982 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2983 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2984 return AVERROR(EINVAL);
2989 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2990 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2996 static int opt_audio_rate(const char *opt, const char *arg)
2998 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3002 static int opt_audio_channels(const char *opt, const char *arg)
3004 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3008 static int opt_video_channel(const char *opt, const char *arg)
3010 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3014 static int opt_video_standard(const char *opt, const char *arg)
3016 video_standard = av_strdup(arg);
3020 static int opt_codec(const char *opt, const char *arg)
3022 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
3024 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
3025 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
3026 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
3027 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
3029 av_freep(pcodec_name);
3030 if (!strcmp(arg, "copy")) {
3033 *pcodec_name = av_strdup(arg);
3038 static int opt_codec_tag(const char *opt, const char *arg)
3041 uint32_t *codec_tag;
3043 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3044 !strcmp(opt, "vtag") ? &video_codec_tag :
3045 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3049 *codec_tag = strtol(arg, &tail, 0);
3051 *codec_tag = AV_RL32(arg);
3056 static int opt_map(const char *opt, const char *arg)
3061 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3062 m = &stream_maps[nb_stream_maps-1];
3064 m->file_index = strtol(arg, &p, 0);
3068 m->stream_index = strtol(p, &p, 0);
3071 m->sync_file_index = strtol(p, &p, 0);
3074 m->sync_stream_index = strtol(p, &p, 0);
3076 m->sync_file_index = m->file_index;
3077 m->sync_stream_index = m->stream_index;
3082 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3093 *index = strtol(++arg, endptr, 0);
3096 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3103 static int opt_map_metadata(const char *opt, const char *arg)
3105 AVMetaDataMap *m, *m1;
3108 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3109 &nb_meta_data_maps, nb_meta_data_maps + 1);
3111 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3112 m->file = strtol(arg, &p, 0);
3113 parse_meta_type(p, &m->type, &m->index, &p);
3117 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3118 m1->file = strtol(p, &p, 0);
3119 parse_meta_type(p, &m1->type, &m1->index, &p);
3121 if (m->type == 'g' || m1->type == 'g')
3122 metadata_global_autocopy = 0;
3123 if (m->type == 's' || m1->type == 's')
3124 metadata_streams_autocopy = 0;
3125 if (m->type == 'c' || m1->type == 'c')
3126 metadata_chapters_autocopy = 0;
3131 static int opt_map_meta_data(const char *opt, const char *arg)
3133 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3134 "Use -map_metadata instead.\n");
3135 return opt_map_metadata(opt, arg);
3138 static int opt_map_chapters(const char *opt, const char *arg)
3143 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3144 nb_chapter_maps + 1);
3145 c = &chapter_maps[nb_chapter_maps - 1];
3146 c->out_file = strtol(arg, &p, 0);
3150 c->in_file = strtol(p, &p, 0);
3154 static int opt_input_ts_scale(const char *opt, const char *arg)
3156 unsigned int stream;
3160 stream = strtol(arg, &p, 0);
3163 scale= strtod(p, &p);
3165 if(stream >= MAX_STREAMS)
3168 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);
3169 input_files_ts_scale[nb_input_files][stream]= scale;
3173 static int opt_recording_time(const char *opt, const char *arg)
3175 recording_time = parse_time_or_die(opt, arg, 1);
3179 static int opt_start_time(const char *opt, const char *arg)
3181 start_time = parse_time_or_die(opt, arg, 1);
3185 static int opt_recording_timestamp(const char *opt, const char *arg)
3187 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3191 static int opt_input_ts_offset(const char *opt, const char *arg)
3193 input_ts_offset = parse_time_or_die(opt, arg, 1);
3197 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3199 const char *codec_string = encoder ? "encoder" : "decoder";
3203 return CODEC_ID_NONE;
3205 avcodec_find_encoder_by_name(name) :
3206 avcodec_find_decoder_by_name(name);
3208 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3211 if(codec->type != type) {
3212 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3215 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3216 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3217 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3218 "results.\nAdd '-strict experimental' if you want to use it.\n",
3219 codec_string, codec->name);
3221 avcodec_find_encoder(codec->id) :
3222 avcodec_find_decoder(codec->id);
3223 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3224 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3225 codec_string, codec->name);
3231 static int opt_input_file(const char *opt, const char *filename)
3233 AVFormatContext *ic;
3234 AVFormatParameters params, *ap = ¶ms;
3235 AVInputFormat *file_iformat = NULL;
3236 int err, i, ret, rfps, rfps_base;
3239 if (last_asked_format) {
3240 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3241 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3244 last_asked_format = NULL;
3247 if (!strcmp(filename, "-"))
3250 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3251 !strcmp(filename, "/dev/stdin");
3253 /* get default parameters from command line */
3254 ic = avformat_alloc_context();
3256 print_error(filename, AVERROR(ENOMEM));
3260 memset(ap, 0, sizeof(*ap));
3261 ap->prealloced_context = 1;
3262 ap->sample_rate = audio_sample_rate;
3263 ap->channels = audio_channels;
3264 ap->time_base.den = frame_rate.num;
3265 ap->time_base.num = frame_rate.den;
3266 ap->width = frame_width;
3267 ap->height = frame_height;
3268 ap->pix_fmt = frame_pix_fmt;
3269 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3270 ap->channel = video_channel;
3271 ap->standard = video_standard;
3273 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3275 ic->video_codec_id =
3276 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3277 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3278 ic->audio_codec_id =
3279 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3280 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3281 ic->subtitle_codec_id=
3282 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3283 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3284 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3286 /* open the input file with generic libav function */
3287 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3289 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3290 err = av_demuxer_open(ic, ap);
3292 avformat_free_context(ic);
3295 print_error(filename, err);
3301 for(i=0; i<ic->nb_streams; i++){
3302 ic->streams[i]->discard= AVDISCARD_ALL;
3304 for(i=0; i<ic->nb_programs; i++){
3305 AVProgram *p= ic->programs[i];
3306 if(p->id != opt_programid){
3307 p->discard = AVDISCARD_ALL;
3310 for(j=0; j<p->nb_stream_indexes; j++){
3311 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3316 fprintf(stderr, "Specified program id not found\n");
3322 ic->loop_input = loop_input;
3324 /* If not enough info to get the stream parameters, we decode the
3325 first frames to get it. (used in mpeg case for example) */
3326 ret = av_find_stream_info(ic);
3327 if (ret < 0 && verbose >= 0) {
3328 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3329 av_close_input_file(ic);
3333 timestamp = start_time;
3334 /* add the stream start time */
3335 if (ic->start_time != AV_NOPTS_VALUE)
3336 timestamp += ic->start_time;
3338 /* if seeking requested, we execute it */
3339 if (start_time != 0) {
3340 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3342 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3343 filename, (double)timestamp / AV_TIME_BASE);
3345 /* reset seek info */
3349 /* update the current parameters so that they match the one of the input stream */
3350 for(i=0;i<ic->nb_streams;i++) {
3351 AVStream *st = ic->streams[i];
3352 AVCodecContext *dec = st->codec;
3355 dec->thread_count = thread_count;
3356 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3358 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3359 ist = &input_streams[nb_input_streams - 1];
3361 ist->file_index = nb_input_files;
3364 switch (dec->codec_type) {
3365 case AVMEDIA_TYPE_AUDIO:
3366 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3367 if(!input_codecs[nb_input_codecs-1])
3368 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3369 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]);
3370 channel_layout = dec->channel_layout;
3371 audio_channels = dec->channels;
3372 audio_sample_rate = dec->sample_rate;
3373 audio_sample_fmt = dec->sample_fmt;
3375 st->discard= AVDISCARD_ALL;
3376 /* Note that av_find_stream_info can add more streams, and we
3377 * currently have no chance of setting up lowres decoding
3378 * early enough for them. */
3380 audio_sample_rate >>= dec->lowres;
3382 case AVMEDIA_TYPE_VIDEO:
3383 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3384 if(!input_codecs[nb_input_codecs-1])
3385 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3386 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]);
3387 frame_height = dec->height;
3388 frame_width = dec->width;
3389 frame_pix_fmt = dec->pix_fmt;
3390 rfps = ic->streams[i]->r_frame_rate.num;
3391 rfps_base = ic->streams[i]->r_frame_rate.den;
3393 dec->flags |= CODEC_FLAG_EMU_EDGE;
3394 frame_height >>= dec->lowres;
3395 frame_width >>= dec->lowres;
3396 dec->height = frame_height;
3397 dec->width = frame_width;
3400 dec->debug |= FF_DEBUG_MV;
3402 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3405 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3406 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3408 (float)rfps / rfps_base, rfps, rfps_base);
3410 /* update the current frame rate to match the stream frame rate */
3411 frame_rate.num = rfps;
3412 frame_rate.den = rfps_base;
3415 st->discard= AVDISCARD_ALL;
3416 else if(video_discard)
3417 st->discard= video_discard;
3419 case AVMEDIA_TYPE_DATA:
3421 case AVMEDIA_TYPE_SUBTITLE:
3422 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3423 if(!input_codecs[nb_input_codecs-1])
3424 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3425 if(subtitle_disable)
3426 st->discard = AVDISCARD_ALL;
3428 case AVMEDIA_TYPE_ATTACHMENT:
3429 case AVMEDIA_TYPE_UNKNOWN:
3436 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3437 /* dump the file content */
3439 av_dump_format(ic, nb_input_files, filename, 0);
3441 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3442 input_files[nb_input_files - 1].ctx = ic;
3443 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3446 top_field_first = -1;
3448 av_freep(&video_codec_name);
3449 av_freep(&audio_codec_name);
3450 av_freep(&subtitle_codec_name);
3456 static void check_inputs(int *has_video_ptr,
3458 int *has_subtitle_ptr,
3461 int has_video, has_audio, has_subtitle, has_data, i, j;
3462 AVFormatContext *ic;
3469 for(j=0;j<nb_input_files;j++) {
3470 ic = input_files[j].ctx;
3471 for(i=0;i<ic->nb_streams;i++) {
3472 AVCodecContext *enc = ic->streams[i]->codec;
3473 switch(enc->codec_type) {
3474 case AVMEDIA_TYPE_AUDIO:
3477 case AVMEDIA_TYPE_VIDEO:
3480 case AVMEDIA_TYPE_SUBTITLE:
3483 case AVMEDIA_TYPE_DATA:
3484 case AVMEDIA_TYPE_ATTACHMENT:
3485 case AVMEDIA_TYPE_UNKNOWN:
3493 *has_video_ptr = has_video;
3494 *has_audio_ptr = has_audio;
3495 *has_subtitle_ptr = has_subtitle;
3496 *has_data_ptr = has_data;
3499 static void new_video_stream(AVFormatContext *oc, int file_idx)
3502 AVOutputStream *ost;
3503 AVCodecContext *video_enc;
3504 enum CodecID codec_id = CODEC_ID_NONE;
3505 AVCodec *codec= NULL;
3507 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3509 fprintf(stderr, "Could not alloc stream\n");
3512 ost = new_output_stream(oc, file_idx);
3514 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3515 if(!video_stream_copy){
3516 if (video_codec_name) {
3517 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3518 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3519 codec = avcodec_find_encoder_by_name(video_codec_name);
3520 output_codecs[nb_output_codecs-1] = codec;
3522 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3523 codec = avcodec_find_encoder(codec_id);
3525 ost->frame_aspect_ratio = frame_aspect_ratio;
3526 frame_aspect_ratio = 0;
3528 ost->avfilter = vfilters;
3533 avcodec_get_context_defaults3(st->codec, codec);
3534 ost->bitstream_filters = video_bitstream_filters;
3535 video_bitstream_filters= NULL;
3537 st->codec->thread_count= thread_count;
3539 video_enc = st->codec;
3542 video_enc->codec_tag= video_codec_tag;
3544 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3545 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3546 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3549 if (video_stream_copy) {
3550 st->stream_copy = 1;
3551 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3552 video_enc->sample_aspect_ratio =
3553 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3557 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3559 video_enc->codec_id = codec_id;
3560 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3562 if (codec && codec->supported_framerates && !force_fps)
3563 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3564 video_enc->time_base.den = fps.num;
3565 video_enc->time_base.num = fps.den;
3567 video_enc->width = frame_width;
3568 video_enc->height = frame_height;
3569 video_enc->pix_fmt = frame_pix_fmt;
3570 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3571 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3573 choose_pixel_fmt(st, codec);
3576 video_enc->gop_size = 0;
3577 if (video_qscale || same_quality) {
3578 video_enc->flags |= CODEC_FLAG_QSCALE;
3579 video_enc->global_quality=
3580 st->quality = FF_QP2LAMBDA * video_qscale;
3584 video_enc->intra_matrix = intra_matrix;
3586 video_enc->inter_matrix = inter_matrix;
3588 p= video_rc_override_string;
3591 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3593 fprintf(stderr, "error parsing rc_override\n");
3596 video_enc->rc_override=
3597 av_realloc(video_enc->rc_override,
3598 sizeof(RcOverride)*(i+1));
3599 video_enc->rc_override[i].start_frame= start;
3600 video_enc->rc_override[i].end_frame = end;
3602 video_enc->rc_override[i].qscale= q;
3603 video_enc->rc_override[i].quality_factor= 1.0;
3606 video_enc->rc_override[i].qscale= 0;
3607 video_enc->rc_override[i].quality_factor= -q/100.0;
3612 video_enc->rc_override_count=i;
3613 if (!video_enc->rc_initial_buffer_occupancy)
3614 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3615 video_enc->me_threshold= me_threshold;
3616 video_enc->intra_dc_precision= intra_dc_precision - 8;
3619 video_enc->flags|= CODEC_FLAG_PSNR;
3624 video_enc->flags |= CODEC_FLAG_PASS1;
3626 video_enc->flags |= CODEC_FLAG_PASS2;
3630 if (forced_key_frames)
3631 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3633 if (video_language) {
3634 av_metadata_set2(&st->metadata, "language", video_language, 0);
3635 av_freep(&video_language);
3638 /* reset some key parameters */
3640 av_freep(&video_codec_name);
3641 av_freep(&forced_key_frames);
3642 video_stream_copy = 0;
3643 frame_pix_fmt = PIX_FMT_NONE;
3646 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3649 AVOutputStream *ost;
3650 AVCodec *codec= NULL;
3651 AVCodecContext *audio_enc;
3652 enum CodecID codec_id = CODEC_ID_NONE;
3654 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3656 fprintf(stderr, "Could not alloc stream\n");
3659 ost = new_output_stream(oc, file_idx);
3661 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3662 if(!audio_stream_copy){
3663 if (audio_codec_name) {
3664 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3665 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3666 codec = avcodec_find_encoder_by_name(audio_codec_name);
3667 output_codecs[nb_output_codecs-1] = codec;
3669 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3670 codec = avcodec_find_encoder(codec_id);
3674 avcodec_get_context_defaults3(st->codec, codec);
3676 ost->bitstream_filters = audio_bitstream_filters;
3677 audio_bitstream_filters= NULL;
3679 st->codec->thread_count= thread_count;
3681 audio_enc = st->codec;
3682 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3685 audio_enc->codec_tag= audio_codec_tag;
3687 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3688 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3689 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3691 if (audio_stream_copy) {
3692 st->stream_copy = 1;
3693 audio_enc->channels = audio_channels;
3694 audio_enc->sample_rate = audio_sample_rate;
3696 audio_enc->codec_id = codec_id;
3697 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3699 if (audio_qscale > QSCALE_NONE) {
3700 audio_enc->flags |= CODEC_FLAG_QSCALE;
3701 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3703 audio_enc->channels = audio_channels;
3704 audio_enc->sample_fmt = audio_sample_fmt;
3705 audio_enc->sample_rate = audio_sample_rate;
3706 audio_enc->channel_layout = channel_layout;
3707 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3708 audio_enc->channel_layout = 0;
3709 choose_sample_fmt(st, codec);
3710 choose_sample_rate(st, codec);
3712 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3713 if (audio_language) {
3714 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3715 av_freep(&audio_language);
3718 /* reset some key parameters */
3720 av_freep(&audio_codec_name);
3721 audio_stream_copy = 0;
3724 static void new_data_stream(AVFormatContext *oc, int file_idx)
3727 AVCodec *codec=NULL;
3728 AVCodecContext *data_enc;
3730 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3732 fprintf(stderr, "Could not alloc stream\n");
3735 new_output_stream(oc, file_idx);
3736 data_enc = st->codec;
3737 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3738 if (!data_stream_copy) {
3739 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3742 avcodec_get_context_defaults3(st->codec, codec);
3744 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3747 data_enc->codec_tag= data_codec_tag;
3749 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3750 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3751 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3753 if (data_stream_copy) {
3754 st->stream_copy = 1;
3758 av_freep(&data_codec_name);
3759 data_stream_copy = 0;
3762 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3765 AVOutputStream *ost;
3766 AVCodec *codec=NULL;
3767 AVCodecContext *subtitle_enc;
3768 enum CodecID codec_id = CODEC_ID_NONE;
3770 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3772 fprintf(stderr, "Could not alloc stream\n");
3775 ost = new_output_stream(oc, file_idx);
3776 subtitle_enc = st->codec;
3777 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3778 if(!subtitle_stream_copy){
3779 if (subtitle_codec_name) {
3780 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3781 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3782 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3784 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3785 codec = avcodec_find_encoder(codec_id);
3788 avcodec_get_context_defaults3(st->codec, codec);
3790 ost->bitstream_filters = subtitle_bitstream_filters;
3791 subtitle_bitstream_filters= NULL;
3793 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3795 if(subtitle_codec_tag)
3796 subtitle_enc->codec_tag= subtitle_codec_tag;
3798 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3799 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3800 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3802 if (subtitle_stream_copy) {
3803 st->stream_copy = 1;
3805 subtitle_enc->codec_id = codec_id;
3806 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3809 if (subtitle_language) {
3810 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3811 av_freep(&subtitle_language);
3814 subtitle_disable = 0;
3815 av_freep(&subtitle_codec_name);
3816 subtitle_stream_copy = 0;
3819 static int opt_new_stream(const char *opt, const char *arg)
3821 AVFormatContext *oc;
3822 int file_idx = nb_output_files - 1;
3823 if (nb_output_files <= 0) {
3824 fprintf(stderr, "At least one output file must be specified\n");
3827 oc = output_files[file_idx];
3829 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3830 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3831 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3832 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3837 /* arg format is "output-stream-index:streamid-value". */
3838 static int opt_streamid(const char *opt, const char *arg)
3844 av_strlcpy(idx_str, arg, sizeof(idx_str));
3845 p = strchr(idx_str, ':');
3848 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3853 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3854 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3855 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3859 static int opt_output_file(const char *opt, const char *filename)
3861 AVFormatContext *oc;
3862 int err, use_video, use_audio, use_subtitle, use_data;
3863 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3864 AVFormatParameters params, *ap = ¶ms;
3865 AVOutputFormat *file_oformat;
3867 if(nb_output_files >= FF_ARRAY_ELEMS(output_files)){
3868 fprintf(stderr, "Too many output files\n");
3872 if (!strcmp(filename, "-"))
3875 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3876 last_asked_format = NULL;
3878 print_error(filename, err);
3881 file_oformat= oc->oformat;
3883 if (!strcmp(file_oformat->name, "ffm") &&
3884 av_strstart(filename, "http:", NULL)) {
3885 /* special case for files sent to ffserver: we get the stream
3886 parameters from ffserver */
3887 int err = read_ffserver_streams(oc, filename);
3889 print_error(filename, err);
3893 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3894 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3895 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3896 use_data = data_stream_copy || data_codec_name; /* XXX once generic data codec will be available add a ->data_codec reference and use it here */
3898 /* disable if no corresponding type found and at least one
3900 if (nb_input_files > 0) {
3901 check_inputs(&input_has_video,
3903 &input_has_subtitle,
3906 if (!input_has_video)
3908 if (!input_has_audio)
3910 if (!input_has_subtitle)
3912 if (!input_has_data)
3916 /* manual disable */
3917 if (audio_disable) use_audio = 0;
3918 if (video_disable) use_video = 0;
3919 if (subtitle_disable) use_subtitle = 0;
3920 if (data_disable) use_data = 0;
3922 if (use_video) new_video_stream(oc, nb_output_files);
3923 if (use_audio) new_audio_stream(oc, nb_output_files);
3924 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3925 if (use_data) new_data_stream(oc, nb_output_files);
3927 oc->timestamp = recording_timestamp;
3929 av_metadata_copy(&oc->metadata, metadata, 0);
3930 av_metadata_free(&metadata);
3933 output_files[nb_output_files++] = oc;
3935 /* check filename in case of an image number is expected */
3936 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3937 if (!av_filename_number_test(oc->filename)) {
3938 print_error(oc->filename, AVERROR(EINVAL));
3943 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3944 /* test if it already exists to avoid loosing precious files */
3945 if (!file_overwrite &&
3946 (strchr(filename, ':') == NULL ||
3947 filename[1] == ':' ||
3948 av_strstart(filename, "file:", NULL))) {
3949 if (avio_check(filename, 0) == 0) {
3951 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3953 if (!read_yesno()) {
3954 fprintf(stderr, "Not overwriting - exiting\n");
3959 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3966 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3967 print_error(filename, err);
3972 memset(ap, 0, sizeof(*ap));
3973 if (av_set_parameters(oc, ap) < 0) {
3974 fprintf(stderr, "%s: Invalid encoding parameters\n",
3979 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3980 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3981 oc->loop_output = loop_output;
3983 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3985 av_freep(&forced_key_frames);
3991 /* same option as mencoder */
3992 static int opt_pass(const char *opt, const char *arg)
3994 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3998 static int64_t getutime(void)
4001 struct rusage rusage;
4003 getrusage(RUSAGE_SELF, &rusage);
4004 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
4005 #elif HAVE_GETPROCESSTIMES
4007 FILETIME c, e, k, u;
4008 proc = GetCurrentProcess();
4009 GetProcessTimes(proc, &c, &e, &k, &u);
4010 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
4012 return av_gettime();
4016 static int64_t getmaxrss(void)
4018 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4019 struct rusage rusage;
4020 getrusage(RUSAGE_SELF, &rusage);
4021 return (int64_t)rusage.ru_maxrss * 1024;
4022 #elif HAVE_GETPROCESSMEMORYINFO
4024 PROCESS_MEMORY_COUNTERS memcounters;
4025 proc = GetCurrentProcess();
4026 memcounters.cb = sizeof(memcounters);
4027 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4028 return memcounters.PeakPagefileUsage;
4034 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4037 const char *p = str;
4044 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4051 static void opt_inter_matrix(const char *arg)
4053 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4054 parse_matrix_coeffs(inter_matrix, arg);
4057 static void opt_intra_matrix(const char *arg)
4059 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4060 parse_matrix_coeffs(intra_matrix, arg);
4063 static void show_usage(void)
4065 printf("Hyper fast Audio and Video encoder\n");
4066 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4070 static void show_help(void)
4073 AVOutputFormat *oformat = NULL;
4075 av_log_set_callback(log_callback_help);
4077 show_help_options(options, "Main options:\n",
4078 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4079 show_help_options(options, "\nAdvanced options:\n",
4080 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4082 show_help_options(options, "\nVideo options:\n",
4083 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4085 show_help_options(options, "\nAdvanced Video options:\n",
4086 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4087 OPT_VIDEO | OPT_EXPERT);
4088 show_help_options(options, "\nAudio options:\n",
4089 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4091 show_help_options(options, "\nAdvanced Audio options:\n",
4092 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4093 OPT_AUDIO | OPT_EXPERT);
4094 show_help_options(options, "\nSubtitle options:\n",
4095 OPT_SUBTITLE | OPT_GRAB,
4097 show_help_options(options, "\nAudio/Video grab options:\n",
4101 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4104 /* individual codec options */
4106 while ((c = av_codec_next(c))) {
4107 if (c->priv_class) {
4108 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4113 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4116 /* individual muxer options */
4117 while ((oformat = av_oformat_next(oformat))) {
4118 if (oformat->priv_class) {
4119 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4124 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4127 static int opt_target(const char *opt, const char *arg)
4129 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4130 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4132 if(!strncmp(arg, "pal-", 4)) {
4135 } else if(!strncmp(arg, "ntsc-", 5)) {
4138 } else if(!strncmp(arg, "film-", 5)) {
4143 /* Calculate FR via float to avoid int overflow */
4144 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4147 } else if((fr == 29970) || (fr == 23976)) {
4150 /* Try to determine PAL/NTSC by peeking in the input files */
4151 if(nb_input_files) {
4153 for (j = 0; j < nb_input_files; j++) {
4154 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4155 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4156 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4158 fr = c->time_base.den * 1000 / c->time_base.num;
4162 } else if((fr == 29970) || (fr == 23976)) {
4172 if(verbose > 0 && norm != UNKNOWN)
4173 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4176 if(norm == UNKNOWN) {
4177 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4178 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4179 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4183 if(!strcmp(arg, "vcd")) {
4184 opt_codec("vcodec", "mpeg1video");
4185 opt_codec("acodec", "mp2");
4186 opt_format("f", "vcd");
4188 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4189 opt_frame_rate("r", frame_rates[norm]);
4190 opt_default("g", norm == PAL ? "15" : "18");
4192 opt_default("b", "1150000");
4193 opt_default("maxrate", "1150000");
4194 opt_default("minrate", "1150000");
4195 opt_default("bufsize", "327680"); // 40*1024*8;
4197 opt_default("ab", "224000");
4198 audio_sample_rate = 44100;
4201 opt_default("packetsize", "2324");
4202 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4204 /* We have to offset the PTS, so that it is consistent with the SCR.
4205 SCR starts at 36000, but the first two packs contain only padding
4206 and the first pack from the other stream, respectively, may also have
4207 been written before.
4208 So the real data starts at SCR 36000+3*1200. */
4209 mux_preload= (36000+3*1200) / 90000.0; //0.44
4210 } else if(!strcmp(arg, "svcd")) {
4212 opt_codec("vcodec", "mpeg2video");
4213 opt_codec("acodec", "mp2");
4214 opt_format("f", "svcd");
4216 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4217 opt_frame_rate("r", frame_rates[norm]);
4218 opt_default("g", norm == PAL ? "15" : "18");
4220 opt_default("b", "2040000");
4221 opt_default("maxrate", "2516000");
4222 opt_default("minrate", "0"); //1145000;
4223 opt_default("bufsize", "1835008"); //224*1024*8;
4224 opt_default("flags", "+scan_offset");
4227 opt_default("ab", "224000");
4228 audio_sample_rate = 44100;
4230 opt_default("packetsize", "2324");
4232 } else if(!strcmp(arg, "dvd")) {
4234 opt_codec("vcodec", "mpeg2video");
4235 opt_codec("acodec", "ac3");
4236 opt_format("f", "dvd");
4238 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4239 opt_frame_rate("r", frame_rates[norm]);
4240 opt_default("g", norm == PAL ? "15" : "18");
4242 opt_default("b", "6000000");
4243 opt_default("maxrate", "9000000");
4244 opt_default("minrate", "0"); //1500000;
4245 opt_default("bufsize", "1835008"); //224*1024*8;
4247 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4248 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4250 opt_default("ab", "448000");
4251 audio_sample_rate = 48000;
4253 } else if(!strncmp(arg, "dv", 2)) {
4255 opt_format("f", "dv");
4257 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4258 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4259 norm == PAL ? "yuv420p" : "yuv411p");
4260 opt_frame_rate("r", frame_rates[norm]);
4262 audio_sample_rate = 48000;
4266 fprintf(stderr, "Unknown target: %s\n", arg);
4267 return AVERROR(EINVAL);
4272 static int opt_vstats_file(const char *opt, const char *arg)
4274 av_free (vstats_filename);
4275 vstats_filename=av_strdup (arg);
4279 static int opt_vstats(const char *opt, const char *arg)
4282 time_t today2 = time(NULL);
4283 struct tm *today = localtime(&today2);
4285 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4287 return opt_vstats_file(opt, filename);
4290 static int opt_bsf(const char *opt, const char *arg)
4292 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4293 AVBitStreamFilterContext **bsfp;
4296 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4300 bsfp= *opt == 'v' ? &video_bitstream_filters :
4301 *opt == 'a' ? &audio_bitstream_filters :
4302 &subtitle_bitstream_filters;
4304 bsfp= &(*bsfp)->next;
4311 static int opt_preset(const char *opt, const char *arg)
4314 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4315 char *codec_name = *opt == 'v' ? video_codec_name :
4316 *opt == 'a' ? audio_codec_name :
4317 subtitle_codec_name;
4319 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4320 fprintf(stderr, "File for preset '%s' not found\n", arg);
4325 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4326 if(line[0] == '#' && !e)
4328 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4330 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4333 if (!strcmp(tmp, "acodec") ||
4334 !strcmp(tmp, "vcodec") ||
4335 !strcmp(tmp, "scodec") ||
4336 !strcmp(tmp, "dcodec")) {
4337 opt_codec(tmp, tmp2);
4338 }else if(opt_default(tmp, tmp2) < 0){
4339 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4349 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4353 static void opt_passlogfile(const char *arg)
4355 pass_logfilename_prefix = arg;
4356 opt_default("passlogfile", arg);
4359 static const OptionDef options[] = {
4361 #include "cmdutils_common_opts.h"
4362 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4363 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4364 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4365 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4366 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4367 "outfile[,metadata]:infile[,metadata]" },
4368 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4369 "outfile[,metadata]:infile[,metadata]" },
4370 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4371 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4372 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4373 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4374 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4375 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4376 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4377 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4378 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4379 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4380 "add timings for benchmarking" },
4381 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4382 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4383 "dump each input packet" },
4384 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4385 "when dumping packets, also dump the payload" },
4386 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4387 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4388 { "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)", "" },
4389 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4390 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4391 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4392 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4393 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4394 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4395 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4396 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4397 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4398 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4399 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4400 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4401 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4404 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4405 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4406 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4407 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4408 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4409 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4410 { "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" },
4411 { "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" },
4412 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4413 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4414 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4415 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4416 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4417 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4418 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4419 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4420 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4421 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4422 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4423 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4424 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4425 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4426 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4427 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4428 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4429 "use same quantizer as source (implies VBR)" },
4430 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4431 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4432 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4433 "deinterlace pictures" },
4434 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4435 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4436 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4438 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4440 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4441 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4442 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4443 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4444 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4445 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4446 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4447 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4448 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4449 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4450 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4453 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4454 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4455 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4456 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4457 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4458 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4459 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4460 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4461 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4462 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4463 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4464 { "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" },
4466 /* subtitle options */
4467 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4468 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4469 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4470 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4471 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4474 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4475 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4476 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4479 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4480 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4482 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4483 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4484 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4486 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4487 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4488 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4489 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4490 /* data codec support */
4491 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
4493 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4497 int main(int argc, char **argv)
4501 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4503 if(argc>1 && !strcmp(argv[1], "-d")){
4506 av_log_set_callback(log_callback_null);
4511 avcodec_register_all();
4513 avdevice_register_all();
4516 avfilter_register_all();
4521 if(isatty(STDIN_FILENO))
4522 avio_set_interrupt_cb(decode_interrupt_cb);
4531 parse_options(argc, argv, options, opt_output_file);
4533 if(nb_output_files <= 0 && nb_input_files == 0) {
4535 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4539 /* file converter / grab */
4540 if (nb_output_files <= 0) {
4541 fprintf(stderr, "At least one output file must be specified\n");
4545 if (nb_input_files == 0) {
4546 fprintf(stderr, "At least one input file must be specified\n");
4551 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4552 stream_maps, nb_stream_maps) < 0)
4554 ti = getutime() - ti;
4556 int maxrss = getmaxrss() / 1024;
4557 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4560 return ffmpeg_exit(0);