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, avcodec_get_pix_fmt_name(ost->resample_pix_fmt),
1212 dec->width , dec->height , avcodec_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, ost->resample_frame.data, ost->resample_frame.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;
1382 double bitrate, ti1, pts;
1383 static int64_t last_time = -1;
1384 static int qp_histogram[52];
1386 if (!is_last_report) {
1388 /* display the report every 0.5 seconds */
1389 cur_time = av_gettime();
1390 if (last_time == -1) {
1391 last_time = cur_time;
1394 if ((cur_time - last_time) < 500000)
1396 last_time = cur_time;
1400 oc = output_files[0];
1402 total_size = avio_size(oc->pb);
1403 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1404 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 = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1459 if ((pts < ti1) && (pts > 0))
1465 if (verbose > 0 || is_last_report) {
1466 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1468 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1469 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1470 (double)total_size / 1024, ti1, bitrate);
1472 if (nb_frames_dup || nb_frames_drop)
1473 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1474 nb_frames_dup, nb_frames_drop);
1477 fprintf(stderr, "%s \r", buf);
1482 if (is_last_report && verbose >= 0){
1483 int64_t raw= audio_size + video_size + extra_size;
1484 fprintf(stderr, "\n");
1485 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1489 100.0*(total_size - raw)/raw
1494 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1496 int fill_char = 0x00;
1497 if (sample_fmt == AV_SAMPLE_FMT_U8)
1499 memset(buf, fill_char, size);
1502 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1503 static int output_packet(AVInputStream *ist, int ist_index,
1504 AVOutputStream **ost_table, int nb_ostreams,
1505 const AVPacket *pkt)
1507 AVFormatContext *os;
1508 AVOutputStream *ost;
1512 void *buffer_to_free = NULL;
1513 static unsigned int samples_size= 0;
1514 AVSubtitle subtitle, *subtitle_to_free;
1515 int64_t pkt_pts = AV_NOPTS_VALUE;
1517 int frame_available;
1521 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1523 if(ist->next_pts == AV_NOPTS_VALUE)
1524 ist->next_pts= ist->pts;
1528 av_init_packet(&avpkt);
1536 if(pkt->dts != AV_NOPTS_VALUE)
1537 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1538 if(pkt->pts != AV_NOPTS_VALUE)
1539 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1541 //while we have more to decode or while the decoder did output something on EOF
1542 while (avpkt.size > 0 || (!pkt && got_output)) {
1543 uint8_t *data_buf, *decoded_data_buf;
1544 int data_size, decoded_data_size;
1546 ist->pts= ist->next_pts;
1548 if(avpkt.size && avpkt.size != pkt->size &&
1549 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1550 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1551 ist->showed_multi_packet_warning=1;
1554 /* decode the packet if needed */
1555 decoded_data_buf = NULL; /* fail safe */
1556 decoded_data_size= 0;
1557 data_buf = avpkt.data;
1558 data_size = avpkt.size;
1559 subtitle_to_free = NULL;
1560 if (ist->decoding_needed) {
1561 switch(ist->st->codec->codec_type) {
1562 case AVMEDIA_TYPE_AUDIO:{
1563 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1564 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1566 samples= av_malloc(samples_size);
1568 decoded_data_size= samples_size;
1569 /* XXX: could avoid copy if PCM 16 bits with same
1570 endianness as CPU */
1571 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1578 got_output = decoded_data_size > 0;
1579 /* Some bug in mpeg audio decoder gives */
1580 /* decoded_data_size < 0, it seems they are overflows */
1582 /* no audio frame */
1585 decoded_data_buf = (uint8_t *)samples;
1586 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1587 (ist->st->codec->sample_rate * ist->st->codec->channels);
1589 case AVMEDIA_TYPE_VIDEO:
1590 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1591 /* XXX: allocate picture correctly */
1592 avcodec_get_frame_defaults(&picture);
1593 avpkt.pts = pkt_pts;
1594 avpkt.dts = ist->pts;
1595 pkt_pts = AV_NOPTS_VALUE;
1597 ret = avcodec_decode_video2(ist->st->codec,
1598 &picture, &got_output, &avpkt);
1599 ist->st->quality= picture.quality;
1603 /* no picture yet */
1604 goto discard_packet;
1606 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1607 if (ist->st->codec->time_base.num != 0) {
1608 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1609 ist->next_pts += ((int64_t)AV_TIME_BASE *
1610 ist->st->codec->time_base.num * ticks) /
1611 ist->st->codec->time_base.den;
1614 buffer_to_free = NULL;
1615 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1617 case AVMEDIA_TYPE_SUBTITLE:
1618 ret = avcodec_decode_subtitle2(ist->st->codec,
1619 &subtitle, &got_output, &avpkt);
1623 goto discard_packet;
1625 subtitle_to_free = &subtitle;
1632 switch(ist->st->codec->codec_type) {
1633 case AVMEDIA_TYPE_AUDIO:
1634 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1635 ist->st->codec->sample_rate;
1637 case AVMEDIA_TYPE_VIDEO:
1638 if (ist->st->codec->time_base.num != 0) {
1639 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1640 ist->next_pts += ((int64_t)AV_TIME_BASE *
1641 ist->st->codec->time_base.num * ticks) /
1642 ist->st->codec->time_base.den;
1651 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1652 for(i=0;i<nb_ostreams;i++) {
1654 if (ost->input_video_filter && ost->source_index == ist_index) {
1655 if (!picture.sample_aspect_ratio.num)
1656 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1657 picture.pts = ist->pts;
1659 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture);
1665 // preprocess audio (volume)
1666 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1667 if (audio_volume != 256) {
1670 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1671 int v = ((*volp) * audio_volume + 128) >> 8;
1672 if (v < -32768) v = -32768;
1673 if (v > 32767) v = 32767;
1679 /* frame rate emulation */
1681 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1682 int64_t now = av_gettime() - ist->start;
1686 /* if output time reached then transcode raw format,
1687 encode packets and output them */
1688 if (start_time == 0 || ist->pts >= start_time)
1689 for(i=0;i<nb_ostreams;i++) {
1693 if (ost->source_index == ist_index) {
1695 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1696 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1697 while (frame_available) {
1698 AVRational ist_pts_tb;
1699 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1700 if (get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb) < 0)
1703 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1705 os = output_files[ost->file_index];
1707 /* set the input output pts pairs */
1708 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1710 if (ost->encoding_needed) {
1711 av_assert0(ist->decoding_needed);
1712 switch(ost->st->codec->codec_type) {
1713 case AVMEDIA_TYPE_AUDIO:
1714 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1716 case AVMEDIA_TYPE_VIDEO:
1718 if (ost->picref->video && !ost->frame_aspect_ratio)
1719 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1721 do_video_out(os, ost, ist, &picture, &frame_size);
1722 if (vstats_filename && frame_size)
1723 do_video_stats(os, ost, frame_size);
1725 case AVMEDIA_TYPE_SUBTITLE:
1726 do_subtitle_out(os, ost, ist, &subtitle,
1733 AVFrame avframe; //FIXME/XXX remove this
1736 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1738 av_init_packet(&opkt);
1740 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1741 #if !CONFIG_AVFILTER
1747 /* no reencoding needed : output the packet directly */
1748 /* force the input stream PTS */
1750 avcodec_get_frame_defaults(&avframe);
1751 ost->st->codec->coded_frame= &avframe;
1752 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1754 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1755 audio_size += data_size;
1756 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1757 video_size += data_size;
1761 opkt.stream_index= ost->index;
1762 if(pkt->pts != AV_NOPTS_VALUE)
1763 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1765 opkt.pts= AV_NOPTS_VALUE;
1767 if (pkt->dts == AV_NOPTS_VALUE)
1768 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1770 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1771 opkt.dts -= ost_tb_start_time;
1773 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1774 opkt.flags= pkt->flags;
1776 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1777 if( ost->st->codec->codec_id != CODEC_ID_H264
1778 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1779 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1781 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1782 opkt.destruct= av_destruct_packet;
1784 opkt.data = data_buf;
1785 opkt.size = data_size;
1788 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1789 /* store AVPicture in AVPacket, as expected by the output format */
1790 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1791 opkt.data = (uint8_t *)&pict;
1792 opkt.size = sizeof(AVPicture);
1793 opkt.flags |= AV_PKT_FLAG_KEY;
1795 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1796 ost->st->codec->frame_number++;
1797 ost->frame_number++;
1798 av_free_packet(&opkt);
1802 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1803 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1804 avfilter_unref_buffer(ost->picref);
1810 av_free(buffer_to_free);
1811 /* XXX: allocate the subtitles in the codec ? */
1812 if (subtitle_to_free) {
1813 avsubtitle_free(subtitle_to_free);
1814 subtitle_to_free = NULL;
1821 for(i=0;i<nb_ostreams;i++) {
1823 if (ost->source_index == ist_index) {
1824 AVCodecContext *enc= ost->st->codec;
1825 os = output_files[ost->file_index];
1827 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1829 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1832 if (ost->encoding_needed) {
1836 av_init_packet(&pkt);
1837 pkt.stream_index= ost->index;
1839 switch(ost->st->codec->codec_type) {
1840 case AVMEDIA_TYPE_AUDIO:
1841 fifo_bytes = av_fifo_size(ost->fifo);
1843 /* encode any samples remaining in fifo */
1844 if (fifo_bytes > 0) {
1845 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1846 int fs_tmp = enc->frame_size;
1848 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1849 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1850 enc->frame_size = fifo_bytes / (osize * enc->channels);
1852 int frame_bytes = enc->frame_size*osize*enc->channels;
1853 if (allocated_audio_buf_size < frame_bytes)
1855 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1858 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1859 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1860 ost->st->time_base.num, enc->sample_rate);
1861 enc->frame_size = fs_tmp;
1864 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1867 fprintf(stderr, "Audio encoding failed\n");
1871 pkt.flags |= AV_PKT_FLAG_KEY;
1873 case AVMEDIA_TYPE_VIDEO:
1874 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1876 fprintf(stderr, "Video encoding failed\n");
1880 if(enc->coded_frame && enc->coded_frame->key_frame)
1881 pkt.flags |= AV_PKT_FLAG_KEY;
1882 if (ost->logfile && enc->stats_out) {
1883 fprintf(ost->logfile, "%s", enc->stats_out);
1892 pkt.data= bit_buffer;
1894 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1895 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1896 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1908 static void print_sdp(AVFormatContext **avc, int n)
1912 av_sdp_create(avc, n, sdp, sizeof(sdp));
1913 printf("SDP:\n%s\n", sdp);
1917 static int copy_chapters(int infile, int outfile)
1919 AVFormatContext *is = input_files[infile].ctx;
1920 AVFormatContext *os = output_files[outfile];
1923 for (i = 0; i < is->nb_chapters; i++) {
1924 AVChapter *in_ch = is->chapters[i], *out_ch;
1925 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1926 AV_TIME_BASE_Q, in_ch->time_base);
1927 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1928 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1931 if (in_ch->end < ts_off)
1933 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1936 out_ch = av_mallocz(sizeof(AVChapter));
1938 return AVERROR(ENOMEM);
1940 out_ch->id = in_ch->id;
1941 out_ch->time_base = in_ch->time_base;
1942 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1943 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1945 if (metadata_chapters_autocopy)
1946 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1949 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1951 return AVERROR(ENOMEM);
1952 os->chapters[os->nb_chapters - 1] = out_ch;
1957 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1958 AVCodecContext *avctx)
1964 for (p = kf; *p; p++)
1967 ost->forced_kf_count = n;
1968 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1969 if (!ost->forced_kf_pts) {
1970 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1973 for (i = 0; i < n; i++) {
1974 p = i ? strchr(p, ',') + 1 : kf;
1975 t = parse_time_or_die("force_key_frames", p, 1);
1976 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1981 * The following code is the main loop of the file converter
1983 static int transcode(AVFormatContext **output_files,
1984 int nb_output_files,
1985 AVInputFile *input_files,
1987 AVStreamMap *stream_maps, int nb_stream_maps)
1989 int ret = 0, i, j, k, n, nb_ostreams = 0, step;
1991 AVFormatContext *is, *os;
1992 AVCodecContext *codec, *icodec;
1993 AVOutputStream *ost, **ost_table = NULL;
1998 uint8_t no_packet[MAX_FILES]={0};
1999 int no_packet_count=0;
2000 int nb_frame_threshold[AVMEDIA_TYPE_NB]={0};
2001 int nb_streams[AVMEDIA_TYPE_NB]={0};
2004 for (i = 0; i < nb_input_streams; i++)
2005 input_streams[i].start = av_gettime();
2007 /* output stream init */
2009 for(i=0;i<nb_output_files;i++) {
2010 os = output_files[i];
2011 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
2012 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2013 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
2014 ret = AVERROR(EINVAL);
2017 nb_ostreams += os->nb_streams;
2019 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
2020 fprintf(stderr, "Number of stream maps must match number of output streams\n");
2021 ret = AVERROR(EINVAL);
2025 /* Sanity check the mapping args -- do the input files & streams exist? */
2026 for(i=0;i<nb_stream_maps;i++) {
2027 int fi = stream_maps[i].file_index;
2028 int si = stream_maps[i].stream_index;
2030 if (fi < 0 || fi > nb_input_files - 1 ||
2031 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2032 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2033 ret = AVERROR(EINVAL);
2036 fi = stream_maps[i].sync_file_index;
2037 si = stream_maps[i].sync_stream_index;
2038 if (fi < 0 || fi > nb_input_files - 1 ||
2039 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2040 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2041 ret = AVERROR(EINVAL);
2046 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2050 for(k=0;k<nb_output_files;k++) {
2051 os = output_files[k];
2052 for(i=0;i<os->nb_streams;i++,n++) {
2053 nb_streams[os->streams[i]->codec->codec_type]++;
2056 for(step=1<<30; step; step>>=1){
2057 int found_streams[AVMEDIA_TYPE_NB]={0};
2058 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2059 nb_frame_threshold[j] += step;
2061 for(j=0; j<nb_input_streams; j++) {
2063 ist = &input_streams[j];
2066 AVFormatContext *f= input_files[ ist->file_index ].ctx;
2068 for(pi=0; pi<f->nb_programs; pi++){
2069 AVProgram *p= f->programs[pi];
2070 if(p->id == opt_programid)
2071 for(si=0; si<p->nb_stream_indexes; si++){
2072 if(f->streams[ p->stream_index[si] ] == ist->st)
2077 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip
2078 && nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames){
2079 found_streams[ist->st->codec->codec_type]++;
2082 for(j=0; j<AVMEDIA_TYPE_NB; j++)
2083 if(found_streams[j] < nb_streams[j])
2084 nb_frame_threshold[j] -= step;
2087 for(k=0;k<nb_output_files;k++) {
2088 os = output_files[k];
2089 for(i=0;i<os->nb_streams;i++,n++) {
2091 ost = ost_table[n] = output_streams_for_file[k][i];
2092 ost->st = os->streams[i];
2093 if (nb_stream_maps > 0) {
2094 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2095 stream_maps[n].stream_index;
2097 /* Sanity check that the stream types match */
2098 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2099 int i= ost->file_index;
2100 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2101 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2102 stream_maps[n].file_index, stream_maps[n].stream_index,
2103 ost->file_index, ost->index);
2108 /* get corresponding input stream index : we select the first one with the right type */
2110 for (j = 0; j < nb_input_streams; j++) {
2112 ist = &input_streams[j];
2115 AVFormatContext *f = input_files[ist->file_index].ctx;
2117 for(pi=0; pi<f->nb_programs; pi++){
2118 AVProgram *p= f->programs[pi];
2119 if(p->id == opt_programid)
2120 for(si=0; si<p->nb_stream_indexes; si++){
2121 if(f->streams[ p->stream_index[si] ] == ist->st)
2126 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2127 ist->st->codec->codec_type == ost->st->codec->codec_type &&
2128 nb_frame_threshold[ist->st->codec->codec_type] <= ist->st->codec_info_nb_frames) {
2129 ost->source_index = j;
2136 if(! opt_programid) {
2137 /* try again and reuse existing stream */
2138 for (j = 0; j < nb_input_streams; j++) {
2139 ist = &input_streams[j];
2140 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2141 && ist->st->discard != AVDISCARD_ALL) {
2142 ost->source_index = j;
2148 int i= ost->file_index;
2149 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2150 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2151 ost->file_index, ost->index);
2156 ist = &input_streams[ost->source_index];
2158 ost->sync_ist = (nb_stream_maps > 0) ?
2159 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2160 stream_maps[n].sync_stream_index] : ist;
2164 /* for each output stream, we compute the right encoding parameters */
2165 for(i=0;i<nb_ostreams;i++) {
2167 os = output_files[ost->file_index];
2168 ist = &input_streams[ost->source_index];
2170 codec = ost->st->codec;
2171 icodec = ist->st->codec;
2173 if (metadata_streams_autocopy)
2174 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2175 AV_METADATA_DONT_OVERWRITE);
2177 ost->st->disposition = ist->st->disposition;
2178 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2179 codec->chroma_sample_location = icodec->chroma_sample_location;
2181 if (ost->st->stream_copy) {
2182 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2184 if (extra_size > INT_MAX)
2187 /* if stream_copy is selected, no need to decode or encode */
2188 codec->codec_id = icodec->codec_id;
2189 codec->codec_type = icodec->codec_type;
2191 if(!codec->codec_tag){
2192 if( !os->oformat->codec_tag
2193 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2194 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2195 codec->codec_tag = icodec->codec_tag;
2198 codec->bit_rate = icodec->bit_rate;
2199 codec->rc_max_rate = icodec->rc_max_rate;
2200 codec->rc_buffer_size = icodec->rc_buffer_size;
2201 codec->extradata= av_mallocz(extra_size);
2202 if (!codec->extradata)
2204 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2205 codec->extradata_size= icodec->extradata_size;
2206 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){
2207 codec->time_base = icodec->time_base;
2208 codec->time_base.num *= icodec->ticks_per_frame;
2209 av_reduce(&codec->time_base.num, &codec->time_base.den,
2210 codec->time_base.num, codec->time_base.den, INT_MAX);
2212 codec->time_base = ist->st->time_base;
2213 switch(codec->codec_type) {
2214 case AVMEDIA_TYPE_AUDIO:
2215 if(audio_volume != 256) {
2216 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2219 codec->channel_layout = icodec->channel_layout;
2220 codec->sample_rate = icodec->sample_rate;
2221 codec->channels = icodec->channels;
2222 codec->frame_size = icodec->frame_size;
2223 codec->audio_service_type = icodec->audio_service_type;
2224 codec->block_align= icodec->block_align;
2225 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2226 codec->block_align= 0;
2227 if(codec->codec_id == CODEC_ID_AC3)
2228 codec->block_align= 0;
2230 case AVMEDIA_TYPE_VIDEO:
2231 codec->pix_fmt = icodec->pix_fmt;
2232 codec->width = icodec->width;
2233 codec->height = icodec->height;
2234 codec->has_b_frames = icodec->has_b_frames;
2235 if (!codec->sample_aspect_ratio.num) {
2236 codec->sample_aspect_ratio =
2237 ost->st->sample_aspect_ratio =
2238 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2239 ist->st->codec->sample_aspect_ratio.num ?
2240 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2243 case AVMEDIA_TYPE_SUBTITLE:
2244 codec->width = icodec->width;
2245 codec->height = icodec->height;
2247 case AVMEDIA_TYPE_DATA:
2253 switch(codec->codec_type) {
2254 case AVMEDIA_TYPE_AUDIO:
2255 ost->fifo= av_fifo_alloc(1024);
2258 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2259 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2260 icodec->request_channels = codec->channels;
2261 ist->decoding_needed = 1;
2262 ost->encoding_needed = 1;
2263 ost->resample_sample_fmt = icodec->sample_fmt;
2264 ost->resample_sample_rate = icodec->sample_rate;
2265 ost->resample_channels = icodec->channels;
2267 case AVMEDIA_TYPE_VIDEO:
2268 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2269 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2272 ost->video_resample = codec->width != icodec->width ||
2273 codec->height != icodec->height ||
2274 codec->pix_fmt != icodec->pix_fmt;
2275 if (ost->video_resample) {
2276 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2278 ost->resample_height = icodec->height;
2279 ost->resample_width = icodec->width;
2280 ost->resample_pix_fmt= icodec->pix_fmt;
2281 ost->encoding_needed = 1;
2282 ist->decoding_needed = 1;
2285 if (configure_video_filters(ist, ost)) {
2286 fprintf(stderr, "Error opening filters!\n");
2291 case AVMEDIA_TYPE_SUBTITLE:
2292 ost->encoding_needed = 1;
2293 ist->decoding_needed = 1;
2300 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2301 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2302 char logfilename[1024];
2305 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2306 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2308 if (codec->flags & CODEC_FLAG_PASS1) {
2309 f = fopen(logfilename, "wb");
2311 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2317 size_t logbuffer_size;
2318 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2319 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2322 codec->stats_in = logbuffer;
2326 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2327 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2328 int size= codec->width * codec->height;
2329 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2334 bit_buffer = av_malloc(bit_buffer_size);
2336 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2338 ret = AVERROR(ENOMEM);
2342 /* open each encoder */
2343 for(i=0;i<nb_ostreams;i++) {
2345 if (ost->encoding_needed) {
2346 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2347 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2349 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2351 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2352 ost->st->codec->codec_id, ost->file_index, ost->index);
2353 ret = AVERROR(EINVAL);
2356 if (dec->subtitle_header) {
2357 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2358 if (!ost->st->codec->subtitle_header) {
2359 ret = AVERROR(ENOMEM);
2362 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2363 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2365 if (avcodec_open(ost->st->codec, codec) < 0) {
2366 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2367 ost->file_index, ost->index);
2368 ret = AVERROR(EINVAL);
2371 extra_size += ost->st->codec->extradata_size;
2375 /* open each decoder */
2376 for (i = 0; i < nb_input_streams; i++) {
2377 ist = &input_streams[i];
2378 if (ist->decoding_needed) {
2379 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2381 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2383 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2384 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2385 ret = AVERROR(EINVAL);
2388 if (avcodec_open(ist->st->codec, codec) < 0) {
2389 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2390 ist->file_index, ist->st->index);
2391 ret = AVERROR(EINVAL);
2394 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2395 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2400 for (i = 0; i < nb_input_streams; i++) {
2402 ist = &input_streams[i];
2404 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2405 ist->next_pts = AV_NOPTS_VALUE;
2409 /* set meta data information from input file if required */
2410 for (i=0;i<nb_meta_data_maps;i++) {
2411 AVFormatContext *files[2];
2412 AVMetadata **meta[2];
2415 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2416 if ((index) < 0 || (index) >= (nb_elems)) {\
2417 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2419 ret = AVERROR(EINVAL);\
2423 int out_file_index = meta_data_maps[i][0].file;
2424 int in_file_index = meta_data_maps[i][1].file;
2425 if (in_file_index < 0 || out_file_index < 0)
2427 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2428 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2430 files[0] = output_files[out_file_index];
2431 files[1] = input_files[in_file_index].ctx;
2433 for (j = 0; j < 2; j++) {
2434 AVMetaDataMap *map = &meta_data_maps[i][j];
2436 switch (map->type) {
2438 meta[j] = &files[j]->metadata;
2441 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2442 meta[j] = &files[j]->streams[map->index]->metadata;
2445 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2446 meta[j] = &files[j]->chapters[map->index]->metadata;
2449 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2450 meta[j] = &files[j]->programs[map->index]->metadata;
2455 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2458 /* copy global metadata by default */
2459 if (metadata_global_autocopy) {
2461 for (i = 0; i < nb_output_files; i++)
2462 av_metadata_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2463 AV_METADATA_DONT_OVERWRITE);
2466 /* copy chapters according to chapter maps */
2467 for (i = 0; i < nb_chapter_maps; i++) {
2468 int infile = chapter_maps[i].in_file;
2469 int outfile = chapter_maps[i].out_file;
2471 if (infile < 0 || outfile < 0)
2473 if (infile >= nb_input_files) {
2474 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2475 ret = AVERROR(EINVAL);
2478 if (outfile >= nb_output_files) {
2479 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2480 ret = AVERROR(EINVAL);
2483 copy_chapters(infile, outfile);
2486 /* copy chapters from the first input file that has them*/
2487 if (!nb_chapter_maps)
2488 for (i = 0; i < nb_input_files; i++) {
2489 if (!input_files[i].ctx->nb_chapters)
2492 for (j = 0; j < nb_output_files; j++)
2493 if ((ret = copy_chapters(i, j)) < 0)
2498 /* open files and write file headers */
2499 for(i=0;i<nb_output_files;i++) {
2500 os = output_files[i];
2501 if (av_write_header(os) < 0) {
2502 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2503 ret = AVERROR(EINVAL);
2506 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2512 /* dump the file output parameters - cannot be done before in case
2514 for(i=0;i<nb_output_files;i++) {
2515 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2518 /* dump the stream mapping */
2520 fprintf(stderr, "Stream mapping:\n");
2521 for(i=0;i<nb_ostreams;i++) {
2523 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2524 input_streams[ost->source_index].file_index,
2525 input_streams[ost->source_index].st->index,
2528 if (ost->sync_ist != &input_streams[ost->source_index])
2529 fprintf(stderr, " [sync #%d.%d]",
2530 ost->sync_ist->file_index,
2531 ost->sync_ist->st->index);
2532 fprintf(stderr, "\n");
2537 fprintf(stderr, "%s\n", error);
2542 print_sdp(output_files, nb_output_files);
2547 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2548 avio_set_interrupt_cb(decode_interrupt_cb);
2552 timer_start = av_gettime();
2554 for(; received_sigterm == 0;) {
2555 int file_index, ist_index;
2563 /* if 'q' pressed, exits */
2567 /* read_key() returns 0 on EOF */
2571 if (key == '+') verbose++;
2572 if (key == '-') verbose--;
2573 if (key == 's') qp_hist ^= 1;
2576 do_hex_dump = do_pkt_dump = 0;
2577 } else if(do_pkt_dump){
2581 av_log_set_level(AV_LOG_DEBUG);
2583 if (key == 'd' || key == 'D'){
2586 debug = input_streams[0].st->codec->debug<<1;
2587 if(!debug) debug = 1;
2588 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2591 scanf("%d", &debug);
2592 for(i=0;i<nb_input_streams;i++) {
2593 input_streams[i].st->codec->debug = debug;
2595 for(i=0;i<nb_ostreams;i++) {
2597 ost->st->codec->debug = debug;
2599 if(debug) av_log_set_level(AV_LOG_DEBUG);
2600 fprintf(stderr,"debug=%d\n", debug);
2603 fprintf(stderr, "key function\n"
2604 "? show this help\n"
2605 "+ increase verbosity\n"
2606 "- decrease verbosity\n"
2607 "D cycle through available debug modes\n"
2608 "h dump packets/hex press to cycle through the 3 states\n"
2610 "s Show QP histogram\n"
2615 /* select the stream that we must read now by looking at the
2616 smallest output pts */
2618 for(i=0;i<nb_ostreams;i++) {
2621 os = output_files[ost->file_index];
2622 ist = &input_streams[ost->source_index];
2623 if(ist->is_past_recording_time || no_packet[ist->file_index])
2625 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2626 ipts = (double)ist->pts;
2627 if (!input_files[ist->file_index].eof_reached){
2628 if(ipts < ipts_min) {
2630 if(input_sync ) file_index = ist->file_index;
2632 if(opts < opts_min) {
2634 if(!input_sync) file_index = ist->file_index;
2637 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2642 /* if none, if is finished */
2643 if (file_index < 0) {
2644 if(no_packet_count){
2646 memset(no_packet, 0, sizeof(no_packet));
2653 /* finish if limit size exhausted */
2654 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2657 /* read a frame from it and output it in the fifo */
2658 is = input_files[file_index].ctx;
2659 ret= av_read_frame(is, &pkt);
2660 if(ret == AVERROR(EAGAIN)){
2661 no_packet[file_index]=1;
2666 input_files[file_index].eof_reached = 1;
2674 memset(no_packet, 0, sizeof(no_packet));
2677 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2678 is->streams[pkt.stream_index]);
2680 /* the following test is needed in case new streams appear
2681 dynamically in stream : we ignore them */
2682 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2683 goto discard_packet;
2684 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2685 ist = &input_streams[ist_index];
2687 goto discard_packet;
2689 if (pkt.dts != AV_NOPTS_VALUE)
2690 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2691 if (pkt.pts != AV_NOPTS_VALUE)
2692 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2694 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2695 && input_files_ts_scale[file_index][pkt.stream_index]){
2696 if(pkt.pts != AV_NOPTS_VALUE)
2697 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2698 if(pkt.dts != AV_NOPTS_VALUE)
2699 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2702 // 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);
2703 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2704 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2705 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2706 int64_t delta= pkt_dts - ist->next_pts;
2707 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2708 input_files_ts_offset[ist->file_index]-= delta;
2710 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2711 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2712 if(pkt.pts != AV_NOPTS_VALUE)
2713 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2717 /* finish if recording time exhausted */
2718 if (recording_time != INT64_MAX &&
2719 (pkt.pts != AV_NOPTS_VALUE || pkt.dts != AV_NOPTS_VALUE ?
2720 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000})
2722 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
2724 ist->is_past_recording_time = 1;
2725 goto discard_packet;
2728 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2729 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2732 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2733 ist->file_index, ist->st->index);
2736 av_free_packet(&pkt);
2741 av_free_packet(&pkt);
2743 /* dump report by using the output first video and audio streams */
2744 print_report(output_files, ost_table, nb_ostreams, 0);
2747 /* at the end of stream, we must flush the decoder buffers */
2748 for (i = 0; i < nb_input_streams; i++) {
2749 ist = &input_streams[i];
2750 if (ist->decoding_needed) {
2751 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2757 /* write the trailer if needed and close file */
2758 for(i=0;i<nb_output_files;i++) {
2759 os = output_files[i];
2760 av_write_trailer(os);
2763 /* dump report by using the first video and audio streams */
2764 print_report(output_files, ost_table, nb_ostreams, 1);
2766 /* close each encoder */
2767 for(i=0;i<nb_ostreams;i++) {
2769 if (ost->encoding_needed) {
2770 av_freep(&ost->st->codec->stats_in);
2771 avcodec_close(ost->st->codec);
2774 avfilter_graph_free(&ost->graph);
2778 /* close each decoder */
2779 for (i = 0; i < nb_input_streams; i++) {
2780 ist = &input_streams[i];
2781 if (ist->decoding_needed) {
2782 avcodec_close(ist->st->codec);
2790 av_freep(&bit_buffer);
2793 for(i=0;i<nb_ostreams;i++) {
2796 if (ost->st->stream_copy)
2797 av_freep(&ost->st->codec->extradata);
2799 fclose(ost->logfile);
2800 ost->logfile = NULL;
2802 av_fifo_free(ost->fifo); /* works even if fifo is not
2803 initialized but set to zero */
2804 av_freep(&ost->st->codec->subtitle_header);
2805 av_free(ost->resample_frame.data[0]);
2806 av_free(ost->forced_kf_pts);
2807 if (ost->video_resample)
2808 sws_freeContext(ost->img_resample_ctx);
2810 audio_resample_close(ost->resample);
2811 if (ost->reformat_ctx)
2812 av_audio_convert_free(ost->reformat_ctx);
2821 static int opt_format(const char *opt, const char *arg)
2823 last_asked_format = arg;
2827 static int opt_video_rc_override_string(const char *opt, const char *arg)
2829 video_rc_override_string = arg;
2833 static int opt_me_threshold(const char *opt, const char *arg)
2835 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2839 static int opt_verbose(const char *opt, const char *arg)
2841 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2845 static int opt_frame_rate(const char *opt, const char *arg)
2847 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2848 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2854 static int opt_bitrate(const char *opt, const char *arg)
2856 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2858 opt_default(opt, arg);
2860 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2861 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2866 static int opt_frame_crop(const char *opt, const char *arg)
2868 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2869 return AVERROR(EINVAL);
2872 static int opt_frame_size(const char *opt, const char *arg)
2874 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2875 fprintf(stderr, "Incorrect frame size\n");
2876 return AVERROR(EINVAL);
2881 static int opt_pad(const char *opt, const char *arg) {
2882 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2886 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2888 if (strcmp(arg, "list")) {
2889 frame_pix_fmt = av_get_pix_fmt(arg);
2890 if (frame_pix_fmt == PIX_FMT_NONE) {
2891 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2892 return AVERROR(EINVAL);
2901 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2908 p = strchr(arg, ':');
2910 x = strtol(arg, &end, 10);
2912 y = strtol(end+1, &end, 10);
2914 ar = (double)x / (double)y;
2916 ar = strtod(arg, NULL);
2919 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2920 return AVERROR(EINVAL);
2922 frame_aspect_ratio = ar;
2926 static int opt_metadata(const char *opt, const char *arg)
2928 char *mid= strchr(arg, '=');
2931 fprintf(stderr, "Missing =\n");
2936 av_metadata_set2(&metadata, arg, mid, 0);
2941 static int opt_qscale(const char *opt, const char *arg)
2943 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2944 if (video_qscale <= 0 || video_qscale > 255) {
2945 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2946 return AVERROR(EINVAL);
2951 static int opt_top_field_first(const char *opt, const char *arg)
2953 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2954 opt_default(opt, arg);
2958 static int opt_thread_count(const char *opt, const char *arg)
2960 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2963 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2968 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2970 if (strcmp(arg, "list")) {
2971 audio_sample_fmt = av_get_sample_fmt(arg);
2972 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2973 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2974 return AVERROR(EINVAL);
2979 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2980 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2986 static int opt_audio_rate(const char *opt, const char *arg)
2988 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2992 static int opt_audio_channels(const char *opt, const char *arg)
2994 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2998 static int opt_video_channel(const char *opt, const char *arg)
3000 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
3004 static int opt_video_standard(const char *opt, const char *arg)
3006 video_standard = av_strdup(arg);
3010 static int opt_codec(const char *opt, const char *arg)
3012 int *pstream_copy; char **pcodec_name; enum AVMediaType codec_type;
3014 if (!strcmp(opt, "acodec")) { pstream_copy = &audio_stream_copy; pcodec_name = &audio_codec_name; codec_type = AVMEDIA_TYPE_AUDIO; }
3015 else if (!strcmp(opt, "vcodec")) { pstream_copy = &video_stream_copy; pcodec_name = &video_codec_name; codec_type = AVMEDIA_TYPE_VIDEO; }
3016 else if (!strcmp(opt, "scodec")) { pstream_copy = &subtitle_stream_copy; pcodec_name = &subtitle_codec_name; codec_type = AVMEDIA_TYPE_SUBTITLE; }
3017 else if (!strcmp(opt, "dcodec")) { pstream_copy = &data_stream_copy; pcodec_name = &data_codec_name; codec_type = AVMEDIA_TYPE_DATA; }
3019 av_freep(pcodec_name);
3020 if (!strcmp(arg, "copy")) {
3023 *pcodec_name = av_strdup(arg);
3028 static int opt_codec_tag(const char *opt, const char *arg)
3031 uint32_t *codec_tag;
3033 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
3034 !strcmp(opt, "vtag") ? &video_codec_tag :
3035 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
3039 *codec_tag = strtol(arg, &tail, 0);
3041 *codec_tag = AV_RL32(arg);
3046 static int opt_map(const char *opt, const char *arg)
3051 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
3052 m = &stream_maps[nb_stream_maps-1];
3054 m->file_index = strtol(arg, &p, 0);
3058 m->stream_index = strtol(p, &p, 0);
3061 m->sync_file_index = strtol(p, &p, 0);
3064 m->sync_stream_index = strtol(p, &p, 0);
3066 m->sync_file_index = m->file_index;
3067 m->sync_stream_index = m->stream_index;
3072 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3083 *index = strtol(++arg, endptr, 0);
3086 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3093 static int opt_map_metadata(const char *opt, const char *arg)
3095 AVMetaDataMap *m, *m1;
3098 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3099 &nb_meta_data_maps, nb_meta_data_maps + 1);
3101 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3102 m->file = strtol(arg, &p, 0);
3103 parse_meta_type(p, &m->type, &m->index, &p);
3107 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3108 m1->file = strtol(p, &p, 0);
3109 parse_meta_type(p, &m1->type, &m1->index, &p);
3111 if (m->type == 'g' || m1->type == 'g')
3112 metadata_global_autocopy = 0;
3113 if (m->type == 's' || m1->type == 's')
3114 metadata_streams_autocopy = 0;
3115 if (m->type == 'c' || m1->type == 'c')
3116 metadata_chapters_autocopy = 0;
3121 static int opt_map_meta_data(const char *opt, const char *arg)
3123 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3124 "Use -map_metadata instead.\n");
3125 return opt_map_metadata(opt, arg);
3128 static int opt_map_chapters(const char *opt, const char *arg)
3133 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3134 nb_chapter_maps + 1);
3135 c = &chapter_maps[nb_chapter_maps - 1];
3136 c->out_file = strtol(arg, &p, 0);
3140 c->in_file = strtol(p, &p, 0);
3144 static int opt_input_ts_scale(const char *opt, const char *arg)
3146 unsigned int stream;
3150 stream = strtol(arg, &p, 0);
3153 scale= strtod(p, &p);
3155 if(stream >= MAX_STREAMS)
3158 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);
3159 input_files_ts_scale[nb_input_files][stream]= scale;
3163 static int opt_recording_time(const char *opt, const char *arg)
3165 recording_time = parse_time_or_die(opt, arg, 1);
3169 static int opt_start_time(const char *opt, const char *arg)
3171 start_time = parse_time_or_die(opt, arg, 1);
3175 static int opt_recording_timestamp(const char *opt, const char *arg)
3177 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3181 static int opt_input_ts_offset(const char *opt, const char *arg)
3183 input_ts_offset = parse_time_or_die(opt, arg, 1);
3187 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3189 const char *codec_string = encoder ? "encoder" : "decoder";
3193 return CODEC_ID_NONE;
3195 avcodec_find_encoder_by_name(name) :
3196 avcodec_find_decoder_by_name(name);
3198 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3201 if(codec->type != type) {
3202 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3205 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3206 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3207 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3208 "results.\nAdd '-strict experimental' if you want to use it.\n",
3209 codec_string, codec->name);
3211 avcodec_find_encoder(codec->id) :
3212 avcodec_find_decoder(codec->id);
3213 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3214 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3215 codec_string, codec->name);
3221 static int opt_input_file(const char *opt, const char *filename)
3223 AVFormatContext *ic;
3224 AVFormatParameters params, *ap = ¶ms;
3225 AVInputFormat *file_iformat = NULL;
3226 int err, i, ret, rfps, rfps_base;
3229 if (last_asked_format) {
3230 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3231 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3234 last_asked_format = NULL;
3237 if (!strcmp(filename, "-"))
3240 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3241 !strcmp(filename, "/dev/stdin");
3243 /* get default parameters from command line */
3244 ic = avformat_alloc_context();
3246 print_error(filename, AVERROR(ENOMEM));
3250 memset(ap, 0, sizeof(*ap));
3251 ap->prealloced_context = 1;
3252 ap->sample_rate = audio_sample_rate;
3253 ap->channels = audio_channels;
3254 ap->time_base.den = frame_rate.num;
3255 ap->time_base.num = frame_rate.den;
3256 ap->width = frame_width;
3257 ap->height = frame_height;
3258 ap->pix_fmt = frame_pix_fmt;
3259 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3260 ap->channel = video_channel;
3261 ap->standard = video_standard;
3263 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3265 ic->video_codec_id =
3266 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3267 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3268 ic->audio_codec_id =
3269 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3270 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3271 ic->subtitle_codec_id=
3272 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3273 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3274 ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
3276 /* open the input file with generic libav function */
3277 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3279 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3280 err = av_demuxer_open(ic, ap);
3282 avformat_free_context(ic);
3285 print_error(filename, err);
3291 for(i=0; i<ic->nb_streams; i++){
3292 ic->streams[i]->discard= AVDISCARD_ALL;
3294 for(i=0; i<ic->nb_programs; i++){
3295 AVProgram *p= ic->programs[i];
3296 if(p->id != opt_programid){
3297 p->discard = AVDISCARD_ALL;
3300 for(j=0; j<p->nb_stream_indexes; j++){
3301 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3306 fprintf(stderr, "Specified program id not found\n");
3312 ic->loop_input = loop_input;
3314 /* If not enough info to get the stream parameters, we decode the
3315 first frames to get it. (used in mpeg case for example) */
3316 ret = av_find_stream_info(ic);
3317 if (ret < 0 && verbose >= 0) {
3318 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3319 av_close_input_file(ic);
3323 timestamp = start_time;
3324 /* add the stream start time */
3325 if (ic->start_time != AV_NOPTS_VALUE)
3326 timestamp += ic->start_time;
3328 /* if seeking requested, we execute it */
3329 if (start_time != 0) {
3330 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3332 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3333 filename, (double)timestamp / AV_TIME_BASE);
3335 /* reset seek info */
3339 /* update the current parameters so that they match the one of the input stream */
3340 for(i=0;i<ic->nb_streams;i++) {
3341 AVStream *st = ic->streams[i];
3342 AVCodecContext *dec = st->codec;
3345 dec->thread_count = thread_count;
3346 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3348 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3349 ist = &input_streams[nb_input_streams - 1];
3351 ist->file_index = nb_input_files;
3354 switch (dec->codec_type) {
3355 case AVMEDIA_TYPE_AUDIO:
3356 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3357 if(!input_codecs[nb_input_codecs-1])
3358 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3359 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]);
3360 channel_layout = dec->channel_layout;
3361 audio_channels = dec->channels;
3362 audio_sample_rate = dec->sample_rate;
3363 audio_sample_fmt = dec->sample_fmt;
3365 st->discard= AVDISCARD_ALL;
3366 /* Note that av_find_stream_info can add more streams, and we
3367 * currently have no chance of setting up lowres decoding
3368 * early enough for them. */
3370 audio_sample_rate >>= dec->lowres;
3372 case AVMEDIA_TYPE_VIDEO:
3373 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3374 if(!input_codecs[nb_input_codecs-1])
3375 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3376 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]);
3377 frame_height = dec->height;
3378 frame_width = dec->width;
3379 frame_pix_fmt = dec->pix_fmt;
3380 rfps = ic->streams[i]->r_frame_rate.num;
3381 rfps_base = ic->streams[i]->r_frame_rate.den;
3383 dec->flags |= CODEC_FLAG_EMU_EDGE;
3384 frame_height >>= dec->lowres;
3385 frame_width >>= dec->lowres;
3386 dec->height = frame_height;
3387 dec->width = frame_width;
3390 dec->debug |= FF_DEBUG_MV;
3392 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3395 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3396 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3398 (float)rfps / rfps_base, rfps, rfps_base);
3400 /* update the current frame rate to match the stream frame rate */
3401 frame_rate.num = rfps;
3402 frame_rate.den = rfps_base;
3405 st->discard= AVDISCARD_ALL;
3406 else if(video_discard)
3407 st->discard= video_discard;
3409 case AVMEDIA_TYPE_DATA:
3411 case AVMEDIA_TYPE_SUBTITLE:
3412 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3413 if(!input_codecs[nb_input_codecs-1])
3414 input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
3415 if(subtitle_disable)
3416 st->discard = AVDISCARD_ALL;
3418 case AVMEDIA_TYPE_ATTACHMENT:
3419 case AVMEDIA_TYPE_UNKNOWN:
3426 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3427 /* dump the file content */
3429 av_dump_format(ic, nb_input_files, filename, 0);
3431 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3432 input_files[nb_input_files - 1].ctx = ic;
3433 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3436 top_field_first = -1;
3438 av_freep(&video_codec_name);
3439 av_freep(&audio_codec_name);
3440 av_freep(&subtitle_codec_name);
3446 static void check_inputs(int *has_video_ptr,
3448 int *has_subtitle_ptr,
3451 int has_video, has_audio, has_subtitle, has_data, i, j;
3452 AVFormatContext *ic;
3459 for(j=0;j<nb_input_files;j++) {
3460 ic = input_files[j].ctx;
3461 for(i=0;i<ic->nb_streams;i++) {
3462 AVCodecContext *enc = ic->streams[i]->codec;
3463 switch(enc->codec_type) {
3464 case AVMEDIA_TYPE_AUDIO:
3467 case AVMEDIA_TYPE_VIDEO:
3470 case AVMEDIA_TYPE_SUBTITLE:
3473 case AVMEDIA_TYPE_DATA:
3474 case AVMEDIA_TYPE_ATTACHMENT:
3475 case AVMEDIA_TYPE_UNKNOWN:
3483 *has_video_ptr = has_video;
3484 *has_audio_ptr = has_audio;
3485 *has_subtitle_ptr = has_subtitle;
3486 *has_data_ptr = has_data;
3489 static void new_video_stream(AVFormatContext *oc, int file_idx)
3492 AVOutputStream *ost;
3493 AVCodecContext *video_enc;
3494 enum CodecID codec_id = CODEC_ID_NONE;
3495 AVCodec *codec= NULL;
3497 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3499 fprintf(stderr, "Could not alloc stream\n");
3502 ost = new_output_stream(oc, file_idx);
3504 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3505 if(!video_stream_copy){
3506 if (video_codec_name) {
3507 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3508 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3509 codec = avcodec_find_encoder_by_name(video_codec_name);
3510 output_codecs[nb_output_codecs-1] = codec;
3512 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3513 codec = avcodec_find_encoder(codec_id);
3515 ost->frame_aspect_ratio = frame_aspect_ratio;
3516 frame_aspect_ratio = 0;
3518 ost->avfilter = vfilters;
3523 avcodec_get_context_defaults3(st->codec, codec);
3524 ost->bitstream_filters = video_bitstream_filters;
3525 video_bitstream_filters= NULL;
3527 st->codec->thread_count= thread_count;
3529 video_enc = st->codec;
3532 video_enc->codec_tag= video_codec_tag;
3534 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3535 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3536 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3539 if (video_stream_copy) {
3540 st->stream_copy = 1;
3541 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3542 video_enc->sample_aspect_ratio =
3543 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3547 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3549 video_enc->codec_id = codec_id;
3550 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3552 if (codec && codec->supported_framerates && !force_fps)
3553 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3554 video_enc->time_base.den = fps.num;
3555 video_enc->time_base.num = fps.den;
3557 video_enc->width = frame_width;
3558 video_enc->height = frame_height;
3559 video_enc->pix_fmt = frame_pix_fmt;
3560 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3561 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3563 choose_pixel_fmt(st, codec);
3566 video_enc->gop_size = 0;
3567 if (video_qscale || same_quality) {
3568 video_enc->flags |= CODEC_FLAG_QSCALE;
3569 video_enc->global_quality=
3570 st->quality = FF_QP2LAMBDA * video_qscale;
3574 video_enc->intra_matrix = intra_matrix;
3576 video_enc->inter_matrix = inter_matrix;
3578 p= video_rc_override_string;
3581 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3583 fprintf(stderr, "error parsing rc_override\n");
3586 video_enc->rc_override=
3587 av_realloc(video_enc->rc_override,
3588 sizeof(RcOverride)*(i+1));
3589 video_enc->rc_override[i].start_frame= start;
3590 video_enc->rc_override[i].end_frame = end;
3592 video_enc->rc_override[i].qscale= q;
3593 video_enc->rc_override[i].quality_factor= 1.0;
3596 video_enc->rc_override[i].qscale= 0;
3597 video_enc->rc_override[i].quality_factor= -q/100.0;
3602 video_enc->rc_override_count=i;
3603 if (!video_enc->rc_initial_buffer_occupancy)
3604 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3605 video_enc->me_threshold= me_threshold;
3606 video_enc->intra_dc_precision= intra_dc_precision - 8;
3609 video_enc->flags|= CODEC_FLAG_PSNR;
3614 video_enc->flags |= CODEC_FLAG_PASS1;
3616 video_enc->flags |= CODEC_FLAG_PASS2;
3620 if (forced_key_frames)
3621 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3623 if (video_language) {
3624 av_metadata_set2(&st->metadata, "language", video_language, 0);
3625 av_freep(&video_language);
3628 /* reset some key parameters */
3630 av_freep(&video_codec_name);
3631 av_freep(&forced_key_frames);
3632 video_stream_copy = 0;
3633 frame_pix_fmt = PIX_FMT_NONE;
3636 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3639 AVOutputStream *ost;
3640 AVCodec *codec= NULL;
3641 AVCodecContext *audio_enc;
3642 enum CodecID codec_id = CODEC_ID_NONE;
3644 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3646 fprintf(stderr, "Could not alloc stream\n");
3649 ost = new_output_stream(oc, file_idx);
3651 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3652 if(!audio_stream_copy){
3653 if (audio_codec_name) {
3654 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3655 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3656 codec = avcodec_find_encoder_by_name(audio_codec_name);
3657 output_codecs[nb_output_codecs-1] = codec;
3659 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3660 codec = avcodec_find_encoder(codec_id);
3664 avcodec_get_context_defaults3(st->codec, codec);
3666 ost->bitstream_filters = audio_bitstream_filters;
3667 audio_bitstream_filters= NULL;
3669 st->codec->thread_count= thread_count;
3671 audio_enc = st->codec;
3672 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3675 audio_enc->codec_tag= audio_codec_tag;
3677 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3678 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3679 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3681 if (audio_stream_copy) {
3682 st->stream_copy = 1;
3683 audio_enc->channels = audio_channels;
3684 audio_enc->sample_rate = audio_sample_rate;
3686 audio_enc->codec_id = codec_id;
3687 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3689 if (audio_qscale > QSCALE_NONE) {
3690 audio_enc->flags |= CODEC_FLAG_QSCALE;
3691 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3693 audio_enc->channels = audio_channels;
3694 audio_enc->sample_fmt = audio_sample_fmt;
3695 audio_enc->sample_rate = audio_sample_rate;
3696 audio_enc->channel_layout = channel_layout;
3697 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3698 audio_enc->channel_layout = 0;
3699 choose_sample_fmt(st, codec);
3700 choose_sample_rate(st, codec);
3702 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3703 if (audio_language) {
3704 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3705 av_freep(&audio_language);
3708 /* reset some key parameters */
3710 av_freep(&audio_codec_name);
3711 audio_stream_copy = 0;
3714 static void new_data_stream(AVFormatContext *oc, int file_idx)
3717 AVOutputStream *ost av_unused;
3718 AVCodec *codec=NULL;
3719 AVCodecContext *data_enc;
3721 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3723 fprintf(stderr, "Could not alloc stream\n");
3726 ost = new_output_stream(oc, file_idx);
3727 data_enc = st->codec;
3728 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3729 if (!data_stream_copy) {
3730 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3733 avcodec_get_context_defaults3(st->codec, codec);
3735 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3738 data_enc->codec_tag= data_codec_tag;
3740 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3741 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3742 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3744 if (data_stream_copy) {
3745 st->stream_copy = 1;
3749 av_freep(&data_codec_name);
3750 data_stream_copy = 0;
3753 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3756 AVOutputStream *ost;
3757 AVCodec *codec=NULL;
3758 AVCodecContext *subtitle_enc;
3759 enum CodecID codec_id = CODEC_ID_NONE;
3761 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3763 fprintf(stderr, "Could not alloc stream\n");
3766 ost = new_output_stream(oc, file_idx);
3767 subtitle_enc = st->codec;
3768 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3769 if(!subtitle_stream_copy){
3770 if (subtitle_codec_name) {
3771 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3772 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3773 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3775 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3776 codec = avcodec_find_encoder(codec_id);
3779 avcodec_get_context_defaults3(st->codec, codec);
3781 ost->bitstream_filters = subtitle_bitstream_filters;
3782 subtitle_bitstream_filters= NULL;
3784 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3786 if(subtitle_codec_tag)
3787 subtitle_enc->codec_tag= subtitle_codec_tag;
3789 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3790 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3791 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3793 if (subtitle_stream_copy) {
3794 st->stream_copy = 1;
3796 subtitle_enc->codec_id = codec_id;
3797 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3800 if (subtitle_language) {
3801 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3802 av_freep(&subtitle_language);
3805 subtitle_disable = 0;
3806 av_freep(&subtitle_codec_name);
3807 subtitle_stream_copy = 0;
3810 static int opt_new_stream(const char *opt, const char *arg)
3812 AVFormatContext *oc;
3813 int file_idx = nb_output_files - 1;
3814 if (nb_output_files <= 0) {
3815 fprintf(stderr, "At least one output file must be specified\n");
3818 oc = output_files[file_idx];
3820 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3821 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3822 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3823 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3828 /* arg format is "output-stream-index:streamid-value". */
3829 static int opt_streamid(const char *opt, const char *arg)
3835 av_strlcpy(idx_str, arg, sizeof(idx_str));
3836 p = strchr(idx_str, ':');
3839 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3844 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3845 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3846 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3850 static void opt_output_file(const char *filename)
3852 AVFormatContext *oc;
3853 int err, use_video, use_audio, use_subtitle, use_data;
3854 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3855 AVFormatParameters params, *ap = ¶ms;
3856 AVOutputFormat *file_oformat;
3858 if (!strcmp(filename, "-"))
3861 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3862 last_asked_format = NULL;
3864 print_error(filename, err);
3867 file_oformat= oc->oformat;
3869 if (!strcmp(file_oformat->name, "ffm") &&
3870 av_strstart(filename, "http:", NULL)) {
3871 /* special case for files sent to ffserver: we get the stream
3872 parameters from ffserver */
3873 int err = read_ffserver_streams(oc, filename);
3875 print_error(filename, err);
3879 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3880 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3881 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3882 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 */
3884 /* disable if no corresponding type found and at least one
3886 if (nb_input_files > 0) {
3887 check_inputs(&input_has_video,
3889 &input_has_subtitle,
3892 if (!input_has_video)
3894 if (!input_has_audio)
3896 if (!input_has_subtitle)
3898 if (!input_has_data)
3902 /* manual disable */
3903 if (audio_disable) use_audio = 0;
3904 if (video_disable) use_video = 0;
3905 if (subtitle_disable) use_subtitle = 0;
3906 if (data_disable) use_data = 0;
3908 if (use_video) new_video_stream(oc, nb_output_files);
3909 if (use_audio) new_audio_stream(oc, nb_output_files);
3910 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3911 if (use_data) new_data_stream(oc, nb_output_files);
3913 oc->timestamp = recording_timestamp;
3915 av_metadata_copy(&oc->metadata, metadata, 0);
3916 av_metadata_free(&metadata);
3919 output_files[nb_output_files++] = oc;
3921 /* check filename in case of an image number is expected */
3922 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3923 if (!av_filename_number_test(oc->filename)) {
3924 print_error(oc->filename, AVERROR(EINVAL));
3929 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3930 /* test if it already exists to avoid loosing precious files */
3931 if (!file_overwrite &&
3932 (strchr(filename, ':') == NULL ||
3933 filename[1] == ':' ||
3934 av_strstart(filename, "file:", NULL))) {
3935 if (avio_check(filename, 0) == 0) {
3937 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3939 if (!read_yesno()) {
3940 fprintf(stderr, "Not overwriting - exiting\n");
3945 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3952 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3953 print_error(filename, err);
3958 memset(ap, 0, sizeof(*ap));
3959 if (av_set_parameters(oc, ap) < 0) {
3960 fprintf(stderr, "%s: Invalid encoding parameters\n",
3965 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3966 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3967 oc->loop_output = loop_output;
3969 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3971 av_freep(&forced_key_frames);
3976 /* same option as mencoder */
3977 static int opt_pass(const char *opt, const char *arg)
3979 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3983 static int64_t getutime(void)
3986 struct rusage rusage;
3988 getrusage(RUSAGE_SELF, &rusage);
3989 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3990 #elif HAVE_GETPROCESSTIMES
3992 FILETIME c, e, k, u;
3993 proc = GetCurrentProcess();
3994 GetProcessTimes(proc, &c, &e, &k, &u);
3995 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3997 return av_gettime();
4001 static int64_t getmaxrss(void)
4003 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
4004 struct rusage rusage;
4005 getrusage(RUSAGE_SELF, &rusage);
4006 return (int64_t)rusage.ru_maxrss * 1024;
4007 #elif HAVE_GETPROCESSMEMORYINFO
4009 PROCESS_MEMORY_COUNTERS memcounters;
4010 proc = GetCurrentProcess();
4011 memcounters.cb = sizeof(memcounters);
4012 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
4013 return memcounters.PeakPagefileUsage;
4019 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
4022 const char *p = str;
4029 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
4036 static void opt_inter_matrix(const char *arg)
4038 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
4039 parse_matrix_coeffs(inter_matrix, arg);
4042 static void opt_intra_matrix(const char *arg)
4044 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
4045 parse_matrix_coeffs(intra_matrix, arg);
4048 static void show_usage(void)
4050 printf("Hyper fast Audio and Video encoder\n");
4051 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
4055 static void show_help(void)
4058 AVOutputFormat *oformat = NULL;
4060 av_log_set_callback(log_callback_help);
4062 show_help_options(options, "Main options:\n",
4063 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4064 show_help_options(options, "\nAdvanced options:\n",
4065 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4067 show_help_options(options, "\nVideo options:\n",
4068 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4070 show_help_options(options, "\nAdvanced Video options:\n",
4071 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4072 OPT_VIDEO | OPT_EXPERT);
4073 show_help_options(options, "\nAudio options:\n",
4074 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4076 show_help_options(options, "\nAdvanced Audio options:\n",
4077 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4078 OPT_AUDIO | OPT_EXPERT);
4079 show_help_options(options, "\nSubtitle options:\n",
4080 OPT_SUBTITLE | OPT_GRAB,
4082 show_help_options(options, "\nAudio/Video grab options:\n",
4086 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4089 /* individual codec options */
4091 while ((c = av_codec_next(c))) {
4092 if (c->priv_class) {
4093 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4098 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4101 /* individual muxer options */
4102 while ((oformat = av_oformat_next(oformat))) {
4103 if (oformat->priv_class) {
4104 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4109 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4112 static int opt_target(const char *opt, const char *arg)
4114 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4115 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4117 if(!strncmp(arg, "pal-", 4)) {
4120 } else if(!strncmp(arg, "ntsc-", 5)) {
4123 } else if(!strncmp(arg, "film-", 5)) {
4128 /* Calculate FR via float to avoid int overflow */
4129 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4132 } else if((fr == 29970) || (fr == 23976)) {
4135 /* Try to determine PAL/NTSC by peeking in the input files */
4136 if(nb_input_files) {
4138 for (j = 0; j < nb_input_files; j++) {
4139 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4140 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4141 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4143 fr = c->time_base.den * 1000 / c->time_base.num;
4147 } else if((fr == 29970) || (fr == 23976)) {
4157 if(verbose > 0 && norm != UNKNOWN)
4158 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4161 if(norm == UNKNOWN) {
4162 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4163 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4164 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4168 if(!strcmp(arg, "vcd")) {
4169 opt_codec("vcodec", "mpeg1video");
4170 opt_codec("vcodec", "mp2");
4171 opt_format("f", "vcd");
4173 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4174 opt_frame_rate("r", frame_rates[norm]);
4175 opt_default("g", norm == PAL ? "15" : "18");
4177 opt_default("b", "1150000");
4178 opt_default("maxrate", "1150000");
4179 opt_default("minrate", "1150000");
4180 opt_default("bufsize", "327680"); // 40*1024*8;
4182 opt_default("ab", "224000");
4183 audio_sample_rate = 44100;
4186 opt_default("packetsize", "2324");
4187 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4189 /* We have to offset the PTS, so that it is consistent with the SCR.
4190 SCR starts at 36000, but the first two packs contain only padding
4191 and the first pack from the other stream, respectively, may also have
4192 been written before.
4193 So the real data starts at SCR 36000+3*1200. */
4194 mux_preload= (36000+3*1200) / 90000.0; //0.44
4195 } else if(!strcmp(arg, "svcd")) {
4197 opt_codec("vcodec", "mpeg2video");
4198 opt_codec("acodec", "mp2");
4199 opt_format("f", "svcd");
4201 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4202 opt_frame_rate("r", frame_rates[norm]);
4203 opt_default("g", norm == PAL ? "15" : "18");
4205 opt_default("b", "2040000");
4206 opt_default("maxrate", "2516000");
4207 opt_default("minrate", "0"); //1145000;
4208 opt_default("bufsize", "1835008"); //224*1024*8;
4209 opt_default("flags", "+scan_offset");
4212 opt_default("ab", "224000");
4213 audio_sample_rate = 44100;
4215 opt_default("packetsize", "2324");
4217 } else if(!strcmp(arg, "dvd")) {
4219 opt_codec("vcodec", "mpeg2video");
4220 opt_codec("vcodec", "ac3");
4221 opt_format("f", "dvd");
4223 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4224 opt_frame_rate("r", frame_rates[norm]);
4225 opt_default("g", norm == PAL ? "15" : "18");
4227 opt_default("b", "6000000");
4228 opt_default("maxrate", "9000000");
4229 opt_default("minrate", "0"); //1500000;
4230 opt_default("bufsize", "1835008"); //224*1024*8;
4232 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4233 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4235 opt_default("ab", "448000");
4236 audio_sample_rate = 48000;
4238 } else if(!strncmp(arg, "dv", 2)) {
4240 opt_format("f", "dv");
4242 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4243 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4244 norm == PAL ? "yuv420p" : "yuv411p");
4245 opt_frame_rate("r", frame_rates[norm]);
4247 audio_sample_rate = 48000;
4251 fprintf(stderr, "Unknown target: %s\n", arg);
4252 return AVERROR(EINVAL);
4257 static int opt_vstats_file(const char *opt, const char *arg)
4259 av_free (vstats_filename);
4260 vstats_filename=av_strdup (arg);
4264 static int opt_vstats(const char *opt, const char *arg)
4267 time_t today2 = time(NULL);
4268 struct tm *today = localtime(&today2);
4270 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4272 return opt_vstats_file(opt, filename);
4275 static int opt_bsf(const char *opt, const char *arg)
4277 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4278 AVBitStreamFilterContext **bsfp;
4281 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4285 bsfp= *opt == 'v' ? &video_bitstream_filters :
4286 *opt == 'a' ? &audio_bitstream_filters :
4287 &subtitle_bitstream_filters;
4289 bsfp= &(*bsfp)->next;
4296 static int opt_preset(const char *opt, const char *arg)
4299 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4300 char *codec_name = *opt == 'v' ? video_codec_name :
4301 *opt == 'a' ? audio_codec_name :
4302 subtitle_codec_name;
4304 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4305 fprintf(stderr, "File for preset '%s' not found\n", arg);
4310 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4311 if(line[0] == '#' && !e)
4313 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4315 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4318 if (!strcmp(tmp, "acodec") ||
4319 !strcmp(tmp, "vcodec") ||
4320 !strcmp(tmp, "scodec") ||
4321 !strcmp(tmp, "dcodec")) {
4322 opt_codec(tmp, tmp2);
4323 }else if(opt_default(tmp, tmp2) < 0){
4324 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4334 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4338 static void opt_passlogfile(const char *arg)
4340 pass_logfilename_prefix = arg;
4341 opt_default("passlogfile", arg);
4344 static const OptionDef options[] = {
4346 #include "cmdutils_common_opts.h"
4347 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4348 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4349 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4350 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4351 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4352 "outfile[,metadata]:infile[,metadata]" },
4353 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4354 "outfile[,metadata]:infile[,metadata]" },
4355 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4356 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4357 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4358 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4359 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4360 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4361 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4362 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4363 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4364 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4365 "add timings for benchmarking" },
4366 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4367 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4368 "dump each input packet" },
4369 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4370 "when dumping packets, also dump the payload" },
4371 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4372 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4373 { "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)", "" },
4374 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4375 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4376 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4377 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4378 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4379 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4380 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4381 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4382 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4383 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4384 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4385 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4386 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4389 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4390 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4391 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4392 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4393 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4394 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4395 { "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" },
4396 { "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" },
4397 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4398 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4399 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4400 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4401 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4402 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4403 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4404 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4405 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4406 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4407 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4408 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4409 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4410 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4411 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_codec}, "force video codec ('copy' to copy stream)", "codec" },
4412 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4413 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4414 "use same quantizer as source (implies VBR)" },
4415 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4416 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4417 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4418 "deinterlace pictures" },
4419 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4420 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4421 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4423 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4425 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4426 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4427 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4428 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4429 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4430 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4431 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4432 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4433 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4434 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4435 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4438 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4439 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4440 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4441 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4442 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4443 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4444 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4445 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4446 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4447 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4448 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4449 { "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" },
4451 /* subtitle options */
4452 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4453 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4454 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4455 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4456 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4459 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4460 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4461 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4464 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4465 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4467 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4468 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4469 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4471 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4472 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4473 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4474 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4475 /* data codec support */
4476 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_codec}, "force data codec ('copy' to copy stream)", "codec" },
4478 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4482 int main(int argc, char **argv)
4486 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4488 if(argc>1 && !strcmp(argv[1], "-d")){
4491 av_log_set_callback(log_callback_null);
4496 avcodec_register_all();
4498 avdevice_register_all();
4501 avfilter_register_all();
4506 if(isatty(STDIN_FILENO))
4507 avio_set_interrupt_cb(decode_interrupt_cb);
4516 parse_options(argc, argv, options, opt_output_file);
4518 if(nb_output_files <= 0 && nb_input_files == 0) {
4520 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4524 /* file converter / grab */
4525 if (nb_output_files <= 0) {
4526 fprintf(stderr, "At least one output file must be specified\n");
4530 if (nb_input_files == 0) {
4531 fprintf(stderr, "At least one input file must be specified\n");
4536 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4537 stream_maps, nb_stream_maps) < 0)
4539 ti = getutime() - ti;
4541 int maxrss = getmaxrss() / 1024;
4542 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4545 return ffmpeg_exit(0);