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/pixdesc.h"
43 #include "libavutil/avstring.h"
44 #include "libavutil/libm.h"
45 #include "libavformat/os_support.h"
48 # include "libavfilter/avfilter.h"
49 # include "libavfilter/avfiltergraph.h"
50 # include "libavfilter/vsrc_buffer.h"
53 #if HAVE_SYS_RESOURCE_H
54 #include <sys/types.h>
56 #include <sys/resource.h>
57 #elif HAVE_GETPROCESSTIMES
60 #if HAVE_GETPROCESSMEMORYINFO
66 #include <sys/select.h>
73 #include "libavutil/avassert.h"
75 const char program_name[] = "ffmpeg";
76 const int program_birth_year = 2000;
78 /* select an input stream for an output stream */
79 typedef struct AVStreamMap {
83 int sync_stream_index;
87 * select an input file for an output file
89 typedef struct AVMetaDataMap {
90 int file; //< file index
91 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
92 int index; //< stream/chapter/program number
95 typedef struct AVChapterMap {
100 static const OptionDef options[];
102 #define MAX_FILES 100
103 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
105 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
107 static const char *last_asked_format = NULL;
108 static AVFormatContext *input_files[MAX_FILES];
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_files = 0;
113 static int nb_input_codecs = 0;
114 static int nb_input_files_ts_scale[MAX_FILES] = {0};
116 static AVFormatContext *output_files[MAX_FILES];
117 static AVCodec **output_codecs = NULL;
118 static int nb_output_files = 0;
119 static int nb_output_codecs = 0;
121 static AVStreamMap *stream_maps = NULL;
122 static int nb_stream_maps;
124 /* first item specifies output metadata, second is input */
125 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
126 static int nb_meta_data_maps;
127 static int metadata_global_autocopy = 1;
128 static int metadata_streams_autocopy = 1;
129 static int metadata_chapters_autocopy = 1;
131 static AVChapterMap *chapter_maps = NULL;
132 static int nb_chapter_maps;
134 /* indexed by output file stream index */
135 static int *streamid_map = NULL;
136 static int nb_streamid_map = 0;
138 static int frame_width = 0;
139 static int frame_height = 0;
140 static float frame_aspect_ratio = 0;
141 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
142 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
143 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
144 static AVRational frame_rate;
145 static float video_qscale = 0;
146 static uint16_t *intra_matrix = NULL;
147 static uint16_t *inter_matrix = NULL;
148 static const char *video_rc_override_string=NULL;
149 static int video_disable = 0;
150 static int video_discard = 0;
151 static char *video_codec_name = NULL;
152 static unsigned int video_codec_tag = 0;
153 static char *video_language = NULL;
154 static int same_quality = 0;
155 static int do_deinterlace = 0;
156 static int top_field_first = -1;
157 static int me_threshold = 0;
158 static int intra_dc_precision = 8;
159 static int loop_input = 0;
160 static int loop_output = AVFMT_NOOUTPUTLOOP;
161 static int qp_hist = 0;
163 static char *vfilters = NULL;
166 static int intra_only = 0;
167 static int audio_sample_rate = 44100;
168 static int64_t channel_layout = 0;
169 #define QSCALE_NONE -99999
170 static float audio_qscale = QSCALE_NONE;
171 static int audio_disable = 0;
172 static int audio_channels = 1;
173 static char *audio_codec_name = NULL;
174 static unsigned int audio_codec_tag = 0;
175 static char *audio_language = NULL;
177 static int subtitle_disable = 0;
178 static char *subtitle_codec_name = NULL;
179 static char *subtitle_language = NULL;
180 static unsigned int subtitle_codec_tag = 0;
182 static int data_disable = 0;
183 static char *data_codec_name = NULL;
184 static unsigned int data_codec_tag = 0;
186 static float mux_preload= 0.5;
187 static float mux_max_delay= 0.7;
189 static int64_t recording_time = INT64_MAX;
190 static int64_t start_time = 0;
191 static int64_t recording_timestamp = 0;
192 static int64_t input_ts_offset = 0;
193 static int file_overwrite = 0;
194 static AVMetadata *metadata;
195 static int do_benchmark = 0;
196 static int do_hex_dump = 0;
197 static int do_pkt_dump = 0;
198 static int do_psnr = 0;
199 static int do_pass = 0;
200 static char *pass_logfilename_prefix = NULL;
201 static int audio_stream_copy = 0;
202 static int video_stream_copy = 0;
203 static int subtitle_stream_copy = 0;
204 static int data_stream_copy = 0;
205 static int video_sync_method= -1;
206 static int audio_sync_method= 0;
207 static float audio_drift_threshold= 0.1;
208 static int copy_ts= 0;
210 static int opt_shortest = 0;
211 static char *vstats_filename;
212 static FILE *vstats_file;
213 static int opt_programid = 0;
214 static int copy_initial_nonkeyframes = 0;
216 static int rate_emu = 0;
218 static int video_channel = 0;
219 static char *video_standard;
221 static int audio_volume = 256;
223 static int exit_on_error = 0;
224 static int using_stdin = 0;
225 static int verbose = 1;
226 static int thread_count= 1;
227 static int64_t video_size = 0;
228 static int64_t audio_size = 0;
229 static int64_t extra_size = 0;
230 static int nb_frames_dup = 0;
231 static int nb_frames_drop = 0;
232 static int input_sync;
233 static uint64_t limit_filesize = 0;
234 static int force_fps = 0;
235 static char *forced_key_frames = NULL;
237 static float dts_delta_threshold = 10;
239 static int64_t timer_start;
241 static uint8_t *audio_buf;
242 static uint8_t *audio_out;
243 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
245 static short *samples;
247 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
248 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
249 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
251 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
253 struct AVInputStream;
255 typedef struct AVOutputStream {
256 int file_index; /* file index */
257 int index; /* stream index in the output file */
258 int source_index; /* AVInputStream index */
259 AVStream *st; /* stream in the output file */
260 int encoding_needed; /* true if encoding needed for this stream */
262 /* input pts and corresponding output pts
264 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
265 struct AVInputStream *sync_ist; /* input stream to sync against */
266 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
267 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;
276 float frame_aspect_ratio;
278 /* forced key frames */
279 int64_t *forced_kf_pts;
285 ReSampleContext *resample; /* for audio resampling */
286 int resample_sample_fmt;
287 int resample_channels;
288 int resample_sample_rate;
290 AVAudioConvert *reformat_ctx;
291 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
295 AVFilterContext *output_video_filter;
296 AVFilterContext *input_video_filter;
297 AVFilterBufferRef *picref;
299 AVFilterGraph *graph;
305 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
306 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
308 typedef struct AVInputStream {
311 int discard; /* true if stream data should be discarded */
312 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
313 int64_t sample_index; /* current sample */
315 int64_t start; /* time when read started */
316 int64_t next_pts; /* synthetic pts for cases where pkt.pts
318 int64_t pts; /* current pts */
319 PtsCorrectionContext pts_ctx;
320 int is_start; /* is 1 at the start and after a discontinuity */
321 int showed_multi_packet_warning;
322 int is_past_recording_time;
324 AVFrame *filter_frame;
325 int has_filter_frame;
329 typedef struct AVInputFile {
330 int eof_reached; /* true if eof reached */
331 int ist_index; /* index of first stream in ist_table */
332 int buffer_size; /* current total buffer size */
333 int nb_streams; /* nb streams we are aware of */
338 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
340 AVFilterContext *last_filter, *filter;
341 /** filter graph containing all filters including input & output */
342 AVCodecContext *codec = ost->st->codec;
343 AVCodecContext *icodec = ist->st->codec;
344 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
345 AVRational sample_aspect_ratio;
349 ost->graph = avfilter_graph_alloc();
351 if (ist->st->sample_aspect_ratio.num){
352 sample_aspect_ratio = ist->st->sample_aspect_ratio;
354 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
356 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
357 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
358 sample_aspect_ratio.num, sample_aspect_ratio.den);
360 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
361 "src", args, NULL, ost->graph);
364 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
365 "out", NULL, &ffsink_ctx, ost->graph);
368 last_filter = ost->input_video_filter;
370 if (codec->width != icodec->width || codec->height != icodec->height) {
371 snprintf(args, 255, "%d:%d:flags=0x%X",
375 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
376 NULL, args, NULL, ost->graph)) < 0)
378 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
380 last_filter = filter;
383 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
384 ost->graph->scale_sws_opts = av_strdup(args);
387 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
388 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
390 outputs->name = av_strdup("in");
391 outputs->filter_ctx = last_filter;
392 outputs->pad_idx = 0;
393 outputs->next = NULL;
395 inputs->name = av_strdup("out");
396 inputs->filter_ctx = ost->output_video_filter;
400 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
402 av_freep(&ost->avfilter);
404 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
408 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
411 codec->width = ost->output_video_filter->inputs[0]->w;
412 codec->height = ost->output_video_filter->inputs[0]->h;
413 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
414 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
415 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
416 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
420 #endif /* CONFIG_AVFILTER */
422 static void term_exit(void)
424 av_log(NULL, AV_LOG_QUIET, "");
427 static volatile int received_sigterm = 0;
428 static volatile int received_nb_signals = 0;
431 sigterm_handler(int sig)
433 received_sigterm = sig;
434 received_nb_signals++;
438 static void term_init(void)
440 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
441 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
443 signal(SIGXCPU, sigterm_handler);
447 static int decode_interrupt_cb(void)
449 return received_nb_signals > 1;
452 static int ffmpeg_exit(int ret)
457 for(i=0;i<nb_output_files;i++) {
458 AVFormatContext *s = output_files[i];
459 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
461 avformat_free_context(s);
462 av_free(output_streams_for_file[i]);
464 for(i=0;i<nb_input_files;i++) {
465 av_close_input_file(input_files[i]);
466 av_free(input_files_ts_scale[i]);
469 av_free(intra_matrix);
470 av_free(inter_matrix);
474 av_free(vstats_filename);
476 av_free(streamid_map);
477 av_free(input_codecs);
478 av_free(output_codecs);
479 av_free(stream_maps);
480 av_free(meta_data_maps);
482 av_free(video_codec_name);
483 av_free(audio_codec_name);
484 av_free(subtitle_codec_name);
485 av_free(data_codec_name);
487 av_free(video_standard);
492 allocated_audio_buf_size= allocated_audio_out_size= 0;
499 if (received_sigterm) {
501 "Received signal %d: terminating.\n",
502 (int) received_sigterm);
506 exit(ret); /* not all OS-es handle main() return value */
510 /* similar to ff_dynarray_add() and av_fast_realloc() */
511 static void *grow_array(void *array, int elem_size, int *size, int new_size)
513 if (new_size >= INT_MAX / elem_size) {
514 fprintf(stderr, "Array too big.\n");
517 if (*size < new_size) {
518 uint8_t *tmp = av_realloc(array, new_size*elem_size);
520 fprintf(stderr, "Could not alloc buffer.\n");
523 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
530 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
532 if(codec && codec->sample_fmts){
533 const enum AVSampleFormat *p= codec->sample_fmts;
535 if(*p == st->codec->sample_fmt)
539 av_log(NULL, AV_LOG_WARNING,
540 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
541 av_get_sample_fmt_name(st->codec->sample_fmt),
543 av_get_sample_fmt_name(codec->sample_fmts[0]));
544 st->codec->sample_fmt = codec->sample_fmts[0];
550 * Update the requested input sample format based on the output sample format.
551 * This is currently only used to request float output from decoders which
552 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
553 * Ideally this will be removed in the future when decoders do not do format
554 * conversion and only output in their native format.
556 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
559 /* if sample formats match or a decoder sample format has already been
560 requested, just return */
561 if (enc->sample_fmt == dec->sample_fmt ||
562 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
565 /* if decoder supports more than one output format */
566 if (dec_codec && dec_codec->sample_fmts &&
567 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
568 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
569 enum AVSampleFormat *p;
570 int min_dec = -1, min_inc = -1;
572 /* find a matching sample format in the encoder */
573 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
574 if (*p == enc->sample_fmt) {
575 dec->request_sample_fmt = *p;
577 } else if (*p > enc->sample_fmt) {
578 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
580 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
583 /* if none match, provide the one that matches quality closest */
584 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
585 enc->sample_fmt - min_dec;
589 static void choose_sample_rate(AVStream *st, AVCodec *codec)
591 if(codec && codec->supported_samplerates){
592 const int *p= codec->supported_samplerates;
594 int best_dist=INT_MAX;
596 int dist= abs(st->codec->sample_rate - *p);
597 if(dist < best_dist){
603 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
605 st->codec->sample_rate= best;
609 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
611 if(codec && codec->pix_fmts){
612 const enum PixelFormat *p= codec->pix_fmts;
613 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
614 if(st->codec->codec_id==CODEC_ID_MJPEG){
615 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
616 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
617 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};
621 if(*p == st->codec->pix_fmt)
625 if(st->codec->pix_fmt != PIX_FMT_NONE)
626 av_log(NULL, AV_LOG_WARNING,
627 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
628 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
630 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
631 st->codec->pix_fmt = codec->pix_fmts[0];
636 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
638 int idx = oc->nb_streams - 1;
641 output_streams_for_file[file_idx] =
642 grow_array(output_streams_for_file[file_idx],
643 sizeof(*output_streams_for_file[file_idx]),
644 &nb_output_streams_for_file[file_idx],
646 ost = output_streams_for_file[file_idx][idx] =
647 av_mallocz(sizeof(AVOutputStream));
649 fprintf(stderr, "Could not alloc output stream\n");
652 ost->file_index = file_idx;
655 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
659 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
665 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
668 /* copy stream format */
670 for(i=0;i<ic->nb_streams;i++) {
676 // FIXME: a more elegant solution is needed
677 st = av_mallocz(sizeof(AVStream));
678 memcpy(st, ic->streams[i], sizeof(AVStream));
679 st->codec = avcodec_alloc_context();
681 print_error(filename, AVERROR(ENOMEM));
684 avcodec_copy_context(st->codec, ic->streams[i]->codec);
687 codec = avcodec_find_encoder(st->codec->codec_id);
688 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
689 if (audio_stream_copy) {
692 choose_sample_fmt(st, codec);
693 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
694 if (video_stream_copy) {
697 choose_pixel_fmt(st, codec);
700 if(st->codec->flags & CODEC_FLAG_BITEXACT)
703 new_output_stream(s, nb_output_files);
707 s->timestamp = av_gettime();
709 av_close_input_file(ic);
714 get_sync_ipts(const AVOutputStream *ost)
716 const AVInputStream *ist = ost->sync_ist;
717 return (double)(ist->pts - start_time)/AV_TIME_BASE;
720 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
724 AVPacket new_pkt= *pkt;
725 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
726 &new_pkt.data, &new_pkt.size,
727 pkt->data, pkt->size,
728 pkt->flags & AV_PKT_FLAG_KEY);
731 new_pkt.destruct= av_destruct_packet;
733 fprintf(stderr, "%s failed for stream %d, codec %s",
734 bsfc->filter->name, pkt->stream_index,
735 avctx->codec ? avctx->codec->name : "copy");
745 ret= av_interleaved_write_frame(s, pkt);
747 print_error("av_interleaved_write_frame()", ret);
752 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
754 static void do_audio_out(AVFormatContext *s,
757 unsigned char *buf, int size)
760 int64_t audio_out_size, audio_buf_size;
761 int64_t allocated_for_size= size;
763 int size_out, frame_bytes, ret, resample_changed;
764 AVCodecContext *enc= ost->st->codec;
765 AVCodecContext *dec= ist->st->codec;
766 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
767 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
768 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
771 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
772 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
773 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
774 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
775 audio_buf_size*= osize*enc->channels;
777 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
778 if(coded_bps > 8*osize)
779 audio_out_size= audio_out_size * coded_bps / (8*osize);
780 audio_out_size += FF_MIN_BUFFER_SIZE;
782 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
783 fprintf(stderr, "Buffer sizes too large\n");
787 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
788 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
789 if (!audio_buf || !audio_out){
790 fprintf(stderr, "Out of memory in do_audio_out\n");
794 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
795 ost->audio_resample = 1;
797 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
798 ost->resample_channels != dec->channels ||
799 ost->resample_sample_rate != dec->sample_rate;
801 if ((ost->audio_resample && !ost->resample) || resample_changed) {
802 if (resample_changed) {
803 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",
804 ist->file_index, ist->st->index,
805 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
806 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
807 ost->resample_sample_fmt = dec->sample_fmt;
808 ost->resample_channels = dec->channels;
809 ost->resample_sample_rate = dec->sample_rate;
811 audio_resample_close(ost->resample);
813 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
814 if (audio_sync_method <= 1 &&
815 ost->resample_sample_fmt == enc->sample_fmt &&
816 ost->resample_channels == enc->channels &&
817 ost->resample_sample_rate == enc->sample_rate) {
818 ost->resample = NULL;
819 ost->audio_resample = 0;
820 } else if (ost->audio_resample) {
821 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
822 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
823 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
824 enc->sample_rate, dec->sample_rate,
825 enc->sample_fmt, dec->sample_fmt,
827 if (!ost->resample) {
828 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
829 dec->channels, dec->sample_rate,
830 enc->channels, enc->sample_rate);
836 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
837 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
838 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
839 if (ost->reformat_ctx)
840 av_audio_convert_free(ost->reformat_ctx);
841 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
842 dec->sample_fmt, 1, NULL, 0);
843 if (!ost->reformat_ctx) {
844 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
845 av_get_sample_fmt_name(dec->sample_fmt),
846 av_get_sample_fmt_name(enc->sample_fmt));
849 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
852 if(audio_sync_method){
853 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
854 - av_fifo_size(ost->fifo)/(enc->channels * 2);
855 double idelta= delta*dec->sample_rate / enc->sample_rate;
856 int byte_delta= ((int)idelta)*2*dec->channels;
858 //FIXME resample delay
859 if(fabs(delta) > 50){
860 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
862 byte_delta= FFMAX(byte_delta, -size);
866 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
871 static uint8_t *input_tmp= NULL;
872 input_tmp= av_realloc(input_tmp, byte_delta + size);
874 if(byte_delta > allocated_for_size - size){
875 allocated_for_size= byte_delta + (int64_t)size;
880 memset(input_tmp, 0, byte_delta);
881 memcpy(input_tmp + byte_delta, buf, size);
885 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
887 }else if(audio_sync_method>1){
888 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
889 av_assert0(ost->audio_resample);
891 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
892 // 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));
893 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
897 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
898 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
900 if (ost->audio_resample) {
902 size_out = audio_resample(ost->resample,
903 (short *)buftmp, (short *)buf,
904 size / (dec->channels * isize));
905 size_out = size_out * enc->channels * osize;
911 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
912 const void *ibuf[6]= {buftmp};
913 void *obuf[6]= {audio_buf};
914 int istride[6]= {isize};
915 int ostride[6]= {osize};
916 int len= size_out/istride[0];
917 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
918 printf("av_audio_convert() failed\n");
924 size_out = len*osize;
927 /* now encode as many frames as possible */
928 if (enc->frame_size > 1) {
929 /* output resampled raw samples */
930 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
931 fprintf(stderr, "av_fifo_realloc2() failed\n");
934 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
936 frame_bytes = enc->frame_size * osize * enc->channels;
938 while (av_fifo_size(ost->fifo) >= frame_bytes) {
940 av_init_packet(&pkt);
942 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
944 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
946 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
949 fprintf(stderr, "Audio encoding failed\n");
953 pkt.stream_index= ost->index;
956 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
957 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
958 pkt.flags |= AV_PKT_FLAG_KEY;
959 write_frame(s, &pkt, enc, ost->bitstream_filters);
961 ost->sync_opts += enc->frame_size;
965 av_init_packet(&pkt);
967 ost->sync_opts += size_out / (osize * enc->channels);
969 /* output a pcm frame */
970 /* determine the size of the coded buffer */
973 size_out = size_out*coded_bps/8;
975 if(size_out > audio_out_size){
976 fprintf(stderr, "Internal error, buffer size too small\n");
980 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
981 ret = avcodec_encode_audio(enc, audio_out, size_out,
984 fprintf(stderr, "Audio encoding failed\n");
988 pkt.stream_index= ost->index;
991 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
992 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
993 pkt.flags |= AV_PKT_FLAG_KEY;
994 write_frame(s, &pkt, enc, ost->bitstream_filters);
998 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1000 AVCodecContext *dec;
1001 AVPicture *picture2;
1002 AVPicture picture_tmp;
1005 dec = ist->st->codec;
1007 /* deinterlace : must be done before any resize */
1008 if (do_deinterlace) {
1011 /* create temporary picture */
1012 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1013 buf = av_malloc(size);
1017 picture2 = &picture_tmp;
1018 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1020 if(avpicture_deinterlace(picture2, picture,
1021 dec->pix_fmt, dec->width, dec->height) < 0) {
1022 /* if error, do not deinterlace */
1023 fprintf(stderr, "Deinterlacing failed\n");
1032 if (picture != picture2)
1033 *picture = *picture2;
1037 /* we begin to correct av delay at this threshold */
1038 #define AV_DELAY_MAX 0.100
1040 static void do_subtitle_out(AVFormatContext *s,
1041 AVOutputStream *ost,
1046 static uint8_t *subtitle_out = NULL;
1047 int subtitle_out_max_size = 1024 * 1024;
1048 int subtitle_out_size, nb, i;
1049 AVCodecContext *enc;
1052 if (pts == AV_NOPTS_VALUE) {
1053 fprintf(stderr, "Subtitle packets must have a pts\n");
1059 enc = ost->st->codec;
1061 if (!subtitle_out) {
1062 subtitle_out = av_malloc(subtitle_out_max_size);
1065 /* Note: DVB subtitle need one packet to draw them and one other
1066 packet to clear them */
1067 /* XXX: signal it in the codec context ? */
1068 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1073 for(i = 0; i < nb; i++) {
1074 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1075 // start_display_time is required to be 0
1076 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1077 sub->end_display_time -= sub->start_display_time;
1078 sub->start_display_time = 0;
1079 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1080 subtitle_out_max_size, sub);
1081 if (subtitle_out_size < 0) {
1082 fprintf(stderr, "Subtitle encoding failed\n");
1086 av_init_packet(&pkt);
1087 pkt.stream_index = ost->index;
1088 pkt.data = subtitle_out;
1089 pkt.size = subtitle_out_size;
1090 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1091 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1092 /* XXX: the pts correction is handled here. Maybe handling
1093 it in the codec would be better */
1095 pkt.pts += 90 * sub->start_display_time;
1097 pkt.pts += 90 * sub->end_display_time;
1099 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1103 static int bit_buffer_size= 1024*256;
1104 static uint8_t *bit_buffer= NULL;
1106 static void do_video_out(AVFormatContext *s,
1107 AVOutputStream *ost,
1109 AVFrame *in_picture,
1112 int nb_frames, i, ret, resample_changed;
1113 AVFrame *final_picture, *formatted_picture, *resampling_dst;
1114 AVCodecContext *enc, *dec;
1117 enc = ost->st->codec;
1118 dec = ist->st->codec;
1120 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1122 /* by default, we output a single frame */
1127 if(video_sync_method){
1128 double vdelta = sync_ipts - ost->sync_opts;
1129 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1132 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1135 }else if(vdelta>0.6)
1136 ost->sync_opts= lrintf(sync_ipts);
1137 }else if (vdelta > 1.1)
1138 nb_frames = lrintf(vdelta);
1139 //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);
1140 if (nb_frames == 0){
1143 fprintf(stderr, "*** drop!\n");
1144 }else if (nb_frames > 1) {
1145 nb_frames_dup += nb_frames - 1;
1147 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1150 ost->sync_opts= lrintf(sync_ipts);
1152 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1156 formatted_picture = in_picture;
1157 final_picture = formatted_picture;
1158 resampling_dst = &ost->pict_tmp;
1160 resample_changed = ost->resample_width != dec->width ||
1161 ost->resample_height != dec->height ||
1162 ost->resample_pix_fmt != dec->pix_fmt;
1164 if (resample_changed) {
1165 av_log(NULL, AV_LOG_INFO,
1166 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1167 ist->file_index, ist->st->index,
1168 ost->resample_width, ost->resample_height, avcodec_get_pix_fmt_name(ost->resample_pix_fmt),
1169 dec->width , dec->height , avcodec_get_pix_fmt_name(dec->pix_fmt));
1170 if(!ost->video_resample)
1174 #if !CONFIG_AVFILTER
1175 if (ost->video_resample) {
1176 final_picture = &ost->pict_tmp;
1177 if (resample_changed) {
1178 /* initialize a new scaler context */
1179 sws_freeContext(ost->img_resample_ctx);
1180 ost->img_resample_ctx = sws_getContext(
1181 ist->st->codec->width,
1182 ist->st->codec->height,
1183 ist->st->codec->pix_fmt,
1184 ost->st->codec->width,
1185 ost->st->codec->height,
1186 ost->st->codec->pix_fmt,
1187 ost->sws_flags, NULL, NULL, NULL);
1188 if (ost->img_resample_ctx == NULL) {
1189 fprintf(stderr, "Cannot get resampling context\n");
1193 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1194 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1198 /* duplicates frame if needed */
1199 for(i=0;i<nb_frames;i++) {
1201 av_init_packet(&pkt);
1202 pkt.stream_index= ost->index;
1204 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1205 /* raw pictures are written as AVPicture structure to
1206 avoid any copies. We support temorarily the older
1208 AVFrame* old_frame = enc->coded_frame;
1209 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1210 pkt.data= (uint8_t *)final_picture;
1211 pkt.size= sizeof(AVPicture);
1212 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1213 pkt.flags |= AV_PKT_FLAG_KEY;
1215 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1216 enc->coded_frame = old_frame;
1218 AVFrame big_picture;
1220 big_picture= *final_picture;
1221 /* better than nothing: use input picture interlaced
1223 big_picture.interlaced_frame = in_picture->interlaced_frame;
1224 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1225 if(top_field_first == -1)
1226 big_picture.top_field_first = in_picture->top_field_first;
1228 big_picture.top_field_first = top_field_first;
1231 /* handles sameq here. This is not correct because it may
1232 not be a global option */
1233 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1235 big_picture.pict_type = 0;
1236 // big_picture.pts = AV_NOPTS_VALUE;
1237 big_picture.pts= ost->sync_opts;
1238 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1239 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1240 if (ost->forced_kf_index < ost->forced_kf_count &&
1241 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1242 big_picture.pict_type = AV_PICTURE_TYPE_I;
1243 ost->forced_kf_index++;
1245 ret = avcodec_encode_video(enc,
1246 bit_buffer, bit_buffer_size,
1249 fprintf(stderr, "Video encoding failed\n");
1254 pkt.data= bit_buffer;
1256 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1257 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1258 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1259 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1260 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1262 if(enc->coded_frame->key_frame)
1263 pkt.flags |= AV_PKT_FLAG_KEY;
1264 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1267 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1268 // enc->frame_number-1, ret, enc->pict_type);
1269 /* if two pass, output log */
1270 if (ost->logfile && enc->stats_out) {
1271 fprintf(ost->logfile, "%s", enc->stats_out);
1276 ost->frame_number++;
1280 static double psnr(double d){
1281 return -10.0*log(d)/log(10.0);
1284 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1287 AVCodecContext *enc;
1289 double ti1, bitrate, avg_bitrate;
1291 /* this is executed just the first time do_video_stats is called */
1293 vstats_file = fopen(vstats_filename, "w");
1300 enc = ost->st->codec;
1301 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1302 frame_number = ost->frame_number;
1303 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1304 if (enc->flags&CODEC_FLAG_PSNR)
1305 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1307 fprintf(vstats_file,"f_size= %6d ", frame_size);
1308 /* compute pts value */
1309 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1313 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1314 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1315 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1316 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1317 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1321 static void print_report(AVFormatContext **output_files,
1322 AVOutputStream **ost_table, int nb_ostreams,
1326 AVOutputStream *ost;
1327 AVFormatContext *oc;
1329 AVCodecContext *enc;
1330 int frame_number, vid, i;
1331 double bitrate, ti1, pts;
1332 static int64_t last_time = -1;
1333 static int qp_histogram[52];
1335 if (!is_last_report) {
1337 /* display the report every 0.5 seconds */
1338 cur_time = av_gettime();
1339 if (last_time == -1) {
1340 last_time = cur_time;
1343 if ((cur_time - last_time) < 500000)
1345 last_time = cur_time;
1349 oc = output_files[0];
1351 total_size = avio_size(oc->pb);
1352 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1353 total_size= avio_tell(oc->pb);
1358 for(i=0;i<nb_ostreams;i++) {
1361 enc = ost->st->codec;
1362 if (!ost->st->stream_copy && enc->coded_frame)
1363 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1364 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1365 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1367 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1368 float t = (av_gettime()-timer_start) / 1000000.0;
1370 frame_number = ost->frame_number;
1371 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1372 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1378 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1381 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1383 if (enc->flags&CODEC_FLAG_PSNR){
1385 double error, error_sum=0;
1386 double scale, scale_sum=0;
1387 char type[3]= {'Y','U','V'};
1388 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1391 error= enc->error[j];
1392 scale= enc->width*enc->height*255.0*255.0*frame_number;
1394 error= enc->coded_frame->error[j];
1395 scale= enc->width*enc->height*255.0*255.0;
1400 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1402 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1406 /* compute min output value */
1407 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1408 if ((pts < ti1) && (pts > 0))
1414 if (verbose > 0 || is_last_report) {
1415 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1417 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1418 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1419 (double)total_size / 1024, ti1, bitrate);
1421 if (nb_frames_dup || nb_frames_drop)
1422 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1423 nb_frames_dup, nb_frames_drop);
1426 fprintf(stderr, "%s \r", buf);
1431 if (is_last_report && verbose >= 0){
1432 int64_t raw= audio_size + video_size + extra_size;
1433 fprintf(stderr, "\n");
1434 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1438 100.0*(total_size - raw)/raw
1443 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1445 int fill_char = 0x00;
1446 if (sample_fmt == AV_SAMPLE_FMT_U8)
1448 memset(buf, fill_char, size);
1451 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1452 static int output_packet(AVInputStream *ist, int ist_index,
1453 AVOutputStream **ost_table, int nb_ostreams,
1454 const AVPacket *pkt)
1456 AVFormatContext *os;
1457 AVOutputStream *ost;
1461 void *buffer_to_free = NULL;
1462 static unsigned int samples_size= 0;
1463 AVSubtitle subtitle, *subtitle_to_free;
1464 int64_t pkt_pts = AV_NOPTS_VALUE;
1466 int frame_available;
1470 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1472 if(ist->next_pts == AV_NOPTS_VALUE)
1473 ist->next_pts= ist->pts;
1477 av_init_packet(&avpkt);
1485 if(pkt->dts != AV_NOPTS_VALUE)
1486 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1487 if(pkt->pts != AV_NOPTS_VALUE)
1488 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1490 //while we have more to decode or while the decoder did output something on EOF
1491 while (avpkt.size > 0 || (!pkt && got_output)) {
1492 uint8_t *data_buf, *decoded_data_buf;
1493 int data_size, decoded_data_size;
1495 ist->pts= ist->next_pts;
1497 if(avpkt.size && avpkt.size != pkt->size &&
1498 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1499 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1500 ist->showed_multi_packet_warning=1;
1503 /* decode the packet if needed */
1504 decoded_data_buf = NULL; /* fail safe */
1505 decoded_data_size= 0;
1506 data_buf = avpkt.data;
1507 data_size = avpkt.size;
1508 subtitle_to_free = NULL;
1509 if (ist->decoding_needed) {
1510 switch(ist->st->codec->codec_type) {
1511 case AVMEDIA_TYPE_AUDIO:{
1512 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1513 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1515 samples= av_malloc(samples_size);
1517 decoded_data_size= samples_size;
1518 /* XXX: could avoid copy if PCM 16 bits with same
1519 endianness as CPU */
1520 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1527 got_output = decoded_data_size > 0;
1528 /* Some bug in mpeg audio decoder gives */
1529 /* decoded_data_size < 0, it seems they are overflows */
1531 /* no audio frame */
1534 decoded_data_buf = (uint8_t *)samples;
1535 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1536 (ist->st->codec->sample_rate * ist->st->codec->channels);
1538 case AVMEDIA_TYPE_VIDEO:
1539 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1540 /* XXX: allocate picture correctly */
1541 avcodec_get_frame_defaults(&picture);
1542 avpkt.pts = pkt_pts;
1543 avpkt.dts = ist->pts;
1544 pkt_pts = AV_NOPTS_VALUE;
1546 ret = avcodec_decode_video2(ist->st->codec,
1547 &picture, &got_output, &avpkt);
1548 ist->st->quality= picture.quality;
1552 /* no picture yet */
1553 goto discard_packet;
1555 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1556 if (ist->st->codec->time_base.num != 0) {
1557 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1558 ist->next_pts += ((int64_t)AV_TIME_BASE *
1559 ist->st->codec->time_base.num * ticks) /
1560 ist->st->codec->time_base.den;
1563 buffer_to_free = NULL;
1564 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1566 case AVMEDIA_TYPE_SUBTITLE:
1567 ret = avcodec_decode_subtitle2(ist->st->codec,
1568 &subtitle, &got_output, &avpkt);
1572 goto discard_packet;
1574 subtitle_to_free = &subtitle;
1581 switch(ist->st->codec->codec_type) {
1582 case AVMEDIA_TYPE_AUDIO:
1583 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1584 ist->st->codec->sample_rate;
1586 case AVMEDIA_TYPE_VIDEO:
1587 if (ist->st->codec->time_base.num != 0) {
1588 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1589 ist->next_pts += ((int64_t)AV_TIME_BASE *
1590 ist->st->codec->time_base.num * ticks) /
1591 ist->st->codec->time_base.den;
1600 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1601 for (i = 0; i < nb_ostreams; i++) {
1603 if (ost->input_video_filter && ost->source_index == ist_index) {
1605 if (ist->st->sample_aspect_ratio.num)
1606 sar = ist->st->sample_aspect_ratio;
1608 sar = ist->st->codec->sample_aspect_ratio;
1609 // add it to be filtered
1610 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1618 // preprocess audio (volume)
1619 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1620 if (audio_volume != 256) {
1623 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1624 int v = ((*volp) * audio_volume + 128) >> 8;
1625 if (v < -32768) v = -32768;
1626 if (v > 32767) v = 32767;
1632 /* frame rate emulation */
1634 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1635 int64_t now = av_gettime() - ist->start;
1639 /* if output time reached then transcode raw format,
1640 encode packets and output them */
1641 if (start_time == 0 || ist->pts >= start_time)
1642 for(i=0;i<nb_ostreams;i++) {
1646 if (ost->source_index == ist_index) {
1648 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1649 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1650 while (frame_available) {
1651 AVRational ist_pts_tb;
1652 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1653 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1655 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1657 os = output_files[ost->file_index];
1659 /* set the input output pts pairs */
1660 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1662 if (ost->encoding_needed) {
1663 av_assert0(ist->decoding_needed);
1664 switch(ost->st->codec->codec_type) {
1665 case AVMEDIA_TYPE_AUDIO:
1666 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1668 case AVMEDIA_TYPE_VIDEO:
1670 if (ost->picref->video && !ost->frame_aspect_ratio)
1671 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1673 do_video_out(os, ost, ist, &picture, &frame_size);
1674 if (vstats_filename && frame_size)
1675 do_video_stats(os, ost, frame_size);
1677 case AVMEDIA_TYPE_SUBTITLE:
1678 do_subtitle_out(os, ost, ist, &subtitle,
1685 AVFrame avframe; //FIXME/XXX remove this
1687 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1689 av_init_packet(&opkt);
1691 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1692 #if !CONFIG_AVFILTER
1698 /* no reencoding needed : output the packet directly */
1699 /* force the input stream PTS */
1701 avcodec_get_frame_defaults(&avframe);
1702 ost->st->codec->coded_frame= &avframe;
1703 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1705 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1706 audio_size += data_size;
1707 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1708 video_size += data_size;
1712 opkt.stream_index= ost->index;
1713 if(pkt->pts != AV_NOPTS_VALUE)
1714 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1716 opkt.pts= AV_NOPTS_VALUE;
1718 if (pkt->dts == AV_NOPTS_VALUE)
1719 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1721 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1722 opkt.dts -= ost_tb_start_time;
1724 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1725 opkt.flags= pkt->flags;
1727 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1728 if( ost->st->codec->codec_id != CODEC_ID_H264
1729 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1730 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1732 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1733 opkt.destruct= av_destruct_packet;
1735 opkt.data = data_buf;
1736 opkt.size = data_size;
1739 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1740 ost->st->codec->frame_number++;
1741 ost->frame_number++;
1742 av_free_packet(&opkt);
1746 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1747 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1749 avfilter_unref_buffer(ost->picref);
1755 av_free(buffer_to_free);
1756 /* XXX: allocate the subtitles in the codec ? */
1757 if (subtitle_to_free) {
1758 avsubtitle_free(subtitle_to_free);
1759 subtitle_to_free = NULL;
1766 for(i=0;i<nb_ostreams;i++) {
1768 if (ost->source_index == ist_index) {
1769 AVCodecContext *enc= ost->st->codec;
1770 os = output_files[ost->file_index];
1772 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1774 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1777 if (ost->encoding_needed) {
1781 av_init_packet(&pkt);
1782 pkt.stream_index= ost->index;
1784 switch(ost->st->codec->codec_type) {
1785 case AVMEDIA_TYPE_AUDIO:
1786 fifo_bytes = av_fifo_size(ost->fifo);
1788 /* encode any samples remaining in fifo */
1789 if (fifo_bytes > 0) {
1790 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1791 int fs_tmp = enc->frame_size;
1793 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1794 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1795 enc->frame_size = fifo_bytes / (osize * enc->channels);
1797 int frame_bytes = enc->frame_size*osize*enc->channels;
1798 if (allocated_audio_buf_size < frame_bytes)
1800 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1803 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1804 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1805 ost->st->time_base.num, enc->sample_rate);
1806 enc->frame_size = fs_tmp;
1809 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1812 fprintf(stderr, "Audio encoding failed\n");
1816 pkt.flags |= AV_PKT_FLAG_KEY;
1818 case AVMEDIA_TYPE_VIDEO:
1819 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1821 fprintf(stderr, "Video encoding failed\n");
1825 if(enc->coded_frame && enc->coded_frame->key_frame)
1826 pkt.flags |= AV_PKT_FLAG_KEY;
1827 if (ost->logfile && enc->stats_out) {
1828 fprintf(ost->logfile, "%s", enc->stats_out);
1837 pkt.data= bit_buffer;
1839 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1840 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1841 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1853 static void print_sdp(AVFormatContext **avc, int n)
1857 av_sdp_create(avc, n, sdp, sizeof(sdp));
1858 printf("SDP:\n%s\n", sdp);
1862 static int copy_chapters(int infile, int outfile)
1864 AVFormatContext *is = input_files[infile];
1865 AVFormatContext *os = output_files[outfile];
1868 for (i = 0; i < is->nb_chapters; i++) {
1869 AVChapter *in_ch = is->chapters[i], *out_ch;
1870 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1871 AV_TIME_BASE_Q, in_ch->time_base);
1872 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1873 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1876 if (in_ch->end < ts_off)
1878 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1881 out_ch = av_mallocz(sizeof(AVChapter));
1883 return AVERROR(ENOMEM);
1885 out_ch->id = in_ch->id;
1886 out_ch->time_base = in_ch->time_base;
1887 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1888 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1890 if (metadata_chapters_autocopy)
1891 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1894 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1896 return AVERROR(ENOMEM);
1897 os->chapters[os->nb_chapters - 1] = out_ch;
1902 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1903 AVCodecContext *avctx)
1909 for (p = kf; *p; p++)
1912 ost->forced_kf_count = n;
1913 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1914 if (!ost->forced_kf_pts) {
1915 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1918 for (i = 0; i < n; i++) {
1919 p = i ? strchr(p, ',') + 1 : kf;
1920 t = parse_time_or_die("force_key_frames", p, 1);
1921 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1926 * The following code is the main loop of the file converter
1928 static int transcode(AVFormatContext **output_files,
1929 int nb_output_files,
1930 AVFormatContext **input_files,
1932 AVStreamMap *stream_maps, int nb_stream_maps)
1934 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1935 AVFormatContext *is, *os;
1936 AVCodecContext *codec, *icodec;
1937 AVOutputStream *ost, **ost_table = NULL;
1938 AVInputStream *ist, **ist_table = NULL;
1939 AVInputFile *file_table;
1942 uint8_t no_packet[MAX_FILES]={0};
1943 int no_packet_count=0;
1945 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1949 /* input stream init */
1951 for(i=0;i<nb_input_files;i++) {
1952 is = input_files[i];
1953 file_table[i].ist_index = j;
1954 file_table[i].nb_streams = is->nb_streams;
1955 j += is->nb_streams;
1959 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1963 for(i=0;i<nb_istreams;i++) {
1964 ist = av_mallocz(sizeof(AVInputStream));
1970 for(i=0;i<nb_input_files;i++) {
1971 is = input_files[i];
1972 for(k=0;k<is->nb_streams;k++) {
1973 ist = ist_table[j++];
1974 ist->st = is->streams[k];
1975 ist->file_index = i;
1976 ist->discard = 1; /* the stream is discarded by default
1980 ist->start = av_gettime();
1985 /* output stream init */
1987 for(i=0;i<nb_output_files;i++) {
1988 os = output_files[i];
1989 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1990 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1991 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1992 ret = AVERROR(EINVAL);
1995 nb_ostreams += os->nb_streams;
1997 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1998 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1999 ret = AVERROR(EINVAL);
2003 /* Sanity check the mapping args -- do the input files & streams exist? */
2004 for(i=0;i<nb_stream_maps;i++) {
2005 int fi = stream_maps[i].file_index;
2006 int si = stream_maps[i].stream_index;
2008 if (fi < 0 || fi > nb_input_files - 1 ||
2009 si < 0 || si > file_table[fi].nb_streams - 1) {
2010 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
2011 ret = AVERROR(EINVAL);
2014 fi = stream_maps[i].sync_file_index;
2015 si = stream_maps[i].sync_stream_index;
2016 if (fi < 0 || fi > nb_input_files - 1 ||
2017 si < 0 || si > file_table[fi].nb_streams - 1) {
2018 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
2019 ret = AVERROR(EINVAL);
2024 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
2028 for(k=0;k<nb_output_files;k++) {
2029 os = output_files[k];
2030 for(i=0;i<os->nb_streams;i++,n++) {
2032 ost = ost_table[n] = output_streams_for_file[k][i];
2033 ost->st = os->streams[i];
2034 if (nb_stream_maps > 0) {
2035 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
2036 stream_maps[n].stream_index;
2038 /* Sanity check that the stream types match */
2039 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2040 int i= ost->file_index;
2041 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2042 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2043 stream_maps[n].file_index, stream_maps[n].stream_index,
2044 ost->file_index, ost->index);
2049 int best_nb_frames=-1;
2050 /* get corresponding input stream index : we select the first one with the right type */
2052 for(j=0;j<nb_istreams;j++) {
2057 AVFormatContext *f= input_files[ ist->file_index ];
2059 for(pi=0; pi<f->nb_programs; pi++){
2060 AVProgram *p= f->programs[pi];
2061 if(p->id == opt_programid)
2062 for(si=0; si<p->nb_stream_indexes; si++){
2063 if(f->streams[ p->stream_index[si] ] == ist->st)
2068 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2069 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2070 if(best_nb_frames < ist->st->codec_info_nb_frames){
2071 best_nb_frames= ist->st->codec_info_nb_frames;
2072 ost->source_index = j;
2079 if(! opt_programid) {
2080 /* try again and reuse existing stream */
2081 for(j=0;j<nb_istreams;j++) {
2083 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2084 && ist->st->discard != AVDISCARD_ALL) {
2085 ost->source_index = j;
2091 int i= ost->file_index;
2092 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2093 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2094 ost->file_index, ost->index);
2099 ist = ist_table[ost->source_index];
2101 ost->sync_ist = (nb_stream_maps > 0) ?
2102 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2103 stream_maps[n].sync_stream_index] : ist;
2107 /* for each output stream, we compute the right encoding parameters */
2108 for(i=0;i<nb_ostreams;i++) {
2110 os = output_files[ost->file_index];
2111 ist = ist_table[ost->source_index];
2113 codec = ost->st->codec;
2114 icodec = ist->st->codec;
2116 if (metadata_streams_autocopy)
2117 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2118 AV_METADATA_DONT_OVERWRITE);
2120 ost->st->disposition = ist->st->disposition;
2121 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2122 codec->chroma_sample_location = icodec->chroma_sample_location;
2124 if (ost->st->stream_copy) {
2125 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2127 if (extra_size > INT_MAX)
2130 /* if stream_copy is selected, no need to decode or encode */
2131 codec->codec_id = icodec->codec_id;
2132 codec->codec_type = icodec->codec_type;
2134 if(!codec->codec_tag){
2135 if( !os->oformat->codec_tag
2136 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2137 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2138 codec->codec_tag = icodec->codec_tag;
2141 codec->bit_rate = icodec->bit_rate;
2142 codec->rc_max_rate = icodec->rc_max_rate;
2143 codec->rc_buffer_size = icodec->rc_buffer_size;
2144 codec->extradata= av_mallocz(extra_size);
2145 if (!codec->extradata)
2147 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2148 codec->extradata_size= icodec->extradata_size;
2149 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){
2150 codec->time_base = icodec->time_base;
2151 codec->time_base.num *= icodec->ticks_per_frame;
2152 av_reduce(&codec->time_base.num, &codec->time_base.den,
2153 codec->time_base.num, codec->time_base.den, INT_MAX);
2155 codec->time_base = ist->st->time_base;
2156 switch(codec->codec_type) {
2157 case AVMEDIA_TYPE_AUDIO:
2158 if(audio_volume != 256) {
2159 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2162 codec->channel_layout = icodec->channel_layout;
2163 codec->sample_rate = icodec->sample_rate;
2164 codec->channels = icodec->channels;
2165 codec->frame_size = icodec->frame_size;
2166 codec->audio_service_type = icodec->audio_service_type;
2167 codec->block_align= icodec->block_align;
2168 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2169 codec->block_align= 0;
2170 if(codec->codec_id == CODEC_ID_AC3)
2171 codec->block_align= 0;
2173 case AVMEDIA_TYPE_VIDEO:
2174 codec->pix_fmt = icodec->pix_fmt;
2175 codec->width = icodec->width;
2176 codec->height = icodec->height;
2177 codec->has_b_frames = icodec->has_b_frames;
2178 if (!codec->sample_aspect_ratio.num) {
2179 codec->sample_aspect_ratio =
2180 ost->st->sample_aspect_ratio =
2181 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2182 ist->st->codec->sample_aspect_ratio.num ?
2183 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2186 case AVMEDIA_TYPE_SUBTITLE:
2187 codec->width = icodec->width;
2188 codec->height = icodec->height;
2190 case AVMEDIA_TYPE_DATA:
2196 switch(codec->codec_type) {
2197 case AVMEDIA_TYPE_AUDIO:
2198 ost->fifo= av_fifo_alloc(1024);
2201 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2202 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2203 icodec->request_channels = codec->channels;
2204 ist->decoding_needed = 1;
2205 ost->encoding_needed = 1;
2206 ost->resample_sample_fmt = icodec->sample_fmt;
2207 ost->resample_sample_rate = icodec->sample_rate;
2208 ost->resample_channels = icodec->channels;
2210 case AVMEDIA_TYPE_VIDEO:
2211 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2212 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2215 ost->video_resample = codec->width != icodec->width ||
2216 codec->height != icodec->height ||
2217 codec->pix_fmt != icodec->pix_fmt;
2218 if (ost->video_resample) {
2219 #if !CONFIG_AVFILTER
2220 avcodec_get_frame_defaults(&ost->pict_tmp);
2221 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2222 codec->width, codec->height)) {
2223 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2226 ost->img_resample_ctx = sws_getContext(
2233 ost->sws_flags, NULL, NULL, NULL);
2234 if (ost->img_resample_ctx == NULL) {
2235 fprintf(stderr, "Cannot get resampling context\n");
2239 codec->bits_per_raw_sample= 0;
2241 ost->resample_height = icodec->height;
2242 ost->resample_width = icodec->width;
2243 ost->resample_pix_fmt= icodec->pix_fmt;
2244 ost->encoding_needed = 1;
2245 ist->decoding_needed = 1;
2248 if (configure_video_filters(ist, ost)) {
2249 fprintf(stderr, "Error opening filters!\n");
2254 case AVMEDIA_TYPE_SUBTITLE:
2255 ost->encoding_needed = 1;
2256 ist->decoding_needed = 1;
2263 if (ost->encoding_needed &&
2264 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2265 char logfilename[1024];
2268 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2269 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2271 if (codec->flags & CODEC_FLAG_PASS1) {
2272 f = fopen(logfilename, "wb");
2274 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2280 size_t logbuffer_size;
2281 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2282 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2285 codec->stats_in = logbuffer;
2289 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2290 int size= codec->width * codec->height;
2291 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2296 bit_buffer = av_malloc(bit_buffer_size);
2298 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2300 ret = AVERROR(ENOMEM);
2304 /* open each encoder */
2305 for(i=0;i<nb_ostreams;i++) {
2307 if (ost->encoding_needed) {
2308 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2309 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2311 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2313 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2314 ost->st->codec->codec_id, ost->file_index, ost->index);
2315 ret = AVERROR(EINVAL);
2318 if (dec->subtitle_header) {
2319 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2320 if (!ost->st->codec->subtitle_header) {
2321 ret = AVERROR(ENOMEM);
2324 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2325 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2327 if (avcodec_open(ost->st->codec, codec) < 0) {
2328 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2329 ost->file_index, ost->index);
2330 ret = AVERROR(EINVAL);
2333 extra_size += ost->st->codec->extradata_size;
2337 /* open each decoder */
2338 for(i=0;i<nb_istreams;i++) {
2340 if (ist->decoding_needed) {
2341 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2343 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2345 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2346 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2347 ret = AVERROR(EINVAL);
2351 /* update requested sample format for the decoder based on the
2352 corresponding encoder sample format */
2353 for (j = 0; j < nb_ostreams; j++) {
2355 if (ost->source_index == i) {
2356 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2361 if (avcodec_open(ist->st->codec, codec) < 0) {
2362 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2363 ist->file_index, ist->st->index);
2364 ret = AVERROR(EINVAL);
2367 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2368 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2373 for(i=0;i<nb_istreams;i++) {
2377 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2378 ist->next_pts = AV_NOPTS_VALUE;
2379 init_pts_correction(&ist->pts_ctx);
2383 /* set meta data information from input file if required */
2384 for (i=0;i<nb_meta_data_maps;i++) {
2385 AVFormatContext *files[2];
2386 AVMetadata **meta[2];
2389 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2390 if ((index) < 0 || (index) >= (nb_elems)) {\
2391 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2393 ret = AVERROR(EINVAL);\
2397 int out_file_index = meta_data_maps[i][0].file;
2398 int in_file_index = meta_data_maps[i][1].file;
2399 if (in_file_index < 0 || out_file_index < 0)
2401 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2402 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2404 files[0] = output_files[out_file_index];
2405 files[1] = input_files[in_file_index];
2407 for (j = 0; j < 2; j++) {
2408 AVMetaDataMap *map = &meta_data_maps[i][j];
2410 switch (map->type) {
2412 meta[j] = &files[j]->metadata;
2415 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2416 meta[j] = &files[j]->streams[map->index]->metadata;
2419 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2420 meta[j] = &files[j]->chapters[map->index]->metadata;
2423 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2424 meta[j] = &files[j]->programs[map->index]->metadata;
2429 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2432 /* copy global metadata by default */
2433 if (metadata_global_autocopy) {
2435 for (i = 0; i < nb_output_files; i++)
2436 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2437 AV_METADATA_DONT_OVERWRITE);
2440 /* copy chapters according to chapter maps */
2441 for (i = 0; i < nb_chapter_maps; i++) {
2442 int infile = chapter_maps[i].in_file;
2443 int outfile = chapter_maps[i].out_file;
2445 if (infile < 0 || outfile < 0)
2447 if (infile >= nb_input_files) {
2448 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2449 ret = AVERROR(EINVAL);
2452 if (outfile >= nb_output_files) {
2453 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2454 ret = AVERROR(EINVAL);
2457 copy_chapters(infile, outfile);
2460 /* copy chapters from the first input file that has them*/
2461 if (!nb_chapter_maps)
2462 for (i = 0; i < nb_input_files; i++) {
2463 if (!input_files[i]->nb_chapters)
2466 for (j = 0; j < nb_output_files; j++)
2467 if ((ret = copy_chapters(i, j)) < 0)
2472 /* open files and write file headers */
2473 for(i=0;i<nb_output_files;i++) {
2474 os = output_files[i];
2475 if (av_write_header(os) < 0) {
2476 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2477 ret = AVERROR(EINVAL);
2480 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2486 /* dump the file output parameters - cannot be done before in case
2488 for(i=0;i<nb_output_files;i++) {
2489 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2492 /* dump the stream mapping */
2494 fprintf(stderr, "Stream mapping:\n");
2495 for(i=0;i<nb_ostreams;i++) {
2497 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2498 ist_table[ost->source_index]->file_index,
2499 ist_table[ost->source_index]->st->index,
2502 if (ost->sync_ist != ist_table[ost->source_index])
2503 fprintf(stderr, " [sync #%d.%d]",
2504 ost->sync_ist->file_index,
2505 ost->sync_ist->st->index);
2506 fprintf(stderr, "\n");
2511 fprintf(stderr, "%s\n", error);
2516 print_sdp(output_files, nb_output_files);
2520 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2523 timer_start = av_gettime();
2525 for(; received_sigterm == 0;) {
2526 int file_index, ist_index;
2535 /* select the stream that we must read now by looking at the
2536 smallest output pts */
2538 for(i=0;i<nb_ostreams;i++) {
2541 os = output_files[ost->file_index];
2542 ist = ist_table[ost->source_index];
2543 if(ist->is_past_recording_time || no_packet[ist->file_index])
2545 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2546 ipts = (double)ist->pts;
2547 if (!file_table[ist->file_index].eof_reached){
2548 if(ipts < ipts_min) {
2550 if(input_sync ) file_index = ist->file_index;
2552 if(opts < opts_min) {
2554 if(!input_sync) file_index = ist->file_index;
2557 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2562 /* if none, if is finished */
2563 if (file_index < 0) {
2564 if(no_packet_count){
2566 memset(no_packet, 0, sizeof(no_packet));
2573 /* finish if limit size exhausted */
2574 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2577 /* read a frame from it and output it in the fifo */
2578 is = input_files[file_index];
2579 ret= av_read_frame(is, &pkt);
2580 if(ret == AVERROR(EAGAIN)){
2581 no_packet[file_index]=1;
2586 file_table[file_index].eof_reached = 1;
2594 memset(no_packet, 0, sizeof(no_packet));
2597 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2598 is->streams[pkt.stream_index]);
2600 /* the following test is needed in case new streams appear
2601 dynamically in stream : we ignore them */
2602 if (pkt.stream_index >= file_table[file_index].nb_streams)
2603 goto discard_packet;
2604 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2605 ist = ist_table[ist_index];
2607 goto discard_packet;
2609 if (pkt.dts != AV_NOPTS_VALUE)
2610 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2611 if (pkt.pts != AV_NOPTS_VALUE)
2612 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2614 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2615 && input_files_ts_scale[file_index][pkt.stream_index]){
2616 if(pkt.pts != AV_NOPTS_VALUE)
2617 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2618 if(pkt.dts != AV_NOPTS_VALUE)
2619 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2622 // 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);
2623 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2624 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2625 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2626 int64_t delta= pkt_dts - ist->next_pts;
2627 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2628 input_files_ts_offset[ist->file_index]-= delta;
2630 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2631 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2632 if(pkt.pts != AV_NOPTS_VALUE)
2633 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2637 /* finish if recording time exhausted */
2638 if (recording_time != INT64_MAX &&
2639 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2640 ist->is_past_recording_time = 1;
2641 goto discard_packet;
2644 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2645 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2648 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2649 ist->file_index, ist->st->index);
2652 av_free_packet(&pkt);
2657 av_free_packet(&pkt);
2659 /* dump report by using the output first video and audio streams */
2660 print_report(output_files, ost_table, nb_ostreams, 0);
2663 /* at the end of stream, we must flush the decoder buffers */
2664 for(i=0;i<nb_istreams;i++) {
2666 if (ist->decoding_needed) {
2667 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2673 /* write the trailer if needed and close file */
2674 for(i=0;i<nb_output_files;i++) {
2675 os = output_files[i];
2676 av_write_trailer(os);
2679 /* dump report by using the first video and audio streams */
2680 print_report(output_files, ost_table, nb_ostreams, 1);
2682 /* close each encoder */
2683 for(i=0;i<nb_ostreams;i++) {
2685 if (ost->encoding_needed) {
2686 av_freep(&ost->st->codec->stats_in);
2687 avcodec_close(ost->st->codec);
2690 avfilter_graph_free(&ost->graph);
2694 /* close each decoder */
2695 for(i=0;i<nb_istreams;i++) {
2697 if (ist->decoding_needed) {
2698 avcodec_close(ist->st->codec);
2706 av_freep(&bit_buffer);
2707 av_free(file_table);
2710 for(i=0;i<nb_istreams;i++) {
2717 for(i=0;i<nb_ostreams;i++) {
2720 if (ost->st->stream_copy)
2721 av_freep(&ost->st->codec->extradata);
2723 fclose(ost->logfile);
2724 ost->logfile = NULL;
2726 av_fifo_free(ost->fifo); /* works even if fifo is not
2727 initialized but set to zero */
2728 av_freep(&ost->st->codec->subtitle_header);
2729 av_free(ost->pict_tmp.data[0]);
2730 av_free(ost->forced_kf_pts);
2731 if (ost->video_resample)
2732 sws_freeContext(ost->img_resample_ctx);
2734 audio_resample_close(ost->resample);
2735 if (ost->reformat_ctx)
2736 av_audio_convert_free(ost->reformat_ctx);
2745 static void opt_format(const char *arg)
2747 last_asked_format = arg;
2750 static void opt_video_rc_override_string(const char *arg)
2752 video_rc_override_string = arg;
2755 static int opt_me_threshold(const char *opt, const char *arg)
2757 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2761 static int opt_verbose(const char *opt, const char *arg)
2763 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2767 static int opt_frame_rate(const char *opt, const char *arg)
2769 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2770 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2776 static int opt_bitrate(const char *opt, const char *arg)
2778 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2780 opt_default(opt, arg);
2782 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2783 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2788 static int opt_frame_crop(const char *opt, const char *arg)
2790 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2791 return AVERROR(EINVAL);
2794 static void opt_frame_size(const char *arg)
2796 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2797 fprintf(stderr, "Incorrect frame size\n");
2802 static int opt_pad(const char *opt, const char *arg) {
2803 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2807 static void opt_frame_pix_fmt(const char *arg)
2809 if (strcmp(arg, "list")) {
2810 frame_pix_fmt = av_get_pix_fmt(arg);
2811 if (frame_pix_fmt == PIX_FMT_NONE) {
2812 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2821 static void opt_frame_aspect_ratio(const char *arg)
2828 p = strchr(arg, ':');
2830 x = strtol(arg, &end, 10);
2832 y = strtol(end+1, &end, 10);
2834 ar = (double)x / (double)y;
2836 ar = strtod(arg, NULL);
2839 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2842 frame_aspect_ratio = ar;
2845 static int opt_metadata(const char *opt, const char *arg)
2847 char *mid= strchr(arg, '=');
2850 fprintf(stderr, "Missing =\n");
2855 av_metadata_set2(&metadata, arg, mid, 0);
2860 static int opt_qscale(const char *opt, const char *arg)
2862 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2863 if (video_qscale == 0) {
2864 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2865 return AVERROR(EINVAL);
2870 static int opt_top_field_first(const char *opt, const char *arg)
2872 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2876 static int opt_thread_count(const char *opt, const char *arg)
2878 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2881 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2886 static void opt_audio_sample_fmt(const char *arg)
2888 if (strcmp(arg, "list")) {
2889 audio_sample_fmt = av_get_sample_fmt(arg);
2890 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2891 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2897 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2898 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2903 static int opt_audio_rate(const char *opt, const char *arg)
2905 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2909 static int opt_audio_channels(const char *opt, const char *arg)
2911 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2915 static int opt_video_channel(const char *opt, const char *arg)
2917 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2921 static void opt_video_standard(const char *arg)
2923 video_standard = av_strdup(arg);
2926 static void opt_codec(int *pstream_copy, char **pcodec_name,
2927 int codec_type, const char *arg)
2929 av_freep(pcodec_name);
2930 if (!strcmp(arg, "copy")) {
2933 *pcodec_name = av_strdup(arg);
2937 static void opt_audio_codec(const char *arg)
2939 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2942 static void opt_video_codec(const char *arg)
2944 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2947 static void opt_subtitle_codec(const char *arg)
2949 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2952 static void opt_data_codec(const char *arg)
2954 opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2957 static int opt_codec_tag(const char *opt, const char *arg)
2960 uint32_t *codec_tag;
2962 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2963 !strcmp(opt, "vtag") ? &video_codec_tag :
2964 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2968 *codec_tag = strtol(arg, &tail, 0);
2970 *codec_tag = AV_RL32(arg);
2975 static void opt_map(const char *arg)
2980 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2981 m = &stream_maps[nb_stream_maps-1];
2983 m->file_index = strtol(arg, &p, 0);
2987 m->stream_index = strtol(p, &p, 0);
2990 m->sync_file_index = strtol(p, &p, 0);
2993 m->sync_stream_index = strtol(p, &p, 0);
2995 m->sync_file_index = m->file_index;
2996 m->sync_stream_index = m->stream_index;
3000 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3011 *index = strtol(++arg, endptr, 0);
3014 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3021 static void opt_map_metadata(const char *arg)
3023 AVMetaDataMap *m, *m1;
3026 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3027 &nb_meta_data_maps, nb_meta_data_maps + 1);
3029 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3030 m->file = strtol(arg, &p, 0);
3031 parse_meta_type(p, &m->type, &m->index, &p);
3035 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3036 m1->file = strtol(p, &p, 0);
3037 parse_meta_type(p, &m1->type, &m1->index, &p);
3039 if (m->type == 'g' || m1->type == 'g')
3040 metadata_global_autocopy = 0;
3041 if (m->type == 's' || m1->type == 's')
3042 metadata_streams_autocopy = 0;
3043 if (m->type == 'c' || m1->type == 'c')
3044 metadata_chapters_autocopy = 0;
3047 static void opt_map_meta_data(const char *arg)
3049 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3050 "Use -map_metadata instead.\n");
3051 opt_map_metadata(arg);
3054 static void opt_map_chapters(const char *arg)
3059 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3060 nb_chapter_maps + 1);
3061 c = &chapter_maps[nb_chapter_maps - 1];
3062 c->out_file = strtol(arg, &p, 0);
3066 c->in_file = strtol(p, &p, 0);
3069 static void opt_input_ts_scale(const char *arg)
3071 unsigned int stream;
3075 stream = strtol(arg, &p, 0);
3078 scale= strtod(p, &p);
3080 if(stream >= MAX_STREAMS)
3083 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);
3084 input_files_ts_scale[nb_input_files][stream]= scale;
3087 static int opt_recording_time(const char *opt, const char *arg)
3089 recording_time = parse_time_or_die(opt, arg, 1);
3093 static int opt_start_time(const char *opt, const char *arg)
3095 start_time = parse_time_or_die(opt, arg, 1);
3099 static int opt_recording_timestamp(const char *opt, const char *arg)
3101 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3105 static int opt_input_ts_offset(const char *opt, const char *arg)
3107 input_ts_offset = parse_time_or_die(opt, arg, 1);
3111 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3113 const char *codec_string = encoder ? "encoder" : "decoder";
3117 return CODEC_ID_NONE;
3119 avcodec_find_encoder_by_name(name) :
3120 avcodec_find_decoder_by_name(name);
3122 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3125 if(codec->type != type) {
3126 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3129 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3130 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3131 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3132 "results.\nAdd '-strict experimental' if you want to use it.\n",
3133 codec_string, codec->name);
3135 avcodec_find_encoder(codec->id) :
3136 avcodec_find_decoder(codec->id);
3137 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3138 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3139 codec_string, codec->name);
3145 static void opt_input_file(const char *filename)
3147 AVFormatContext *ic;
3148 AVFormatParameters params, *ap = ¶ms;
3149 AVInputFormat *file_iformat = NULL;
3150 int err, i, ret, rfps, rfps_base;
3153 if (last_asked_format) {
3154 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3155 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3158 last_asked_format = NULL;
3161 if (!strcmp(filename, "-"))
3164 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3165 !strcmp(filename, "/dev/stdin");
3167 /* get default parameters from command line */
3168 ic = avformat_alloc_context();
3170 print_error(filename, AVERROR(ENOMEM));
3174 memset(ap, 0, sizeof(*ap));
3175 ap->prealloced_context = 1;
3176 ap->sample_rate = audio_sample_rate;
3177 ap->channels = audio_channels;
3178 ap->time_base.den = frame_rate.num;
3179 ap->time_base.num = frame_rate.den;
3180 ap->width = frame_width;
3181 ap->height = frame_height;
3182 ap->pix_fmt = frame_pix_fmt;
3183 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3184 ap->channel = video_channel;
3185 ap->standard = video_standard;
3187 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3189 ic->video_codec_id =
3190 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3191 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3192 ic->audio_codec_id =
3193 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3194 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3195 ic->subtitle_codec_id=
3196 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3197 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3198 ic->flags |= AVFMT_FLAG_NONBLOCK;
3200 /* open the input file with generic libav function */
3201 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3203 print_error(filename, err);
3209 for(i=0; i<ic->nb_streams; i++){
3210 ic->streams[i]->discard= AVDISCARD_ALL;
3212 for(i=0; i<ic->nb_programs; i++){
3213 AVProgram *p= ic->programs[i];
3214 if(p->id != opt_programid){
3215 p->discard = AVDISCARD_ALL;
3218 for(j=0; j<p->nb_stream_indexes; j++){
3219 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3224 fprintf(stderr, "Specified program id not found\n");
3230 ic->loop_input = loop_input;
3232 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3233 for (i = 0; i < ic->nb_streams; i++) {
3234 AVCodecContext *dec = ic->streams[i]->codec;
3235 switch (dec->codec_type) {
3236 case AVMEDIA_TYPE_AUDIO:
3237 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3238 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3241 case AVMEDIA_TYPE_VIDEO:
3242 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3243 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3249 /* If not enough info to get the stream parameters, we decode the
3250 first frames to get it. (used in mpeg case for example) */
3251 ret = av_find_stream_info(ic);
3252 if (ret < 0 && verbose >= 0) {
3253 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3254 av_close_input_file(ic);
3258 timestamp = start_time;
3259 /* add the stream start time */
3260 if (ic->start_time != AV_NOPTS_VALUE)
3261 timestamp += ic->start_time;
3263 /* if seeking requested, we execute it */
3264 if (start_time != 0) {
3265 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3267 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3268 filename, (double)timestamp / AV_TIME_BASE);
3270 /* reset seek info */
3274 /* update the current parameters so that they match the one of the input stream */
3275 for(i=0;i<ic->nb_streams;i++) {
3276 AVStream *st = ic->streams[i];
3277 AVCodecContext *dec = st->codec;
3278 dec->thread_count = thread_count;
3279 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3280 switch (dec->codec_type) {
3281 case AVMEDIA_TYPE_AUDIO:
3282 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3283 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]);
3284 channel_layout = dec->channel_layout;
3285 audio_channels = dec->channels;
3286 audio_sample_rate = dec->sample_rate;
3287 audio_sample_fmt = dec->sample_fmt;
3289 st->discard= AVDISCARD_ALL;
3290 /* Note that av_find_stream_info can add more streams, and we
3291 * currently have no chance of setting up lowres decoding
3292 * early enough for them. */
3294 audio_sample_rate >>= dec->lowres;
3296 case AVMEDIA_TYPE_VIDEO:
3297 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3298 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]);
3299 frame_height = dec->height;
3300 frame_width = dec->width;
3301 frame_pix_fmt = dec->pix_fmt;
3302 rfps = ic->streams[i]->r_frame_rate.num;
3303 rfps_base = ic->streams[i]->r_frame_rate.den;
3305 dec->flags |= CODEC_FLAG_EMU_EDGE;
3306 frame_height >>= dec->lowres;
3307 frame_width >>= dec->lowres;
3308 dec->height = frame_height;
3309 dec->width = frame_width;
3312 dec->debug |= FF_DEBUG_MV;
3314 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3317 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3318 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3320 (float)rfps / rfps_base, rfps, rfps_base);
3322 /* update the current frame rate to match the stream frame rate */
3323 frame_rate.num = rfps;
3324 frame_rate.den = rfps_base;
3327 st->discard= AVDISCARD_ALL;
3328 else if(video_discard)
3329 st->discard= video_discard;
3331 case AVMEDIA_TYPE_DATA:
3333 case AVMEDIA_TYPE_SUBTITLE:
3334 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3335 if(subtitle_disable)
3336 st->discard = AVDISCARD_ALL;
3338 case AVMEDIA_TYPE_ATTACHMENT:
3339 case AVMEDIA_TYPE_UNKNOWN:
3346 input_files[nb_input_files] = ic;
3347 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3348 /* dump the file content */
3350 av_dump_format(ic, nb_input_files, filename, 0);
3356 av_freep(&video_codec_name);
3357 av_freep(&audio_codec_name);
3358 av_freep(&subtitle_codec_name);
3363 static void check_inputs(int *has_video_ptr,
3365 int *has_subtitle_ptr,
3368 int has_video, has_audio, has_subtitle, has_data, i, j;
3369 AVFormatContext *ic;
3376 for(j=0;j<nb_input_files;j++) {
3377 ic = input_files[j];
3378 for(i=0;i<ic->nb_streams;i++) {
3379 AVCodecContext *enc = ic->streams[i]->codec;
3380 switch(enc->codec_type) {
3381 case AVMEDIA_TYPE_AUDIO:
3384 case AVMEDIA_TYPE_VIDEO:
3387 case AVMEDIA_TYPE_SUBTITLE:
3390 case AVMEDIA_TYPE_DATA:
3391 case AVMEDIA_TYPE_ATTACHMENT:
3392 case AVMEDIA_TYPE_UNKNOWN:
3400 *has_video_ptr = has_video;
3401 *has_audio_ptr = has_audio;
3402 *has_subtitle_ptr = has_subtitle;
3403 *has_data_ptr = has_data;
3406 static void new_video_stream(AVFormatContext *oc, int file_idx)
3409 AVOutputStream *ost;
3410 AVCodecContext *video_enc;
3411 enum CodecID codec_id = CODEC_ID_NONE;
3412 AVCodec *codec= NULL;
3414 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3416 fprintf(stderr, "Could not alloc stream\n");
3419 ost = new_output_stream(oc, file_idx);
3421 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3422 if(!video_stream_copy){
3423 if (video_codec_name) {
3424 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3425 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3426 codec = avcodec_find_encoder_by_name(video_codec_name);
3427 output_codecs[nb_output_codecs-1] = codec;
3429 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3430 codec = avcodec_find_encoder(codec_id);
3433 ost->frame_aspect_ratio = frame_aspect_ratio;
3434 frame_aspect_ratio = 0;
3436 ost->avfilter= vfilters;
3441 avcodec_get_context_defaults3(st->codec, codec);
3442 ost->bitstream_filters = video_bitstream_filters;
3443 video_bitstream_filters= NULL;
3445 st->codec->thread_count= thread_count;
3447 video_enc = st->codec;
3450 video_enc->codec_tag= video_codec_tag;
3452 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3453 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3454 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3457 if (video_stream_copy) {
3458 st->stream_copy = 1;
3459 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3460 video_enc->sample_aspect_ratio =
3461 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3465 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3467 video_enc->codec_id = codec_id;
3468 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3470 if (codec && codec->supported_framerates && !force_fps)
3471 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3472 video_enc->time_base.den = fps.num;
3473 video_enc->time_base.num = fps.den;
3475 video_enc->width = frame_width;
3476 video_enc->height = frame_height;
3477 video_enc->pix_fmt = frame_pix_fmt;
3478 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3480 choose_pixel_fmt(st, codec);
3483 video_enc->gop_size = 0;
3484 if (video_qscale || same_quality) {
3485 video_enc->flags |= CODEC_FLAG_QSCALE;
3486 video_enc->global_quality=
3487 st->quality = FF_QP2LAMBDA * video_qscale;
3491 video_enc->intra_matrix = intra_matrix;
3493 video_enc->inter_matrix = inter_matrix;
3495 p= video_rc_override_string;
3498 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3500 fprintf(stderr, "error parsing rc_override\n");
3503 video_enc->rc_override=
3504 av_realloc(video_enc->rc_override,
3505 sizeof(RcOverride)*(i+1));
3506 video_enc->rc_override[i].start_frame= start;
3507 video_enc->rc_override[i].end_frame = end;
3509 video_enc->rc_override[i].qscale= q;
3510 video_enc->rc_override[i].quality_factor= 1.0;
3513 video_enc->rc_override[i].qscale= 0;
3514 video_enc->rc_override[i].quality_factor= -q/100.0;
3519 video_enc->rc_override_count=i;
3520 if (!video_enc->rc_initial_buffer_occupancy)
3521 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3522 video_enc->me_threshold= me_threshold;
3523 video_enc->intra_dc_precision= intra_dc_precision - 8;
3526 video_enc->flags|= CODEC_FLAG_PSNR;
3531 video_enc->flags |= CODEC_FLAG_PASS1;
3533 video_enc->flags |= CODEC_FLAG_PASS2;
3537 if (forced_key_frames)
3538 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3540 if (video_language) {
3541 av_metadata_set2(&st->metadata, "language", video_language, 0);
3542 av_freep(&video_language);
3545 /* reset some key parameters */
3547 av_freep(&video_codec_name);
3548 av_freep(&forced_key_frames);
3549 video_stream_copy = 0;
3550 frame_pix_fmt = PIX_FMT_NONE;
3553 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3556 AVOutputStream *ost;
3557 AVCodec *codec= NULL;
3558 AVCodecContext *audio_enc;
3559 enum CodecID codec_id = CODEC_ID_NONE;
3561 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3563 fprintf(stderr, "Could not alloc stream\n");
3566 ost = new_output_stream(oc, file_idx);
3568 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3569 if(!audio_stream_copy){
3570 if (audio_codec_name) {
3571 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3572 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3573 codec = avcodec_find_encoder_by_name(audio_codec_name);
3574 output_codecs[nb_output_codecs-1] = codec;
3576 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3577 codec = avcodec_find_encoder(codec_id);
3581 avcodec_get_context_defaults3(st->codec, codec);
3583 ost->bitstream_filters = audio_bitstream_filters;
3584 audio_bitstream_filters= NULL;
3586 st->codec->thread_count= thread_count;
3588 audio_enc = st->codec;
3589 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3592 audio_enc->codec_tag= audio_codec_tag;
3594 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3595 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3596 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3598 if (audio_stream_copy) {
3599 st->stream_copy = 1;
3600 audio_enc->channels = audio_channels;
3601 audio_enc->sample_rate = audio_sample_rate;
3603 audio_enc->codec_id = codec_id;
3604 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3606 if (audio_qscale > QSCALE_NONE) {
3607 audio_enc->flags |= CODEC_FLAG_QSCALE;
3608 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3610 audio_enc->channels = audio_channels;
3611 audio_enc->sample_fmt = audio_sample_fmt;
3612 audio_enc->sample_rate = audio_sample_rate;
3613 audio_enc->channel_layout = channel_layout;
3614 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3615 audio_enc->channel_layout = 0;
3616 choose_sample_fmt(st, codec);
3617 choose_sample_rate(st, codec);
3619 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3620 if (audio_language) {
3621 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3622 av_freep(&audio_language);
3625 /* reset some key parameters */
3627 av_freep(&audio_codec_name);
3628 audio_stream_copy = 0;
3631 static void new_data_stream(AVFormatContext *oc, int file_idx)
3634 AVOutputStream *ost;
3635 AVCodec *codec=NULL;
3636 AVCodecContext *data_enc;
3638 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3640 fprintf(stderr, "Could not alloc stream\n");
3643 ost = new_output_stream(oc, file_idx);
3644 data_enc = st->codec;
3645 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3646 if (!data_stream_copy) {
3647 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3650 avcodec_get_context_defaults3(st->codec, codec);
3652 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3655 data_enc->codec_tag= data_codec_tag;
3657 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3658 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3659 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3661 if (data_stream_copy) {
3662 st->stream_copy = 1;
3666 av_freep(&data_codec_name);
3667 data_stream_copy = 0;
3670 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3673 AVOutputStream *ost;
3674 AVCodec *codec=NULL;
3675 AVCodecContext *subtitle_enc;
3676 enum CodecID codec_id = CODEC_ID_NONE;
3678 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3680 fprintf(stderr, "Could not alloc stream\n");
3683 ost = new_output_stream(oc, file_idx);
3684 subtitle_enc = st->codec;
3685 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3686 if(!subtitle_stream_copy){
3687 if (subtitle_codec_name) {
3688 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3689 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3690 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3692 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3693 codec = avcodec_find_encoder(codec_id);
3696 avcodec_get_context_defaults3(st->codec, codec);
3698 ost->bitstream_filters = subtitle_bitstream_filters;
3699 subtitle_bitstream_filters= NULL;
3701 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3703 if(subtitle_codec_tag)
3704 subtitle_enc->codec_tag= subtitle_codec_tag;
3706 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3707 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3708 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3710 if (subtitle_stream_copy) {
3711 st->stream_copy = 1;
3713 subtitle_enc->codec_id = codec_id;
3714 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3717 if (subtitle_language) {
3718 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3719 av_freep(&subtitle_language);
3722 subtitle_disable = 0;
3723 av_freep(&subtitle_codec_name);
3724 subtitle_stream_copy = 0;
3727 static int opt_new_stream(const char *opt, const char *arg)
3729 AVFormatContext *oc;
3730 int file_idx = nb_output_files - 1;
3731 if (nb_output_files <= 0) {
3732 fprintf(stderr, "At least one output file must be specified\n");
3735 oc = output_files[file_idx];
3737 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3738 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3739 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3740 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3745 /* arg format is "output-stream-index:streamid-value". */
3746 static int opt_streamid(const char *opt, const char *arg)
3752 av_strlcpy(idx_str, arg, sizeof(idx_str));
3753 p = strchr(idx_str, ':');
3756 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3761 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3762 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3763 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3767 static void opt_output_file(const char *filename)
3769 AVFormatContext *oc;
3770 int err, use_video, use_audio, use_subtitle, use_data;
3771 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3772 AVFormatParameters params, *ap = ¶ms;
3773 AVOutputFormat *file_oformat;
3775 if (!strcmp(filename, "-"))
3778 oc = avformat_alloc_context();
3780 print_error(filename, AVERROR(ENOMEM));
3784 if (last_asked_format) {
3785 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3786 if (!file_oformat) {
3787 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3790 last_asked_format = NULL;
3792 file_oformat = av_guess_format(NULL, filename, NULL);
3793 if (!file_oformat) {
3794 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3800 oc->oformat = file_oformat;
3801 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3803 if (!strcmp(file_oformat->name, "ffm") &&
3804 av_strstart(filename, "http:", NULL)) {
3805 /* special case for files sent to ffserver: we get the stream
3806 parameters from ffserver */
3807 int err = read_ffserver_streams(oc, filename);
3809 print_error(filename, err);
3813 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3814 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3815 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3816 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 */
3818 /* disable if no corresponding type found and at least one
3820 if (nb_input_files > 0) {
3821 check_inputs(&input_has_video,
3823 &input_has_subtitle,
3826 if (!input_has_video)
3828 if (!input_has_audio)
3830 if (!input_has_subtitle)
3832 if (!input_has_data)
3836 /* manual disable */
3837 if (audio_disable) use_audio = 0;
3838 if (video_disable) use_video = 0;
3839 if (subtitle_disable) use_subtitle = 0;
3840 if (data_disable) use_data = 0;
3842 if (use_video) new_video_stream(oc, nb_output_files);
3843 if (use_audio) new_audio_stream(oc, nb_output_files);
3844 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3845 if (use_data) new_data_stream(oc, nb_output_files);
3847 oc->timestamp = recording_timestamp;
3849 av_metadata_copy(&oc->metadata, metadata, 0);
3850 av_metadata_free(&metadata);
3853 output_files[nb_output_files++] = oc;
3855 /* check filename in case of an image number is expected */
3856 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3857 if (!av_filename_number_test(oc->filename)) {
3858 print_error(oc->filename, AVERROR(EINVAL));
3863 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3864 /* test if it already exists to avoid loosing precious files */
3865 if (!file_overwrite &&
3866 (strchr(filename, ':') == NULL ||
3867 filename[1] == ':' ||
3868 av_strstart(filename, "file:", NULL))) {
3869 if (avio_check(filename, 0) == 0) {
3871 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3873 if (!read_yesno()) {
3874 fprintf(stderr, "Not overwriting - exiting\n");
3879 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3886 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3887 print_error(filename, err);
3892 memset(ap, 0, sizeof(*ap));
3893 if (av_set_parameters(oc, ap) < 0) {
3894 fprintf(stderr, "%s: Invalid encoding parameters\n",
3899 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3900 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3901 oc->loop_output = loop_output;
3902 oc->flags |= AVFMT_FLAG_NONBLOCK;
3904 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3906 av_freep(&forced_key_frames);
3911 /* same option as mencoder */
3912 static int opt_pass(const char *opt, const char *arg)
3914 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3918 static int64_t getutime(void)
3921 struct rusage rusage;
3923 getrusage(RUSAGE_SELF, &rusage);
3924 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3925 #elif HAVE_GETPROCESSTIMES
3927 FILETIME c, e, k, u;
3928 proc = GetCurrentProcess();
3929 GetProcessTimes(proc, &c, &e, &k, &u);
3930 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3932 return av_gettime();
3936 static int64_t getmaxrss(void)
3938 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3939 struct rusage rusage;
3940 getrusage(RUSAGE_SELF, &rusage);
3941 return (int64_t)rusage.ru_maxrss * 1024;
3942 #elif HAVE_GETPROCESSMEMORYINFO
3944 PROCESS_MEMORY_COUNTERS memcounters;
3945 proc = GetCurrentProcess();
3946 memcounters.cb = sizeof(memcounters);
3947 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3948 return memcounters.PeakPagefileUsage;
3954 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3957 const char *p = str;
3964 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3971 static void opt_inter_matrix(const char *arg)
3973 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3974 parse_matrix_coeffs(inter_matrix, arg);
3977 static void opt_intra_matrix(const char *arg)
3979 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3980 parse_matrix_coeffs(intra_matrix, arg);
3983 static void show_usage(void)
3985 printf("Hyper fast Audio and Video encoder\n");
3986 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3990 static void show_help(void)
3993 AVOutputFormat *oformat = NULL;
3995 av_log_set_callback(log_callback_help);
3997 show_help_options(options, "Main options:\n",
3998 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3999 show_help_options(options, "\nAdvanced options:\n",
4000 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
4002 show_help_options(options, "\nVideo options:\n",
4003 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4005 show_help_options(options, "\nAdvanced Video options:\n",
4006 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4007 OPT_VIDEO | OPT_EXPERT);
4008 show_help_options(options, "\nAudio options:\n",
4009 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4011 show_help_options(options, "\nAdvanced Audio options:\n",
4012 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
4013 OPT_AUDIO | OPT_EXPERT);
4014 show_help_options(options, "\nSubtitle options:\n",
4015 OPT_SUBTITLE | OPT_GRAB,
4017 show_help_options(options, "\nAudio/Video grab options:\n",
4021 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4024 /* individual codec options */
4026 while ((c = av_codec_next(c))) {
4027 if (c->priv_class) {
4028 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4033 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4036 /* individual muxer options */
4037 while ((oformat = av_oformat_next(oformat))) {
4038 if (oformat->priv_class) {
4039 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4044 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4047 static void opt_target(const char *arg)
4049 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4050 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4052 if(!strncmp(arg, "pal-", 4)) {
4055 } else if(!strncmp(arg, "ntsc-", 5)) {
4058 } else if(!strncmp(arg, "film-", 5)) {
4063 /* Calculate FR via float to avoid int overflow */
4064 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4067 } else if((fr == 29970) || (fr == 23976)) {
4070 /* Try to determine PAL/NTSC by peeking in the input files */
4071 if(nb_input_files) {
4073 for(j = 0; j < nb_input_files; j++) {
4074 for(i = 0; i < input_files[j]->nb_streams; i++) {
4075 AVCodecContext *c = input_files[j]->streams[i]->codec;
4076 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4078 fr = c->time_base.den * 1000 / c->time_base.num;
4082 } else if((fr == 29970) || (fr == 23976)) {
4092 if(verbose > 0 && norm != UNKNOWN)
4093 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4096 if(norm == UNKNOWN) {
4097 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4098 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4099 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4103 if(!strcmp(arg, "vcd")) {
4105 opt_video_codec("mpeg1video");
4106 opt_audio_codec("mp2");
4109 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4110 opt_frame_rate(NULL, frame_rates[norm]);
4111 opt_default("g", norm == PAL ? "15" : "18");
4113 opt_default("b", "1150000");
4114 opt_default("maxrate", "1150000");
4115 opt_default("minrate", "1150000");
4116 opt_default("bufsize", "327680"); // 40*1024*8;
4118 opt_default("ab", "224000");
4119 audio_sample_rate = 44100;
4122 opt_default("packetsize", "2324");
4123 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4125 /* We have to offset the PTS, so that it is consistent with the SCR.
4126 SCR starts at 36000, but the first two packs contain only padding
4127 and the first pack from the other stream, respectively, may also have
4128 been written before.
4129 So the real data starts at SCR 36000+3*1200. */
4130 mux_preload= (36000+3*1200) / 90000.0; //0.44
4131 } else if(!strcmp(arg, "svcd")) {
4133 opt_video_codec("mpeg2video");
4134 opt_audio_codec("mp2");
4137 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4138 opt_frame_rate(NULL, frame_rates[norm]);
4139 opt_default("g", norm == PAL ? "15" : "18");
4141 opt_default("b", "2040000");
4142 opt_default("maxrate", "2516000");
4143 opt_default("minrate", "0"); //1145000;
4144 opt_default("bufsize", "1835008"); //224*1024*8;
4145 opt_default("flags", "+scan_offset");
4148 opt_default("ab", "224000");
4149 audio_sample_rate = 44100;
4151 opt_default("packetsize", "2324");
4153 } else if(!strcmp(arg, "dvd")) {
4155 opt_video_codec("mpeg2video");
4156 opt_audio_codec("ac3");
4159 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4160 opt_frame_rate(NULL, frame_rates[norm]);
4161 opt_default("g", norm == PAL ? "15" : "18");
4163 opt_default("b", "6000000");
4164 opt_default("maxrate", "9000000");
4165 opt_default("minrate", "0"); //1500000;
4166 opt_default("bufsize", "1835008"); //224*1024*8;
4168 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4169 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4171 opt_default("ab", "448000");
4172 audio_sample_rate = 48000;
4174 } else if(!strncmp(arg, "dv", 2)) {
4178 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4179 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4180 (norm == PAL ? "yuv420p" : "yuv411p"));
4181 opt_frame_rate(NULL, frame_rates[norm]);
4183 audio_sample_rate = 48000;
4187 fprintf(stderr, "Unknown target: %s\n", arg);
4192 static void opt_vstats_file (const char *arg)
4194 av_free (vstats_filename);
4195 vstats_filename=av_strdup (arg);
4198 static void opt_vstats (void)
4201 time_t today2 = time(NULL);
4202 struct tm *today = localtime(&today2);
4204 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4206 opt_vstats_file(filename);
4209 static int opt_bsf(const char *opt, const char *arg)
4211 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4212 AVBitStreamFilterContext **bsfp;
4215 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4219 bsfp= *opt == 'v' ? &video_bitstream_filters :
4220 *opt == 'a' ? &audio_bitstream_filters :
4221 &subtitle_bitstream_filters;
4223 bsfp= &(*bsfp)->next;
4230 static int opt_preset(const char *opt, const char *arg)
4233 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4234 char *codec_name = *opt == 'v' ? video_codec_name :
4235 *opt == 'a' ? audio_codec_name :
4236 subtitle_codec_name;
4238 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4239 fprintf(stderr, "File for preset '%s' not found\n", arg);
4244 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4245 if(line[0] == '#' && !e)
4247 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4249 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4252 if(!strcmp(tmp, "acodec")){
4253 opt_audio_codec(tmp2);
4254 }else if(!strcmp(tmp, "vcodec")){
4255 opt_video_codec(tmp2);
4256 }else if(!strcmp(tmp, "scodec")){
4257 opt_subtitle_codec(tmp2);
4258 }else if(!strcmp(tmp, "dcodec")){
4259 opt_data_codec(tmp2);
4260 }else if(opt_default(tmp, tmp2) < 0){
4261 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4271 static const OptionDef options[] = {
4273 #include "cmdutils_common_opts.h"
4274 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4275 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4276 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4277 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4278 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4279 "outfile[,metadata]:infile[,metadata]" },
4280 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4281 "outfile[,metadata]:infile[,metadata]" },
4282 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4283 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4284 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4285 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4286 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4287 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4288 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4289 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4290 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4291 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4292 "add timings for benchmarking" },
4293 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4294 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4295 "dump each input packet" },
4296 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4297 "when dumping packets, also dump the payload" },
4298 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4299 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4300 { "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)", "" },
4301 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4302 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4303 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4304 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4305 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4306 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4307 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4308 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4309 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4310 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4311 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4312 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4313 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4316 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4317 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4318 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4319 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4320 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4321 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4322 { "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" },
4323 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4324 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4325 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4326 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4327 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4328 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4329 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4330 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4331 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4332 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4333 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4334 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4335 { "qscale", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4336 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4337 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4338 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4339 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4340 "use same quantizer as source (implies VBR)" },
4341 { "pass", HAS_ARG | OPT_FUNC2 | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4342 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4343 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4344 "deinterlace pictures" },
4345 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4346 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4347 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4349 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4351 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4352 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4353 { "top", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4354 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4355 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4356 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4357 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4358 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4359 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4360 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4361 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4364 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4365 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4366 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4367 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4368 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4369 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4370 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4371 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4372 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4373 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4374 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4375 { "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" },
4377 /* subtitle options */
4378 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4379 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4380 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4381 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4382 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4385 { "vc", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4386 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4387 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4390 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4391 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4393 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4394 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4395 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4397 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4398 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4399 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4400 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4401 /* data codec support */
4402 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4404 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4408 int main(int argc, char **argv)
4412 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4414 avcodec_register_all();
4416 avdevice_register_all();
4419 avfilter_register_all();
4423 avio_set_interrupt_cb(decode_interrupt_cb);
4430 parse_options(argc, argv, options, opt_output_file);
4432 if(nb_output_files <= 0 && nb_input_files == 0) {
4434 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4438 /* file converter / grab */
4439 if (nb_output_files <= 0) {
4440 fprintf(stderr, "At least one output file must be specified\n");
4444 if (nb_input_files == 0) {
4445 fprintf(stderr, "At least one input file must be specified\n");
4450 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4451 stream_maps, nb_stream_maps) < 0)
4453 ti = getutime() - ti;
4455 int maxrss = getmaxrss() / 1024;
4456 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4459 return ffmpeg_exit(0);