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 int64_t input_files_ts_offset[MAX_FILES];
109 static double *input_files_ts_scale[MAX_FILES] = {NULL};
110 static AVCodec **input_codecs = NULL;
111 static int nb_input_codecs = 0;
112 static int nb_input_files_ts_scale[MAX_FILES] = {0};
114 static AVFormatContext *output_files[MAX_FILES];
115 static AVCodec **output_codecs = NULL;
116 static int nb_output_files = 0;
117 static int nb_output_codecs = 0;
119 static AVStreamMap *stream_maps = NULL;
120 static int nb_stream_maps;
122 /* first item specifies output metadata, second is input */
123 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
124 static int nb_meta_data_maps;
125 static int metadata_global_autocopy = 1;
126 static int metadata_streams_autocopy = 1;
127 static int metadata_chapters_autocopy = 1;
129 static AVChapterMap *chapter_maps = NULL;
130 static int nb_chapter_maps;
132 /* indexed by output file stream index */
133 static int *streamid_map = NULL;
134 static int nb_streamid_map = 0;
136 static int frame_width = 0;
137 static int frame_height = 0;
138 static float frame_aspect_ratio = 0;
139 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
140 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
141 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
142 static AVRational frame_rate;
143 static float video_qscale = 0;
144 static uint16_t *intra_matrix = NULL;
145 static uint16_t *inter_matrix = NULL;
146 static const char *video_rc_override_string=NULL;
147 static int video_disable = 0;
148 static int video_discard = 0;
149 static char *video_codec_name = NULL;
150 static unsigned int video_codec_tag = 0;
151 static char *video_language = NULL;
152 static int same_quality = 0;
153 static int do_deinterlace = 0;
154 static int top_field_first = -1;
155 static int me_threshold = 0;
156 static int intra_dc_precision = 8;
157 static int loop_input = 0;
158 static int loop_output = AVFMT_NOOUTPUTLOOP;
159 static int qp_hist = 0;
161 static char *vfilters = NULL;
164 static int intra_only = 0;
165 static int audio_sample_rate = 44100;
166 static int64_t channel_layout = 0;
167 #define QSCALE_NONE -99999
168 static float audio_qscale = QSCALE_NONE;
169 static int audio_disable = 0;
170 static int audio_channels = 1;
171 static char *audio_codec_name = NULL;
172 static unsigned int audio_codec_tag = 0;
173 static char *audio_language = NULL;
175 static int subtitle_disable = 0;
176 static char *subtitle_codec_name = NULL;
177 static char *subtitle_language = NULL;
178 static unsigned int subtitle_codec_tag = 0;
180 static int data_disable = 0;
181 static char *data_codec_name = NULL;
182 static unsigned int data_codec_tag = 0;
184 static float mux_preload= 0.5;
185 static float mux_max_delay= 0.7;
187 static int64_t recording_time = INT64_MAX;
188 static int64_t start_time = 0;
189 static int64_t recording_timestamp = 0;
190 static int64_t input_ts_offset = 0;
191 static int file_overwrite = 0;
192 static AVMetadata *metadata;
193 static int do_benchmark = 0;
194 static int do_hex_dump = 0;
195 static int do_pkt_dump = 0;
196 static int do_psnr = 0;
197 static int do_pass = 0;
198 static char *pass_logfilename_prefix = NULL;
199 static int audio_stream_copy = 0;
200 static int video_stream_copy = 0;
201 static int subtitle_stream_copy = 0;
202 static int data_stream_copy = 0;
203 static int video_sync_method= -1;
204 static int audio_sync_method= 0;
205 static float audio_drift_threshold= 0.1;
206 static int copy_ts= 0;
208 static int opt_shortest = 0;
209 static char *vstats_filename;
210 static FILE *vstats_file;
211 static int opt_programid = 0;
212 static int copy_initial_nonkeyframes = 0;
214 static int rate_emu = 0;
216 static int video_channel = 0;
217 static char *video_standard;
219 static int audio_volume = 256;
221 static int exit_on_error = 0;
222 static int using_stdin = 0;
223 static int verbose = 1;
224 static int thread_count= 1;
225 static int64_t video_size = 0;
226 static int64_t audio_size = 0;
227 static int64_t extra_size = 0;
228 static int nb_frames_dup = 0;
229 static int nb_frames_drop = 0;
230 static int input_sync;
231 static uint64_t limit_filesize = 0;
232 static int force_fps = 0;
233 static char *forced_key_frames = NULL;
235 static float dts_delta_threshold = 10;
237 static int64_t timer_start;
239 static uint8_t *audio_buf;
240 static uint8_t *audio_out;
241 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
243 static short *samples;
245 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
246 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
247 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
249 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
251 struct AVInputStream;
253 typedef struct AVOutputStream {
254 int file_index; /* file index */
255 int index; /* stream index in the output file */
256 int source_index; /* AVInputStream index */
257 AVStream *st; /* stream in the output file */
258 int encoding_needed; /* true if encoding needed for this stream */
260 /* input pts and corresponding output pts
262 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
263 struct AVInputStream *sync_ist; /* input stream to sync against */
264 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
265 AVBitStreamFilterContext *bitstream_filters;
268 AVFrame pict_tmp; /* temporary image for resampling */
269 struct SwsContext *img_resample_ctx; /* for image resampling */
272 int resample_pix_fmt;
274 float frame_aspect_ratio;
276 /* forced key frames */
277 int64_t *forced_kf_pts;
283 ReSampleContext *resample; /* for audio resampling */
284 int resample_sample_fmt;
285 int resample_channels;
286 int resample_sample_rate;
288 AVAudioConvert *reformat_ctx;
289 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
293 AVFilterContext *output_video_filter;
294 AVFilterContext *input_video_filter;
295 AVFilterBufferRef *picref;
297 AVFilterGraph *graph;
303 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
304 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
306 typedef struct AVInputStream {
309 int discard; /* true if stream data should be discarded */
310 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t sample_index; /* current sample */
313 int64_t start; /* time when read started */
314 int64_t next_pts; /* synthetic pts for cases where pkt.pts
316 int64_t pts; /* current pts */
317 PtsCorrectionContext pts_ctx;
318 int is_start; /* is 1 at the start and after a discontinuity */
319 int showed_multi_packet_warning;
320 int is_past_recording_time;
322 AVFrame *filter_frame;
323 int has_filter_frame;
327 typedef struct AVInputFile {
328 AVFormatContext *ctx;
329 int eof_reached; /* true if eof reached */
330 int ist_index; /* index of first stream in ist_table */
331 int buffer_size; /* current total buffer size */
332 int nb_streams; /* nb streams we are aware of */
335 static AVInputStream *input_streams = NULL;
336 static int nb_input_streams = 0;
337 static AVInputFile *input_files = NULL;
338 static int nb_input_files = 0;
342 static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
344 AVFilterContext *last_filter, *filter;
345 /** filter graph containing all filters including input & output */
346 AVCodecContext *codec = ost->st->codec;
347 AVCodecContext *icodec = ist->st->codec;
348 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
349 AVRational sample_aspect_ratio;
353 ost->graph = avfilter_graph_alloc();
355 if (ist->st->sample_aspect_ratio.num){
356 sample_aspect_ratio = ist->st->sample_aspect_ratio;
358 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
360 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
361 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
362 sample_aspect_ratio.num, sample_aspect_ratio.den);
364 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
365 "src", args, NULL, ost->graph);
368 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
369 "out", NULL, &ffsink_ctx, ost->graph);
372 last_filter = ost->input_video_filter;
374 if (codec->width != icodec->width || codec->height != icodec->height) {
375 snprintf(args, 255, "%d:%d:flags=0x%X",
379 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
380 NULL, args, NULL, ost->graph)) < 0)
382 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
384 last_filter = filter;
387 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
388 ost->graph->scale_sws_opts = av_strdup(args);
391 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
392 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
394 outputs->name = av_strdup("in");
395 outputs->filter_ctx = last_filter;
396 outputs->pad_idx = 0;
397 outputs->next = NULL;
399 inputs->name = av_strdup("out");
400 inputs->filter_ctx = ost->output_video_filter;
404 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
406 av_freep(&ost->avfilter);
408 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
412 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
415 codec->width = ost->output_video_filter->inputs[0]->w;
416 codec->height = ost->output_video_filter->inputs[0]->h;
417 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
418 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
419 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
420 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
424 #endif /* CONFIG_AVFILTER */
426 static void term_exit(void)
428 av_log(NULL, AV_LOG_QUIET, "");
431 static volatile int received_sigterm = 0;
432 static volatile int received_nb_signals = 0;
435 sigterm_handler(int sig)
437 received_sigterm = sig;
438 received_nb_signals++;
442 static void term_init(void)
444 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
445 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
447 signal(SIGXCPU, sigterm_handler);
451 static int decode_interrupt_cb(void)
453 return received_nb_signals > 1;
456 static int ffmpeg_exit(int ret)
461 for(i=0;i<nb_output_files;i++) {
462 AVFormatContext *s = output_files[i];
463 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
465 avformat_free_context(s);
466 av_free(output_streams_for_file[i]);
468 for(i=0;i<nb_input_files;i++) {
469 av_close_input_file(input_files[i].ctx);
470 av_free(input_files_ts_scale[i]);
473 av_free(intra_matrix);
474 av_free(inter_matrix);
478 av_free(vstats_filename);
480 av_free(streamid_map);
481 av_free(input_codecs);
482 av_free(output_codecs);
483 av_free(stream_maps);
484 av_free(meta_data_maps);
486 av_freep(&input_streams);
487 av_freep(&input_files);
489 av_free(video_codec_name);
490 av_free(audio_codec_name);
491 av_free(subtitle_codec_name);
492 av_free(data_codec_name);
494 av_free(video_standard);
499 allocated_audio_buf_size= allocated_audio_out_size= 0;
506 if (received_sigterm) {
508 "Received signal %d: terminating.\n",
509 (int) received_sigterm);
513 exit(ret); /* not all OS-es handle main() return value */
517 /* similar to ff_dynarray_add() and av_fast_realloc() */
518 static void *grow_array(void *array, int elem_size, int *size, int new_size)
520 if (new_size >= INT_MAX / elem_size) {
521 fprintf(stderr, "Array too big.\n");
524 if (*size < new_size) {
525 uint8_t *tmp = av_realloc(array, new_size*elem_size);
527 fprintf(stderr, "Could not alloc buffer.\n");
530 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
537 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
539 if(codec && codec->sample_fmts){
540 const enum AVSampleFormat *p= codec->sample_fmts;
542 if(*p == st->codec->sample_fmt)
546 av_log(NULL, AV_LOG_WARNING,
547 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
548 av_get_sample_fmt_name(st->codec->sample_fmt),
550 av_get_sample_fmt_name(codec->sample_fmts[0]));
551 st->codec->sample_fmt = codec->sample_fmts[0];
557 * Update the requested input sample format based on the output sample format.
558 * This is currently only used to request float output from decoders which
559 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
560 * Ideally this will be removed in the future when decoders do not do format
561 * conversion and only output in their native format.
563 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
566 /* if sample formats match or a decoder sample format has already been
567 requested, just return */
568 if (enc->sample_fmt == dec->sample_fmt ||
569 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
572 /* if decoder supports more than one output format */
573 if (dec_codec && dec_codec->sample_fmts &&
574 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
575 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
576 enum AVSampleFormat *p;
577 int min_dec = -1, min_inc = -1;
579 /* find a matching sample format in the encoder */
580 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
581 if (*p == enc->sample_fmt) {
582 dec->request_sample_fmt = *p;
584 } else if (*p > enc->sample_fmt) {
585 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
587 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
590 /* if none match, provide the one that matches quality closest */
591 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
592 enc->sample_fmt - min_dec;
596 static void choose_sample_rate(AVStream *st, AVCodec *codec)
598 if(codec && codec->supported_samplerates){
599 const int *p= codec->supported_samplerates;
601 int best_dist=INT_MAX;
603 int dist= abs(st->codec->sample_rate - *p);
604 if(dist < best_dist){
610 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
612 st->codec->sample_rate= best;
616 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
618 if(codec && codec->pix_fmts){
619 const enum PixelFormat *p= codec->pix_fmts;
620 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
621 if(st->codec->codec_id==CODEC_ID_MJPEG){
622 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
623 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
624 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};
628 if(*p == st->codec->pix_fmt)
632 if(st->codec->pix_fmt != PIX_FMT_NONE)
633 av_log(NULL, AV_LOG_WARNING,
634 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
635 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
637 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
638 st->codec->pix_fmt = codec->pix_fmts[0];
643 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
645 int idx = oc->nb_streams - 1;
648 output_streams_for_file[file_idx] =
649 grow_array(output_streams_for_file[file_idx],
650 sizeof(*output_streams_for_file[file_idx]),
651 &nb_output_streams_for_file[file_idx],
653 ost = output_streams_for_file[file_idx][idx] =
654 av_mallocz(sizeof(AVOutputStream));
656 fprintf(stderr, "Could not alloc output stream\n");
659 ost->file_index = file_idx;
662 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
666 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
672 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
675 /* copy stream format */
677 for(i=0;i<ic->nb_streams;i++) {
683 // FIXME: a more elegant solution is needed
684 st = av_mallocz(sizeof(AVStream));
685 memcpy(st, ic->streams[i], sizeof(AVStream));
686 st->codec = avcodec_alloc_context();
688 print_error(filename, AVERROR(ENOMEM));
691 avcodec_copy_context(st->codec, ic->streams[i]->codec);
694 codec = avcodec_find_encoder(st->codec->codec_id);
695 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
696 if (audio_stream_copy) {
699 choose_sample_fmt(st, codec);
700 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
701 if (video_stream_copy) {
704 choose_pixel_fmt(st, codec);
707 if(st->codec->flags & CODEC_FLAG_BITEXACT)
710 new_output_stream(s, nb_output_files);
714 s->timestamp = av_gettime();
716 av_close_input_file(ic);
721 get_sync_ipts(const AVOutputStream *ost)
723 const AVInputStream *ist = ost->sync_ist;
724 return (double)(ist->pts - start_time)/AV_TIME_BASE;
727 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
731 AVPacket new_pkt= *pkt;
732 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
733 &new_pkt.data, &new_pkt.size,
734 pkt->data, pkt->size,
735 pkt->flags & AV_PKT_FLAG_KEY);
738 new_pkt.destruct= av_destruct_packet;
740 fprintf(stderr, "%s failed for stream %d, codec %s",
741 bsfc->filter->name, pkt->stream_index,
742 avctx->codec ? avctx->codec->name : "copy");
752 ret= av_interleaved_write_frame(s, pkt);
754 print_error("av_interleaved_write_frame()", ret);
759 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
761 static void do_audio_out(AVFormatContext *s,
764 unsigned char *buf, int size)
767 int64_t audio_out_size, audio_buf_size;
768 int64_t allocated_for_size= size;
770 int size_out, frame_bytes, ret, resample_changed;
771 AVCodecContext *enc= ost->st->codec;
772 AVCodecContext *dec= ist->st->codec;
773 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
774 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
775 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
778 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
779 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
780 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
781 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
782 audio_buf_size*= osize*enc->channels;
784 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
785 if(coded_bps > 8*osize)
786 audio_out_size= audio_out_size * coded_bps / (8*osize);
787 audio_out_size += FF_MIN_BUFFER_SIZE;
789 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
790 fprintf(stderr, "Buffer sizes too large\n");
794 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
795 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
796 if (!audio_buf || !audio_out){
797 fprintf(stderr, "Out of memory in do_audio_out\n");
801 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
802 ost->audio_resample = 1;
804 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
805 ost->resample_channels != dec->channels ||
806 ost->resample_sample_rate != dec->sample_rate;
808 if ((ost->audio_resample && !ost->resample) || resample_changed) {
809 if (resample_changed) {
810 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",
811 ist->file_index, ist->st->index,
812 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
813 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
814 ost->resample_sample_fmt = dec->sample_fmt;
815 ost->resample_channels = dec->channels;
816 ost->resample_sample_rate = dec->sample_rate;
818 audio_resample_close(ost->resample);
820 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
821 if (audio_sync_method <= 1 &&
822 ost->resample_sample_fmt == enc->sample_fmt &&
823 ost->resample_channels == enc->channels &&
824 ost->resample_sample_rate == enc->sample_rate) {
825 ost->resample = NULL;
826 ost->audio_resample = 0;
827 } else if (ost->audio_resample) {
828 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
829 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
830 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
831 enc->sample_rate, dec->sample_rate,
832 enc->sample_fmt, dec->sample_fmt,
834 if (!ost->resample) {
835 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
836 dec->channels, dec->sample_rate,
837 enc->channels, enc->sample_rate);
843 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
844 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
845 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
846 if (ost->reformat_ctx)
847 av_audio_convert_free(ost->reformat_ctx);
848 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
849 dec->sample_fmt, 1, NULL, 0);
850 if (!ost->reformat_ctx) {
851 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
852 av_get_sample_fmt_name(dec->sample_fmt),
853 av_get_sample_fmt_name(enc->sample_fmt));
856 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
859 if(audio_sync_method){
860 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
861 - av_fifo_size(ost->fifo)/(enc->channels * 2);
862 double idelta= delta*dec->sample_rate / enc->sample_rate;
863 int byte_delta= ((int)idelta)*2*dec->channels;
865 //FIXME resample delay
866 if(fabs(delta) > 50){
867 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
869 byte_delta= FFMAX(byte_delta, -size);
873 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
878 static uint8_t *input_tmp= NULL;
879 input_tmp= av_realloc(input_tmp, byte_delta + size);
881 if(byte_delta > allocated_for_size - size){
882 allocated_for_size= byte_delta + (int64_t)size;
887 memset(input_tmp, 0, byte_delta);
888 memcpy(input_tmp + byte_delta, buf, size);
892 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
894 }else if(audio_sync_method>1){
895 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
896 av_assert0(ost->audio_resample);
898 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
899 // 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));
900 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
904 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
905 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
907 if (ost->audio_resample) {
909 size_out = audio_resample(ost->resample,
910 (short *)buftmp, (short *)buf,
911 size / (dec->channels * isize));
912 size_out = size_out * enc->channels * osize;
918 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
919 const void *ibuf[6]= {buftmp};
920 void *obuf[6]= {audio_buf};
921 int istride[6]= {isize};
922 int ostride[6]= {osize};
923 int len= size_out/istride[0];
924 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
925 printf("av_audio_convert() failed\n");
931 size_out = len*osize;
934 /* now encode as many frames as possible */
935 if (enc->frame_size > 1) {
936 /* output resampled raw samples */
937 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
938 fprintf(stderr, "av_fifo_realloc2() failed\n");
941 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
943 frame_bytes = enc->frame_size * osize * enc->channels;
945 while (av_fifo_size(ost->fifo) >= frame_bytes) {
947 av_init_packet(&pkt);
949 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
951 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
953 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
956 fprintf(stderr, "Audio encoding failed\n");
960 pkt.stream_index= ost->index;
963 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
964 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
965 pkt.flags |= AV_PKT_FLAG_KEY;
966 write_frame(s, &pkt, enc, ost->bitstream_filters);
968 ost->sync_opts += enc->frame_size;
972 av_init_packet(&pkt);
974 ost->sync_opts += size_out / (osize * enc->channels);
976 /* output a pcm frame */
977 /* determine the size of the coded buffer */
980 size_out = size_out*coded_bps/8;
982 if(size_out > audio_out_size){
983 fprintf(stderr, "Internal error, buffer size too small\n");
987 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
988 ret = avcodec_encode_audio(enc, audio_out, size_out,
991 fprintf(stderr, "Audio encoding failed\n");
995 pkt.stream_index= ost->index;
998 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
999 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1000 pkt.flags |= AV_PKT_FLAG_KEY;
1001 write_frame(s, &pkt, enc, ost->bitstream_filters);
1005 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
1007 AVCodecContext *dec;
1008 AVPicture *picture2;
1009 AVPicture picture_tmp;
1012 dec = ist->st->codec;
1014 /* deinterlace : must be done before any resize */
1015 if (do_deinterlace) {
1018 /* create temporary picture */
1019 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1020 buf = av_malloc(size);
1024 picture2 = &picture_tmp;
1025 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1027 if(avpicture_deinterlace(picture2, picture,
1028 dec->pix_fmt, dec->width, dec->height) < 0) {
1029 /* if error, do not deinterlace */
1030 fprintf(stderr, "Deinterlacing failed\n");
1039 if (picture != picture2)
1040 *picture = *picture2;
1044 /* we begin to correct av delay at this threshold */
1045 #define AV_DELAY_MAX 0.100
1047 static void do_subtitle_out(AVFormatContext *s,
1048 AVOutputStream *ost,
1053 static uint8_t *subtitle_out = NULL;
1054 int subtitle_out_max_size = 1024 * 1024;
1055 int subtitle_out_size, nb, i;
1056 AVCodecContext *enc;
1059 if (pts == AV_NOPTS_VALUE) {
1060 fprintf(stderr, "Subtitle packets must have a pts\n");
1066 enc = ost->st->codec;
1068 if (!subtitle_out) {
1069 subtitle_out = av_malloc(subtitle_out_max_size);
1072 /* Note: DVB subtitle need one packet to draw them and one other
1073 packet to clear them */
1074 /* XXX: signal it in the codec context ? */
1075 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1080 for(i = 0; i < nb; i++) {
1081 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1082 // start_display_time is required to be 0
1083 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1084 sub->end_display_time -= sub->start_display_time;
1085 sub->start_display_time = 0;
1086 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1087 subtitle_out_max_size, sub);
1088 if (subtitle_out_size < 0) {
1089 fprintf(stderr, "Subtitle encoding failed\n");
1093 av_init_packet(&pkt);
1094 pkt.stream_index = ost->index;
1095 pkt.data = subtitle_out;
1096 pkt.size = subtitle_out_size;
1097 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1098 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1099 /* XXX: the pts correction is handled here. Maybe handling
1100 it in the codec would be better */
1102 pkt.pts += 90 * sub->start_display_time;
1104 pkt.pts += 90 * sub->end_display_time;
1106 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1110 static int bit_buffer_size= 1024*256;
1111 static uint8_t *bit_buffer= NULL;
1113 static void do_video_out(AVFormatContext *s,
1114 AVOutputStream *ost,
1116 AVFrame *in_picture,
1119 int nb_frames, i, ret, resample_changed;
1120 AVFrame *final_picture, *formatted_picture, *resampling_dst;
1121 AVCodecContext *enc, *dec;
1124 enc = ost->st->codec;
1125 dec = ist->st->codec;
1127 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1129 /* by default, we output a single frame */
1134 if(video_sync_method){
1135 double vdelta = sync_ipts - ost->sync_opts;
1136 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1139 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1142 }else if(vdelta>0.6)
1143 ost->sync_opts= lrintf(sync_ipts);
1144 }else if (vdelta > 1.1)
1145 nb_frames = lrintf(vdelta);
1146 //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);
1147 if (nb_frames == 0){
1150 fprintf(stderr, "*** drop!\n");
1151 }else if (nb_frames > 1) {
1152 nb_frames_dup += nb_frames - 1;
1154 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1157 ost->sync_opts= lrintf(sync_ipts);
1159 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1163 formatted_picture = in_picture;
1164 final_picture = formatted_picture;
1165 resampling_dst = &ost->pict_tmp;
1167 resample_changed = ost->resample_width != dec->width ||
1168 ost->resample_height != dec->height ||
1169 ost->resample_pix_fmt != dec->pix_fmt;
1171 if (resample_changed) {
1172 av_log(NULL, AV_LOG_INFO,
1173 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1174 ist->file_index, ist->st->index,
1175 ost->resample_width, ost->resample_height, avcodec_get_pix_fmt_name(ost->resample_pix_fmt),
1176 dec->width , dec->height , avcodec_get_pix_fmt_name(dec->pix_fmt));
1177 if(!ost->video_resample)
1181 #if !CONFIG_AVFILTER
1182 if (ost->video_resample) {
1183 final_picture = &ost->pict_tmp;
1184 if (resample_changed) {
1185 /* initialize a new scaler context */
1186 sws_freeContext(ost->img_resample_ctx);
1187 ost->img_resample_ctx = sws_getContext(
1188 ist->st->codec->width,
1189 ist->st->codec->height,
1190 ist->st->codec->pix_fmt,
1191 ost->st->codec->width,
1192 ost->st->codec->height,
1193 ost->st->codec->pix_fmt,
1194 ost->sws_flags, NULL, NULL, NULL);
1195 if (ost->img_resample_ctx == NULL) {
1196 fprintf(stderr, "Cannot get resampling context\n");
1200 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1201 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1205 /* duplicates frame if needed */
1206 for(i=0;i<nb_frames;i++) {
1208 av_init_packet(&pkt);
1209 pkt.stream_index= ost->index;
1211 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1212 /* raw pictures are written as AVPicture structure to
1213 avoid any copies. We support temorarily the older
1215 AVFrame* old_frame = enc->coded_frame;
1216 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1217 pkt.data= (uint8_t *)final_picture;
1218 pkt.size= sizeof(AVPicture);
1219 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1220 pkt.flags |= AV_PKT_FLAG_KEY;
1222 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1223 enc->coded_frame = old_frame;
1225 AVFrame big_picture;
1227 big_picture= *final_picture;
1228 /* better than nothing: use input picture interlaced
1230 big_picture.interlaced_frame = in_picture->interlaced_frame;
1231 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1232 if(top_field_first == -1)
1233 big_picture.top_field_first = in_picture->top_field_first;
1235 big_picture.top_field_first = top_field_first;
1238 /* handles sameq here. This is not correct because it may
1239 not be a global option */
1240 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1242 big_picture.pict_type = 0;
1243 // big_picture.pts = AV_NOPTS_VALUE;
1244 big_picture.pts= ost->sync_opts;
1245 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1246 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1247 if (ost->forced_kf_index < ost->forced_kf_count &&
1248 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1249 big_picture.pict_type = AV_PICTURE_TYPE_I;
1250 ost->forced_kf_index++;
1252 ret = avcodec_encode_video(enc,
1253 bit_buffer, bit_buffer_size,
1256 fprintf(stderr, "Video encoding failed\n");
1261 pkt.data= bit_buffer;
1263 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1264 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1265 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1266 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1267 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1269 if(enc->coded_frame->key_frame)
1270 pkt.flags |= AV_PKT_FLAG_KEY;
1271 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1274 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1275 // enc->frame_number-1, ret, enc->pict_type);
1276 /* if two pass, output log */
1277 if (ost->logfile && enc->stats_out) {
1278 fprintf(ost->logfile, "%s", enc->stats_out);
1283 ost->frame_number++;
1287 static double psnr(double d){
1288 return -10.0*log(d)/log(10.0);
1291 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1294 AVCodecContext *enc;
1296 double ti1, bitrate, avg_bitrate;
1298 /* this is executed just the first time do_video_stats is called */
1300 vstats_file = fopen(vstats_filename, "w");
1307 enc = ost->st->codec;
1308 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1309 frame_number = ost->frame_number;
1310 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1311 if (enc->flags&CODEC_FLAG_PSNR)
1312 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1314 fprintf(vstats_file,"f_size= %6d ", frame_size);
1315 /* compute pts value */
1316 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1320 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1321 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1322 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1323 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1324 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1328 static void print_report(AVFormatContext **output_files,
1329 AVOutputStream **ost_table, int nb_ostreams,
1333 AVOutputStream *ost;
1334 AVFormatContext *oc;
1336 AVCodecContext *enc;
1337 int frame_number, vid, i;
1338 double bitrate, ti1, pts;
1339 static int64_t last_time = -1;
1340 static int qp_histogram[52];
1342 if (!is_last_report) {
1344 /* display the report every 0.5 seconds */
1345 cur_time = av_gettime();
1346 if (last_time == -1) {
1347 last_time = cur_time;
1350 if ((cur_time - last_time) < 500000)
1352 last_time = cur_time;
1356 oc = output_files[0];
1358 total_size = avio_size(oc->pb);
1359 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1360 total_size= avio_tell(oc->pb);
1365 for(i=0;i<nb_ostreams;i++) {
1368 enc = ost->st->codec;
1369 if (!ost->st->stream_copy && enc->coded_frame)
1370 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1371 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1372 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1374 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1375 float t = (av_gettime()-timer_start) / 1000000.0;
1377 frame_number = ost->frame_number;
1378 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1379 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1381 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1385 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1388 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1390 if (enc->flags&CODEC_FLAG_PSNR){
1392 double error, error_sum=0;
1393 double scale, scale_sum=0;
1394 char type[3]= {'Y','U','V'};
1395 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1398 error= enc->error[j];
1399 scale= enc->width*enc->height*255.0*255.0*frame_number;
1401 error= enc->coded_frame->error[j];
1402 scale= enc->width*enc->height*255.0*255.0;
1407 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1413 /* compute min output value */
1414 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1415 if ((pts < ti1) && (pts > 0))
1421 if (verbose > 0 || is_last_report) {
1422 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1424 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1425 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1426 (double)total_size / 1024, ti1, bitrate);
1428 if (nb_frames_dup || nb_frames_drop)
1429 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1430 nb_frames_dup, nb_frames_drop);
1433 fprintf(stderr, "%s \r", buf);
1438 if (is_last_report && verbose >= 0){
1439 int64_t raw= audio_size + video_size + extra_size;
1440 fprintf(stderr, "\n");
1441 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1445 100.0*(total_size - raw)/raw
1450 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1452 int fill_char = 0x00;
1453 if (sample_fmt == AV_SAMPLE_FMT_U8)
1455 memset(buf, fill_char, size);
1458 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1459 static int output_packet(AVInputStream *ist, int ist_index,
1460 AVOutputStream **ost_table, int nb_ostreams,
1461 const AVPacket *pkt)
1463 AVFormatContext *os;
1464 AVOutputStream *ost;
1468 void *buffer_to_free = NULL;
1469 static unsigned int samples_size= 0;
1470 AVSubtitle subtitle, *subtitle_to_free;
1471 int64_t pkt_pts = AV_NOPTS_VALUE;
1473 int frame_available;
1477 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1479 if(ist->next_pts == AV_NOPTS_VALUE)
1480 ist->next_pts= ist->pts;
1484 av_init_packet(&avpkt);
1492 if(pkt->dts != AV_NOPTS_VALUE)
1493 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1494 if(pkt->pts != AV_NOPTS_VALUE)
1495 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1497 //while we have more to decode or while the decoder did output something on EOF
1498 while (avpkt.size > 0 || (!pkt && got_output)) {
1499 uint8_t *data_buf, *decoded_data_buf;
1500 int data_size, decoded_data_size;
1502 ist->pts= ist->next_pts;
1504 if(avpkt.size && avpkt.size != pkt->size &&
1505 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1506 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1507 ist->showed_multi_packet_warning=1;
1510 /* decode the packet if needed */
1511 decoded_data_buf = NULL; /* fail safe */
1512 decoded_data_size= 0;
1513 data_buf = avpkt.data;
1514 data_size = avpkt.size;
1515 subtitle_to_free = NULL;
1516 if (ist->decoding_needed) {
1517 switch(ist->st->codec->codec_type) {
1518 case AVMEDIA_TYPE_AUDIO:{
1519 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1520 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1522 samples= av_malloc(samples_size);
1524 decoded_data_size= samples_size;
1525 /* XXX: could avoid copy if PCM 16 bits with same
1526 endianness as CPU */
1527 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1534 got_output = decoded_data_size > 0;
1535 /* Some bug in mpeg audio decoder gives */
1536 /* decoded_data_size < 0, it seems they are overflows */
1538 /* no audio frame */
1541 decoded_data_buf = (uint8_t *)samples;
1542 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1543 (ist->st->codec->sample_rate * ist->st->codec->channels);
1545 case AVMEDIA_TYPE_VIDEO:
1546 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1547 /* XXX: allocate picture correctly */
1548 avcodec_get_frame_defaults(&picture);
1549 avpkt.pts = pkt_pts;
1550 avpkt.dts = ist->pts;
1551 pkt_pts = AV_NOPTS_VALUE;
1553 ret = avcodec_decode_video2(ist->st->codec,
1554 &picture, &got_output, &avpkt);
1555 ist->st->quality= picture.quality;
1559 /* no picture yet */
1560 goto discard_packet;
1562 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1563 if (ist->st->codec->time_base.num != 0) {
1564 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1565 ist->next_pts += ((int64_t)AV_TIME_BASE *
1566 ist->st->codec->time_base.num * ticks) /
1567 ist->st->codec->time_base.den;
1570 buffer_to_free = NULL;
1571 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1573 case AVMEDIA_TYPE_SUBTITLE:
1574 ret = avcodec_decode_subtitle2(ist->st->codec,
1575 &subtitle, &got_output, &avpkt);
1579 goto discard_packet;
1581 subtitle_to_free = &subtitle;
1588 switch(ist->st->codec->codec_type) {
1589 case AVMEDIA_TYPE_AUDIO:
1590 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1591 ist->st->codec->sample_rate;
1593 case AVMEDIA_TYPE_VIDEO:
1594 if (ist->st->codec->time_base.num != 0) {
1595 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1596 ist->next_pts += ((int64_t)AV_TIME_BASE *
1597 ist->st->codec->time_base.num * ticks) /
1598 ist->st->codec->time_base.den;
1607 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1608 for (i = 0; i < nb_ostreams; i++) {
1610 if (ost->input_video_filter && ost->source_index == ist_index) {
1612 if (ist->st->sample_aspect_ratio.num)
1613 sar = ist->st->sample_aspect_ratio;
1615 sar = ist->st->codec->sample_aspect_ratio;
1616 // add it to be filtered
1617 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1625 // preprocess audio (volume)
1626 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1627 if (audio_volume != 256) {
1630 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1631 int v = ((*volp) * audio_volume + 128) >> 8;
1632 if (v < -32768) v = -32768;
1633 if (v > 32767) v = 32767;
1639 /* frame rate emulation */
1641 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1642 int64_t now = av_gettime() - ist->start;
1646 /* if output time reached then transcode raw format,
1647 encode packets and output them */
1648 if (start_time == 0 || ist->pts >= start_time)
1649 for(i=0;i<nb_ostreams;i++) {
1653 if (ost->source_index == ist_index) {
1655 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1656 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1657 while (frame_available) {
1658 AVRational ist_pts_tb;
1659 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1660 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1662 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1664 os = output_files[ost->file_index];
1666 /* set the input output pts pairs */
1667 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1669 if (ost->encoding_needed) {
1670 av_assert0(ist->decoding_needed);
1671 switch(ost->st->codec->codec_type) {
1672 case AVMEDIA_TYPE_AUDIO:
1673 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1675 case AVMEDIA_TYPE_VIDEO:
1677 if (ost->picref->video && !ost->frame_aspect_ratio)
1678 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1680 do_video_out(os, ost, ist, &picture, &frame_size);
1681 if (vstats_filename && frame_size)
1682 do_video_stats(os, ost, frame_size);
1684 case AVMEDIA_TYPE_SUBTITLE:
1685 do_subtitle_out(os, ost, ist, &subtitle,
1692 AVFrame avframe; //FIXME/XXX remove this
1694 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1696 av_init_packet(&opkt);
1698 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1699 #if !CONFIG_AVFILTER
1705 /* no reencoding needed : output the packet directly */
1706 /* force the input stream PTS */
1708 avcodec_get_frame_defaults(&avframe);
1709 ost->st->codec->coded_frame= &avframe;
1710 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1712 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1713 audio_size += data_size;
1714 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1715 video_size += data_size;
1719 opkt.stream_index= ost->index;
1720 if(pkt->pts != AV_NOPTS_VALUE)
1721 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1723 opkt.pts= AV_NOPTS_VALUE;
1725 if (pkt->dts == AV_NOPTS_VALUE)
1726 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1728 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1729 opkt.dts -= ost_tb_start_time;
1731 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1732 opkt.flags= pkt->flags;
1734 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1735 if( ost->st->codec->codec_id != CODEC_ID_H264
1736 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1737 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1739 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1740 opkt.destruct= av_destruct_packet;
1742 opkt.data = data_buf;
1743 opkt.size = data_size;
1746 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1747 ost->st->codec->frame_number++;
1748 ost->frame_number++;
1749 av_free_packet(&opkt);
1753 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1754 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1756 avfilter_unref_buffer(ost->picref);
1762 av_free(buffer_to_free);
1763 /* XXX: allocate the subtitles in the codec ? */
1764 if (subtitle_to_free) {
1765 avsubtitle_free(subtitle_to_free);
1766 subtitle_to_free = NULL;
1773 for(i=0;i<nb_ostreams;i++) {
1775 if (ost->source_index == ist_index) {
1776 AVCodecContext *enc= ost->st->codec;
1777 os = output_files[ost->file_index];
1779 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1781 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1784 if (ost->encoding_needed) {
1788 av_init_packet(&pkt);
1789 pkt.stream_index= ost->index;
1791 switch(ost->st->codec->codec_type) {
1792 case AVMEDIA_TYPE_AUDIO:
1793 fifo_bytes = av_fifo_size(ost->fifo);
1795 /* encode any samples remaining in fifo */
1796 if (fifo_bytes > 0) {
1797 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1798 int fs_tmp = enc->frame_size;
1800 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1801 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1802 enc->frame_size = fifo_bytes / (osize * enc->channels);
1804 int frame_bytes = enc->frame_size*osize*enc->channels;
1805 if (allocated_audio_buf_size < frame_bytes)
1807 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1810 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1811 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1812 ost->st->time_base.num, enc->sample_rate);
1813 enc->frame_size = fs_tmp;
1816 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1819 fprintf(stderr, "Audio encoding failed\n");
1823 pkt.flags |= AV_PKT_FLAG_KEY;
1825 case AVMEDIA_TYPE_VIDEO:
1826 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1828 fprintf(stderr, "Video encoding failed\n");
1832 if(enc->coded_frame && enc->coded_frame->key_frame)
1833 pkt.flags |= AV_PKT_FLAG_KEY;
1834 if (ost->logfile && enc->stats_out) {
1835 fprintf(ost->logfile, "%s", enc->stats_out);
1844 pkt.data= bit_buffer;
1846 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1847 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1848 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1860 static void print_sdp(AVFormatContext **avc, int n)
1864 av_sdp_create(avc, n, sdp, sizeof(sdp));
1865 printf("SDP:\n%s\n", sdp);
1869 static int copy_chapters(int infile, int outfile)
1871 AVFormatContext *is = input_files[infile].ctx;
1872 AVFormatContext *os = output_files[outfile];
1875 for (i = 0; i < is->nb_chapters; i++) {
1876 AVChapter *in_ch = is->chapters[i], *out_ch;
1877 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1878 AV_TIME_BASE_Q, in_ch->time_base);
1879 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1880 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1883 if (in_ch->end < ts_off)
1885 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1888 out_ch = av_mallocz(sizeof(AVChapter));
1890 return AVERROR(ENOMEM);
1892 out_ch->id = in_ch->id;
1893 out_ch->time_base = in_ch->time_base;
1894 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1895 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1897 if (metadata_chapters_autocopy)
1898 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1901 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1903 return AVERROR(ENOMEM);
1904 os->chapters[os->nb_chapters - 1] = out_ch;
1909 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1910 AVCodecContext *avctx)
1916 for (p = kf; *p; p++)
1919 ost->forced_kf_count = n;
1920 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1921 if (!ost->forced_kf_pts) {
1922 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1925 for (i = 0; i < n; i++) {
1926 p = i ? strchr(p, ',') + 1 : kf;
1927 t = parse_time_or_die("force_key_frames", p, 1);
1928 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1933 * The following code is the main loop of the file converter
1935 static int transcode(AVFormatContext **output_files,
1936 int nb_output_files,
1937 AVInputFile *input_files,
1939 AVStreamMap *stream_maps, int nb_stream_maps)
1941 int ret = 0, i, j, k, n, nb_ostreams = 0;
1942 AVFormatContext *is, *os;
1943 AVCodecContext *codec, *icodec;
1944 AVOutputStream *ost, **ost_table = NULL;
1948 uint8_t no_packet[MAX_FILES]={0};
1949 int no_packet_count=0;
1952 for (i = 0; i < nb_input_streams; i++)
1953 input_streams[i].start = av_gettime();
1955 /* output stream init */
1957 for(i=0;i<nb_output_files;i++) {
1958 os = output_files[i];
1959 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1960 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1961 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1962 ret = AVERROR(EINVAL);
1965 nb_ostreams += os->nb_streams;
1967 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1968 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1969 ret = AVERROR(EINVAL);
1973 /* Sanity check the mapping args -- do the input files & streams exist? */
1974 for(i=0;i<nb_stream_maps;i++) {
1975 int fi = stream_maps[i].file_index;
1976 int si = stream_maps[i].stream_index;
1978 if (fi < 0 || fi > nb_input_files - 1 ||
1979 si < 0 || si > input_files[fi].nb_streams - 1) {
1980 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1981 ret = AVERROR(EINVAL);
1984 fi = stream_maps[i].sync_file_index;
1985 si = stream_maps[i].sync_stream_index;
1986 if (fi < 0 || fi > nb_input_files - 1 ||
1987 si < 0 || si > input_files[fi].nb_streams - 1) {
1988 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1989 ret = AVERROR(EINVAL);
1994 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1998 for(k=0;k<nb_output_files;k++) {
1999 os = output_files[k];
2000 for(i=0;i<os->nb_streams;i++,n++) {
2002 ost = ost_table[n] = output_streams_for_file[k][i];
2003 ost->st = os->streams[i];
2004 if (nb_stream_maps > 0) {
2005 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2006 stream_maps[n].stream_index;
2008 /* Sanity check that the stream types match */
2009 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2010 int i= ost->file_index;
2011 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2012 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2013 stream_maps[n].file_index, stream_maps[n].stream_index,
2014 ost->file_index, ost->index);
2019 int best_nb_frames=-1;
2020 /* get corresponding input stream index : we select the first one with the right type */
2022 for (j = 0; j < nb_input_streams; j++) {
2024 ist = &input_streams[j];
2027 AVFormatContext *f = input_files[ist->file_index].ctx;
2029 for(pi=0; pi<f->nb_programs; pi++){
2030 AVProgram *p= f->programs[pi];
2031 if(p->id == opt_programid)
2032 for(si=0; si<p->nb_stream_indexes; si++){
2033 if(f->streams[ p->stream_index[si] ] == ist->st)
2038 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2039 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2040 if(best_nb_frames < ist->st->codec_info_nb_frames){
2041 best_nb_frames= ist->st->codec_info_nb_frames;
2042 ost->source_index = j;
2049 if(! opt_programid) {
2050 /* try again and reuse existing stream */
2051 for (j = 0; j < nb_input_streams; j++) {
2052 ist = &input_streams[j];
2053 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2054 && ist->st->discard != AVDISCARD_ALL) {
2055 ost->source_index = j;
2061 int i= ost->file_index;
2062 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2063 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2064 ost->file_index, ost->index);
2069 ist = &input_streams[ost->source_index];
2071 ost->sync_ist = (nb_stream_maps > 0) ?
2072 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2073 stream_maps[n].sync_stream_index] : ist;
2077 /* for each output stream, we compute the right encoding parameters */
2078 for(i=0;i<nb_ostreams;i++) {
2080 os = output_files[ost->file_index];
2081 ist = &input_streams[ost->source_index];
2083 codec = ost->st->codec;
2084 icodec = ist->st->codec;
2086 if (metadata_streams_autocopy)
2087 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2088 AV_METADATA_DONT_OVERWRITE);
2090 ost->st->disposition = ist->st->disposition;
2091 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2092 codec->chroma_sample_location = icodec->chroma_sample_location;
2094 if (ost->st->stream_copy) {
2095 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2097 if (extra_size > INT_MAX)
2100 /* if stream_copy is selected, no need to decode or encode */
2101 codec->codec_id = icodec->codec_id;
2102 codec->codec_type = icodec->codec_type;
2104 if(!codec->codec_tag){
2105 if( !os->oformat->codec_tag
2106 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2107 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2108 codec->codec_tag = icodec->codec_tag;
2111 codec->bit_rate = icodec->bit_rate;
2112 codec->rc_max_rate = icodec->rc_max_rate;
2113 codec->rc_buffer_size = icodec->rc_buffer_size;
2114 codec->extradata= av_mallocz(extra_size);
2115 if (!codec->extradata)
2117 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2118 codec->extradata_size= icodec->extradata_size;
2119 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){
2120 codec->time_base = icodec->time_base;
2121 codec->time_base.num *= icodec->ticks_per_frame;
2122 av_reduce(&codec->time_base.num, &codec->time_base.den,
2123 codec->time_base.num, codec->time_base.den, INT_MAX);
2125 codec->time_base = ist->st->time_base;
2126 switch(codec->codec_type) {
2127 case AVMEDIA_TYPE_AUDIO:
2128 if(audio_volume != 256) {
2129 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2132 codec->channel_layout = icodec->channel_layout;
2133 codec->sample_rate = icodec->sample_rate;
2134 codec->channels = icodec->channels;
2135 codec->frame_size = icodec->frame_size;
2136 codec->audio_service_type = icodec->audio_service_type;
2137 codec->block_align= icodec->block_align;
2138 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2139 codec->block_align= 0;
2140 if(codec->codec_id == CODEC_ID_AC3)
2141 codec->block_align= 0;
2143 case AVMEDIA_TYPE_VIDEO:
2144 codec->pix_fmt = icodec->pix_fmt;
2145 codec->width = icodec->width;
2146 codec->height = icodec->height;
2147 codec->has_b_frames = icodec->has_b_frames;
2148 if (!codec->sample_aspect_ratio.num) {
2149 codec->sample_aspect_ratio =
2150 ost->st->sample_aspect_ratio =
2151 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2152 ist->st->codec->sample_aspect_ratio.num ?
2153 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2156 case AVMEDIA_TYPE_SUBTITLE:
2157 codec->width = icodec->width;
2158 codec->height = icodec->height;
2160 case AVMEDIA_TYPE_DATA:
2166 switch(codec->codec_type) {
2167 case AVMEDIA_TYPE_AUDIO:
2168 ost->fifo= av_fifo_alloc(1024);
2171 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2172 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2173 icodec->request_channels = codec->channels;
2174 ist->decoding_needed = 1;
2175 ost->encoding_needed = 1;
2176 ost->resample_sample_fmt = icodec->sample_fmt;
2177 ost->resample_sample_rate = icodec->sample_rate;
2178 ost->resample_channels = icodec->channels;
2180 case AVMEDIA_TYPE_VIDEO:
2181 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2182 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2185 ost->video_resample = codec->width != icodec->width ||
2186 codec->height != icodec->height ||
2187 codec->pix_fmt != icodec->pix_fmt;
2188 if (ost->video_resample) {
2189 #if !CONFIG_AVFILTER
2190 avcodec_get_frame_defaults(&ost->pict_tmp);
2191 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2192 codec->width, codec->height)) {
2193 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2196 ost->img_resample_ctx = sws_getContext(
2203 ost->sws_flags, NULL, NULL, NULL);
2204 if (ost->img_resample_ctx == NULL) {
2205 fprintf(stderr, "Cannot get resampling context\n");
2209 codec->bits_per_raw_sample= 0;
2211 ost->resample_height = icodec->height;
2212 ost->resample_width = icodec->width;
2213 ost->resample_pix_fmt= icodec->pix_fmt;
2214 ost->encoding_needed = 1;
2215 ist->decoding_needed = 1;
2218 if (configure_video_filters(ist, ost)) {
2219 fprintf(stderr, "Error opening filters!\n");
2224 case AVMEDIA_TYPE_SUBTITLE:
2225 ost->encoding_needed = 1;
2226 ist->decoding_needed = 1;
2233 if (ost->encoding_needed &&
2234 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2235 char logfilename[1024];
2238 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2239 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2241 if (codec->flags & CODEC_FLAG_PASS1) {
2242 f = fopen(logfilename, "wb");
2244 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2250 size_t logbuffer_size;
2251 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2252 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2255 codec->stats_in = logbuffer;
2259 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2260 int size= codec->width * codec->height;
2261 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2266 bit_buffer = av_malloc(bit_buffer_size);
2268 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2270 ret = AVERROR(ENOMEM);
2274 /* open each encoder */
2275 for(i=0;i<nb_ostreams;i++) {
2277 if (ost->encoding_needed) {
2278 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2279 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2281 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2283 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2284 ost->st->codec->codec_id, ost->file_index, ost->index);
2285 ret = AVERROR(EINVAL);
2288 if (dec->subtitle_header) {
2289 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2290 if (!ost->st->codec->subtitle_header) {
2291 ret = AVERROR(ENOMEM);
2294 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2295 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2297 if (avcodec_open(ost->st->codec, codec) < 0) {
2298 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2299 ost->file_index, ost->index);
2300 ret = AVERROR(EINVAL);
2303 extra_size += ost->st->codec->extradata_size;
2307 /* open each decoder */
2308 for (i = 0; i < nb_input_streams; i++) {
2309 ist = &input_streams[i];
2310 if (ist->decoding_needed) {
2311 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2313 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2315 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2316 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2317 ret = AVERROR(EINVAL);
2321 /* update requested sample format for the decoder based on the
2322 corresponding encoder sample format */
2323 for (j = 0; j < nb_ostreams; j++) {
2325 if (ost->source_index == i) {
2326 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2331 if (avcodec_open(ist->st->codec, codec) < 0) {
2332 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2333 ist->file_index, ist->st->index);
2334 ret = AVERROR(EINVAL);
2337 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2338 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2343 for (i = 0; i < nb_input_streams; i++) {
2345 ist = &input_streams[i];
2347 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2348 ist->next_pts = AV_NOPTS_VALUE;
2349 init_pts_correction(&ist->pts_ctx);
2353 /* set meta data information from input file if required */
2354 for (i=0;i<nb_meta_data_maps;i++) {
2355 AVFormatContext *files[2];
2356 AVMetadata **meta[2];
2359 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2360 if ((index) < 0 || (index) >= (nb_elems)) {\
2361 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2363 ret = AVERROR(EINVAL);\
2367 int out_file_index = meta_data_maps[i][0].file;
2368 int in_file_index = meta_data_maps[i][1].file;
2369 if (in_file_index < 0 || out_file_index < 0)
2371 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2372 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2374 files[0] = output_files[out_file_index];
2375 files[1] = input_files[in_file_index].ctx;
2377 for (j = 0; j < 2; j++) {
2378 AVMetaDataMap *map = &meta_data_maps[i][j];
2380 switch (map->type) {
2382 meta[j] = &files[j]->metadata;
2385 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2386 meta[j] = &files[j]->streams[map->index]->metadata;
2389 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2390 meta[j] = &files[j]->chapters[map->index]->metadata;
2393 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2394 meta[j] = &files[j]->programs[map->index]->metadata;
2399 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2402 /* copy global metadata by default */
2403 if (metadata_global_autocopy) {
2405 for (i = 0; i < nb_output_files; i++)
2406 av_metadata_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2407 AV_METADATA_DONT_OVERWRITE);
2410 /* copy chapters according to chapter maps */
2411 for (i = 0; i < nb_chapter_maps; i++) {
2412 int infile = chapter_maps[i].in_file;
2413 int outfile = chapter_maps[i].out_file;
2415 if (infile < 0 || outfile < 0)
2417 if (infile >= nb_input_files) {
2418 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2419 ret = AVERROR(EINVAL);
2422 if (outfile >= nb_output_files) {
2423 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2424 ret = AVERROR(EINVAL);
2427 copy_chapters(infile, outfile);
2430 /* copy chapters from the first input file that has them*/
2431 if (!nb_chapter_maps)
2432 for (i = 0; i < nb_input_files; i++) {
2433 if (!input_files[i].ctx->nb_chapters)
2436 for (j = 0; j < nb_output_files; j++)
2437 if ((ret = copy_chapters(i, j)) < 0)
2442 /* open files and write file headers */
2443 for(i=0;i<nb_output_files;i++) {
2444 os = output_files[i];
2445 if (av_write_header(os) < 0) {
2446 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2447 ret = AVERROR(EINVAL);
2450 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2456 /* dump the file output parameters - cannot be done before in case
2458 for(i=0;i<nb_output_files;i++) {
2459 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2462 /* dump the stream mapping */
2464 fprintf(stderr, "Stream mapping:\n");
2465 for(i=0;i<nb_ostreams;i++) {
2467 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2468 input_streams[ost->source_index].file_index,
2469 input_streams[ost->source_index].st->index,
2472 if (ost->sync_ist != &input_streams[ost->source_index])
2473 fprintf(stderr, " [sync #%d.%d]",
2474 ost->sync_ist->file_index,
2475 ost->sync_ist->st->index);
2476 fprintf(stderr, "\n");
2481 fprintf(stderr, "%s\n", error);
2486 print_sdp(output_files, nb_output_files);
2490 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2493 timer_start = av_gettime();
2495 for(; received_sigterm == 0;) {
2496 int file_index, ist_index;
2505 /* select the stream that we must read now by looking at the
2506 smallest output pts */
2508 for(i=0;i<nb_ostreams;i++) {
2511 os = output_files[ost->file_index];
2512 ist = &input_streams[ost->source_index];
2513 if(ist->is_past_recording_time || no_packet[ist->file_index])
2515 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2516 ipts = (double)ist->pts;
2517 if (!input_files[ist->file_index].eof_reached){
2518 if(ipts < ipts_min) {
2520 if(input_sync ) file_index = ist->file_index;
2522 if(opts < opts_min) {
2524 if(!input_sync) file_index = ist->file_index;
2527 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2532 /* if none, if is finished */
2533 if (file_index < 0) {
2534 if(no_packet_count){
2536 memset(no_packet, 0, sizeof(no_packet));
2543 /* finish if limit size exhausted */
2544 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2547 /* read a frame from it and output it in the fifo */
2548 is = input_files[file_index].ctx;
2549 ret= av_read_frame(is, &pkt);
2550 if(ret == AVERROR(EAGAIN)){
2551 no_packet[file_index]=1;
2556 input_files[file_index].eof_reached = 1;
2564 memset(no_packet, 0, sizeof(no_packet));
2567 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2568 is->streams[pkt.stream_index]);
2570 /* the following test is needed in case new streams appear
2571 dynamically in stream : we ignore them */
2572 if (pkt.stream_index >= input_files[file_index].nb_streams)
2573 goto discard_packet;
2574 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2575 ist = &input_streams[ist_index];
2577 goto discard_packet;
2579 if (pkt.dts != AV_NOPTS_VALUE)
2580 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2581 if (pkt.pts != AV_NOPTS_VALUE)
2582 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2584 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2585 && input_files_ts_scale[file_index][pkt.stream_index]){
2586 if(pkt.pts != AV_NOPTS_VALUE)
2587 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2588 if(pkt.dts != AV_NOPTS_VALUE)
2589 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2592 // 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);
2593 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2594 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2595 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2596 int64_t delta= pkt_dts - ist->next_pts;
2597 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2598 input_files_ts_offset[ist->file_index]-= delta;
2600 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2601 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2602 if(pkt.pts != AV_NOPTS_VALUE)
2603 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2607 /* finish if recording time exhausted */
2608 if (recording_time != INT64_MAX &&
2609 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2610 ist->is_past_recording_time = 1;
2611 goto discard_packet;
2614 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2615 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2618 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2619 ist->file_index, ist->st->index);
2622 av_free_packet(&pkt);
2627 av_free_packet(&pkt);
2629 /* dump report by using the output first video and audio streams */
2630 print_report(output_files, ost_table, nb_ostreams, 0);
2633 /* at the end of stream, we must flush the decoder buffers */
2634 for (i = 0; i < nb_input_streams; i++) {
2635 ist = &input_streams[i];
2636 if (ist->decoding_needed) {
2637 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2643 /* write the trailer if needed and close file */
2644 for(i=0;i<nb_output_files;i++) {
2645 os = output_files[i];
2646 av_write_trailer(os);
2649 /* dump report by using the first video and audio streams */
2650 print_report(output_files, ost_table, nb_ostreams, 1);
2652 /* close each encoder */
2653 for(i=0;i<nb_ostreams;i++) {
2655 if (ost->encoding_needed) {
2656 av_freep(&ost->st->codec->stats_in);
2657 avcodec_close(ost->st->codec);
2660 avfilter_graph_free(&ost->graph);
2664 /* close each decoder */
2665 for (i = 0; i < nb_input_streams; i++) {
2666 ist = &input_streams[i];
2667 if (ist->decoding_needed) {
2668 avcodec_close(ist->st->codec);
2676 av_freep(&bit_buffer);
2679 for(i=0;i<nb_ostreams;i++) {
2682 if (ost->st->stream_copy)
2683 av_freep(&ost->st->codec->extradata);
2685 fclose(ost->logfile);
2686 ost->logfile = NULL;
2688 av_fifo_free(ost->fifo); /* works even if fifo is not
2689 initialized but set to zero */
2690 av_freep(&ost->st->codec->subtitle_header);
2691 av_free(ost->pict_tmp.data[0]);
2692 av_free(ost->forced_kf_pts);
2693 if (ost->video_resample)
2694 sws_freeContext(ost->img_resample_ctx);
2696 audio_resample_close(ost->resample);
2697 if (ost->reformat_ctx)
2698 av_audio_convert_free(ost->reformat_ctx);
2707 static void opt_format(const char *arg)
2709 last_asked_format = arg;
2712 static void opt_video_rc_override_string(const char *arg)
2714 video_rc_override_string = arg;
2717 static int opt_me_threshold(const char *opt, const char *arg)
2719 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2723 static int opt_verbose(const char *opt, const char *arg)
2725 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2729 static int opt_frame_rate(const char *opt, const char *arg)
2731 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2732 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2738 static int opt_bitrate(const char *opt, const char *arg)
2740 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2742 opt_default(opt, arg);
2744 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2745 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2750 static int opt_frame_crop(const char *opt, const char *arg)
2752 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2753 return AVERROR(EINVAL);
2756 static void opt_frame_size(const char *arg)
2758 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2759 fprintf(stderr, "Incorrect frame size\n");
2764 static int opt_pad(const char *opt, const char *arg) {
2765 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2769 static void opt_frame_pix_fmt(const char *arg)
2771 if (strcmp(arg, "list")) {
2772 frame_pix_fmt = av_get_pix_fmt(arg);
2773 if (frame_pix_fmt == PIX_FMT_NONE) {
2774 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2783 static void opt_frame_aspect_ratio(const char *arg)
2790 p = strchr(arg, ':');
2792 x = strtol(arg, &end, 10);
2794 y = strtol(end+1, &end, 10);
2796 ar = (double)x / (double)y;
2798 ar = strtod(arg, NULL);
2801 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2804 frame_aspect_ratio = ar;
2807 static int opt_metadata(const char *opt, const char *arg)
2809 char *mid= strchr(arg, '=');
2812 fprintf(stderr, "Missing =\n");
2817 av_metadata_set2(&metadata, arg, mid, 0);
2822 static int opt_qscale(const char *opt, const char *arg)
2824 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2825 if (video_qscale == 0) {
2826 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2827 return AVERROR(EINVAL);
2832 static int opt_top_field_first(const char *opt, const char *arg)
2834 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2838 static int opt_thread_count(const char *opt, const char *arg)
2840 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2843 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2848 static void opt_audio_sample_fmt(const char *arg)
2850 if (strcmp(arg, "list")) {
2851 audio_sample_fmt = av_get_sample_fmt(arg);
2852 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2853 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2859 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2860 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2865 static int opt_audio_rate(const char *opt, const char *arg)
2867 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2871 static int opt_audio_channels(const char *opt, const char *arg)
2873 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2877 static int opt_video_channel(const char *opt, const char *arg)
2879 video_channel = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2883 static void opt_video_standard(const char *arg)
2885 video_standard = av_strdup(arg);
2888 static void opt_codec(int *pstream_copy, char **pcodec_name,
2889 int codec_type, const char *arg)
2891 av_freep(pcodec_name);
2892 if (!strcmp(arg, "copy")) {
2895 *pcodec_name = av_strdup(arg);
2899 static void opt_audio_codec(const char *arg)
2901 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2904 static void opt_video_codec(const char *arg)
2906 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2909 static void opt_subtitle_codec(const char *arg)
2911 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2914 static void opt_data_codec(const char *arg)
2916 opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2919 static int opt_codec_tag(const char *opt, const char *arg)
2922 uint32_t *codec_tag;
2924 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2925 !strcmp(opt, "vtag") ? &video_codec_tag :
2926 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2930 *codec_tag = strtol(arg, &tail, 0);
2932 *codec_tag = AV_RL32(arg);
2937 static void opt_map(const char *arg)
2942 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2943 m = &stream_maps[nb_stream_maps-1];
2945 m->file_index = strtol(arg, &p, 0);
2949 m->stream_index = strtol(p, &p, 0);
2952 m->sync_file_index = strtol(p, &p, 0);
2955 m->sync_stream_index = strtol(p, &p, 0);
2957 m->sync_file_index = m->file_index;
2958 m->sync_stream_index = m->stream_index;
2962 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
2973 *index = strtol(++arg, endptr, 0);
2976 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2983 static void opt_map_metadata(const char *arg)
2985 AVMetaDataMap *m, *m1;
2988 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2989 &nb_meta_data_maps, nb_meta_data_maps + 1);
2991 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2992 m->file = strtol(arg, &p, 0);
2993 parse_meta_type(p, &m->type, &m->index, &p);
2997 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2998 m1->file = strtol(p, &p, 0);
2999 parse_meta_type(p, &m1->type, &m1->index, &p);
3001 if (m->type == 'g' || m1->type == 'g')
3002 metadata_global_autocopy = 0;
3003 if (m->type == 's' || m1->type == 's')
3004 metadata_streams_autocopy = 0;
3005 if (m->type == 'c' || m1->type == 'c')
3006 metadata_chapters_autocopy = 0;
3009 static void opt_map_meta_data(const char *arg)
3011 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3012 "Use -map_metadata instead.\n");
3013 opt_map_metadata(arg);
3016 static void opt_map_chapters(const char *arg)
3021 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3022 nb_chapter_maps + 1);
3023 c = &chapter_maps[nb_chapter_maps - 1];
3024 c->out_file = strtol(arg, &p, 0);
3028 c->in_file = strtol(p, &p, 0);
3031 static void opt_input_ts_scale(const char *arg)
3033 unsigned int stream;
3037 stream = strtol(arg, &p, 0);
3040 scale= strtod(p, &p);
3042 if(stream >= MAX_STREAMS)
3045 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);
3046 input_files_ts_scale[nb_input_files][stream]= scale;
3049 static int opt_recording_time(const char *opt, const char *arg)
3051 recording_time = parse_time_or_die(opt, arg, 1);
3055 static int opt_start_time(const char *opt, const char *arg)
3057 start_time = parse_time_or_die(opt, arg, 1);
3061 static int opt_recording_timestamp(const char *opt, const char *arg)
3063 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3067 static int opt_input_ts_offset(const char *opt, const char *arg)
3069 input_ts_offset = parse_time_or_die(opt, arg, 1);
3073 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3075 const char *codec_string = encoder ? "encoder" : "decoder";
3079 return CODEC_ID_NONE;
3081 avcodec_find_encoder_by_name(name) :
3082 avcodec_find_decoder_by_name(name);
3084 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3087 if(codec->type != type) {
3088 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3091 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3092 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3093 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3094 "results.\nAdd '-strict experimental' if you want to use it.\n",
3095 codec_string, codec->name);
3097 avcodec_find_encoder(codec->id) :
3098 avcodec_find_decoder(codec->id);
3099 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3100 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3101 codec_string, codec->name);
3107 static void opt_input_file(const char *filename)
3109 AVFormatContext *ic;
3110 AVFormatParameters params, *ap = ¶ms;
3111 AVInputFormat *file_iformat = NULL;
3112 int err, i, ret, rfps, rfps_base;
3115 if (last_asked_format) {
3116 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3117 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3120 last_asked_format = NULL;
3123 if (!strcmp(filename, "-"))
3126 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3127 !strcmp(filename, "/dev/stdin");
3129 /* get default parameters from command line */
3130 ic = avformat_alloc_context();
3132 print_error(filename, AVERROR(ENOMEM));
3136 memset(ap, 0, sizeof(*ap));
3137 ap->prealloced_context = 1;
3138 ap->sample_rate = audio_sample_rate;
3139 ap->channels = audio_channels;
3140 ap->time_base.den = frame_rate.num;
3141 ap->time_base.num = frame_rate.den;
3142 ap->width = frame_width;
3143 ap->height = frame_height;
3144 ap->pix_fmt = frame_pix_fmt;
3145 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3146 ap->channel = video_channel;
3147 ap->standard = video_standard;
3149 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3151 ic->video_codec_id =
3152 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3153 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3154 ic->audio_codec_id =
3155 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3156 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3157 ic->subtitle_codec_id=
3158 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3159 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3160 ic->flags |= AVFMT_FLAG_NONBLOCK;
3162 /* open the input file with generic libav function */
3163 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3165 print_error(filename, err);
3171 for(i=0; i<ic->nb_streams; i++){
3172 ic->streams[i]->discard= AVDISCARD_ALL;
3174 for(i=0; i<ic->nb_programs; i++){
3175 AVProgram *p= ic->programs[i];
3176 if(p->id != opt_programid){
3177 p->discard = AVDISCARD_ALL;
3180 for(j=0; j<p->nb_stream_indexes; j++){
3181 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3186 fprintf(stderr, "Specified program id not found\n");
3192 ic->loop_input = loop_input;
3194 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3195 for (i = 0; i < ic->nb_streams; i++) {
3196 AVCodecContext *dec = ic->streams[i]->codec;
3197 switch (dec->codec_type) {
3198 case AVMEDIA_TYPE_AUDIO:
3199 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3200 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3203 case AVMEDIA_TYPE_VIDEO:
3204 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3205 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3211 /* If not enough info to get the stream parameters, we decode the
3212 first frames to get it. (used in mpeg case for example) */
3213 ret = av_find_stream_info(ic);
3214 if (ret < 0 && verbose >= 0) {
3215 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3216 av_close_input_file(ic);
3220 timestamp = start_time;
3221 /* add the stream start time */
3222 if (ic->start_time != AV_NOPTS_VALUE)
3223 timestamp += ic->start_time;
3225 /* if seeking requested, we execute it */
3226 if (start_time != 0) {
3227 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3229 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3230 filename, (double)timestamp / AV_TIME_BASE);
3232 /* reset seek info */
3236 /* update the current parameters so that they match the one of the input stream */
3237 for(i=0;i<ic->nb_streams;i++) {
3238 AVStream *st = ic->streams[i];
3239 AVCodecContext *dec = st->codec;
3242 dec->thread_count = thread_count;
3243 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3245 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3246 ist = &input_streams[nb_input_streams - 1];
3248 ist->file_index = nb_input_files;
3251 switch (dec->codec_type) {
3252 case AVMEDIA_TYPE_AUDIO:
3253 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3254 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]);
3255 channel_layout = dec->channel_layout;
3256 audio_channels = dec->channels;
3257 audio_sample_rate = dec->sample_rate;
3258 audio_sample_fmt = dec->sample_fmt;
3260 st->discard= AVDISCARD_ALL;
3261 /* Note that av_find_stream_info can add more streams, and we
3262 * currently have no chance of setting up lowres decoding
3263 * early enough for them. */
3265 audio_sample_rate >>= dec->lowres;
3267 case AVMEDIA_TYPE_VIDEO:
3268 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3269 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]);
3270 frame_height = dec->height;
3271 frame_width = dec->width;
3272 frame_pix_fmt = dec->pix_fmt;
3273 rfps = ic->streams[i]->r_frame_rate.num;
3274 rfps_base = ic->streams[i]->r_frame_rate.den;
3276 dec->flags |= CODEC_FLAG_EMU_EDGE;
3277 frame_height >>= dec->lowres;
3278 frame_width >>= dec->lowres;
3279 dec->height = frame_height;
3280 dec->width = frame_width;
3283 dec->debug |= FF_DEBUG_MV;
3285 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3288 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3289 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3291 (float)rfps / rfps_base, rfps, rfps_base);
3293 /* update the current frame rate to match the stream frame rate */
3294 frame_rate.num = rfps;
3295 frame_rate.den = rfps_base;
3298 st->discard= AVDISCARD_ALL;
3299 else if(video_discard)
3300 st->discard= video_discard;
3302 case AVMEDIA_TYPE_DATA:
3304 case AVMEDIA_TYPE_SUBTITLE:
3305 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3306 if(subtitle_disable)
3307 st->discard = AVDISCARD_ALL;
3309 case AVMEDIA_TYPE_ATTACHMENT:
3310 case AVMEDIA_TYPE_UNKNOWN:
3317 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3318 /* dump the file content */
3320 av_dump_format(ic, nb_input_files, filename, 0);
3322 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3323 input_files[nb_input_files - 1].ctx = ic;
3324 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3325 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3329 av_freep(&video_codec_name);
3330 av_freep(&audio_codec_name);
3331 av_freep(&subtitle_codec_name);
3336 static void check_inputs(int *has_video_ptr,
3338 int *has_subtitle_ptr,
3341 int has_video, has_audio, has_subtitle, has_data, i, j;
3342 AVFormatContext *ic;
3349 for(j=0;j<nb_input_files;j++) {
3350 ic = input_files[j].ctx;
3351 for(i=0;i<ic->nb_streams;i++) {
3352 AVCodecContext *enc = ic->streams[i]->codec;
3353 switch(enc->codec_type) {
3354 case AVMEDIA_TYPE_AUDIO:
3357 case AVMEDIA_TYPE_VIDEO:
3360 case AVMEDIA_TYPE_SUBTITLE:
3363 case AVMEDIA_TYPE_DATA:
3364 case AVMEDIA_TYPE_ATTACHMENT:
3365 case AVMEDIA_TYPE_UNKNOWN:
3373 *has_video_ptr = has_video;
3374 *has_audio_ptr = has_audio;
3375 *has_subtitle_ptr = has_subtitle;
3376 *has_data_ptr = has_data;
3379 static void new_video_stream(AVFormatContext *oc, int file_idx)
3382 AVOutputStream *ost;
3383 AVCodecContext *video_enc;
3384 enum CodecID codec_id = CODEC_ID_NONE;
3385 AVCodec *codec= NULL;
3387 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3389 fprintf(stderr, "Could not alloc stream\n");
3392 ost = new_output_stream(oc, file_idx);
3394 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3395 if(!video_stream_copy){
3396 if (video_codec_name) {
3397 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3398 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3399 codec = avcodec_find_encoder_by_name(video_codec_name);
3400 output_codecs[nb_output_codecs-1] = codec;
3402 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3403 codec = avcodec_find_encoder(codec_id);
3406 ost->frame_aspect_ratio = frame_aspect_ratio;
3407 frame_aspect_ratio = 0;
3409 ost->avfilter= vfilters;
3414 avcodec_get_context_defaults3(st->codec, codec);
3415 ost->bitstream_filters = video_bitstream_filters;
3416 video_bitstream_filters= NULL;
3418 st->codec->thread_count= thread_count;
3420 video_enc = st->codec;
3423 video_enc->codec_tag= video_codec_tag;
3425 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3426 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3427 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3430 if (video_stream_copy) {
3431 st->stream_copy = 1;
3432 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3433 video_enc->sample_aspect_ratio =
3434 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3438 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3440 video_enc->codec_id = codec_id;
3441 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3443 if (codec && codec->supported_framerates && !force_fps)
3444 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3445 video_enc->time_base.den = fps.num;
3446 video_enc->time_base.num = fps.den;
3448 video_enc->width = frame_width;
3449 video_enc->height = frame_height;
3450 video_enc->pix_fmt = frame_pix_fmt;
3451 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3453 choose_pixel_fmt(st, codec);
3456 video_enc->gop_size = 0;
3457 if (video_qscale || same_quality) {
3458 video_enc->flags |= CODEC_FLAG_QSCALE;
3459 video_enc->global_quality=
3460 st->quality = FF_QP2LAMBDA * video_qscale;
3464 video_enc->intra_matrix = intra_matrix;
3466 video_enc->inter_matrix = inter_matrix;
3468 p= video_rc_override_string;
3471 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3473 fprintf(stderr, "error parsing rc_override\n");
3476 video_enc->rc_override=
3477 av_realloc(video_enc->rc_override,
3478 sizeof(RcOverride)*(i+1));
3479 video_enc->rc_override[i].start_frame= start;
3480 video_enc->rc_override[i].end_frame = end;
3482 video_enc->rc_override[i].qscale= q;
3483 video_enc->rc_override[i].quality_factor= 1.0;
3486 video_enc->rc_override[i].qscale= 0;
3487 video_enc->rc_override[i].quality_factor= -q/100.0;
3492 video_enc->rc_override_count=i;
3493 if (!video_enc->rc_initial_buffer_occupancy)
3494 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3495 video_enc->me_threshold= me_threshold;
3496 video_enc->intra_dc_precision= intra_dc_precision - 8;
3499 video_enc->flags|= CODEC_FLAG_PSNR;
3504 video_enc->flags |= CODEC_FLAG_PASS1;
3506 video_enc->flags |= CODEC_FLAG_PASS2;
3510 if (forced_key_frames)
3511 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3513 if (video_language) {
3514 av_metadata_set2(&st->metadata, "language", video_language, 0);
3515 av_freep(&video_language);
3518 /* reset some key parameters */
3520 av_freep(&video_codec_name);
3521 av_freep(&forced_key_frames);
3522 video_stream_copy = 0;
3523 frame_pix_fmt = PIX_FMT_NONE;
3526 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3529 AVOutputStream *ost;
3530 AVCodec *codec= NULL;
3531 AVCodecContext *audio_enc;
3532 enum CodecID codec_id = CODEC_ID_NONE;
3534 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3536 fprintf(stderr, "Could not alloc stream\n");
3539 ost = new_output_stream(oc, file_idx);
3541 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3542 if(!audio_stream_copy){
3543 if (audio_codec_name) {
3544 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3545 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3546 codec = avcodec_find_encoder_by_name(audio_codec_name);
3547 output_codecs[nb_output_codecs-1] = codec;
3549 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3550 codec = avcodec_find_encoder(codec_id);
3554 avcodec_get_context_defaults3(st->codec, codec);
3556 ost->bitstream_filters = audio_bitstream_filters;
3557 audio_bitstream_filters= NULL;
3559 st->codec->thread_count= thread_count;
3561 audio_enc = st->codec;
3562 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3565 audio_enc->codec_tag= audio_codec_tag;
3567 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3568 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3569 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3571 if (audio_stream_copy) {
3572 st->stream_copy = 1;
3573 audio_enc->channels = audio_channels;
3574 audio_enc->sample_rate = audio_sample_rate;
3576 audio_enc->codec_id = codec_id;
3577 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3579 if (audio_qscale > QSCALE_NONE) {
3580 audio_enc->flags |= CODEC_FLAG_QSCALE;
3581 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3583 audio_enc->channels = audio_channels;
3584 audio_enc->sample_fmt = audio_sample_fmt;
3585 audio_enc->sample_rate = audio_sample_rate;
3586 audio_enc->channel_layout = channel_layout;
3587 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3588 audio_enc->channel_layout = 0;
3589 choose_sample_fmt(st, codec);
3590 choose_sample_rate(st, codec);
3592 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3593 if (audio_language) {
3594 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3595 av_freep(&audio_language);
3598 /* reset some key parameters */
3600 av_freep(&audio_codec_name);
3601 audio_stream_copy = 0;
3604 static void new_data_stream(AVFormatContext *oc, int file_idx)
3607 AVOutputStream *ost;
3608 AVCodec *codec=NULL;
3609 AVCodecContext *data_enc;
3611 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3613 fprintf(stderr, "Could not alloc stream\n");
3616 ost = new_output_stream(oc, file_idx);
3617 data_enc = st->codec;
3618 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3619 if (!data_stream_copy) {
3620 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3623 avcodec_get_context_defaults3(st->codec, codec);
3625 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3628 data_enc->codec_tag= data_codec_tag;
3630 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3631 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3632 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3634 if (data_stream_copy) {
3635 st->stream_copy = 1;
3639 av_freep(&data_codec_name);
3640 data_stream_copy = 0;
3643 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3646 AVOutputStream *ost;
3647 AVCodec *codec=NULL;
3648 AVCodecContext *subtitle_enc;
3649 enum CodecID codec_id = CODEC_ID_NONE;
3651 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3653 fprintf(stderr, "Could not alloc stream\n");
3656 ost = new_output_stream(oc, file_idx);
3657 subtitle_enc = st->codec;
3658 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3659 if(!subtitle_stream_copy){
3660 if (subtitle_codec_name) {
3661 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3662 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3663 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3665 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3666 codec = avcodec_find_encoder(codec_id);
3669 avcodec_get_context_defaults3(st->codec, codec);
3671 ost->bitstream_filters = subtitle_bitstream_filters;
3672 subtitle_bitstream_filters= NULL;
3674 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3676 if(subtitle_codec_tag)
3677 subtitle_enc->codec_tag= subtitle_codec_tag;
3679 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3680 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3681 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3683 if (subtitle_stream_copy) {
3684 st->stream_copy = 1;
3686 subtitle_enc->codec_id = codec_id;
3687 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3690 if (subtitle_language) {
3691 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3692 av_freep(&subtitle_language);
3695 subtitle_disable = 0;
3696 av_freep(&subtitle_codec_name);
3697 subtitle_stream_copy = 0;
3700 static int opt_new_stream(const char *opt, const char *arg)
3702 AVFormatContext *oc;
3703 int file_idx = nb_output_files - 1;
3704 if (nb_output_files <= 0) {
3705 fprintf(stderr, "At least one output file must be specified\n");
3708 oc = output_files[file_idx];
3710 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3711 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3712 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3713 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3718 /* arg format is "output-stream-index:streamid-value". */
3719 static int opt_streamid(const char *opt, const char *arg)
3725 av_strlcpy(idx_str, arg, sizeof(idx_str));
3726 p = strchr(idx_str, ':');
3729 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3734 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3735 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3736 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3740 static void opt_output_file(const char *filename)
3742 AVFormatContext *oc;
3743 int err, use_video, use_audio, use_subtitle, use_data;
3744 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3745 AVFormatParameters params, *ap = ¶ms;
3746 AVOutputFormat *file_oformat;
3748 if (!strcmp(filename, "-"))
3751 oc = avformat_alloc_context();
3753 print_error(filename, AVERROR(ENOMEM));
3757 if (last_asked_format) {
3758 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3759 if (!file_oformat) {
3760 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3763 last_asked_format = NULL;
3765 file_oformat = av_guess_format(NULL, filename, NULL);
3766 if (!file_oformat) {
3767 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3773 oc->oformat = file_oformat;
3774 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3776 if (!strcmp(file_oformat->name, "ffm") &&
3777 av_strstart(filename, "http:", NULL)) {
3778 /* special case for files sent to ffserver: we get the stream
3779 parameters from ffserver */
3780 int err = read_ffserver_streams(oc, filename);
3782 print_error(filename, err);
3786 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3787 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3788 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3789 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 */
3791 /* disable if no corresponding type found and at least one
3793 if (nb_input_files > 0) {
3794 check_inputs(&input_has_video,
3796 &input_has_subtitle,
3799 if (!input_has_video)
3801 if (!input_has_audio)
3803 if (!input_has_subtitle)
3805 if (!input_has_data)
3809 /* manual disable */
3810 if (audio_disable) use_audio = 0;
3811 if (video_disable) use_video = 0;
3812 if (subtitle_disable) use_subtitle = 0;
3813 if (data_disable) use_data = 0;
3815 if (use_video) new_video_stream(oc, nb_output_files);
3816 if (use_audio) new_audio_stream(oc, nb_output_files);
3817 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3818 if (use_data) new_data_stream(oc, nb_output_files);
3820 oc->timestamp = recording_timestamp;
3822 av_metadata_copy(&oc->metadata, metadata, 0);
3823 av_metadata_free(&metadata);
3826 output_files[nb_output_files++] = oc;
3828 /* check filename in case of an image number is expected */
3829 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3830 if (!av_filename_number_test(oc->filename)) {
3831 print_error(oc->filename, AVERROR(EINVAL));
3836 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3837 /* test if it already exists to avoid loosing precious files */
3838 if (!file_overwrite &&
3839 (strchr(filename, ':') == NULL ||
3840 filename[1] == ':' ||
3841 av_strstart(filename, "file:", NULL))) {
3842 if (avio_check(filename, 0) == 0) {
3844 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3846 if (!read_yesno()) {
3847 fprintf(stderr, "Not overwriting - exiting\n");
3852 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3859 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3860 print_error(filename, err);
3865 memset(ap, 0, sizeof(*ap));
3866 if (av_set_parameters(oc, ap) < 0) {
3867 fprintf(stderr, "%s: Invalid encoding parameters\n",
3872 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3873 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3874 oc->loop_output = loop_output;
3875 oc->flags |= AVFMT_FLAG_NONBLOCK;
3877 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3879 av_freep(&forced_key_frames);
3884 /* same option as mencoder */
3885 static int opt_pass(const char *opt, const char *arg)
3887 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3891 static int64_t getutime(void)
3894 struct rusage rusage;
3896 getrusage(RUSAGE_SELF, &rusage);
3897 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3898 #elif HAVE_GETPROCESSTIMES
3900 FILETIME c, e, k, u;
3901 proc = GetCurrentProcess();
3902 GetProcessTimes(proc, &c, &e, &k, &u);
3903 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3905 return av_gettime();
3909 static int64_t getmaxrss(void)
3911 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3912 struct rusage rusage;
3913 getrusage(RUSAGE_SELF, &rusage);
3914 return (int64_t)rusage.ru_maxrss * 1024;
3915 #elif HAVE_GETPROCESSMEMORYINFO
3917 PROCESS_MEMORY_COUNTERS memcounters;
3918 proc = GetCurrentProcess();
3919 memcounters.cb = sizeof(memcounters);
3920 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3921 return memcounters.PeakPagefileUsage;
3927 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3930 const char *p = str;
3937 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3944 static void opt_inter_matrix(const char *arg)
3946 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3947 parse_matrix_coeffs(inter_matrix, arg);
3950 static void opt_intra_matrix(const char *arg)
3952 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3953 parse_matrix_coeffs(intra_matrix, arg);
3956 static void show_usage(void)
3958 printf("Hyper fast Audio and Video encoder\n");
3959 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3963 static void show_help(void)
3966 AVOutputFormat *oformat = NULL;
3968 av_log_set_callback(log_callback_help);
3970 show_help_options(options, "Main options:\n",
3971 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3972 show_help_options(options, "\nAdvanced options:\n",
3973 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3975 show_help_options(options, "\nVideo options:\n",
3976 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3978 show_help_options(options, "\nAdvanced Video options:\n",
3979 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3980 OPT_VIDEO | OPT_EXPERT);
3981 show_help_options(options, "\nAudio options:\n",
3982 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3984 show_help_options(options, "\nAdvanced Audio options:\n",
3985 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3986 OPT_AUDIO | OPT_EXPERT);
3987 show_help_options(options, "\nSubtitle options:\n",
3988 OPT_SUBTITLE | OPT_GRAB,
3990 show_help_options(options, "\nAudio/Video grab options:\n",
3994 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3997 /* individual codec options */
3999 while ((c = av_codec_next(c))) {
4000 if (c->priv_class) {
4001 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4006 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4009 /* individual muxer options */
4010 while ((oformat = av_oformat_next(oformat))) {
4011 if (oformat->priv_class) {
4012 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4017 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4020 static void opt_target(const char *arg)
4022 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4023 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4025 if(!strncmp(arg, "pal-", 4)) {
4028 } else if(!strncmp(arg, "ntsc-", 5)) {
4031 } else if(!strncmp(arg, "film-", 5)) {
4036 /* Calculate FR via float to avoid int overflow */
4037 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4040 } else if((fr == 29970) || (fr == 23976)) {
4043 /* Try to determine PAL/NTSC by peeking in the input files */
4044 if(nb_input_files) {
4046 for (j = 0; j < nb_input_files; j++) {
4047 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4048 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4049 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4051 fr = c->time_base.den * 1000 / c->time_base.num;
4055 } else if((fr == 29970) || (fr == 23976)) {
4065 if(verbose > 0 && norm != UNKNOWN)
4066 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4069 if(norm == UNKNOWN) {
4070 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4071 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4072 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4076 if(!strcmp(arg, "vcd")) {
4078 opt_video_codec("mpeg1video");
4079 opt_audio_codec("mp2");
4082 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4083 opt_frame_rate(NULL, frame_rates[norm]);
4084 opt_default("g", norm == PAL ? "15" : "18");
4086 opt_default("b", "1150000");
4087 opt_default("maxrate", "1150000");
4088 opt_default("minrate", "1150000");
4089 opt_default("bufsize", "327680"); // 40*1024*8;
4091 opt_default("ab", "224000");
4092 audio_sample_rate = 44100;
4095 opt_default("packetsize", "2324");
4096 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4098 /* We have to offset the PTS, so that it is consistent with the SCR.
4099 SCR starts at 36000, but the first two packs contain only padding
4100 and the first pack from the other stream, respectively, may also have
4101 been written before.
4102 So the real data starts at SCR 36000+3*1200. */
4103 mux_preload= (36000+3*1200) / 90000.0; //0.44
4104 } else if(!strcmp(arg, "svcd")) {
4106 opt_video_codec("mpeg2video");
4107 opt_audio_codec("mp2");
4110 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4111 opt_frame_rate(NULL, frame_rates[norm]);
4112 opt_default("g", norm == PAL ? "15" : "18");
4114 opt_default("b", "2040000");
4115 opt_default("maxrate", "2516000");
4116 opt_default("minrate", "0"); //1145000;
4117 opt_default("bufsize", "1835008"); //224*1024*8;
4118 opt_default("flags", "+scan_offset");
4121 opt_default("ab", "224000");
4122 audio_sample_rate = 44100;
4124 opt_default("packetsize", "2324");
4126 } else if(!strcmp(arg, "dvd")) {
4128 opt_video_codec("mpeg2video");
4129 opt_audio_codec("ac3");
4132 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4133 opt_frame_rate(NULL, frame_rates[norm]);
4134 opt_default("g", norm == PAL ? "15" : "18");
4136 opt_default("b", "6000000");
4137 opt_default("maxrate", "9000000");
4138 opt_default("minrate", "0"); //1500000;
4139 opt_default("bufsize", "1835008"); //224*1024*8;
4141 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4142 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4144 opt_default("ab", "448000");
4145 audio_sample_rate = 48000;
4147 } else if(!strncmp(arg, "dv", 2)) {
4151 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4152 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4153 (norm == PAL ? "yuv420p" : "yuv411p"));
4154 opt_frame_rate(NULL, frame_rates[norm]);
4156 audio_sample_rate = 48000;
4160 fprintf(stderr, "Unknown target: %s\n", arg);
4165 static void opt_vstats_file (const char *arg)
4167 av_free (vstats_filename);
4168 vstats_filename=av_strdup (arg);
4171 static void opt_vstats (void)
4174 time_t today2 = time(NULL);
4175 struct tm *today = localtime(&today2);
4177 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4179 opt_vstats_file(filename);
4182 static int opt_bsf(const char *opt, const char *arg)
4184 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4185 AVBitStreamFilterContext **bsfp;
4188 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4192 bsfp= *opt == 'v' ? &video_bitstream_filters :
4193 *opt == 'a' ? &audio_bitstream_filters :
4194 &subtitle_bitstream_filters;
4196 bsfp= &(*bsfp)->next;
4203 static int opt_preset(const char *opt, const char *arg)
4206 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4207 char *codec_name = *opt == 'v' ? video_codec_name :
4208 *opt == 'a' ? audio_codec_name :
4209 subtitle_codec_name;
4211 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4212 fprintf(stderr, "File for preset '%s' not found\n", arg);
4217 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4218 if(line[0] == '#' && !e)
4220 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4222 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4225 if(!strcmp(tmp, "acodec")){
4226 opt_audio_codec(tmp2);
4227 }else if(!strcmp(tmp, "vcodec")){
4228 opt_video_codec(tmp2);
4229 }else if(!strcmp(tmp, "scodec")){
4230 opt_subtitle_codec(tmp2);
4231 }else if(!strcmp(tmp, "dcodec")){
4232 opt_data_codec(tmp2);
4233 }else if(opt_default(tmp, tmp2) < 0){
4234 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4244 static const OptionDef options[] = {
4246 #include "cmdutils_common_opts.h"
4247 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4248 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4249 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4250 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4251 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4252 "outfile[,metadata]:infile[,metadata]" },
4253 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4254 "outfile[,metadata]:infile[,metadata]" },
4255 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4256 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4257 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4258 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4259 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4260 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4261 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4262 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4263 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4264 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4265 "add timings for benchmarking" },
4266 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4267 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4268 "dump each input packet" },
4269 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4270 "when dumping packets, also dump the payload" },
4271 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4272 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4273 { "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)", "" },
4274 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4275 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4276 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4277 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4278 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4279 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4280 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4281 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4282 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4283 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4284 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4285 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4286 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4289 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4290 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4291 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4292 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4293 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4294 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4295 { "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" },
4296 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4297 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4298 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4299 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4300 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4301 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4302 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4303 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4304 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4305 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4306 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4307 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4308 { "qscale", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4309 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4310 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4311 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4312 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4313 "use same quantizer as source (implies VBR)" },
4314 { "pass", HAS_ARG | OPT_FUNC2 | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4315 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4316 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4317 "deinterlace pictures" },
4318 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4319 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4320 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4322 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4324 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4325 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4326 { "top", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4327 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4328 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4329 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4330 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4331 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4332 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4333 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4334 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4337 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4338 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4339 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4340 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4341 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4342 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4343 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4344 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4345 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4346 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4347 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4348 { "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" },
4350 /* subtitle options */
4351 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4352 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4353 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4354 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4355 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4358 { "vc", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4359 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4360 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4363 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4364 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4366 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4367 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4368 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4370 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4371 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4372 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4373 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4374 /* data codec support */
4375 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4377 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4381 int main(int argc, char **argv)
4385 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4387 avcodec_register_all();
4389 avdevice_register_all();
4392 avfilter_register_all();
4396 avio_set_interrupt_cb(decode_interrupt_cb);
4403 parse_options(argc, argv, options, opt_output_file);
4405 if(nb_output_files <= 0 && nb_input_files == 0) {
4407 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4411 /* file converter / grab */
4412 if (nb_output_files <= 0) {
4413 fprintf(stderr, "At least one output file must be specified\n");
4417 if (nb_input_files == 0) {
4418 fprintf(stderr, "At least one input file must be specified\n");
4423 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4424 stream_maps, nb_stream_maps) < 0)
4426 ti = getutime() - ti;
4428 int maxrss = getmaxrss() / 1024;
4429 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4432 return ffmpeg_exit(0);