3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/pixdesc.h"
44 #include "libavutil/avstring.h"
45 #include "libavutil/libm.h"
46 #include "libavformat/os_support.h"
49 # include "libavfilter/avfilter.h"
50 # include "libavfilter/avfiltergraph.h"
51 # include "libavfilter/vsrc_buffer.h"
54 #if HAVE_SYS_RESOURCE_H
55 #include <sys/types.h>
57 #include <sys/resource.h>
58 #elif HAVE_GETPROCESSTIMES
61 #if HAVE_GETPROCESSMEMORYINFO
67 #include <sys/select.h>
74 #include "libavutil/avassert.h"
76 const char program_name[] = "ffmpeg";
77 const int program_birth_year = 2000;
79 /* select an input stream for an output stream */
80 typedef struct AVStreamMap {
84 int sync_stream_index;
88 * select an input file for an output file
90 typedef struct AVMetaDataMap {
91 int file; //< file index
92 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
93 int index; //< stream/chapter/program number
96 typedef struct AVChapterMap {
101 static const OptionDef options[];
103 #define MAX_FILES 100
104 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
106 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
108 static const char *last_asked_format = NULL;
109 static int64_t input_files_ts_offset[MAX_FILES];
110 static double *input_files_ts_scale[MAX_FILES] = {NULL};
111 static AVCodec **input_codecs = NULL;
112 static int nb_input_codecs = 0;
113 static int nb_input_files_ts_scale[MAX_FILES] = {0};
115 static AVFormatContext *output_files[MAX_FILES];
116 static AVDictionary *output_opts[MAX_FILES];
117 static int nb_output_files = 0;
119 static AVStreamMap *stream_maps = NULL;
120 static int nb_stream_maps;
122 /* first item specifies output metadata, second is input */
123 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
124 static int nb_meta_data_maps;
125 static int metadata_global_autocopy = 1;
126 static int metadata_streams_autocopy = 1;
127 static int metadata_chapters_autocopy = 1;
129 static AVChapterMap *chapter_maps = NULL;
130 static int nb_chapter_maps;
132 /* indexed by output file stream index */
133 static int *streamid_map = NULL;
134 static int nb_streamid_map = 0;
136 static int frame_width = 0;
137 static int frame_height = 0;
138 static float frame_aspect_ratio = 0;
139 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
140 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
141 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
142 static AVRational frame_rate;
143 static float video_qscale = 0;
144 static uint16_t *intra_matrix = NULL;
145 static uint16_t *inter_matrix = NULL;
146 static const char *video_rc_override_string=NULL;
147 static int video_disable = 0;
148 static int video_discard = 0;
149 static char *video_codec_name = NULL;
150 static unsigned int video_codec_tag = 0;
151 static char *video_language = NULL;
152 static int same_quality = 0;
153 static int do_deinterlace = 0;
154 static int top_field_first = -1;
155 static int me_threshold = 0;
156 static int intra_dc_precision = 8;
157 static int loop_input = 0;
158 static int loop_output = AVFMT_NOOUTPUTLOOP;
159 static int qp_hist = 0;
161 static char *vfilters = NULL;
164 static int intra_only = 0;
165 static int audio_sample_rate = 0;
166 static int64_t channel_layout = 0;
167 #define QSCALE_NONE -99999
168 static float audio_qscale = QSCALE_NONE;
169 static int audio_disable = 0;
170 static int audio_channels = 0;
171 static char *audio_codec_name = NULL;
172 static unsigned int audio_codec_tag = 0;
173 static char *audio_language = NULL;
175 static int subtitle_disable = 0;
176 static char *subtitle_codec_name = NULL;
177 static char *subtitle_language = NULL;
178 static unsigned int subtitle_codec_tag = 0;
180 static int data_disable = 0;
181 static char *data_codec_name = NULL;
182 static unsigned int data_codec_tag = 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = INT64_MAX;
188 static int64_t start_time = 0;
189 static int64_t recording_timestamp = 0;
190 static int64_t input_ts_offset = 0;
191 static int file_overwrite = 0;
192 static AVDictionary *metadata;
193 static int do_benchmark = 0;
194 static int do_hex_dump = 0;
195 static int do_pkt_dump = 0;
196 static int do_psnr = 0;
197 static int do_pass = 0;
198 static char *pass_logfilename_prefix = NULL;
199 static int audio_stream_copy = 0;
200 static int video_stream_copy = 0;
201 static int subtitle_stream_copy = 0;
202 static int data_stream_copy = 0;
203 static int video_sync_method= -1;
204 static int audio_sync_method= 0;
205 static float audio_drift_threshold= 0.1;
206 static int copy_ts= 0;
208 static int opt_shortest = 0;
209 static char *vstats_filename;
210 static FILE *vstats_file;
211 static int opt_programid = 0;
212 static int copy_initial_nonkeyframes = 0;
214 static int rate_emu = 0;
216 static int video_channel = 0;
217 static char *video_standard;
219 static int audio_volume = 256;
221 static int exit_on_error = 0;
222 static int using_stdin = 0;
223 static int verbose = 1;
224 static int thread_count= 1;
225 static int64_t video_size = 0;
226 static int64_t audio_size = 0;
227 static int64_t extra_size = 0;
228 static int nb_frames_dup = 0;
229 static int nb_frames_drop = 0;
230 static int input_sync;
231 static uint64_t limit_filesize = 0;
232 static int force_fps = 0;
233 static char *forced_key_frames = NULL;
235 static float dts_delta_threshold = 10;
237 static int64_t timer_start;
239 static uint8_t *audio_buf;
240 static uint8_t *audio_out;
241 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
243 static short *samples;
245 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
246 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
247 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
249 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
251 struct AVInputStream;
253 typedef struct AVOutputStream {
254 int file_index; /* file index */
255 int index; /* stream index in the output file */
256 int source_index; /* AVInputStream index */
257 AVStream *st; /* stream in the output file */
258 int encoding_needed; /* true if encoding needed for this stream */
260 /* input pts and corresponding output pts
262 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
263 struct AVInputStream *sync_ist; /* input stream to sync against */
264 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
265 AVBitStreamFilterContext *bitstream_filters;
270 AVFrame pict_tmp; /* temporary image for resampling */
271 struct SwsContext *img_resample_ctx; /* for image resampling */
274 int resample_pix_fmt;
275 AVRational frame_rate;
277 float frame_aspect_ratio;
279 /* forced key frames */
280 int64_t *forced_kf_pts;
286 ReSampleContext *resample; /* for audio resampling */
287 int resample_sample_fmt;
288 int resample_channels;
289 int resample_sample_rate;
291 AVAudioConvert *reformat_ctx;
292 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
296 AVFilterContext *output_video_filter;
297 AVFilterContext *input_video_filter;
298 AVFilterBufferRef *picref;
300 AVFilterGraph *graph;
306 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
307 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
309 typedef struct AVInputStream {
312 int discard; /* true if stream data should be discarded */
313 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
314 int64_t sample_index; /* current sample */
316 int64_t start; /* time when read started */
317 int64_t next_pts; /* synthetic pts for cases where pkt.pts
319 int64_t pts; /* current pts */
320 PtsCorrectionContext pts_ctx;
321 int is_start; /* is 1 at the start and after a discontinuity */
322 int showed_multi_packet_warning;
323 int is_past_recording_time;
325 AVFrame *filter_frame;
326 int has_filter_frame;
330 typedef struct AVInputFile {
331 AVFormatContext *ctx;
332 int eof_reached; /* true if eof reached */
333 int ist_index; /* index of first stream in ist_table */
334 int buffer_size; /* current total buffer size */
337 static AVInputStream *input_streams = NULL;
338 static int nb_input_streams = 0;
339 static AVInputFile *input_files = NULL;
340 static int nb_input_files = 0;
344 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
346 AVFilterContext *last_filter, *filter;
347 /** filter graph containing all filters including input & output */
348 AVCodecContext *codec = ost->st->codec;
349 AVCodecContext *icodec = ist->st->codec;
350 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
351 AVRational sample_aspect_ratio;
355 ost->graph = avfilter_graph_alloc();
357 if (ist->st->sample_aspect_ratio.num){
358 sample_aspect_ratio = ist->st->sample_aspect_ratio;
360 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
362 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
363 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
364 sample_aspect_ratio.num, sample_aspect_ratio.den);
366 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
367 "src", args, NULL, ost->graph);
370 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
371 "out", NULL, &ffsink_ctx, ost->graph);
374 last_filter = ost->input_video_filter;
376 if (codec->width != icodec->width || codec->height != icodec->height) {
377 snprintf(args, 255, "%d:%d:flags=0x%X",
381 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
382 NULL, args, NULL, ost->graph)) < 0)
384 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
386 last_filter = filter;
389 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
390 ost->graph->scale_sws_opts = av_strdup(args);
393 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
394 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
396 outputs->name = av_strdup("in");
397 outputs->filter_ctx = last_filter;
398 outputs->pad_idx = 0;
399 outputs->next = NULL;
401 inputs->name = av_strdup("out");
402 inputs->filter_ctx = ost->output_video_filter;
406 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
408 av_freep(&ost->avfilter);
410 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
414 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
417 codec->width = ost->output_video_filter->inputs[0]->w;
418 codec->height = ost->output_video_filter->inputs[0]->h;
419 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
420 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
421 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
422 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
426 #endif /* CONFIG_AVFILTER */
428 static void term_exit(void)
430 av_log(NULL, AV_LOG_QUIET, "");
433 static volatile int received_sigterm = 0;
434 static volatile int received_nb_signals = 0;
437 sigterm_handler(int sig)
439 received_sigterm = sig;
440 received_nb_signals++;
444 static void term_init(void)
446 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
447 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
449 signal(SIGXCPU, sigterm_handler);
453 static int decode_interrupt_cb(void)
455 return received_nb_signals > 1;
458 static int ffmpeg_exit(int ret)
463 for(i=0;i<nb_output_files;i++) {
464 AVFormatContext *s = output_files[i];
465 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
467 avformat_free_context(s);
468 av_free(output_streams_for_file[i]);
469 av_dict_free(&output_opts[i]);
471 for(i=0;i<nb_input_files;i++) {
472 av_close_input_file(input_files[i].ctx);
473 av_free(input_files_ts_scale[i]);
476 av_free(intra_matrix);
477 av_free(inter_matrix);
481 av_free(vstats_filename);
483 av_free(streamid_map);
484 av_free(input_codecs);
485 av_free(stream_maps);
486 av_free(meta_data_maps);
488 av_freep(&input_streams);
489 av_freep(&input_files);
491 av_free(video_codec_name);
492 av_free(audio_codec_name);
493 av_free(subtitle_codec_name);
494 av_free(data_codec_name);
496 av_free(video_standard);
501 allocated_audio_buf_size= allocated_audio_out_size= 0;
508 if (received_sigterm) {
510 "Received signal %d: terminating.\n",
511 (int) received_sigterm);
515 exit(ret); /* not all OS-es handle main() return value */
519 static void assert_avoptions(AVDictionary *m)
521 AVDictionaryEntry *t;
522 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
523 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
528 /* similar to ff_dynarray_add() and av_fast_realloc() */
529 static void *grow_array(void *array, int elem_size, int *size, int new_size)
531 if (new_size >= INT_MAX / elem_size) {
532 fprintf(stderr, "Array too big.\n");
535 if (*size < new_size) {
536 uint8_t *tmp = av_realloc(array, new_size*elem_size);
538 fprintf(stderr, "Could not alloc buffer.\n");
541 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
548 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
550 if(codec && codec->sample_fmts){
551 const enum AVSampleFormat *p= codec->sample_fmts;
553 if(*p == st->codec->sample_fmt)
557 av_log(NULL, AV_LOG_WARNING,
558 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
559 av_get_sample_fmt_name(st->codec->sample_fmt),
561 av_get_sample_fmt_name(codec->sample_fmts[0]));
562 st->codec->sample_fmt = codec->sample_fmts[0];
568 * Update the requested input sample format based on the output sample format.
569 * This is currently only used to request float output from decoders which
570 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
571 * Ideally this will be removed in the future when decoders do not do format
572 * conversion and only output in their native format.
574 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
577 /* if sample formats match or a decoder sample format has already been
578 requested, just return */
579 if (enc->sample_fmt == dec->sample_fmt ||
580 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
583 /* if decoder supports more than one output format */
584 if (dec_codec && dec_codec->sample_fmts &&
585 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
586 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
587 const enum AVSampleFormat *p;
588 int min_dec = -1, min_inc = -1;
590 /* find a matching sample format in the encoder */
591 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
592 if (*p == enc->sample_fmt) {
593 dec->request_sample_fmt = *p;
595 } else if (*p > enc->sample_fmt) {
596 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
598 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
601 /* if none match, provide the one that matches quality closest */
602 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
603 enc->sample_fmt - min_dec;
607 static void choose_sample_rate(AVStream *st, AVCodec *codec)
609 if(codec && codec->supported_samplerates){
610 const int *p= codec->supported_samplerates;
612 int best_dist=INT_MAX;
614 int dist= abs(st->codec->sample_rate - *p);
615 if(dist < best_dist){
621 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
623 st->codec->sample_rate= best;
627 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
629 if(codec && codec->pix_fmts){
630 const enum PixelFormat *p= codec->pix_fmts;
631 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
632 if(st->codec->codec_id==CODEC_ID_MJPEG){
633 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
634 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
635 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};
639 if(*p == st->codec->pix_fmt)
643 if(st->codec->pix_fmt != PIX_FMT_NONE)
644 av_log(NULL, AV_LOG_WARNING,
645 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
646 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
648 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
649 st->codec->pix_fmt = codec->pix_fmts[0];
654 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
656 int idx = oc->nb_streams - 1;
659 output_streams_for_file[file_idx] =
660 grow_array(output_streams_for_file[file_idx],
661 sizeof(*output_streams_for_file[file_idx]),
662 &nb_output_streams_for_file[file_idx],
664 ost = output_streams_for_file[file_idx][idx] =
665 av_mallocz(sizeof(AVOutputStream));
667 fprintf(stderr, "Could not alloc output stream\n");
670 ost->file_index = file_idx;
673 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
677 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
680 AVFormatContext *ic = NULL;
683 err = avformat_open_input(&ic, filename, NULL, NULL);
686 /* copy stream format */
688 s->streams = av_mallocz(sizeof(AVStream *) * ic->nb_streams);
689 for(i=0;i<ic->nb_streams;i++) {
695 // FIXME: a more elegant solution is needed
696 st = av_mallocz(sizeof(AVStream));
697 memcpy(st, ic->streams[i], sizeof(AVStream));
699 st->codec = avcodec_alloc_context();
701 print_error(filename, AVERROR(ENOMEM));
704 avcodec_copy_context(st->codec, ic->streams[i]->codec);
707 codec = avcodec_find_encoder(st->codec->codec_id);
708 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
709 if (audio_stream_copy) {
712 choose_sample_fmt(st, codec);
713 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
714 if (video_stream_copy) {
717 choose_pixel_fmt(st, codec);
720 if(st->codec->flags & CODEC_FLAG_BITEXACT)
723 new_output_stream(s, nb_output_files);
727 s->timestamp = av_gettime();
729 av_close_input_file(ic);
734 get_sync_ipts(const AVOutputStream *ost)
736 const AVInputStream *ist = ost->sync_ist;
737 return (double)(ist->pts - start_time)/AV_TIME_BASE;
740 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
744 AVPacket new_pkt= *pkt;
745 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
746 &new_pkt.data, &new_pkt.size,
747 pkt->data, pkt->size,
748 pkt->flags & AV_PKT_FLAG_KEY);
751 new_pkt.destruct= av_destruct_packet;
753 fprintf(stderr, "%s failed for stream %d, codec %s",
754 bsfc->filter->name, pkt->stream_index,
755 avctx->codec ? avctx->codec->name : "copy");
765 ret= av_interleaved_write_frame(s, pkt);
767 print_error("av_interleaved_write_frame()", ret);
772 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
774 static void do_audio_out(AVFormatContext *s,
777 unsigned char *buf, int size)
780 int64_t audio_out_size, audio_buf_size;
781 int64_t allocated_for_size= size;
783 int size_out, frame_bytes, ret, resample_changed;
784 AVCodecContext *enc= ost->st->codec;
785 AVCodecContext *dec= ist->st->codec;
786 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
787 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
788 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
791 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
792 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
793 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
794 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
795 audio_buf_size*= osize*enc->channels;
797 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
798 if(coded_bps > 8*osize)
799 audio_out_size= audio_out_size * coded_bps / (8*osize);
800 audio_out_size += FF_MIN_BUFFER_SIZE;
802 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
803 fprintf(stderr, "Buffer sizes too large\n");
807 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
808 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
809 if (!audio_buf || !audio_out){
810 fprintf(stderr, "Out of memory in do_audio_out\n");
814 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
815 ost->audio_resample = 1;
817 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
818 ost->resample_channels != dec->channels ||
819 ost->resample_sample_rate != dec->sample_rate;
821 if ((ost->audio_resample && !ost->resample) || resample_changed) {
822 if (resample_changed) {
823 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",
824 ist->file_index, ist->st->index,
825 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
826 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
827 ost->resample_sample_fmt = dec->sample_fmt;
828 ost->resample_channels = dec->channels;
829 ost->resample_sample_rate = dec->sample_rate;
831 audio_resample_close(ost->resample);
833 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
834 if (audio_sync_method <= 1 &&
835 ost->resample_sample_fmt == enc->sample_fmt &&
836 ost->resample_channels == enc->channels &&
837 ost->resample_sample_rate == enc->sample_rate) {
838 ost->resample = NULL;
839 ost->audio_resample = 0;
840 } else if (ost->audio_resample) {
841 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
842 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
843 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
844 enc->sample_rate, dec->sample_rate,
845 enc->sample_fmt, dec->sample_fmt,
847 if (!ost->resample) {
848 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
849 dec->channels, dec->sample_rate,
850 enc->channels, enc->sample_rate);
856 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
857 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
858 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
859 if (ost->reformat_ctx)
860 av_audio_convert_free(ost->reformat_ctx);
861 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
862 dec->sample_fmt, 1, NULL, 0);
863 if (!ost->reformat_ctx) {
864 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
865 av_get_sample_fmt_name(dec->sample_fmt),
866 av_get_sample_fmt_name(enc->sample_fmt));
869 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
872 if(audio_sync_method){
873 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
874 - av_fifo_size(ost->fifo)/(enc->channels * 2);
875 double idelta= delta*dec->sample_rate / enc->sample_rate;
876 int byte_delta= ((int)idelta)*2*dec->channels;
878 //FIXME resample delay
879 if(fabs(delta) > 50){
880 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
882 byte_delta= FFMAX(byte_delta, -size);
886 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
891 static uint8_t *input_tmp= NULL;
892 input_tmp= av_realloc(input_tmp, byte_delta + size);
894 if(byte_delta > allocated_for_size - size){
895 allocated_for_size= byte_delta + (int64_t)size;
900 memset(input_tmp, 0, byte_delta);
901 memcpy(input_tmp + byte_delta, buf, size);
905 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
907 }else if(audio_sync_method>1){
908 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
909 av_assert0(ost->audio_resample);
911 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
912 // 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));
913 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
917 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
918 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
920 if (ost->audio_resample) {
922 size_out = audio_resample(ost->resample,
923 (short *)buftmp, (short *)buf,
924 size / (dec->channels * isize));
925 size_out = size_out * enc->channels * osize;
931 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
932 const void *ibuf[6]= {buftmp};
933 void *obuf[6]= {audio_buf};
934 int istride[6]= {isize};
935 int ostride[6]= {osize};
936 int len= size_out/istride[0];
937 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
938 printf("av_audio_convert() failed\n");
944 size_out = len*osize;
947 /* now encode as many frames as possible */
948 if (enc->frame_size > 1) {
949 /* output resampled raw samples */
950 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
951 fprintf(stderr, "av_fifo_realloc2() failed\n");
954 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
956 frame_bytes = enc->frame_size * osize * enc->channels;
958 while (av_fifo_size(ost->fifo) >= frame_bytes) {
960 av_init_packet(&pkt);
962 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
964 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
966 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
969 fprintf(stderr, "Audio encoding failed\n");
973 pkt.stream_index= ost->index;
976 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
977 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
978 pkt.flags |= AV_PKT_FLAG_KEY;
979 write_frame(s, &pkt, enc, ost->bitstream_filters);
981 ost->sync_opts += enc->frame_size;
985 av_init_packet(&pkt);
987 ost->sync_opts += size_out / (osize * enc->channels);
989 /* output a pcm frame */
990 /* determine the size of the coded buffer */
993 size_out = size_out*coded_bps/8;
995 if(size_out > audio_out_size){
996 fprintf(stderr, "Internal error, buffer size too small\n");
1000 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
1001 ret = avcodec_encode_audio(enc, audio_out, size_out,
1004 fprintf(stderr, "Audio encoding failed\n");
1008 pkt.stream_index= ost->index;
1009 pkt.data= audio_out;
1011 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1012 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1013 pkt.flags |= AV_PKT_FLAG_KEY;
1014 write_frame(s, &pkt, enc, ost->bitstream_filters);
1018 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1020 AVCodecContext *dec;
1021 AVPicture *picture2;
1022 AVPicture picture_tmp;
1025 dec = ist->st->codec;
1027 /* deinterlace : must be done before any resize */
1028 if (do_deinterlace) {
1031 /* create temporary picture */
1032 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1033 buf = av_malloc(size);
1037 picture2 = &picture_tmp;
1038 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1040 if(avpicture_deinterlace(picture2, picture,
1041 dec->pix_fmt, dec->width, dec->height) < 0) {
1042 /* if error, do not deinterlace */
1043 fprintf(stderr, "Deinterlacing failed\n");
1052 if (picture != picture2)
1053 *picture = *picture2;
1057 /* we begin to correct av delay at this threshold */
1058 #define AV_DELAY_MAX 0.100
1060 static void do_subtitle_out(AVFormatContext *s,
1061 AVOutputStream *ost,
1066 static uint8_t *subtitle_out = NULL;
1067 int subtitle_out_max_size = 1024 * 1024;
1068 int subtitle_out_size, nb, i;
1069 AVCodecContext *enc;
1072 if (pts == AV_NOPTS_VALUE) {
1073 fprintf(stderr, "Subtitle packets must have a pts\n");
1079 enc = ost->st->codec;
1081 if (!subtitle_out) {
1082 subtitle_out = av_malloc(subtitle_out_max_size);
1085 /* Note: DVB subtitle need one packet to draw them and one other
1086 packet to clear them */
1087 /* XXX: signal it in the codec context ? */
1088 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1093 for(i = 0; i < nb; i++) {
1094 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1095 // start_display_time is required to be 0
1096 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1097 sub->end_display_time -= sub->start_display_time;
1098 sub->start_display_time = 0;
1099 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1100 subtitle_out_max_size, sub);
1101 if (subtitle_out_size < 0) {
1102 fprintf(stderr, "Subtitle encoding failed\n");
1106 av_init_packet(&pkt);
1107 pkt.stream_index = ost->index;
1108 pkt.data = subtitle_out;
1109 pkt.size = subtitle_out_size;
1110 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1111 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1112 /* XXX: the pts correction is handled here. Maybe handling
1113 it in the codec would be better */
1115 pkt.pts += 90 * sub->start_display_time;
1117 pkt.pts += 90 * sub->end_display_time;
1119 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1123 static int bit_buffer_size= 1024*256;
1124 static uint8_t *bit_buffer= NULL;
1126 static void do_video_out(AVFormatContext *s,
1127 AVOutputStream *ost,
1129 AVFrame *in_picture,
1132 int nb_frames, i, ret, resample_changed;
1133 AVFrame *final_picture, *formatted_picture;
1134 AVCodecContext *enc, *dec;
1137 enc = ost->st->codec;
1138 dec = ist->st->codec;
1140 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1142 /* by default, we output a single frame */
1147 if(video_sync_method){
1148 double vdelta = sync_ipts - ost->sync_opts;
1149 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1152 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1155 }else if(vdelta>0.6)
1156 ost->sync_opts= lrintf(sync_ipts);
1157 }else if (vdelta > 1.1)
1158 nb_frames = lrintf(vdelta);
1159 //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);
1160 if (nb_frames == 0){
1163 fprintf(stderr, "*** drop!\n");
1164 }else if (nb_frames > 1) {
1165 nb_frames_dup += nb_frames - 1;
1167 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1170 ost->sync_opts= lrintf(sync_ipts);
1172 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1176 formatted_picture = in_picture;
1177 final_picture = formatted_picture;
1179 resample_changed = ost->resample_width != dec->width ||
1180 ost->resample_height != dec->height ||
1181 ost->resample_pix_fmt != dec->pix_fmt;
1183 if (resample_changed) {
1184 av_log(NULL, AV_LOG_INFO,
1185 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1186 ist->file_index, ist->st->index,
1187 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1188 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1189 if(!ost->video_resample)
1193 #if !CONFIG_AVFILTER
1194 if (ost->video_resample) {
1195 final_picture = &ost->pict_tmp;
1196 if (resample_changed) {
1197 /* initialize a new scaler context */
1198 sws_freeContext(ost->img_resample_ctx);
1199 ost->img_resample_ctx = sws_getContext(
1200 ist->st->codec->width,
1201 ist->st->codec->height,
1202 ist->st->codec->pix_fmt,
1203 ost->st->codec->width,
1204 ost->st->codec->height,
1205 ost->st->codec->pix_fmt,
1206 ost->sws_flags, NULL, NULL, NULL);
1207 if (ost->img_resample_ctx == NULL) {
1208 fprintf(stderr, "Cannot get resampling context\n");
1212 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1213 0, ost->resample_height, final_picture->data, final_picture->linesize);
1217 /* duplicates frame if needed */
1218 for(i=0;i<nb_frames;i++) {
1220 av_init_packet(&pkt);
1221 pkt.stream_index= ost->index;
1223 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1224 /* raw pictures are written as AVPicture structure to
1225 avoid any copies. We support temorarily the older
1227 AVFrame* old_frame = enc->coded_frame;
1228 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1229 pkt.data= (uint8_t *)final_picture;
1230 pkt.size= sizeof(AVPicture);
1231 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1232 pkt.flags |= AV_PKT_FLAG_KEY;
1234 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1235 enc->coded_frame = old_frame;
1237 AVFrame big_picture;
1239 big_picture= *final_picture;
1240 /* better than nothing: use input picture interlaced
1242 big_picture.interlaced_frame = in_picture->interlaced_frame;
1243 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1244 if(top_field_first == -1)
1245 big_picture.top_field_first = in_picture->top_field_first;
1247 big_picture.top_field_first = top_field_first;
1250 /* handles sameq here. This is not correct because it may
1251 not be a global option */
1252 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1254 big_picture.pict_type = 0;
1255 // big_picture.pts = AV_NOPTS_VALUE;
1256 big_picture.pts= ost->sync_opts;
1257 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1258 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1259 if (ost->forced_kf_index < ost->forced_kf_count &&
1260 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1261 big_picture.pict_type = AV_PICTURE_TYPE_I;
1262 ost->forced_kf_index++;
1264 ret = avcodec_encode_video(enc,
1265 bit_buffer, bit_buffer_size,
1268 fprintf(stderr, "Video encoding failed\n");
1273 pkt.data= bit_buffer;
1275 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1276 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1277 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1278 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1279 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1281 if(enc->coded_frame->key_frame)
1282 pkt.flags |= AV_PKT_FLAG_KEY;
1283 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1286 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1287 // enc->frame_number-1, ret, enc->pict_type);
1288 /* if two pass, output log */
1289 if (ost->logfile && enc->stats_out) {
1290 fprintf(ost->logfile, "%s", enc->stats_out);
1295 ost->frame_number++;
1299 static double psnr(double d){
1300 return -10.0*log(d)/log(10.0);
1303 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1306 AVCodecContext *enc;
1308 double ti1, bitrate, avg_bitrate;
1310 /* this is executed just the first time do_video_stats is called */
1312 vstats_file = fopen(vstats_filename, "w");
1319 enc = ost->st->codec;
1320 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1321 frame_number = ost->frame_number;
1322 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1323 if (enc->flags&CODEC_FLAG_PSNR)
1324 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1326 fprintf(vstats_file,"f_size= %6d ", frame_size);
1327 /* compute pts value */
1328 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1332 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1333 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1334 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1335 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1336 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1340 static void print_report(AVFormatContext **output_files,
1341 AVOutputStream **ost_table, int nb_ostreams,
1345 AVOutputStream *ost;
1346 AVFormatContext *oc;
1348 AVCodecContext *enc;
1349 int frame_number, vid, i;
1350 double bitrate, ti1, pts;
1351 static int64_t last_time = -1;
1352 static int qp_histogram[52];
1354 if (!is_last_report) {
1356 /* display the report every 0.5 seconds */
1357 cur_time = av_gettime();
1358 if (last_time == -1) {
1359 last_time = cur_time;
1362 if ((cur_time - last_time) < 500000)
1364 last_time = cur_time;
1368 oc = output_files[0];
1370 total_size = avio_size(oc->pb);
1371 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1372 total_size= avio_tell(oc->pb);
1377 for(i=0;i<nb_ostreams;i++) {
1380 enc = ost->st->codec;
1381 if (!ost->st->stream_copy && enc->coded_frame)
1382 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1383 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1384 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1386 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1387 float t = (av_gettime()-timer_start) / 1000000.0;
1389 frame_number = ost->frame_number;
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1391 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1393 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1397 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1400 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1402 if (enc->flags&CODEC_FLAG_PSNR){
1404 double error, error_sum=0;
1405 double scale, scale_sum=0;
1406 char type[3]= {'Y','U','V'};
1407 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1410 error= enc->error[j];
1411 scale= enc->width*enc->height*255.0*255.0*frame_number;
1413 error= enc->coded_frame->error[j];
1414 scale= enc->width*enc->height*255.0*255.0;
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1421 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1425 /* compute min output value */
1426 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1427 if ((pts < ti1) && (pts > 0))
1433 if (verbose > 0 || is_last_report) {
1434 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1436 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1437 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1438 (double)total_size / 1024, ti1, bitrate);
1440 if (nb_frames_dup || nb_frames_drop)
1441 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1442 nb_frames_dup, nb_frames_drop);
1445 fprintf(stderr, "%s \r", buf);
1450 if (is_last_report && verbose >= 0){
1451 int64_t raw= audio_size + video_size + extra_size;
1452 fprintf(stderr, "\n");
1453 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1457 100.0*(total_size - raw)/raw
1462 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1464 int fill_char = 0x00;
1465 if (sample_fmt == AV_SAMPLE_FMT_U8)
1467 memset(buf, fill_char, size);
1470 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1471 static int output_packet(AVInputStream *ist, int ist_index,
1472 AVOutputStream **ost_table, int nb_ostreams,
1473 const AVPacket *pkt)
1475 AVFormatContext *os;
1476 AVOutputStream *ost;
1480 void *buffer_to_free = NULL;
1481 static unsigned int samples_size= 0;
1482 AVSubtitle subtitle, *subtitle_to_free;
1483 int64_t pkt_pts = AV_NOPTS_VALUE;
1485 int frame_available;
1489 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1491 if(ist->next_pts == AV_NOPTS_VALUE)
1492 ist->next_pts= ist->pts;
1496 av_init_packet(&avpkt);
1504 if(pkt->dts != AV_NOPTS_VALUE)
1505 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1506 if(pkt->pts != AV_NOPTS_VALUE)
1507 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1509 //while we have more to decode or while the decoder did output something on EOF
1510 while (avpkt.size > 0 || (!pkt && got_output)) {
1511 uint8_t *data_buf, *decoded_data_buf;
1512 int data_size, decoded_data_size;
1514 ist->pts= ist->next_pts;
1516 if(avpkt.size && avpkt.size != pkt->size &&
1517 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1518 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1519 ist->showed_multi_packet_warning=1;
1522 /* decode the packet if needed */
1523 decoded_data_buf = NULL; /* fail safe */
1524 decoded_data_size= 0;
1525 data_buf = avpkt.data;
1526 data_size = avpkt.size;
1527 subtitle_to_free = NULL;
1528 if (ist->decoding_needed) {
1529 switch(ist->st->codec->codec_type) {
1530 case AVMEDIA_TYPE_AUDIO:{
1531 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1532 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1534 samples= av_malloc(samples_size);
1536 decoded_data_size= samples_size;
1537 /* XXX: could avoid copy if PCM 16 bits with same
1538 endianness as CPU */
1539 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1546 got_output = decoded_data_size > 0;
1547 /* Some bug in mpeg audio decoder gives */
1548 /* decoded_data_size < 0, it seems they are overflows */
1550 /* no audio frame */
1553 decoded_data_buf = (uint8_t *)samples;
1554 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1555 (ist->st->codec->sample_rate * ist->st->codec->channels);
1557 case AVMEDIA_TYPE_VIDEO:
1558 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1559 /* XXX: allocate picture correctly */
1560 avcodec_get_frame_defaults(&picture);
1561 avpkt.pts = pkt_pts;
1562 avpkt.dts = ist->pts;
1563 pkt_pts = AV_NOPTS_VALUE;
1565 ret = avcodec_decode_video2(ist->st->codec,
1566 &picture, &got_output, &avpkt);
1567 ist->st->quality= picture.quality;
1571 /* no picture yet */
1572 goto discard_packet;
1574 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1575 if (ist->st->codec->time_base.num != 0) {
1576 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1577 ist->next_pts += ((int64_t)AV_TIME_BASE *
1578 ist->st->codec->time_base.num * ticks) /
1579 ist->st->codec->time_base.den;
1582 buffer_to_free = NULL;
1583 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1585 case AVMEDIA_TYPE_SUBTITLE:
1586 ret = avcodec_decode_subtitle2(ist->st->codec,
1587 &subtitle, &got_output, &avpkt);
1591 goto discard_packet;
1593 subtitle_to_free = &subtitle;
1600 switch(ist->st->codec->codec_type) {
1601 case AVMEDIA_TYPE_AUDIO:
1602 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1603 ist->st->codec->sample_rate;
1605 case AVMEDIA_TYPE_VIDEO:
1606 if (ist->st->codec->time_base.num != 0) {
1607 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1608 ist->next_pts += ((int64_t)AV_TIME_BASE *
1609 ist->st->codec->time_base.num * ticks) /
1610 ist->st->codec->time_base.den;
1619 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1620 for (i = 0; i < nb_ostreams; i++) {
1622 if (ost->input_video_filter && ost->source_index == ist_index) {
1624 if (ist->st->sample_aspect_ratio.num)
1625 sar = ist->st->sample_aspect_ratio;
1627 sar = ist->st->codec->sample_aspect_ratio;
1628 // add it to be filtered
1629 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1637 // preprocess audio (volume)
1638 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1639 if (audio_volume != 256) {
1642 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1643 int v = ((*volp) * audio_volume + 128) >> 8;
1644 if (v < -32768) v = -32768;
1645 if (v > 32767) v = 32767;
1651 /* frame rate emulation */
1653 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1654 int64_t now = av_gettime() - ist->start;
1658 /* if output time reached then transcode raw format,
1659 encode packets and output them */
1660 if (start_time == 0 || ist->pts >= start_time)
1661 for(i=0;i<nb_ostreams;i++) {
1665 if (ost->source_index == ist_index) {
1667 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1668 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1669 while (frame_available) {
1670 AVRational ist_pts_tb;
1671 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1672 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1674 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1676 os = output_files[ost->file_index];
1678 /* set the input output pts pairs */
1679 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1681 if (ost->encoding_needed) {
1682 av_assert0(ist->decoding_needed);
1683 switch(ost->st->codec->codec_type) {
1684 case AVMEDIA_TYPE_AUDIO:
1685 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1687 case AVMEDIA_TYPE_VIDEO:
1689 if (ost->picref->video && !ost->frame_aspect_ratio)
1690 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1692 do_video_out(os, ost, ist, &picture, &frame_size);
1693 if (vstats_filename && frame_size)
1694 do_video_stats(os, ost, frame_size);
1696 case AVMEDIA_TYPE_SUBTITLE:
1697 do_subtitle_out(os, ost, ist, &subtitle,
1704 AVFrame avframe; //FIXME/XXX remove this
1706 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1708 av_init_packet(&opkt);
1710 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1711 #if !CONFIG_AVFILTER
1717 /* no reencoding needed : output the packet directly */
1718 /* force the input stream PTS */
1720 avcodec_get_frame_defaults(&avframe);
1721 ost->st->codec->coded_frame= &avframe;
1722 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1724 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1725 audio_size += data_size;
1726 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1727 video_size += data_size;
1731 opkt.stream_index= ost->index;
1732 if(pkt->pts != AV_NOPTS_VALUE)
1733 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1735 opkt.pts= AV_NOPTS_VALUE;
1737 if (pkt->dts == AV_NOPTS_VALUE)
1738 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1740 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1741 opkt.dts -= ost_tb_start_time;
1743 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1744 opkt.flags= pkt->flags;
1746 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1747 if( ost->st->codec->codec_id != CODEC_ID_H264
1748 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1749 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1751 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1752 opkt.destruct= av_destruct_packet;
1754 opkt.data = data_buf;
1755 opkt.size = data_size;
1758 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1759 ost->st->codec->frame_number++;
1760 ost->frame_number++;
1761 av_free_packet(&opkt);
1765 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1766 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1768 avfilter_unref_buffer(ost->picref);
1774 av_free(buffer_to_free);
1775 /* XXX: allocate the subtitles in the codec ? */
1776 if (subtitle_to_free) {
1777 avsubtitle_free(subtitle_to_free);
1778 subtitle_to_free = NULL;
1785 for(i=0;i<nb_ostreams;i++) {
1787 if (ost->source_index == ist_index) {
1788 AVCodecContext *enc= ost->st->codec;
1789 os = output_files[ost->file_index];
1791 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1793 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1796 if (ost->encoding_needed) {
1800 av_init_packet(&pkt);
1801 pkt.stream_index= ost->index;
1803 switch(ost->st->codec->codec_type) {
1804 case AVMEDIA_TYPE_AUDIO:
1805 fifo_bytes = av_fifo_size(ost->fifo);
1807 /* encode any samples remaining in fifo */
1808 if (fifo_bytes > 0) {
1809 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1810 int fs_tmp = enc->frame_size;
1812 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1813 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1814 enc->frame_size = fifo_bytes / (osize * enc->channels);
1816 int frame_bytes = enc->frame_size*osize*enc->channels;
1817 if (allocated_audio_buf_size < frame_bytes)
1819 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1822 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1823 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1824 ost->st->time_base.num, enc->sample_rate);
1825 enc->frame_size = fs_tmp;
1828 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1831 fprintf(stderr, "Audio encoding failed\n");
1835 pkt.flags |= AV_PKT_FLAG_KEY;
1837 case AVMEDIA_TYPE_VIDEO:
1838 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1840 fprintf(stderr, "Video encoding failed\n");
1844 if(enc->coded_frame && enc->coded_frame->key_frame)
1845 pkt.flags |= AV_PKT_FLAG_KEY;
1846 if (ost->logfile && enc->stats_out) {
1847 fprintf(ost->logfile, "%s", enc->stats_out);
1856 pkt.data= bit_buffer;
1858 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1859 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1860 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1872 static void print_sdp(AVFormatContext **avc, int n)
1876 av_sdp_create(avc, n, sdp, sizeof(sdp));
1877 printf("SDP:\n%s\n", sdp);
1881 static int copy_chapters(int infile, int outfile)
1883 AVFormatContext *is = input_files[infile].ctx;
1884 AVFormatContext *os = output_files[outfile];
1887 for (i = 0; i < is->nb_chapters; i++) {
1888 AVChapter *in_ch = is->chapters[i], *out_ch;
1889 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1890 AV_TIME_BASE_Q, in_ch->time_base);
1891 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1892 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1895 if (in_ch->end < ts_off)
1897 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1900 out_ch = av_mallocz(sizeof(AVChapter));
1902 return AVERROR(ENOMEM);
1904 out_ch->id = in_ch->id;
1905 out_ch->time_base = in_ch->time_base;
1906 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1907 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1909 if (metadata_chapters_autocopy)
1910 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1913 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1915 return AVERROR(ENOMEM);
1916 os->chapters[os->nb_chapters - 1] = out_ch;
1921 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1922 AVCodecContext *avctx)
1928 for (p = kf; *p; p++)
1931 ost->forced_kf_count = n;
1932 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1933 if (!ost->forced_kf_pts) {
1934 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1937 for (i = 0; i < n; i++) {
1938 p = i ? strchr(p, ',') + 1 : kf;
1939 t = parse_time_or_die("force_key_frames", p, 1);
1940 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1945 * The following code is the main loop of the file converter
1947 static int transcode(AVFormatContext **output_files,
1948 int nb_output_files,
1949 AVInputFile *input_files,
1951 AVStreamMap *stream_maps, int nb_stream_maps)
1953 int ret = 0, i, j, k, n, nb_ostreams = 0;
1954 AVFormatContext *is, *os;
1955 AVCodecContext *codec, *icodec;
1956 AVOutputStream *ost, **ost_table = NULL;
1960 uint8_t no_packet[MAX_FILES]={0};
1961 int no_packet_count=0;
1964 for (i = 0; i < nb_input_streams; i++)
1965 input_streams[i].start = av_gettime();
1967 /* output stream init */
1969 for(i=0;i<nb_output_files;i++) {
1970 os = output_files[i];
1971 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1972 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1973 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1974 ret = AVERROR(EINVAL);
1977 nb_ostreams += os->nb_streams;
1979 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1980 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1981 ret = AVERROR(EINVAL);
1985 /* Sanity check the mapping args -- do the input files & streams exist? */
1986 for(i=0;i<nb_stream_maps;i++) {
1987 int fi = stream_maps[i].file_index;
1988 int si = stream_maps[i].stream_index;
1990 if (fi < 0 || fi > nb_input_files - 1 ||
1991 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
1992 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1993 ret = AVERROR(EINVAL);
1996 fi = stream_maps[i].sync_file_index;
1997 si = stream_maps[i].sync_stream_index;
1998 if (fi < 0 || fi > nb_input_files - 1 ||
1999 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
2000 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2001 ret = AVERROR(EINVAL);
2006 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2010 for(k=0;k<nb_output_files;k++) {
2011 os = output_files[k];
2012 for(i=0;i<os->nb_streams;i++,n++) {
2014 ost = ost_table[n] = output_streams_for_file[k][i];
2015 ost->st = os->streams[i];
2016 if (nb_stream_maps > 0) {
2017 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2018 stream_maps[n].stream_index;
2020 /* Sanity check that the stream types match */
2021 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2022 int i= ost->file_index;
2023 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2024 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2025 stream_maps[n].file_index, stream_maps[n].stream_index,
2026 ost->file_index, ost->index);
2031 int best_nb_frames=-1;
2032 /* get corresponding input stream index : we select the first one with the right type */
2034 for (j = 0; j < nb_input_streams; j++) {
2036 ist = &input_streams[j];
2039 AVFormatContext *f = input_files[ist->file_index].ctx;
2041 for(pi=0; pi<f->nb_programs; pi++){
2042 AVProgram *p= f->programs[pi];
2043 if(p->id == opt_programid)
2044 for(si=0; si<p->nb_stream_indexes; si++){
2045 if(f->streams[ p->stream_index[si] ] == ist->st)
2050 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2051 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2052 if(best_nb_frames < ist->st->codec_info_nb_frames){
2053 best_nb_frames= ist->st->codec_info_nb_frames;
2054 ost->source_index = j;
2061 if(! opt_programid) {
2062 /* try again and reuse existing stream */
2063 for (j = 0; j < nb_input_streams; j++) {
2064 ist = &input_streams[j];
2065 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2066 && ist->st->discard != AVDISCARD_ALL) {
2067 ost->source_index = j;
2073 int i= ost->file_index;
2074 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2075 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2076 ost->file_index, ost->index);
2081 ist = &input_streams[ost->source_index];
2083 ost->sync_ist = (nb_stream_maps > 0) ?
2084 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2085 stream_maps[n].sync_stream_index] : ist;
2089 /* for each output stream, we compute the right encoding parameters */
2090 for(i=0;i<nb_ostreams;i++) {
2092 os = output_files[ost->file_index];
2093 ist = &input_streams[ost->source_index];
2095 codec = ost->st->codec;
2096 icodec = ist->st->codec;
2098 if (metadata_streams_autocopy)
2099 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2100 AV_DICT_DONT_OVERWRITE);
2102 ost->st->disposition = ist->st->disposition;
2103 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2104 codec->chroma_sample_location = icodec->chroma_sample_location;
2106 if (ost->st->stream_copy) {
2107 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2109 if (extra_size > INT_MAX)
2112 /* if stream_copy is selected, no need to decode or encode */
2113 codec->codec_id = icodec->codec_id;
2114 codec->codec_type = icodec->codec_type;
2116 if(!codec->codec_tag){
2117 if( !os->oformat->codec_tag
2118 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2119 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2120 codec->codec_tag = icodec->codec_tag;
2123 codec->bit_rate = icodec->bit_rate;
2124 codec->rc_max_rate = icodec->rc_max_rate;
2125 codec->rc_buffer_size = icodec->rc_buffer_size;
2126 codec->extradata= av_mallocz(extra_size);
2127 if (!codec->extradata)
2129 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2130 codec->extradata_size= icodec->extradata_size;
2131 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){
2132 codec->time_base = icodec->time_base;
2133 codec->time_base.num *= icodec->ticks_per_frame;
2134 av_reduce(&codec->time_base.num, &codec->time_base.den,
2135 codec->time_base.num, codec->time_base.den, INT_MAX);
2137 codec->time_base = ist->st->time_base;
2138 switch(codec->codec_type) {
2139 case AVMEDIA_TYPE_AUDIO:
2140 if(audio_volume != 256) {
2141 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2144 codec->channel_layout = icodec->channel_layout;
2145 codec->sample_rate = icodec->sample_rate;
2146 codec->channels = icodec->channels;
2147 codec->frame_size = icodec->frame_size;
2148 codec->audio_service_type = icodec->audio_service_type;
2149 codec->block_align= icodec->block_align;
2150 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2151 codec->block_align= 0;
2152 if(codec->codec_id == CODEC_ID_AC3)
2153 codec->block_align= 0;
2155 case AVMEDIA_TYPE_VIDEO:
2156 codec->pix_fmt = icodec->pix_fmt;
2157 codec->width = icodec->width;
2158 codec->height = icodec->height;
2159 codec->has_b_frames = icodec->has_b_frames;
2160 if (!codec->sample_aspect_ratio.num) {
2161 codec->sample_aspect_ratio =
2162 ost->st->sample_aspect_ratio =
2163 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2164 ist->st->codec->sample_aspect_ratio.num ?
2165 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2168 case AVMEDIA_TYPE_SUBTITLE:
2169 codec->width = icodec->width;
2170 codec->height = icodec->height;
2172 case AVMEDIA_TYPE_DATA:
2179 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2180 switch(codec->codec_type) {
2181 case AVMEDIA_TYPE_AUDIO:
2182 ost->fifo= av_fifo_alloc(1024);
2185 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2186 if (!codec->sample_rate) {
2187 codec->sample_rate = icodec->sample_rate;
2189 codec->sample_rate >>= icodec->lowres;
2191 choose_sample_rate(ost->st, ost->enc);
2192 codec->time_base = (AVRational){1, codec->sample_rate};
2193 if (!codec->channels)
2194 codec->channels = icodec->channels;
2195 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2196 codec->channel_layout = 0;
2197 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2198 icodec->request_channels = codec->channels;
2199 ist->decoding_needed = 1;
2200 ost->encoding_needed = 1;
2201 ost->resample_sample_fmt = icodec->sample_fmt;
2202 ost->resample_sample_rate = icodec->sample_rate;
2203 ost->resample_channels = icodec->channels;
2205 case AVMEDIA_TYPE_VIDEO:
2206 if (codec->pix_fmt == PIX_FMT_NONE)
2207 codec->pix_fmt = icodec->pix_fmt;
2208 choose_pixel_fmt(ost->st, ost->enc);
2210 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2211 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2214 ost->video_resample = codec->width != icodec->width ||
2215 codec->height != icodec->height ||
2216 codec->pix_fmt != icodec->pix_fmt;
2217 if (ost->video_resample) {
2218 #if !CONFIG_AVFILTER
2219 avcodec_get_frame_defaults(&ost->pict_tmp);
2220 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2221 codec->width, codec->height)) {
2222 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2225 ost->img_resample_ctx = sws_getContext(
2232 ost->sws_flags, NULL, NULL, NULL);
2233 if (ost->img_resample_ctx == NULL) {
2234 fprintf(stderr, "Cannot get resampling context\n");
2238 codec->bits_per_raw_sample= 0;
2240 if (!codec->width || !codec->height) {
2241 codec->width = icodec->width;
2242 codec->height = icodec->height;
2244 ost->resample_height = icodec->height;
2245 ost->resample_width = icodec->width;
2246 ost->resample_pix_fmt= icodec->pix_fmt;
2247 ost->encoding_needed = 1;
2248 ist->decoding_needed = 1;
2250 if (!ost->frame_rate.num)
2251 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2252 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2253 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2254 ost->frame_rate = ost->enc->supported_framerates[idx];
2256 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2259 if (configure_video_filters(ist, ost)) {
2260 fprintf(stderr, "Error opening filters!\n");
2265 case AVMEDIA_TYPE_SUBTITLE:
2266 ost->encoding_needed = 1;
2267 ist->decoding_needed = 1;
2274 if (ost->encoding_needed &&
2275 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2276 char logfilename[1024];
2279 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2280 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2282 if (codec->flags & CODEC_FLAG_PASS1) {
2283 f = fopen(logfilename, "wb");
2285 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2291 size_t logbuffer_size;
2292 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2293 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2296 codec->stats_in = logbuffer;
2300 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2301 int size= codec->width * codec->height;
2302 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2307 bit_buffer = av_malloc(bit_buffer_size);
2309 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2311 ret = AVERROR(ENOMEM);
2315 /* open each encoder */
2316 for(i=0;i<nb_ostreams;i++) {
2318 if (ost->encoding_needed) {
2319 AVCodec *codec = ost->enc;
2320 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2322 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2323 ost->st->codec->codec_id, ost->file_index, ost->index);
2324 ret = AVERROR(EINVAL);
2327 if (dec->subtitle_header) {
2328 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2329 if (!ost->st->codec->subtitle_header) {
2330 ret = AVERROR(ENOMEM);
2333 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2334 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2336 if (avcodec_open(ost->st->codec, codec) < 0) {
2337 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2338 ost->file_index, ost->index);
2339 ret = AVERROR(EINVAL);
2342 extra_size += ost->st->codec->extradata_size;
2346 /* open each decoder */
2347 for (i = 0; i < nb_input_streams; i++) {
2348 ist = &input_streams[i];
2349 if (ist->decoding_needed) {
2350 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2352 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2354 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2355 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2356 ret = AVERROR(EINVAL);
2360 /* update requested sample format for the decoder based on the
2361 corresponding encoder sample format */
2362 for (j = 0; j < nb_ostreams; j++) {
2364 if (ost->source_index == i) {
2365 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2370 if (avcodec_open(ist->st->codec, codec) < 0) {
2371 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2372 ist->file_index, ist->st->index);
2373 ret = AVERROR(EINVAL);
2376 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2377 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2382 for (i = 0; i < nb_input_streams; i++) {
2384 ist = &input_streams[i];
2386 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2387 ist->next_pts = AV_NOPTS_VALUE;
2388 init_pts_correction(&ist->pts_ctx);
2392 /* set meta data information from input file if required */
2393 for (i=0;i<nb_meta_data_maps;i++) {
2394 AVFormatContext *files[2];
2395 AVDictionary **meta[2];
2398 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2399 if ((index) < 0 || (index) >= (nb_elems)) {\
2400 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2402 ret = AVERROR(EINVAL);\
2406 int out_file_index = meta_data_maps[i][0].file;
2407 int in_file_index = meta_data_maps[i][1].file;
2408 if (in_file_index < 0 || out_file_index < 0)
2410 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2411 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2413 files[0] = output_files[out_file_index];
2414 files[1] = input_files[in_file_index].ctx;
2416 for (j = 0; j < 2; j++) {
2417 AVMetaDataMap *map = &meta_data_maps[i][j];
2419 switch (map->type) {
2421 meta[j] = &files[j]->metadata;
2424 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2425 meta[j] = &files[j]->streams[map->index]->metadata;
2428 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2429 meta[j] = &files[j]->chapters[map->index]->metadata;
2432 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2433 meta[j] = &files[j]->programs[map->index]->metadata;
2438 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2441 /* copy global metadata by default */
2442 if (metadata_global_autocopy) {
2444 for (i = 0; i < nb_output_files; i++)
2445 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2446 AV_DICT_DONT_OVERWRITE);
2449 /* copy chapters according to chapter maps */
2450 for (i = 0; i < nb_chapter_maps; i++) {
2451 int infile = chapter_maps[i].in_file;
2452 int outfile = chapter_maps[i].out_file;
2454 if (infile < 0 || outfile < 0)
2456 if (infile >= nb_input_files) {
2457 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2458 ret = AVERROR(EINVAL);
2461 if (outfile >= nb_output_files) {
2462 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2463 ret = AVERROR(EINVAL);
2466 copy_chapters(infile, outfile);
2469 /* copy chapters from the first input file that has them*/
2470 if (!nb_chapter_maps)
2471 for (i = 0; i < nb_input_files; i++) {
2472 if (!input_files[i].ctx->nb_chapters)
2475 for (j = 0; j < nb_output_files; j++)
2476 if ((ret = copy_chapters(i, j)) < 0)
2481 /* open files and write file headers */
2482 for(i=0;i<nb_output_files;i++) {
2483 os = output_files[i];
2484 if (avformat_write_header(os, &output_opts[i]) < 0) {
2485 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2486 ret = AVERROR(EINVAL);
2489 assert_avoptions(output_opts[i]);
2490 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2496 /* dump the file output parameters - cannot be done before in case
2498 for(i=0;i<nb_output_files;i++) {
2499 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2502 /* dump the stream mapping */
2504 fprintf(stderr, "Stream mapping:\n");
2505 for(i=0;i<nb_ostreams;i++) {
2507 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2508 input_streams[ost->source_index].file_index,
2509 input_streams[ost->source_index].st->index,
2512 if (ost->sync_ist != &input_streams[ost->source_index])
2513 fprintf(stderr, " [sync #%d.%d]",
2514 ost->sync_ist->file_index,
2515 ost->sync_ist->st->index);
2516 fprintf(stderr, "\n");
2521 fprintf(stderr, "%s\n", error);
2526 print_sdp(output_files, nb_output_files);
2530 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2533 timer_start = av_gettime();
2535 for(; received_sigterm == 0;) {
2536 int file_index, ist_index;
2545 /* select the stream that we must read now by looking at the
2546 smallest output pts */
2548 for(i=0;i<nb_ostreams;i++) {
2551 os = output_files[ost->file_index];
2552 ist = &input_streams[ost->source_index];
2553 if(ist->is_past_recording_time || no_packet[ist->file_index])
2555 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2556 ipts = (double)ist->pts;
2557 if (!input_files[ist->file_index].eof_reached){
2558 if(ipts < ipts_min) {
2560 if(input_sync ) file_index = ist->file_index;
2562 if(opts < opts_min) {
2564 if(!input_sync) file_index = ist->file_index;
2567 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2572 /* if none, if is finished */
2573 if (file_index < 0) {
2574 if(no_packet_count){
2576 memset(no_packet, 0, sizeof(no_packet));
2583 /* finish if limit size exhausted */
2584 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2587 /* read a frame from it and output it in the fifo */
2588 is = input_files[file_index].ctx;
2589 ret= av_read_frame(is, &pkt);
2590 if(ret == AVERROR(EAGAIN)){
2591 no_packet[file_index]=1;
2596 input_files[file_index].eof_reached = 1;
2604 memset(no_packet, 0, sizeof(no_packet));
2607 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2608 is->streams[pkt.stream_index]);
2610 /* the following test is needed in case new streams appear
2611 dynamically in stream : we ignore them */
2612 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2613 goto discard_packet;
2614 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2615 ist = &input_streams[ist_index];
2617 goto discard_packet;
2619 if (pkt.dts != AV_NOPTS_VALUE)
2620 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2621 if (pkt.pts != AV_NOPTS_VALUE)
2622 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2624 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2625 && input_files_ts_scale[file_index][pkt.stream_index]){
2626 if(pkt.pts != AV_NOPTS_VALUE)
2627 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2628 if(pkt.dts != AV_NOPTS_VALUE)
2629 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2632 // 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);
2633 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2634 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2635 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2636 int64_t delta= pkt_dts - ist->next_pts;
2637 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2638 input_files_ts_offset[ist->file_index]-= delta;
2640 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2641 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2642 if(pkt.pts != AV_NOPTS_VALUE)
2643 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2647 /* finish if recording time exhausted */
2648 if (recording_time != INT64_MAX &&
2649 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2650 ist->is_past_recording_time = 1;
2651 goto discard_packet;
2654 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2655 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2658 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2659 ist->file_index, ist->st->index);
2662 av_free_packet(&pkt);
2667 av_free_packet(&pkt);
2669 /* dump report by using the output first video and audio streams */
2670 print_report(output_files, ost_table, nb_ostreams, 0);
2673 /* at the end of stream, we must flush the decoder buffers */
2674 for (i = 0; i < nb_input_streams; i++) {
2675 ist = &input_streams[i];
2676 if (ist->decoding_needed) {
2677 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2683 /* write the trailer if needed and close file */
2684 for(i=0;i<nb_output_files;i++) {
2685 os = output_files[i];
2686 av_write_trailer(os);
2689 /* dump report by using the first video and audio streams */
2690 print_report(output_files, ost_table, nb_ostreams, 1);
2692 /* close each encoder */
2693 for(i=0;i<nb_ostreams;i++) {
2695 if (ost->encoding_needed) {
2696 av_freep(&ost->st->codec->stats_in);
2697 avcodec_close(ost->st->codec);
2700 avfilter_graph_free(&ost->graph);
2704 /* close each decoder */
2705 for (i = 0; i < nb_input_streams; i++) {
2706 ist = &input_streams[i];
2707 if (ist->decoding_needed) {
2708 avcodec_close(ist->st->codec);
2716 av_freep(&bit_buffer);
2719 for(i=0;i<nb_ostreams;i++) {
2722 if (ost->st->stream_copy)
2723 av_freep(&ost->st->codec->extradata);
2725 fclose(ost->logfile);
2726 ost->logfile = NULL;
2728 av_fifo_free(ost->fifo); /* works even if fifo is not
2729 initialized but set to zero */
2730 av_freep(&ost->st->codec->subtitle_header);
2731 av_free(ost->pict_tmp.data[0]);
2732 av_free(ost->forced_kf_pts);
2733 if (ost->video_resample)
2734 sws_freeContext(ost->img_resample_ctx);
2736 audio_resample_close(ost->resample);
2737 if (ost->reformat_ctx)
2738 av_audio_convert_free(ost->reformat_ctx);
2747 static int opt_format(const char *opt, const char *arg)
2749 last_asked_format = arg;
2753 static int opt_video_rc_override_string(const char *opt, const char *arg)
2755 video_rc_override_string = arg;
2759 static int opt_me_threshold(const char *opt, const char *arg)
2761 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2765 static int opt_verbose(const char *opt, const char *arg)
2767 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2771 static int opt_frame_rate(const char *opt, const char *arg)
2773 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2774 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2780 static int opt_bitrate(const char *opt, const char *arg)
2782 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2784 opt_default(opt, arg);
2786 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2787 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2792 static int opt_frame_crop(const char *opt, const char *arg)
2794 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2795 return AVERROR(EINVAL);
2798 static int opt_frame_size(const char *opt, const char *arg)
2800 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2801 fprintf(stderr, "Incorrect frame size\n");
2802 return AVERROR(EINVAL);
2807 static int opt_pad(const char *opt, const char *arg) {
2808 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2812 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2814 if (strcmp(arg, "list")) {
2815 frame_pix_fmt = av_get_pix_fmt(arg);
2816 if (frame_pix_fmt == PIX_FMT_NONE) {
2817 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2818 return AVERROR(EINVAL);
2827 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2834 p = strchr(arg, ':');
2836 x = strtol(arg, &end, 10);
2838 y = strtol(end+1, &end, 10);
2840 ar = (double)x / (double)y;
2842 ar = strtod(arg, NULL);
2845 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2846 return AVERROR(EINVAL);
2848 frame_aspect_ratio = ar;
2852 static int opt_metadata(const char *opt, const char *arg)
2854 char *mid= strchr(arg, '=');
2857 fprintf(stderr, "Missing =\n");
2862 av_dict_set(&metadata, arg, mid, 0);
2867 static int opt_qscale(const char *opt, const char *arg)
2869 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2870 if (video_qscale == 0) {
2871 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2872 return AVERROR(EINVAL);
2877 static int opt_top_field_first(const char *opt, const char *arg)
2879 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2883 static int opt_thread_count(const char *opt, const char *arg)
2885 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2888 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2893 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2895 if (strcmp(arg, "list")) {
2896 audio_sample_fmt = av_get_sample_fmt(arg);
2897 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2898 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2899 return AVERROR(EINVAL);
2904 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2905 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2911 static int opt_audio_rate(const char *opt, const char *arg)
2913 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2917 static int opt_audio_channels(const char *opt, const char *arg)
2919 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2923 static int opt_video_channel(const char *opt, const char *arg)
2925 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2929 static int opt_video_standard(const char *opt, const char *arg)
2931 video_standard = av_strdup(arg);
2935 static int opt_codec(int *pstream_copy, char **pcodec_name,
2936 int codec_type, const char *arg)
2938 av_freep(pcodec_name);
2939 if (!strcmp(arg, "copy")) {
2942 *pcodec_name = av_strdup(arg);
2947 static int opt_audio_codec(const char *opt, const char *arg)
2949 return opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2952 static int opt_video_codec(const char *opt, const char *arg)
2954 return opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2957 static int opt_subtitle_codec(const char *opt, const char *arg)
2959 return opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2962 static int opt_data_codec(const char *opt, const char *arg)
2964 return opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2967 static int opt_codec_tag(const char *opt, const char *arg)
2970 uint32_t *codec_tag;
2972 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2973 !strcmp(opt, "vtag") ? &video_codec_tag :
2974 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2978 *codec_tag = strtol(arg, &tail, 0);
2980 *codec_tag = AV_RL32(arg);
2985 static int opt_map(const char *opt, const char *arg)
2990 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2991 m = &stream_maps[nb_stream_maps-1];
2993 m->file_index = strtol(arg, &p, 0);
2997 m->stream_index = strtol(p, &p, 0);
3000 m->sync_file_index = strtol(p, &p, 0);
3003 m->sync_stream_index = strtol(p, &p, 0);
3005 m->sync_file_index = m->file_index;
3006 m->sync_stream_index = m->stream_index;
3011 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3022 *index = strtol(++arg, endptr, 0);
3025 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3032 static int opt_map_metadata(const char *opt, const char *arg)
3034 AVMetaDataMap *m, *m1;
3037 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3038 &nb_meta_data_maps, nb_meta_data_maps + 1);
3040 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3041 m->file = strtol(arg, &p, 0);
3042 parse_meta_type(p, &m->type, &m->index, &p);
3046 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3047 m1->file = strtol(p, &p, 0);
3048 parse_meta_type(p, &m1->type, &m1->index, &p);
3050 if (m->type == 'g' || m1->type == 'g')
3051 metadata_global_autocopy = 0;
3052 if (m->type == 's' || m1->type == 's')
3053 metadata_streams_autocopy = 0;
3054 if (m->type == 'c' || m1->type == 'c')
3055 metadata_chapters_autocopy = 0;
3060 static int opt_map_meta_data(const char *opt, const char *arg)
3062 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3063 "Use -map_metadata instead.\n");
3064 return opt_map_metadata(opt, arg);
3067 static int opt_map_chapters(const char *opt, const char *arg)
3072 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3073 nb_chapter_maps + 1);
3074 c = &chapter_maps[nb_chapter_maps - 1];
3075 c->out_file = strtol(arg, &p, 0);
3079 c->in_file = strtol(p, &p, 0);
3083 static int opt_input_ts_scale(const char *opt, const char *arg)
3085 unsigned int stream;
3089 stream = strtol(arg, &p, 0);
3092 scale= strtod(p, &p);
3094 if(stream >= MAX_STREAMS)
3097 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);
3098 input_files_ts_scale[nb_input_files][stream]= scale;
3102 static int opt_recording_time(const char *opt, const char *arg)
3104 recording_time = parse_time_or_die(opt, arg, 1);
3108 static int opt_start_time(const char *opt, const char *arg)
3110 start_time = parse_time_or_die(opt, arg, 1);
3114 static int opt_recording_timestamp(const char *opt, const char *arg)
3116 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3120 static int opt_input_ts_offset(const char *opt, const char *arg)
3122 input_ts_offset = parse_time_or_die(opt, arg, 1);
3126 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3128 const char *codec_string = encoder ? "encoder" : "decoder";
3132 return CODEC_ID_NONE;
3134 avcodec_find_encoder_by_name(name) :
3135 avcodec_find_decoder_by_name(name);
3137 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3140 if(codec->type != type) {
3141 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3144 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3145 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3146 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3147 "results.\nAdd '-strict experimental' if you want to use it.\n",
3148 codec_string, codec->name);
3150 avcodec_find_encoder(codec->id) :
3151 avcodec_find_decoder(codec->id);
3152 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3153 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3154 codec_string, codec->name);
3160 static int opt_input_file(const char *opt, const char *filename)
3162 AVFormatContext *ic;
3163 AVInputFormat *file_iformat = NULL;
3164 int err, i, ret, rfps, rfps_base;
3168 if (last_asked_format) {
3169 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3170 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3173 last_asked_format = NULL;
3176 if (!strcmp(filename, "-"))
3179 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3180 !strcmp(filename, "/dev/stdin");
3182 /* get default parameters from command line */
3183 ic = avformat_alloc_context();
3185 print_error(filename, AVERROR(ENOMEM));
3188 if (audio_sample_rate) {
3189 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3190 av_dict_set(&format_opts, "sample_rate", buf, 0);
3192 if (audio_channels) {
3193 snprintf(buf, sizeof(buf), "%d", audio_channels);
3194 av_dict_set(&format_opts, "channels", buf, 0);
3196 if (frame_rate.num) {
3197 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3198 av_dict_set(&format_opts, "framerate", buf, 0);
3200 if (frame_width && frame_height) {
3201 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3202 av_dict_set(&format_opts, "video_size", buf, 0);
3204 if (frame_pix_fmt != PIX_FMT_NONE)
3205 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3207 ic->video_codec_id =
3208 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3209 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3210 ic->audio_codec_id =
3211 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3212 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3213 ic->subtitle_codec_id=
3214 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3215 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3216 ic->flags |= AVFMT_FLAG_NONBLOCK;
3218 /* open the input file with generic libav function */
3219 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3221 print_error(filename, err);
3224 assert_avoptions(format_opts);
3229 for(i=0; i<ic->nb_streams; i++){
3230 ic->streams[i]->discard= AVDISCARD_ALL;
3232 for(i=0; i<ic->nb_programs; i++){
3233 AVProgram *p= ic->programs[i];
3234 if(p->id != opt_programid){
3235 p->discard = AVDISCARD_ALL;
3238 for(j=0; j<p->nb_stream_indexes; j++){
3239 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3244 fprintf(stderr, "Specified program id not found\n");
3250 ic->loop_input = loop_input;
3252 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3253 for (i = 0; i < ic->nb_streams; i++) {
3254 AVCodecContext *dec = ic->streams[i]->codec;
3255 switch (dec->codec_type) {
3256 case AVMEDIA_TYPE_AUDIO:
3257 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3258 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3261 case AVMEDIA_TYPE_VIDEO:
3262 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3263 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3269 /* If not enough info to get the stream parameters, we decode the
3270 first frames to get it. (used in mpeg case for example) */
3271 ret = av_find_stream_info(ic);
3272 if (ret < 0 && verbose >= 0) {
3273 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3274 av_close_input_file(ic);
3278 timestamp = start_time;
3279 /* add the stream start time */
3280 if (ic->start_time != AV_NOPTS_VALUE)
3281 timestamp += ic->start_time;
3283 /* if seeking requested, we execute it */
3284 if (start_time != 0) {
3285 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3287 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3288 filename, (double)timestamp / AV_TIME_BASE);
3290 /* reset seek info */
3294 /* update the current parameters so that they match the one of the input stream */
3295 for(i=0;i<ic->nb_streams;i++) {
3296 AVStream *st = ic->streams[i];
3297 AVCodecContext *dec = st->codec;
3300 dec->thread_count = thread_count;
3301 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3303 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3304 ist = &input_streams[nb_input_streams - 1];
3306 ist->file_index = nb_input_files;
3309 switch (dec->codec_type) {
3310 case AVMEDIA_TYPE_AUDIO:
3311 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3312 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]);
3313 channel_layout = dec->channel_layout;
3314 audio_sample_fmt = dec->sample_fmt;
3316 st->discard= AVDISCARD_ALL;
3318 case AVMEDIA_TYPE_VIDEO:
3319 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3320 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]);
3321 rfps = ic->streams[i]->r_frame_rate.num;
3322 rfps_base = ic->streams[i]->r_frame_rate.den;
3324 dec->flags |= CODEC_FLAG_EMU_EDGE;
3325 dec->height >>= dec->lowres;
3326 dec->width >>= dec->lowres;
3329 dec->debug |= FF_DEBUG_MV;
3331 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3334 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3335 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3337 (float)rfps / rfps_base, rfps, rfps_base);
3341 st->discard= AVDISCARD_ALL;
3342 else if(video_discard)
3343 st->discard= video_discard;
3345 case AVMEDIA_TYPE_DATA:
3347 case AVMEDIA_TYPE_SUBTITLE:
3348 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3349 if(subtitle_disable)
3350 st->discard = AVDISCARD_ALL;
3352 case AVMEDIA_TYPE_ATTACHMENT:
3353 case AVMEDIA_TYPE_UNKNOWN:
3360 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3361 /* dump the file content */
3363 av_dump_format(ic, nb_input_files, filename, 0);
3365 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3366 input_files[nb_input_files - 1].ctx = ic;
3367 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3370 frame_rate = (AVRational){0, 0};
3371 frame_pix_fmt = PIX_FMT_NONE;
3374 audio_sample_rate = 0;
3377 av_freep(&video_codec_name);
3378 av_freep(&audio_codec_name);
3379 av_freep(&subtitle_codec_name);
3385 static void check_inputs(int *has_video_ptr,
3387 int *has_subtitle_ptr,
3390 int has_video, has_audio, has_subtitle, has_data, i, j;
3391 AVFormatContext *ic;
3398 for(j=0;j<nb_input_files;j++) {
3399 ic = input_files[j].ctx;
3400 for(i=0;i<ic->nb_streams;i++) {
3401 AVCodecContext *enc = ic->streams[i]->codec;
3402 switch(enc->codec_type) {
3403 case AVMEDIA_TYPE_AUDIO:
3406 case AVMEDIA_TYPE_VIDEO:
3409 case AVMEDIA_TYPE_SUBTITLE:
3412 case AVMEDIA_TYPE_DATA:
3413 case AVMEDIA_TYPE_ATTACHMENT:
3414 case AVMEDIA_TYPE_UNKNOWN:
3422 *has_video_ptr = has_video;
3423 *has_audio_ptr = has_audio;
3424 *has_subtitle_ptr = has_subtitle;
3425 *has_data_ptr = has_data;
3428 static void new_video_stream(AVFormatContext *oc, int file_idx)
3431 AVOutputStream *ost;
3432 AVCodecContext *video_enc;
3433 enum CodecID codec_id = CODEC_ID_NONE;
3434 AVCodec *codec= NULL;
3436 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3438 fprintf(stderr, "Could not alloc stream\n");
3441 ost = new_output_stream(oc, file_idx);
3443 if(!video_stream_copy){
3444 if (video_codec_name) {
3445 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3446 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3447 codec = avcodec_find_encoder_by_name(video_codec_name);
3450 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3451 codec = avcodec_find_encoder(codec_id);
3454 ost->frame_aspect_ratio = frame_aspect_ratio;
3455 frame_aspect_ratio = 0;
3457 ost->avfilter= vfilters;
3462 avcodec_get_context_defaults3(st->codec, codec);
3463 ost->bitstream_filters = video_bitstream_filters;
3464 video_bitstream_filters= NULL;
3466 st->codec->thread_count= thread_count;
3468 video_enc = st->codec;
3471 video_enc->codec_tag= video_codec_tag;
3473 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3474 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3475 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3478 if (video_stream_copy) {
3479 st->stream_copy = 1;
3480 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3481 video_enc->sample_aspect_ratio =
3482 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3488 ost->frame_rate = frame_rate;
3489 video_enc->codec_id = codec_id;
3490 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3492 video_enc->width = frame_width;
3493 video_enc->height = frame_height;
3494 video_enc->pix_fmt = frame_pix_fmt;
3495 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3498 video_enc->gop_size = 0;
3499 if (video_qscale || same_quality) {
3500 video_enc->flags |= CODEC_FLAG_QSCALE;
3501 video_enc->global_quality=
3502 st->quality = FF_QP2LAMBDA * video_qscale;
3506 video_enc->intra_matrix = intra_matrix;
3508 video_enc->inter_matrix = inter_matrix;
3510 p= video_rc_override_string;
3513 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3515 fprintf(stderr, "error parsing rc_override\n");
3518 video_enc->rc_override=
3519 av_realloc(video_enc->rc_override,
3520 sizeof(RcOverride)*(i+1));
3521 video_enc->rc_override[i].start_frame= start;
3522 video_enc->rc_override[i].end_frame = end;
3524 video_enc->rc_override[i].qscale= q;
3525 video_enc->rc_override[i].quality_factor= 1.0;
3528 video_enc->rc_override[i].qscale= 0;
3529 video_enc->rc_override[i].quality_factor= -q/100.0;
3534 video_enc->rc_override_count=i;
3535 if (!video_enc->rc_initial_buffer_occupancy)
3536 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3537 video_enc->me_threshold= me_threshold;
3538 video_enc->intra_dc_precision= intra_dc_precision - 8;
3541 video_enc->flags|= CODEC_FLAG_PSNR;
3546 video_enc->flags |= CODEC_FLAG_PASS1;
3548 video_enc->flags |= CODEC_FLAG_PASS2;
3552 if (forced_key_frames)
3553 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3555 if (video_language) {
3556 av_dict_set(&st->metadata, "language", video_language, 0);
3557 av_freep(&video_language);
3560 /* reset some key parameters */
3562 av_freep(&video_codec_name);
3563 av_freep(&forced_key_frames);
3564 video_stream_copy = 0;
3565 frame_pix_fmt = PIX_FMT_NONE;
3568 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3571 AVOutputStream *ost;
3572 AVCodec *codec= NULL;
3573 AVCodecContext *audio_enc;
3574 enum CodecID codec_id = CODEC_ID_NONE;
3576 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3578 fprintf(stderr, "Could not alloc stream\n");
3581 ost = new_output_stream(oc, file_idx);
3583 if(!audio_stream_copy){
3584 if (audio_codec_name) {
3585 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3586 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3587 codec = avcodec_find_encoder_by_name(audio_codec_name);
3590 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3591 codec = avcodec_find_encoder(codec_id);
3595 avcodec_get_context_defaults3(st->codec, codec);
3597 ost->bitstream_filters = audio_bitstream_filters;
3598 audio_bitstream_filters= NULL;
3600 st->codec->thread_count= thread_count;
3602 audio_enc = st->codec;
3603 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3606 audio_enc->codec_tag= audio_codec_tag;
3608 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3609 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3610 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3612 if (audio_stream_copy) {
3613 st->stream_copy = 1;
3615 audio_enc->codec_id = codec_id;
3616 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3618 if (audio_qscale > QSCALE_NONE) {
3619 audio_enc->flags |= CODEC_FLAG_QSCALE;
3620 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3623 audio_enc->channels = audio_channels;
3624 audio_enc->sample_fmt = audio_sample_fmt;
3625 if (audio_sample_rate)
3626 audio_enc->sample_rate = audio_sample_rate;
3627 audio_enc->channel_layout = channel_layout;
3628 choose_sample_fmt(st, codec);
3630 if (audio_language) {
3631 av_dict_set(&st->metadata, "language", audio_language, 0);
3632 av_freep(&audio_language);
3635 /* reset some key parameters */
3637 av_freep(&audio_codec_name);
3638 audio_stream_copy = 0;
3641 static void new_data_stream(AVFormatContext *oc, int file_idx)
3644 AVCodec *codec=NULL;
3645 AVCodecContext *data_enc;
3647 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3649 fprintf(stderr, "Could not alloc stream\n");
3652 new_output_stream(oc, file_idx);
3653 data_enc = st->codec;
3654 if (!data_stream_copy) {
3655 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3658 avcodec_get_context_defaults3(st->codec, codec);
3660 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3663 data_enc->codec_tag= data_codec_tag;
3665 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3666 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3667 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3669 if (data_stream_copy) {
3670 st->stream_copy = 1;
3674 av_freep(&data_codec_name);
3675 data_stream_copy = 0;
3678 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3681 AVOutputStream *ost;
3682 AVCodec *codec=NULL;
3683 AVCodecContext *subtitle_enc;
3684 enum CodecID codec_id = CODEC_ID_NONE;
3686 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3688 fprintf(stderr, "Could not alloc stream\n");
3691 ost = new_output_stream(oc, file_idx);
3692 subtitle_enc = st->codec;
3693 if(!subtitle_stream_copy){
3694 if (subtitle_codec_name) {
3695 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3696 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3697 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3700 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3701 codec = avcodec_find_encoder(codec_id);
3704 avcodec_get_context_defaults3(st->codec, codec);
3706 ost->bitstream_filters = subtitle_bitstream_filters;
3707 subtitle_bitstream_filters= NULL;
3709 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3711 if(subtitle_codec_tag)
3712 subtitle_enc->codec_tag= subtitle_codec_tag;
3714 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3715 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3716 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3718 if (subtitle_stream_copy) {
3719 st->stream_copy = 1;
3721 subtitle_enc->codec_id = codec_id;
3722 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3725 if (subtitle_language) {
3726 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3727 av_freep(&subtitle_language);
3730 subtitle_disable = 0;
3731 av_freep(&subtitle_codec_name);
3732 subtitle_stream_copy = 0;
3735 static int opt_new_stream(const char *opt, const char *arg)
3737 AVFormatContext *oc;
3738 int file_idx = nb_output_files - 1;
3739 if (nb_output_files <= 0) {
3740 fprintf(stderr, "At least one output file must be specified\n");
3743 oc = output_files[file_idx];
3745 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3746 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3747 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3748 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3753 /* arg format is "output-stream-index:streamid-value". */
3754 static int opt_streamid(const char *opt, const char *arg)
3760 av_strlcpy(idx_str, arg, sizeof(idx_str));
3761 p = strchr(idx_str, ':');
3764 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3769 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3770 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3771 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3775 static void opt_output_file(const char *filename)
3777 AVFormatContext *oc;
3778 int err, use_video, use_audio, use_subtitle, use_data;
3779 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3780 AVOutputFormat *file_oformat;
3782 if (!strcmp(filename, "-"))
3785 oc = avformat_alloc_context();
3787 print_error(filename, AVERROR(ENOMEM));
3791 if (last_asked_format) {
3792 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3793 if (!file_oformat) {
3794 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3797 last_asked_format = NULL;
3799 file_oformat = av_guess_format(NULL, filename, NULL);
3800 if (!file_oformat) {
3801 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3807 oc->oformat = file_oformat;
3808 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3810 if (!strcmp(file_oformat->name, "ffm") &&
3811 av_strstart(filename, "http:", NULL)) {
3812 /* special case for files sent to ffserver: we get the stream
3813 parameters from ffserver */
3814 int err = read_ffserver_streams(oc, filename);
3816 print_error(filename, err);
3820 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3821 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3822 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3823 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 */
3825 /* disable if no corresponding type found and at least one
3827 if (nb_input_files > 0) {
3828 check_inputs(&input_has_video,
3830 &input_has_subtitle,
3833 if (!input_has_video)
3835 if (!input_has_audio)
3837 if (!input_has_subtitle)
3839 if (!input_has_data)
3843 /* manual disable */
3844 if (audio_disable) use_audio = 0;
3845 if (video_disable) use_video = 0;
3846 if (subtitle_disable) use_subtitle = 0;
3847 if (data_disable) use_data = 0;
3849 if (use_video) new_video_stream(oc, nb_output_files);
3850 if (use_audio) new_audio_stream(oc, nb_output_files);
3851 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3852 if (use_data) new_data_stream(oc, nb_output_files);
3854 oc->timestamp = recording_timestamp;
3856 av_dict_copy(&oc->metadata, metadata, 0);
3857 av_dict_free(&metadata);
3860 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3861 output_files[nb_output_files++] = oc;
3863 /* check filename in case of an image number is expected */
3864 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3865 if (!av_filename_number_test(oc->filename)) {
3866 print_error(oc->filename, AVERROR(EINVAL));
3871 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3872 /* test if it already exists to avoid loosing precious files */
3873 if (!file_overwrite &&
3874 (strchr(filename, ':') == NULL ||
3875 filename[1] == ':' ||
3876 av_strstart(filename, "file:", NULL))) {
3877 if (avio_check(filename, 0) == 0) {
3879 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3881 if (!read_yesno()) {
3882 fprintf(stderr, "Not overwriting - exiting\n");
3887 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3894 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3895 print_error(filename, err);
3900 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3901 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3902 oc->loop_output = loop_output;
3903 oc->flags |= AVFMT_FLAG_NONBLOCK;
3905 frame_rate = (AVRational){0, 0};
3908 audio_sample_rate = 0;
3911 av_freep(&forced_key_frames);
3916 /* same option as mencoder */
3917 static int opt_pass(const char *opt, const char *arg)
3919 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3923 static int64_t getutime(void)
3926 struct rusage rusage;
3928 getrusage(RUSAGE_SELF, &rusage);
3929 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3930 #elif HAVE_GETPROCESSTIMES
3932 FILETIME c, e, k, u;
3933 proc = GetCurrentProcess();
3934 GetProcessTimes(proc, &c, &e, &k, &u);
3935 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3937 return av_gettime();
3941 static int64_t getmaxrss(void)
3943 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3944 struct rusage rusage;
3945 getrusage(RUSAGE_SELF, &rusage);
3946 return (int64_t)rusage.ru_maxrss * 1024;
3947 #elif HAVE_GETPROCESSMEMORYINFO
3949 PROCESS_MEMORY_COUNTERS memcounters;
3950 proc = GetCurrentProcess();
3951 memcounters.cb = sizeof(memcounters);
3952 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3953 return memcounters.PeakPagefileUsage;
3959 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3962 const char *p = str;
3969 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3976 static void opt_inter_matrix(const char *arg)
3978 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3979 parse_matrix_coeffs(inter_matrix, arg);
3982 static void opt_intra_matrix(const char *arg)
3984 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3985 parse_matrix_coeffs(intra_matrix, arg);
3988 static void show_usage(void)
3990 printf("Hyper fast Audio and Video encoder\n");
3991 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3995 static void show_help(void)
3998 AVOutputFormat *oformat = NULL;
3999 AVInputFormat *iformat = NULL;
4001 av_log_set_callback(log_callback_help);
4003 show_help_options(options, "Main options:\n",
4004 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
4005 show_help_options(options, "\nAdvanced options:\n",
4006 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4008 show_help_options(options, "\nVideo options:\n",
4009 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4011 show_help_options(options, "\nAdvanced Video options:\n",
4012 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4013 OPT_VIDEO | OPT_EXPERT);
4014 show_help_options(options, "\nAudio options:\n",
4015 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4017 show_help_options(options, "\nAdvanced Audio options:\n",
4018 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4019 OPT_AUDIO | OPT_EXPERT);
4020 show_help_options(options, "\nSubtitle options:\n",
4021 OPT_SUBTITLE | OPT_GRAB,
4023 show_help_options(options, "\nAudio/Video grab options:\n",
4027 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4030 /* individual codec options */
4032 while ((c = av_codec_next(c))) {
4033 if (c->priv_class) {
4034 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4039 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4042 /* individual muxer options */
4043 while ((oformat = av_oformat_next(oformat))) {
4044 if (oformat->priv_class) {
4045 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4050 /* individual demuxer options */
4051 while ((iformat = av_iformat_next(iformat))) {
4052 if (iformat->priv_class) {
4053 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4058 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4061 static int opt_target(const char *opt, const char *arg)
4063 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4064 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4066 if(!strncmp(arg, "pal-", 4)) {
4069 } else if(!strncmp(arg, "ntsc-", 5)) {
4072 } else if(!strncmp(arg, "film-", 5)) {
4077 /* Calculate FR via float to avoid int overflow */
4078 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4081 } else if((fr == 29970) || (fr == 23976)) {
4084 /* Try to determine PAL/NTSC by peeking in the input files */
4085 if(nb_input_files) {
4087 for (j = 0; j < nb_input_files; j++) {
4088 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4089 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4090 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4092 fr = c->time_base.den * 1000 / c->time_base.num;
4096 } else if((fr == 29970) || (fr == 23976)) {
4106 if(verbose > 0 && norm != UNKNOWN)
4107 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4110 if(norm == UNKNOWN) {
4111 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4112 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4113 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4117 if(!strcmp(arg, "vcd")) {
4118 opt_video_codec("vcodec", "mpeg1video");
4119 opt_audio_codec("vcodec", "mp2");
4120 opt_format("f", "vcd");
4122 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4123 opt_frame_rate("r", frame_rates[norm]);
4124 opt_default("g", norm == PAL ? "15" : "18");
4126 opt_default("b", "1150000");
4127 opt_default("maxrate", "1150000");
4128 opt_default("minrate", "1150000");
4129 opt_default("bufsize", "327680"); // 40*1024*8;
4131 opt_default("ab", "224000");
4132 audio_sample_rate = 44100;
4135 opt_default("packetsize", "2324");
4136 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4138 /* We have to offset the PTS, so that it is consistent with the SCR.
4139 SCR starts at 36000, but the first two packs contain only padding
4140 and the first pack from the other stream, respectively, may also have
4141 been written before.
4142 So the real data starts at SCR 36000+3*1200. */
4143 mux_preload= (36000+3*1200) / 90000.0; //0.44
4144 } else if(!strcmp(arg, "svcd")) {
4146 opt_video_codec("vcodec", "mpeg2video");
4147 opt_audio_codec("acodec", "mp2");
4148 opt_format("f", "svcd");
4150 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4151 opt_frame_rate("r", frame_rates[norm]);
4152 opt_default("g", norm == PAL ? "15" : "18");
4154 opt_default("b", "2040000");
4155 opt_default("maxrate", "2516000");
4156 opt_default("minrate", "0"); //1145000;
4157 opt_default("bufsize", "1835008"); //224*1024*8;
4158 opt_default("flags", "+scan_offset");
4161 opt_default("ab", "224000");
4162 audio_sample_rate = 44100;
4164 opt_default("packetsize", "2324");
4166 } else if(!strcmp(arg, "dvd")) {
4168 opt_video_codec("vcodec", "mpeg2video");
4169 opt_audio_codec("vcodec", "ac3");
4170 opt_format("f", "dvd");
4172 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4173 opt_frame_rate("r", frame_rates[norm]);
4174 opt_default("g", norm == PAL ? "15" : "18");
4176 opt_default("b", "6000000");
4177 opt_default("maxrate", "9000000");
4178 opt_default("minrate", "0"); //1500000;
4179 opt_default("bufsize", "1835008"); //224*1024*8;
4181 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4182 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4184 opt_default("ab", "448000");
4185 audio_sample_rate = 48000;
4187 } else if(!strncmp(arg, "dv", 2)) {
4189 opt_format("f", "dv");
4191 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4192 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4193 norm == PAL ? "yuv420p" : "yuv411p");
4194 opt_frame_rate("r", frame_rates[norm]);
4196 audio_sample_rate = 48000;
4200 fprintf(stderr, "Unknown target: %s\n", arg);
4201 return AVERROR(EINVAL);
4206 static int opt_vstats_file(const char *opt, const char *arg)
4208 av_free (vstats_filename);
4209 vstats_filename=av_strdup (arg);
4213 static int opt_vstats(const char *opt, const char *arg)
4216 time_t today2 = time(NULL);
4217 struct tm *today = localtime(&today2);
4219 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4221 return opt_vstats_file(opt, filename);
4224 static int opt_bsf(const char *opt, const char *arg)
4226 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4227 AVBitStreamFilterContext **bsfp;
4230 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4234 bsfp= *opt == 'v' ? &video_bitstream_filters :
4235 *opt == 'a' ? &audio_bitstream_filters :
4236 &subtitle_bitstream_filters;
4238 bsfp= &(*bsfp)->next;
4245 static int opt_preset(const char *opt, const char *arg)
4248 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4249 char *codec_name = *opt == 'v' ? video_codec_name :
4250 *opt == 'a' ? audio_codec_name :
4251 subtitle_codec_name;
4253 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4254 fprintf(stderr, "File for preset '%s' not found\n", arg);
4259 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4260 if(line[0] == '#' && !e)
4262 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4264 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4267 if(!strcmp(tmp, "acodec")){
4268 opt_audio_codec(tmp, tmp2);
4269 }else if(!strcmp(tmp, "vcodec")){
4270 opt_video_codec(tmp, tmp2);
4271 }else if(!strcmp(tmp, "scodec")){
4272 opt_subtitle_codec(tmp, tmp2);
4273 }else if(!strcmp(tmp, "dcodec")){
4274 opt_data_codec(tmp, tmp2);
4275 }else if(opt_default(tmp, tmp2) < 0){
4276 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4286 static const OptionDef options[] = {
4288 #include "cmdutils_common_opts.h"
4289 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4290 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4291 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4292 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4293 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4294 "outfile[,metadata]:infile[,metadata]" },
4295 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4296 "outfile[,metadata]:infile[,metadata]" },
4297 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4298 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4299 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4300 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4301 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4302 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4303 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4304 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4305 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4306 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4307 "add timings for benchmarking" },
4308 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4309 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4310 "dump each input packet" },
4311 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4312 "when dumping packets, also dump the payload" },
4313 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4314 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4315 { "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)", "" },
4316 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4317 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4318 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4319 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4320 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4321 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4322 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4323 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4324 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4325 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4326 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4327 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4328 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4331 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4332 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4333 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4334 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4335 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4336 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4337 { "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" },
4338 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4339 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4340 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4341 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4342 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4343 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4344 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4345 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4346 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4347 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4348 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4349 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4350 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4351 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4352 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4353 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4354 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4355 "use same quantizer as source (implies VBR)" },
4356 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4357 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4358 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4359 "deinterlace pictures" },
4360 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4361 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4362 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4364 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4366 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4367 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4368 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4369 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4370 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4371 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4372 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4373 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4374 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4375 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4376 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4379 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4380 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4381 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4382 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4383 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4384 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4385 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4386 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4387 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4388 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4389 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4390 { "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" },
4392 /* subtitle options */
4393 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4394 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4395 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4396 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4397 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4400 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4401 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4402 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4405 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4406 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4408 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4409 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4410 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4412 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4413 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4414 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4415 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4416 /* data codec support */
4417 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4419 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4423 int main(int argc, char **argv)
4427 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4429 avcodec_register_all();
4431 avdevice_register_all();
4434 avfilter_register_all();
4438 avio_set_interrupt_cb(decode_interrupt_cb);
4445 parse_options(argc, argv, options, opt_output_file);
4447 if(nb_output_files <= 0 && nb_input_files == 0) {
4449 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4453 /* file converter / grab */
4454 if (nb_output_files <= 0) {
4455 fprintf(stderr, "At least one output file must be specified\n");
4459 if (nb_input_files == 0) {
4460 fprintf(stderr, "At least one input file must be specified\n");
4465 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4466 stream_maps, nb_stream_maps) < 0)
4468 ti = getutime() - ti;
4470 int maxrss = getmaxrss() / 1024;
4471 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4474 return ffmpeg_exit(0);