3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "ffmpeg";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
85 int sync_stream_index;
89 * select an input file for an output file
91 typedef struct MetadataMap {
92 int file; //< file index
93 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
94 int index; //< stream/chapter/program number
97 typedef struct ChapterMap {
102 static const OptionDef options[];
104 #define MAX_FILES 100
105 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
107 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
109 static const char *last_asked_format = NULL;
110 static double *input_files_ts_scale[MAX_FILES] = {NULL};
111 static int nb_input_files_ts_scale[MAX_FILES] = {0};
113 static AVFormatContext *output_files[MAX_FILES];
114 static AVDictionary *output_opts[MAX_FILES];
115 static int nb_output_files = 0;
117 static StreamMap *stream_maps = NULL;
118 static int nb_stream_maps;
120 /* first item specifies output metadata, second is input */
121 static MetadataMap (*meta_data_maps)[2] = NULL;
122 static int nb_meta_data_maps;
123 static int metadata_global_autocopy = 1;
124 static int metadata_streams_autocopy = 1;
125 static int metadata_chapters_autocopy = 1;
127 static ChapterMap *chapter_maps = NULL;
128 static int nb_chapter_maps;
130 /* indexed by output file stream index */
131 static int *streamid_map = NULL;
132 static int nb_streamid_map = 0;
134 static int frame_width = 0;
135 static int frame_height = 0;
136 static float frame_aspect_ratio = 0;
137 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
138 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
139 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
140 static AVRational frame_rate;
141 static float video_qscale = 0;
142 static uint16_t *intra_matrix = NULL;
143 static uint16_t *inter_matrix = NULL;
144 static const char *video_rc_override_string=NULL;
145 static int video_disable = 0;
146 static int video_discard = 0;
147 static char *video_codec_name = NULL;
148 static unsigned int video_codec_tag = 0;
149 static char *video_language = NULL;
150 static int same_quality = 0;
151 static int do_deinterlace = 0;
152 static int top_field_first = -1;
153 static int me_threshold = 0;
154 static int intra_dc_precision = 8;
155 static int loop_input = 0;
156 static int loop_output = AVFMT_NOOUTPUTLOOP;
157 static int qp_hist = 0;
159 static char *vfilters = NULL;
162 static int intra_only = 0;
163 static int audio_sample_rate = 0;
164 static int64_t channel_layout = 0;
165 #define QSCALE_NONE -99999
166 static float audio_qscale = QSCALE_NONE;
167 static int audio_disable = 0;
168 static int audio_channels = 0;
169 static char *audio_codec_name = NULL;
170 static unsigned int audio_codec_tag = 0;
171 static char *audio_language = NULL;
173 static int subtitle_disable = 0;
174 static char *subtitle_codec_name = NULL;
175 static char *subtitle_language = NULL;
176 static unsigned int subtitle_codec_tag = 0;
178 static int data_disable = 0;
179 static char *data_codec_name = NULL;
180 static unsigned int data_codec_tag = 0;
182 static float mux_preload= 0.5;
183 static float mux_max_delay= 0.7;
185 static int64_t recording_time = INT64_MAX;
186 static int64_t start_time = 0;
187 static int64_t recording_timestamp = 0;
188 static int64_t input_ts_offset = 0;
189 static int file_overwrite = 0;
190 static AVDictionary *metadata;
191 static int do_benchmark = 0;
192 static int do_hex_dump = 0;
193 static int do_pkt_dump = 0;
194 static int do_psnr = 0;
195 static int do_pass = 0;
196 static char *pass_logfilename_prefix = NULL;
197 static int audio_stream_copy = 0;
198 static int video_stream_copy = 0;
199 static int subtitle_stream_copy = 0;
200 static int data_stream_copy = 0;
201 static int video_sync_method= -1;
202 static int audio_sync_method= 0;
203 static float audio_drift_threshold= 0.1;
204 static int copy_ts= 0;
206 static int opt_shortest = 0;
207 static char *vstats_filename;
208 static FILE *vstats_file;
209 static int opt_programid = 0;
210 static int copy_initial_nonkeyframes = 0;
212 static int rate_emu = 0;
214 static int audio_volume = 256;
216 static int exit_on_error = 0;
217 static int using_stdin = 0;
218 static int verbose = 1;
219 static int thread_count= 1;
220 static int64_t video_size = 0;
221 static int64_t audio_size = 0;
222 static int64_t extra_size = 0;
223 static int nb_frames_dup = 0;
224 static int nb_frames_drop = 0;
225 static int input_sync;
226 static uint64_t limit_filesize = 0;
227 static int force_fps = 0;
228 static char *forced_key_frames = NULL;
230 static float dts_delta_threshold = 10;
232 static int64_t timer_start;
234 static uint8_t *audio_buf;
235 static uint8_t *audio_out;
236 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
238 static short *samples;
240 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
241 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
242 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
244 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
248 typedef struct OutputStream {
249 int file_index; /* file index */
250 int index; /* stream index in the output file */
251 int source_index; /* InputStream index */
252 AVStream *st; /* stream in the output file */
253 int encoding_needed; /* true if encoding needed for this stream */
255 /* input pts and corresponding output pts
257 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
258 struct InputStream *sync_ist; /* input stream to sync against */
259 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
260 AVBitStreamFilterContext *bitstream_filters;
265 AVFrame pict_tmp; /* temporary image for resampling */
266 struct SwsContext *img_resample_ctx; /* for image resampling */
269 int resample_pix_fmt;
270 AVRational frame_rate;
272 float frame_aspect_ratio;
274 /* forced key frames */
275 int64_t *forced_kf_pts;
281 ReSampleContext *resample; /* for audio resampling */
282 int resample_sample_fmt;
283 int resample_channels;
284 int resample_sample_rate;
286 AVAudioConvert *reformat_ctx;
287 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
291 AVFilterContext *output_video_filter;
292 AVFilterContext *input_video_filter;
293 AVFilterBufferRef *picref;
295 AVFilterGraph *graph;
301 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
302 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
304 typedef struct InputStream {
307 int discard; /* true if stream data should be discarded */
308 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
311 int64_t start; /* time when read started */
312 int64_t next_pts; /* synthetic pts for cases where pkt.pts
314 int64_t pts; /* current pts */
315 PtsCorrectionContext pts_ctx;
316 int is_start; /* is 1 at the start and after a discontinuity */
317 int showed_multi_packet_warning;
318 int is_past_recording_time;
321 typedef struct InputFile {
322 AVFormatContext *ctx;
323 int eof_reached; /* true if eof reached */
324 int ist_index; /* index of first stream in ist_table */
325 int buffer_size; /* current total buffer size */
329 static InputStream *input_streams = NULL;
330 static int nb_input_streams = 0;
331 static InputFile *input_files = NULL;
332 static int nb_input_files = 0;
336 static int configure_video_filters(InputStream *ist, OutputStream *ost)
338 AVFilterContext *last_filter, *filter;
339 /** filter graph containing all filters including input & output */
340 AVCodecContext *codec = ost->st->codec;
341 AVCodecContext *icodec = ist->st->codec;
342 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
343 AVRational sample_aspect_ratio;
347 ost->graph = avfilter_graph_alloc();
349 if (ist->st->sample_aspect_ratio.num){
350 sample_aspect_ratio = ist->st->sample_aspect_ratio;
352 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
354 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
355 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
356 sample_aspect_ratio.num, sample_aspect_ratio.den);
358 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
359 "src", args, NULL, ost->graph);
362 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
363 "out", NULL, &ffsink_ctx, ost->graph);
366 last_filter = ost->input_video_filter;
368 if (codec->width != icodec->width || codec->height != icodec->height) {
369 snprintf(args, 255, "%d:%d:flags=0x%X",
373 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
374 NULL, args, NULL, ost->graph)) < 0)
376 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
378 last_filter = filter;
381 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
382 ost->graph->scale_sws_opts = av_strdup(args);
385 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
386 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
388 outputs->name = av_strdup("in");
389 outputs->filter_ctx = last_filter;
390 outputs->pad_idx = 0;
391 outputs->next = NULL;
393 inputs->name = av_strdup("out");
394 inputs->filter_ctx = ost->output_video_filter;
398 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
400 av_freep(&ost->avfilter);
402 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
406 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
409 codec->width = ost->output_video_filter->inputs[0]->w;
410 codec->height = ost->output_video_filter->inputs[0]->h;
411 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
412 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
413 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
414 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
418 #endif /* CONFIG_AVFILTER */
420 static void term_exit(void)
422 av_log(NULL, AV_LOG_QUIET, "");
425 static volatile int received_sigterm = 0;
426 static volatile int received_nb_signals = 0;
429 sigterm_handler(int sig)
431 received_sigterm = sig;
432 received_nb_signals++;
436 static void term_init(void)
438 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
439 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
441 signal(SIGXCPU, sigterm_handler);
445 static int decode_interrupt_cb(void)
447 return received_nb_signals > 1;
450 static int ffmpeg_exit(int ret)
455 for(i=0;i<nb_output_files;i++) {
456 AVFormatContext *s = output_files[i];
457 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
459 avformat_free_context(s);
460 av_free(output_streams_for_file[i]);
461 av_dict_free(&output_opts[i]);
463 for(i=0;i<nb_input_files;i++) {
464 av_close_input_file(input_files[i].ctx);
465 av_free(input_files_ts_scale[i]);
468 av_free(intra_matrix);
469 av_free(inter_matrix);
473 av_free(vstats_filename);
475 av_free(streamid_map);
476 av_free(stream_maps);
477 av_free(meta_data_maps);
479 av_freep(&input_streams);
480 av_freep(&input_files);
482 av_free(video_codec_name);
483 av_free(audio_codec_name);
484 av_free(subtitle_codec_name);
485 av_free(data_codec_name);
490 allocated_audio_buf_size= allocated_audio_out_size= 0;
497 if (received_sigterm) {
499 "Received signal %d: terminating.\n",
500 (int) received_sigterm);
504 exit(ret); /* not all OS-es handle main() return value */
508 static void assert_avoptions(AVDictionary *m)
510 AVDictionaryEntry *t;
511 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
512 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
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 const 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 OutputStream *new_output_stream(AVFormatContext *oc, int file_idx, AVCodec *codec)
646 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
647 int idx = oc->nb_streams - 1;
650 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
654 output_streams_for_file[file_idx] =
655 grow_array(output_streams_for_file[file_idx],
656 sizeof(*output_streams_for_file[file_idx]),
657 &nb_output_streams_for_file[file_idx],
659 ost = output_streams_for_file[file_idx][idx] =
660 av_mallocz(sizeof(OutputStream));
662 fprintf(stderr, "Could not alloc output stream\n");
665 ost->file_index = file_idx;
670 avcodec_get_context_defaults3(st->codec, codec);
672 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
676 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
679 AVFormatContext *ic = NULL;
682 err = avformat_open_input(&ic, filename, NULL, NULL);
685 /* copy stream format */
686 for(i=0;i<ic->nb_streams;i++) {
691 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
692 ost = new_output_stream(s, nb_output_files, codec);
695 // FIXME: a more elegant solution is needed
696 memcpy(st, ic->streams[i], sizeof(AVStream));
698 avcodec_copy_context(st->codec, ic->streams[i]->codec);
700 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
701 if (audio_stream_copy) {
704 choose_sample_fmt(st, codec);
705 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
706 if (video_stream_copy) {
709 choose_pixel_fmt(st, codec);
712 if(st->codec->flags & CODEC_FLAG_BITEXACT)
717 s->timestamp = av_gettime();
719 av_close_input_file(ic);
724 get_sync_ipts(const OutputStream *ost)
726 const InputStream *ist = ost->sync_ist;
727 return (double)(ist->pts - start_time)/AV_TIME_BASE;
730 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
734 AVPacket new_pkt= *pkt;
735 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
736 &new_pkt.data, &new_pkt.size,
737 pkt->data, pkt->size,
738 pkt->flags & AV_PKT_FLAG_KEY);
741 new_pkt.destruct= av_destruct_packet;
743 fprintf(stderr, "%s failed for stream %d, codec %s",
744 bsfc->filter->name, pkt->stream_index,
745 avctx->codec ? avctx->codec->name : "copy");
755 ret= av_interleaved_write_frame(s, pkt);
757 print_error("av_interleaved_write_frame()", ret);
762 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
764 static void do_audio_out(AVFormatContext *s,
767 unsigned char *buf, int size)
770 int64_t audio_out_size, audio_buf_size;
771 int64_t allocated_for_size= size;
773 int size_out, frame_bytes, ret, resample_changed;
774 AVCodecContext *enc= ost->st->codec;
775 AVCodecContext *dec= ist->st->codec;
776 int osize = av_get_bytes_per_sample(enc->sample_fmt);
777 int isize = av_get_bytes_per_sample(dec->sample_fmt);
778 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
781 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
782 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
783 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
784 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
785 audio_buf_size*= osize*enc->channels;
787 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
788 if(coded_bps > 8*osize)
789 audio_out_size= audio_out_size * coded_bps / (8*osize);
790 audio_out_size += FF_MIN_BUFFER_SIZE;
792 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
793 fprintf(stderr, "Buffer sizes too large\n");
797 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
798 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
799 if (!audio_buf || !audio_out){
800 fprintf(stderr, "Out of memory in do_audio_out\n");
804 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
805 ost->audio_resample = 1;
807 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
808 ost->resample_channels != dec->channels ||
809 ost->resample_sample_rate != dec->sample_rate;
811 if ((ost->audio_resample && !ost->resample) || resample_changed) {
812 if (resample_changed) {
813 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",
814 ist->file_index, ist->st->index,
815 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
816 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
817 ost->resample_sample_fmt = dec->sample_fmt;
818 ost->resample_channels = dec->channels;
819 ost->resample_sample_rate = dec->sample_rate;
821 audio_resample_close(ost->resample);
823 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
824 if (audio_sync_method <= 1 &&
825 ost->resample_sample_fmt == enc->sample_fmt &&
826 ost->resample_channels == enc->channels &&
827 ost->resample_sample_rate == enc->sample_rate) {
828 ost->resample = NULL;
829 ost->audio_resample = 0;
830 } else if (ost->audio_resample) {
831 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
832 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
833 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
834 enc->sample_rate, dec->sample_rate,
835 enc->sample_fmt, dec->sample_fmt,
837 if (!ost->resample) {
838 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
839 dec->channels, dec->sample_rate,
840 enc->channels, enc->sample_rate);
846 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
847 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
848 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
849 if (ost->reformat_ctx)
850 av_audio_convert_free(ost->reformat_ctx);
851 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
852 dec->sample_fmt, 1, NULL, 0);
853 if (!ost->reformat_ctx) {
854 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
855 av_get_sample_fmt_name(dec->sample_fmt),
856 av_get_sample_fmt_name(enc->sample_fmt));
859 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
862 if(audio_sync_method){
863 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
864 - av_fifo_size(ost->fifo)/(enc->channels * 2);
865 double idelta= delta*dec->sample_rate / enc->sample_rate;
866 int byte_delta= ((int)idelta)*2*dec->channels;
868 //FIXME resample delay
869 if(fabs(delta) > 50){
870 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
872 byte_delta= FFMAX(byte_delta, -size);
876 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
881 static uint8_t *input_tmp= NULL;
882 input_tmp= av_realloc(input_tmp, byte_delta + size);
884 if(byte_delta > allocated_for_size - size){
885 allocated_for_size= byte_delta + (int64_t)size;
890 memset(input_tmp, 0, byte_delta);
891 memcpy(input_tmp + byte_delta, buf, size);
895 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
897 }else if(audio_sync_method>1){
898 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
899 av_assert0(ost->audio_resample);
901 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
902 // 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));
903 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
907 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
908 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
910 if (ost->audio_resample) {
912 size_out = audio_resample(ost->resample,
913 (short *)buftmp, (short *)buf,
914 size / (dec->channels * isize));
915 size_out = size_out * enc->channels * osize;
921 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
922 const void *ibuf[6]= {buftmp};
923 void *obuf[6]= {audio_buf};
924 int istride[6]= {isize};
925 int ostride[6]= {osize};
926 int len= size_out/istride[0];
927 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
928 printf("av_audio_convert() failed\n");
934 size_out = len*osize;
937 /* now encode as many frames as possible */
938 if (enc->frame_size > 1) {
939 /* output resampled raw samples */
940 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
941 fprintf(stderr, "av_fifo_realloc2() failed\n");
944 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
946 frame_bytes = enc->frame_size * osize * enc->channels;
948 while (av_fifo_size(ost->fifo) >= frame_bytes) {
950 av_init_packet(&pkt);
952 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
954 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
956 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
959 fprintf(stderr, "Audio encoding failed\n");
963 pkt.stream_index= ost->index;
966 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
967 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
968 pkt.flags |= AV_PKT_FLAG_KEY;
969 write_frame(s, &pkt, enc, ost->bitstream_filters);
971 ost->sync_opts += enc->frame_size;
975 av_init_packet(&pkt);
977 ost->sync_opts += size_out / (osize * enc->channels);
979 /* output a pcm frame */
980 /* determine the size of the coded buffer */
983 size_out = size_out*coded_bps/8;
985 if(size_out > audio_out_size){
986 fprintf(stderr, "Internal error, buffer size too small\n");
990 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
991 ret = avcodec_encode_audio(enc, audio_out, size_out,
994 fprintf(stderr, "Audio encoding failed\n");
998 pkt.stream_index= ost->index;
1001 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1002 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1003 pkt.flags |= AV_PKT_FLAG_KEY;
1004 write_frame(s, &pkt, enc, ost->bitstream_filters);
1008 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1010 AVCodecContext *dec;
1011 AVPicture *picture2;
1012 AVPicture picture_tmp;
1015 dec = ist->st->codec;
1017 /* deinterlace : must be done before any resize */
1018 if (do_deinterlace) {
1021 /* create temporary picture */
1022 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1023 buf = av_malloc(size);
1027 picture2 = &picture_tmp;
1028 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1030 if(avpicture_deinterlace(picture2, picture,
1031 dec->pix_fmt, dec->width, dec->height) < 0) {
1032 /* if error, do not deinterlace */
1033 fprintf(stderr, "Deinterlacing failed\n");
1042 if (picture != picture2)
1043 *picture = *picture2;
1047 /* we begin to correct av delay at this threshold */
1048 #define AV_DELAY_MAX 0.100
1050 static void do_subtitle_out(AVFormatContext *s,
1056 static uint8_t *subtitle_out = NULL;
1057 int subtitle_out_max_size = 1024 * 1024;
1058 int subtitle_out_size, nb, i;
1059 AVCodecContext *enc;
1062 if (pts == AV_NOPTS_VALUE) {
1063 fprintf(stderr, "Subtitle packets must have a pts\n");
1069 enc = ost->st->codec;
1071 if (!subtitle_out) {
1072 subtitle_out = av_malloc(subtitle_out_max_size);
1075 /* Note: DVB subtitle need one packet to draw them and one other
1076 packet to clear them */
1077 /* XXX: signal it in the codec context ? */
1078 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1083 for(i = 0; i < nb; i++) {
1084 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1085 // start_display_time is required to be 0
1086 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1087 sub->end_display_time -= sub->start_display_time;
1088 sub->start_display_time = 0;
1089 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1090 subtitle_out_max_size, sub);
1091 if (subtitle_out_size < 0) {
1092 fprintf(stderr, "Subtitle encoding failed\n");
1096 av_init_packet(&pkt);
1097 pkt.stream_index = ost->index;
1098 pkt.data = subtitle_out;
1099 pkt.size = subtitle_out_size;
1100 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1101 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1102 /* XXX: the pts correction is handled here. Maybe handling
1103 it in the codec would be better */
1105 pkt.pts += 90 * sub->start_display_time;
1107 pkt.pts += 90 * sub->end_display_time;
1109 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1113 static int bit_buffer_size= 1024*256;
1114 static uint8_t *bit_buffer= NULL;
1116 static void do_video_out(AVFormatContext *s,
1119 AVFrame *in_picture,
1120 int *frame_size, float quality)
1122 int nb_frames, i, ret, resample_changed;
1123 AVFrame *final_picture, *formatted_picture;
1124 AVCodecContext *enc, *dec;
1127 enc = ost->st->codec;
1128 dec = ist->st->codec;
1130 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1132 /* by default, we output a single frame */
1137 if(video_sync_method){
1138 double vdelta = sync_ipts - ost->sync_opts;
1139 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1142 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1145 }else if(vdelta>0.6)
1146 ost->sync_opts= lrintf(sync_ipts);
1147 }else if (vdelta > 1.1)
1148 nb_frames = lrintf(vdelta);
1149 //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);
1150 if (nb_frames == 0){
1153 fprintf(stderr, "*** drop!\n");
1154 }else if (nb_frames > 1) {
1155 nb_frames_dup += nb_frames - 1;
1157 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1160 ost->sync_opts= lrintf(sync_ipts);
1162 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1166 formatted_picture = in_picture;
1167 final_picture = formatted_picture;
1169 resample_changed = ost->resample_width != dec->width ||
1170 ost->resample_height != dec->height ||
1171 ost->resample_pix_fmt != dec->pix_fmt;
1173 if (resample_changed) {
1174 av_log(NULL, AV_LOG_INFO,
1175 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1176 ist->file_index, ist->st->index,
1177 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1178 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1179 if(!ost->video_resample)
1183 #if !CONFIG_AVFILTER
1184 if (ost->video_resample) {
1185 final_picture = &ost->pict_tmp;
1186 if (resample_changed) {
1187 /* initialize a new scaler context */
1188 sws_freeContext(ost->img_resample_ctx);
1189 ost->img_resample_ctx = sws_getContext(
1190 ist->st->codec->width,
1191 ist->st->codec->height,
1192 ist->st->codec->pix_fmt,
1193 ost->st->codec->width,
1194 ost->st->codec->height,
1195 ost->st->codec->pix_fmt,
1196 ost->sws_flags, NULL, NULL, NULL);
1197 if (ost->img_resample_ctx == NULL) {
1198 fprintf(stderr, "Cannot get resampling context\n");
1202 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1203 0, ost->resample_height, final_picture->data, final_picture->linesize);
1207 /* duplicates frame if needed */
1208 for(i=0;i<nb_frames;i++) {
1210 av_init_packet(&pkt);
1211 pkt.stream_index= ost->index;
1213 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1214 /* raw pictures are written as AVPicture structure to
1215 avoid any copies. We support temorarily the older
1217 AVFrame* old_frame = enc->coded_frame;
1218 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1219 pkt.data= (uint8_t *)final_picture;
1220 pkt.size= sizeof(AVPicture);
1221 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1222 pkt.flags |= AV_PKT_FLAG_KEY;
1224 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1225 enc->coded_frame = old_frame;
1227 AVFrame big_picture;
1229 big_picture= *final_picture;
1230 /* better than nothing: use input picture interlaced
1232 big_picture.interlaced_frame = in_picture->interlaced_frame;
1233 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1234 if(top_field_first == -1)
1235 big_picture.top_field_first = in_picture->top_field_first;
1237 big_picture.top_field_first = top_field_first;
1240 /* handles sameq here. This is not correct because it may
1241 not be a global option */
1242 big_picture.quality = quality;
1244 big_picture.pict_type = 0;
1245 // big_picture.pts = AV_NOPTS_VALUE;
1246 big_picture.pts= ost->sync_opts;
1247 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1248 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1249 if (ost->forced_kf_index < ost->forced_kf_count &&
1250 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1251 big_picture.pict_type = AV_PICTURE_TYPE_I;
1252 ost->forced_kf_index++;
1254 ret = avcodec_encode_video(enc,
1255 bit_buffer, bit_buffer_size,
1258 fprintf(stderr, "Video encoding failed\n");
1263 pkt.data= bit_buffer;
1265 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1266 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1267 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1268 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1269 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1271 if(enc->coded_frame->key_frame)
1272 pkt.flags |= AV_PKT_FLAG_KEY;
1273 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1276 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1277 // enc->frame_number-1, ret, enc->pict_type);
1278 /* if two pass, output log */
1279 if (ost->logfile && enc->stats_out) {
1280 fprintf(ost->logfile, "%s", enc->stats_out);
1285 ost->frame_number++;
1289 static double psnr(double d){
1290 return -10.0*log(d)/log(10.0);
1293 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1296 AVCodecContext *enc;
1298 double ti1, bitrate, avg_bitrate;
1300 /* this is executed just the first time do_video_stats is called */
1302 vstats_file = fopen(vstats_filename, "w");
1309 enc = ost->st->codec;
1310 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1311 frame_number = ost->frame_number;
1312 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1313 if (enc->flags&CODEC_FLAG_PSNR)
1314 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1316 fprintf(vstats_file,"f_size= %6d ", frame_size);
1317 /* compute pts value */
1318 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1322 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1323 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1324 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1325 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1326 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1330 static void print_report(AVFormatContext **output_files,
1331 OutputStream **ost_table, int nb_ostreams,
1336 AVFormatContext *oc;
1338 AVCodecContext *enc;
1339 int frame_number, vid, i;
1340 double bitrate, ti1, pts;
1341 static int64_t last_time = -1;
1342 static int qp_histogram[52];
1344 if (!is_last_report) {
1346 /* display the report every 0.5 seconds */
1347 cur_time = av_gettime();
1348 if (last_time == -1) {
1349 last_time = cur_time;
1352 if ((cur_time - last_time) < 500000)
1354 last_time = cur_time;
1358 oc = output_files[0];
1360 total_size = avio_size(oc->pb);
1361 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1362 total_size= avio_tell(oc->pb);
1367 for(i=0;i<nb_ostreams;i++) {
1370 enc = ost->st->codec;
1371 if (!ost->st->stream_copy && enc->coded_frame)
1372 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1373 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1376 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1377 float t = (av_gettime()-timer_start) / 1000000.0;
1379 frame_number = ost->frame_number;
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1381 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1383 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1387 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1392 if (enc->flags&CODEC_FLAG_PSNR){
1394 double error, error_sum=0;
1395 double scale, scale_sum=0;
1396 char type[3]= {'Y','U','V'};
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1400 error= enc->error[j];
1401 scale= enc->width*enc->height*255.0*255.0*frame_number;
1403 error= enc->coded_frame->error[j];
1404 scale= enc->width*enc->height*255.0*255.0;
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1411 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1415 /* compute min output value */
1416 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1417 if ((pts < ti1) && (pts > 0))
1423 if (verbose > 0 || is_last_report) {
1424 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1426 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1427 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1428 (double)total_size / 1024, ti1, bitrate);
1430 if (nb_frames_dup || nb_frames_drop)
1431 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1432 nb_frames_dup, nb_frames_drop);
1435 fprintf(stderr, "%s \r", buf);
1440 if (is_last_report && verbose >= 0){
1441 int64_t raw= audio_size + video_size + extra_size;
1442 fprintf(stderr, "\n");
1443 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1447 100.0*(total_size - raw)/raw
1452 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1454 int fill_char = 0x00;
1455 if (sample_fmt == AV_SAMPLE_FMT_U8)
1457 memset(buf, fill_char, size);
1460 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1461 static int output_packet(InputStream *ist, int ist_index,
1462 OutputStream **ost_table, int nb_ostreams,
1463 const AVPacket *pkt)
1465 AVFormatContext *os;
1470 void *buffer_to_free = NULL;
1471 static unsigned int samples_size= 0;
1472 AVSubtitle subtitle, *subtitle_to_free;
1473 int64_t pkt_pts = AV_NOPTS_VALUE;
1475 int frame_available;
1480 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1482 if(ist->next_pts == AV_NOPTS_VALUE)
1483 ist->next_pts= ist->pts;
1487 av_init_packet(&avpkt);
1495 if(pkt->dts != AV_NOPTS_VALUE)
1496 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1497 if(pkt->pts != AV_NOPTS_VALUE)
1498 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1500 //while we have more to decode or while the decoder did output something on EOF
1501 while (avpkt.size > 0 || (!pkt && got_output)) {
1502 uint8_t *data_buf, *decoded_data_buf;
1503 int data_size, decoded_data_size;
1505 ist->pts= ist->next_pts;
1507 if(avpkt.size && avpkt.size != pkt->size &&
1508 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1509 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1510 ist->showed_multi_packet_warning=1;
1513 /* decode the packet if needed */
1514 decoded_data_buf = NULL; /* fail safe */
1515 decoded_data_size= 0;
1516 data_buf = avpkt.data;
1517 data_size = avpkt.size;
1518 subtitle_to_free = NULL;
1519 if (ist->decoding_needed) {
1520 switch(ist->st->codec->codec_type) {
1521 case AVMEDIA_TYPE_AUDIO:{
1522 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1523 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1525 samples= av_malloc(samples_size);
1527 decoded_data_size= samples_size;
1528 /* XXX: could avoid copy if PCM 16 bits with same
1529 endianness as CPU */
1530 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1537 got_output = decoded_data_size > 0;
1538 /* Some bug in mpeg audio decoder gives */
1539 /* decoded_data_size < 0, it seems they are overflows */
1541 /* no audio frame */
1544 decoded_data_buf = (uint8_t *)samples;
1545 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1546 (ist->st->codec->sample_rate * ist->st->codec->channels);
1548 case AVMEDIA_TYPE_VIDEO:
1549 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1550 /* XXX: allocate picture correctly */
1551 avcodec_get_frame_defaults(&picture);
1552 avpkt.pts = pkt_pts;
1553 avpkt.dts = ist->pts;
1554 pkt_pts = AV_NOPTS_VALUE;
1556 ret = avcodec_decode_video2(ist->st->codec,
1557 &picture, &got_output, &avpkt);
1558 quality = same_quality ? picture.quality : 0;
1562 /* no picture yet */
1563 goto discard_packet;
1565 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1566 if (ist->st->codec->time_base.num != 0) {
1567 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1568 ist->next_pts += ((int64_t)AV_TIME_BASE *
1569 ist->st->codec->time_base.num * ticks) /
1570 ist->st->codec->time_base.den;
1573 buffer_to_free = NULL;
1574 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1576 case AVMEDIA_TYPE_SUBTITLE:
1577 ret = avcodec_decode_subtitle2(ist->st->codec,
1578 &subtitle, &got_output, &avpkt);
1582 goto discard_packet;
1584 subtitle_to_free = &subtitle;
1591 switch(ist->st->codec->codec_type) {
1592 case AVMEDIA_TYPE_AUDIO:
1593 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1594 ist->st->codec->sample_rate;
1596 case AVMEDIA_TYPE_VIDEO:
1597 if (ist->st->codec->time_base.num != 0) {
1598 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1599 ist->next_pts += ((int64_t)AV_TIME_BASE *
1600 ist->st->codec->time_base.num * ticks) /
1601 ist->st->codec->time_base.den;
1610 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1611 for (i = 0; i < nb_ostreams; i++) {
1613 if (ost->input_video_filter && ost->source_index == ist_index) {
1615 if (ist->st->sample_aspect_ratio.num)
1616 sar = ist->st->sample_aspect_ratio;
1618 sar = ist->st->codec->sample_aspect_ratio;
1619 // add it to be filtered
1620 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1628 // preprocess audio (volume)
1629 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1630 if (audio_volume != 256) {
1633 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1634 int v = ((*volp) * audio_volume + 128) >> 8;
1635 if (v < -32768) v = -32768;
1636 if (v > 32767) v = 32767;
1642 /* frame rate emulation */
1644 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1645 int64_t now = av_gettime() - ist->start;
1649 /* if output time reached then transcode raw format,
1650 encode packets and output them */
1651 if (start_time == 0 || ist->pts >= start_time)
1652 for(i=0;i<nb_ostreams;i++) {
1656 if (ost->source_index == ist_index) {
1658 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1659 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1660 while (frame_available) {
1661 AVRational ist_pts_tb;
1662 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1663 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1665 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1667 os = output_files[ost->file_index];
1669 /* set the input output pts pairs */
1670 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1672 if (ost->encoding_needed) {
1673 av_assert0(ist->decoding_needed);
1674 switch(ost->st->codec->codec_type) {
1675 case AVMEDIA_TYPE_AUDIO:
1676 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1678 case AVMEDIA_TYPE_VIDEO:
1680 if (ost->picref->video && !ost->frame_aspect_ratio)
1681 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1683 do_video_out(os, ost, ist, &picture, &frame_size,
1684 same_quality ? quality : ost->st->codec->global_quality);
1685 if (vstats_filename && frame_size)
1686 do_video_stats(os, ost, frame_size);
1688 case AVMEDIA_TYPE_SUBTITLE:
1689 do_subtitle_out(os, ost, ist, &subtitle,
1696 AVFrame avframe; //FIXME/XXX remove this
1698 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1700 av_init_packet(&opkt);
1702 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1703 #if !CONFIG_AVFILTER
1709 /* no reencoding needed : output the packet directly */
1710 /* force the input stream PTS */
1712 avcodec_get_frame_defaults(&avframe);
1713 ost->st->codec->coded_frame= &avframe;
1714 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1716 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1717 audio_size += data_size;
1718 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1719 video_size += data_size;
1723 opkt.stream_index= ost->index;
1724 if(pkt->pts != AV_NOPTS_VALUE)
1725 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1727 opkt.pts= AV_NOPTS_VALUE;
1729 if (pkt->dts == AV_NOPTS_VALUE)
1730 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1732 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1733 opkt.dts -= ost_tb_start_time;
1735 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1736 opkt.flags= pkt->flags;
1738 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1739 if( ost->st->codec->codec_id != CODEC_ID_H264
1740 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1741 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1743 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1744 opkt.destruct= av_destruct_packet;
1746 opkt.data = data_buf;
1747 opkt.size = data_size;
1750 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1751 ost->st->codec->frame_number++;
1752 ost->frame_number++;
1753 av_free_packet(&opkt);
1757 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1758 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1760 avfilter_unref_buffer(ost->picref);
1766 av_free(buffer_to_free);
1767 /* XXX: allocate the subtitles in the codec ? */
1768 if (subtitle_to_free) {
1769 avsubtitle_free(subtitle_to_free);
1770 subtitle_to_free = NULL;
1777 for(i=0;i<nb_ostreams;i++) {
1779 if (ost->source_index == ist_index) {
1780 AVCodecContext *enc= ost->st->codec;
1781 os = output_files[ost->file_index];
1783 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1785 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1788 if (ost->encoding_needed) {
1792 av_init_packet(&pkt);
1793 pkt.stream_index= ost->index;
1795 switch(ost->st->codec->codec_type) {
1796 case AVMEDIA_TYPE_AUDIO:
1797 fifo_bytes = av_fifo_size(ost->fifo);
1799 /* encode any samples remaining in fifo */
1800 if (fifo_bytes > 0) {
1801 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1802 int fs_tmp = enc->frame_size;
1804 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1805 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1806 enc->frame_size = fifo_bytes / (osize * enc->channels);
1808 int frame_bytes = enc->frame_size*osize*enc->channels;
1809 if (allocated_audio_buf_size < frame_bytes)
1811 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1814 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1815 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1816 ost->st->time_base.num, enc->sample_rate);
1817 enc->frame_size = fs_tmp;
1820 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1823 fprintf(stderr, "Audio encoding failed\n");
1827 pkt.flags |= AV_PKT_FLAG_KEY;
1829 case AVMEDIA_TYPE_VIDEO:
1830 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1832 fprintf(stderr, "Video encoding failed\n");
1836 if(enc->coded_frame && enc->coded_frame->key_frame)
1837 pkt.flags |= AV_PKT_FLAG_KEY;
1838 if (ost->logfile && enc->stats_out) {
1839 fprintf(ost->logfile, "%s", enc->stats_out);
1848 pkt.data= bit_buffer;
1850 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1851 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1852 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1864 static void print_sdp(AVFormatContext **avc, int n)
1868 av_sdp_create(avc, n, sdp, sizeof(sdp));
1869 printf("SDP:\n%s\n", sdp);
1873 static int copy_chapters(int infile, int outfile)
1875 AVFormatContext *is = input_files[infile].ctx;
1876 AVFormatContext *os = output_files[outfile];
1879 for (i = 0; i < is->nb_chapters; i++) {
1880 AVChapter *in_ch = is->chapters[i], *out_ch;
1881 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
1882 AV_TIME_BASE_Q, in_ch->time_base);
1883 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1884 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1887 if (in_ch->end < ts_off)
1889 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1892 out_ch = av_mallocz(sizeof(AVChapter));
1894 return AVERROR(ENOMEM);
1896 out_ch->id = in_ch->id;
1897 out_ch->time_base = in_ch->time_base;
1898 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1899 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1901 if (metadata_chapters_autocopy)
1902 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
1905 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1907 return AVERROR(ENOMEM);
1908 os->chapters[os->nb_chapters - 1] = out_ch;
1913 static void parse_forced_key_frames(char *kf, OutputStream *ost,
1914 AVCodecContext *avctx)
1920 for (p = kf; *p; p++)
1923 ost->forced_kf_count = n;
1924 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1925 if (!ost->forced_kf_pts) {
1926 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1929 for (i = 0; i < n; i++) {
1930 p = i ? strchr(p, ',') + 1 : kf;
1931 t = parse_time_or_die("force_key_frames", p, 1);
1932 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1937 * The following code is the main loop of the file converter
1939 static int transcode(AVFormatContext **output_files,
1940 int nb_output_files,
1941 InputFile *input_files,
1943 StreamMap *stream_maps, int nb_stream_maps)
1945 int ret = 0, i, j, k, n, nb_ostreams = 0;
1946 AVFormatContext *is, *os;
1947 AVCodecContext *codec, *icodec;
1948 OutputStream *ost, **ost_table = NULL;
1952 uint8_t no_packet[MAX_FILES]={0};
1953 int no_packet_count=0;
1956 for (i = 0; i < nb_input_streams; i++)
1957 input_streams[i].start = av_gettime();
1959 /* output stream init */
1961 for(i=0;i<nb_output_files;i++) {
1962 os = output_files[i];
1963 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1964 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1965 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1966 ret = AVERROR(EINVAL);
1969 nb_ostreams += os->nb_streams;
1971 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1972 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1973 ret = AVERROR(EINVAL);
1977 /* Sanity check the mapping args -- do the input files & streams exist? */
1978 for(i=0;i<nb_stream_maps;i++) {
1979 int fi = stream_maps[i].file_index;
1980 int si = stream_maps[i].stream_index;
1982 if (fi < 0 || fi > nb_input_files - 1 ||
1983 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
1984 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1985 ret = AVERROR(EINVAL);
1988 fi = stream_maps[i].sync_file_index;
1989 si = stream_maps[i].sync_stream_index;
1990 if (fi < 0 || fi > nb_input_files - 1 ||
1991 si < 0 || si > input_files[fi].ctx->nb_streams - 1) {
1992 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1993 ret = AVERROR(EINVAL);
1998 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
2002 for(k=0;k<nb_output_files;k++) {
2003 os = output_files[k];
2004 for(i=0;i<os->nb_streams;i++,n++) {
2006 ost = ost_table[n] = output_streams_for_file[k][i];
2007 if (nb_stream_maps > 0) {
2008 ost->source_index = input_files[stream_maps[n].file_index].ist_index +
2009 stream_maps[n].stream_index;
2011 /* Sanity check that the stream types match */
2012 if (input_streams[ost->source_index].st->codec->codec_type != ost->st->codec->codec_type) {
2013 int i= ost->file_index;
2014 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2015 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2016 stream_maps[n].file_index, stream_maps[n].stream_index,
2017 ost->file_index, ost->index);
2022 int best_nb_frames=-1;
2023 /* get corresponding input stream index : we select the first one with the right type */
2025 for (j = 0; j < nb_input_streams; j++) {
2027 ist = &input_streams[j];
2030 AVFormatContext *f = input_files[ist->file_index].ctx;
2032 for(pi=0; pi<f->nb_programs; pi++){
2033 AVProgram *p= f->programs[pi];
2034 if(p->id == opt_programid)
2035 for(si=0; si<p->nb_stream_indexes; si++){
2036 if(f->streams[ p->stream_index[si] ] == ist->st)
2041 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2042 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2043 if(best_nb_frames < ist->st->codec_info_nb_frames){
2044 best_nb_frames= ist->st->codec_info_nb_frames;
2045 ost->source_index = j;
2052 if(! opt_programid) {
2053 /* try again and reuse existing stream */
2054 for (j = 0; j < nb_input_streams; j++) {
2055 ist = &input_streams[j];
2056 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2057 && ist->st->discard != AVDISCARD_ALL) {
2058 ost->source_index = j;
2064 int i= ost->file_index;
2065 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2066 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2067 ost->file_index, ost->index);
2072 ist = &input_streams[ost->source_index];
2074 ost->sync_ist = (nb_stream_maps > 0) ?
2075 &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
2076 stream_maps[n].sync_stream_index] : ist;
2080 /* for each output stream, we compute the right encoding parameters */
2081 for(i=0;i<nb_ostreams;i++) {
2083 os = output_files[ost->file_index];
2084 ist = &input_streams[ost->source_index];
2086 codec = ost->st->codec;
2087 icodec = ist->st->codec;
2089 if (metadata_streams_autocopy)
2090 av_dict_copy(&ost->st->metadata, ist->st->metadata,
2091 AV_DICT_DONT_OVERWRITE);
2093 ost->st->disposition = ist->st->disposition;
2094 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2095 codec->chroma_sample_location = icodec->chroma_sample_location;
2097 if (ost->st->stream_copy) {
2098 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2100 if (extra_size > INT_MAX)
2103 /* if stream_copy is selected, no need to decode or encode */
2104 codec->codec_id = icodec->codec_id;
2105 codec->codec_type = icodec->codec_type;
2107 if(!codec->codec_tag){
2108 if( !os->oformat->codec_tag
2109 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2110 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2111 codec->codec_tag = icodec->codec_tag;
2114 codec->bit_rate = icodec->bit_rate;
2115 codec->rc_max_rate = icodec->rc_max_rate;
2116 codec->rc_buffer_size = icodec->rc_buffer_size;
2117 codec->extradata= av_mallocz(extra_size);
2118 if (!codec->extradata)
2120 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2121 codec->extradata_size= icodec->extradata_size;
2122 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){
2123 codec->time_base = icodec->time_base;
2124 codec->time_base.num *= icodec->ticks_per_frame;
2125 av_reduce(&codec->time_base.num, &codec->time_base.den,
2126 codec->time_base.num, codec->time_base.den, INT_MAX);
2128 codec->time_base = ist->st->time_base;
2129 switch(codec->codec_type) {
2130 case AVMEDIA_TYPE_AUDIO:
2131 if(audio_volume != 256) {
2132 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2135 codec->channel_layout = icodec->channel_layout;
2136 codec->sample_rate = icodec->sample_rate;
2137 codec->channels = icodec->channels;
2138 codec->frame_size = icodec->frame_size;
2139 codec->audio_service_type = icodec->audio_service_type;
2140 codec->block_align= icodec->block_align;
2141 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2142 codec->block_align= 0;
2143 if(codec->codec_id == CODEC_ID_AC3)
2144 codec->block_align= 0;
2146 case AVMEDIA_TYPE_VIDEO:
2147 codec->pix_fmt = icodec->pix_fmt;
2148 codec->width = icodec->width;
2149 codec->height = icodec->height;
2150 codec->has_b_frames = icodec->has_b_frames;
2151 if (!codec->sample_aspect_ratio.num) {
2152 codec->sample_aspect_ratio =
2153 ost->st->sample_aspect_ratio =
2154 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2155 ist->st->codec->sample_aspect_ratio.num ?
2156 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2159 case AVMEDIA_TYPE_SUBTITLE:
2160 codec->width = icodec->width;
2161 codec->height = icodec->height;
2163 case AVMEDIA_TYPE_DATA:
2170 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2171 switch(codec->codec_type) {
2172 case AVMEDIA_TYPE_AUDIO:
2173 ost->fifo= av_fifo_alloc(1024);
2176 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2177 if (!codec->sample_rate) {
2178 codec->sample_rate = icodec->sample_rate;
2180 codec->sample_rate >>= icodec->lowres;
2182 choose_sample_rate(ost->st, ost->enc);
2183 codec->time_base = (AVRational){1, codec->sample_rate};
2184 if (!codec->channels)
2185 codec->channels = icodec->channels;
2186 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2187 codec->channel_layout = 0;
2188 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2189 icodec->request_channels = codec->channels;
2190 ist->decoding_needed = 1;
2191 ost->encoding_needed = 1;
2192 ost->resample_sample_fmt = icodec->sample_fmt;
2193 ost->resample_sample_rate = icodec->sample_rate;
2194 ost->resample_channels = icodec->channels;
2196 case AVMEDIA_TYPE_VIDEO:
2197 if (codec->pix_fmt == PIX_FMT_NONE)
2198 codec->pix_fmt = icodec->pix_fmt;
2199 choose_pixel_fmt(ost->st, ost->enc);
2201 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2202 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2205 ost->video_resample = codec->width != icodec->width ||
2206 codec->height != icodec->height ||
2207 codec->pix_fmt != icodec->pix_fmt;
2208 if (ost->video_resample) {
2209 #if !CONFIG_AVFILTER
2210 avcodec_get_frame_defaults(&ost->pict_tmp);
2211 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2212 codec->width, codec->height)) {
2213 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2216 ost->img_resample_ctx = sws_getContext(
2223 ost->sws_flags, NULL, NULL, NULL);
2224 if (ost->img_resample_ctx == NULL) {
2225 fprintf(stderr, "Cannot get resampling context\n");
2229 codec->bits_per_raw_sample= 0;
2231 if (!codec->width || !codec->height) {
2232 codec->width = icodec->width;
2233 codec->height = icodec->height;
2235 ost->resample_height = icodec->height;
2236 ost->resample_width = icodec->width;
2237 ost->resample_pix_fmt= icodec->pix_fmt;
2238 ost->encoding_needed = 1;
2239 ist->decoding_needed = 1;
2241 if (!ost->frame_rate.num)
2242 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2243 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2244 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2245 ost->frame_rate = ost->enc->supported_framerates[idx];
2247 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2250 if (configure_video_filters(ist, ost)) {
2251 fprintf(stderr, "Error opening filters!\n");
2256 case AVMEDIA_TYPE_SUBTITLE:
2257 ost->encoding_needed = 1;
2258 ist->decoding_needed = 1;
2265 if (ost->encoding_needed &&
2266 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2267 char logfilename[1024];
2270 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2271 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2273 if (codec->flags & CODEC_FLAG_PASS1) {
2274 f = fopen(logfilename, "wb");
2276 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2282 size_t logbuffer_size;
2283 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2284 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2287 codec->stats_in = logbuffer;
2291 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2292 int size= codec->width * codec->height;
2293 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2298 bit_buffer = av_malloc(bit_buffer_size);
2300 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2302 ret = AVERROR(ENOMEM);
2306 /* open each encoder */
2307 for(i=0;i<nb_ostreams;i++) {
2309 if (ost->encoding_needed) {
2310 AVCodec *codec = ost->enc;
2311 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2313 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2314 ost->st->codec->codec_id, ost->file_index, ost->index);
2315 ret = AVERROR(EINVAL);
2318 if (dec->subtitle_header) {
2319 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2320 if (!ost->st->codec->subtitle_header) {
2321 ret = AVERROR(ENOMEM);
2324 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2325 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2327 if (avcodec_open(ost->st->codec, codec) < 0) {
2328 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2329 ost->file_index, ost->index);
2330 ret = AVERROR(EINVAL);
2333 extra_size += ost->st->codec->extradata_size;
2337 /* open each decoder */
2338 for (i = 0; i < nb_input_streams; i++) {
2339 ist = &input_streams[i];
2340 if (ist->decoding_needed) {
2341 AVCodec *codec = ist->dec;
2343 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2345 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2346 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2347 ret = AVERROR(EINVAL);
2351 /* update requested sample format for the decoder based on the
2352 corresponding encoder sample format */
2353 for (j = 0; j < nb_ostreams; j++) {
2355 if (ost->source_index == i) {
2356 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2361 if (avcodec_open(ist->st->codec, codec) < 0) {
2362 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2363 ist->file_index, ist->st->index);
2364 ret = AVERROR(EINVAL);
2367 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2368 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2373 for (i = 0; i < nb_input_streams; i++) {
2375 ist = &input_streams[i];
2377 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2378 ist->next_pts = AV_NOPTS_VALUE;
2379 init_pts_correction(&ist->pts_ctx);
2383 /* set meta data information from input file if required */
2384 for (i=0;i<nb_meta_data_maps;i++) {
2385 AVFormatContext *files[2];
2386 AVDictionary **meta[2];
2389 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2390 if ((index) < 0 || (index) >= (nb_elems)) {\
2391 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2393 ret = AVERROR(EINVAL);\
2397 int out_file_index = meta_data_maps[i][0].file;
2398 int in_file_index = meta_data_maps[i][1].file;
2399 if (in_file_index < 0 || out_file_index < 0)
2401 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2402 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2404 files[0] = output_files[out_file_index];
2405 files[1] = input_files[in_file_index].ctx;
2407 for (j = 0; j < 2; j++) {
2408 MetadataMap *map = &meta_data_maps[i][j];
2410 switch (map->type) {
2412 meta[j] = &files[j]->metadata;
2415 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2416 meta[j] = &files[j]->streams[map->index]->metadata;
2419 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2420 meta[j] = &files[j]->chapters[map->index]->metadata;
2423 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2424 meta[j] = &files[j]->programs[map->index]->metadata;
2429 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
2432 /* copy global metadata by default */
2433 if (metadata_global_autocopy) {
2435 for (i = 0; i < nb_output_files; i++)
2436 av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata,
2437 AV_DICT_DONT_OVERWRITE);
2440 /* copy chapters according to chapter maps */
2441 for (i = 0; i < nb_chapter_maps; i++) {
2442 int infile = chapter_maps[i].in_file;
2443 int outfile = chapter_maps[i].out_file;
2445 if (infile < 0 || outfile < 0)
2447 if (infile >= nb_input_files) {
2448 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2449 ret = AVERROR(EINVAL);
2452 if (outfile >= nb_output_files) {
2453 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2454 ret = AVERROR(EINVAL);
2457 copy_chapters(infile, outfile);
2460 /* copy chapters from the first input file that has them*/
2461 if (!nb_chapter_maps)
2462 for (i = 0; i < nb_input_files; i++) {
2463 if (!input_files[i].ctx->nb_chapters)
2466 for (j = 0; j < nb_output_files; j++)
2467 if ((ret = copy_chapters(i, j)) < 0)
2472 /* open files and write file headers */
2473 for(i=0;i<nb_output_files;i++) {
2474 os = output_files[i];
2475 if (avformat_write_header(os, &output_opts[i]) < 0) {
2476 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2477 ret = AVERROR(EINVAL);
2480 assert_avoptions(output_opts[i]);
2481 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2487 /* dump the file output parameters - cannot be done before in case
2489 for(i=0;i<nb_output_files;i++) {
2490 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2493 /* dump the stream mapping */
2495 fprintf(stderr, "Stream mapping:\n");
2496 for(i=0;i<nb_ostreams;i++) {
2498 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2499 input_streams[ost->source_index].file_index,
2500 input_streams[ost->source_index].st->index,
2503 if (ost->sync_ist != &input_streams[ost->source_index])
2504 fprintf(stderr, " [sync #%d.%d]",
2505 ost->sync_ist->file_index,
2506 ost->sync_ist->st->index);
2507 fprintf(stderr, "\n");
2512 fprintf(stderr, "%s\n", error);
2517 print_sdp(output_files, nb_output_files);
2521 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2524 timer_start = av_gettime();
2526 for(; received_sigterm == 0;) {
2527 int file_index, ist_index;
2536 /* select the stream that we must read now by looking at the
2537 smallest output pts */
2539 for(i=0;i<nb_ostreams;i++) {
2542 os = output_files[ost->file_index];
2543 ist = &input_streams[ost->source_index];
2544 if(ist->is_past_recording_time || no_packet[ist->file_index])
2546 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2547 ipts = (double)ist->pts;
2548 if (!input_files[ist->file_index].eof_reached){
2549 if(ipts < ipts_min) {
2551 if(input_sync ) file_index = ist->file_index;
2553 if(opts < opts_min) {
2555 if(!input_sync) file_index = ist->file_index;
2558 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2563 /* if none, if is finished */
2564 if (file_index < 0) {
2565 if(no_packet_count){
2567 memset(no_packet, 0, sizeof(no_packet));
2574 /* finish if limit size exhausted */
2575 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2578 /* read a frame from it and output it in the fifo */
2579 is = input_files[file_index].ctx;
2580 ret= av_read_frame(is, &pkt);
2581 if(ret == AVERROR(EAGAIN)){
2582 no_packet[file_index]=1;
2587 input_files[file_index].eof_reached = 1;
2595 memset(no_packet, 0, sizeof(no_packet));
2598 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2599 is->streams[pkt.stream_index]);
2601 /* the following test is needed in case new streams appear
2602 dynamically in stream : we ignore them */
2603 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2604 goto discard_packet;
2605 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2606 ist = &input_streams[ist_index];
2608 goto discard_packet;
2610 if (pkt.dts != AV_NOPTS_VALUE)
2611 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2612 if (pkt.pts != AV_NOPTS_VALUE)
2613 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2615 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2616 && input_files_ts_scale[file_index][pkt.stream_index]){
2617 if(pkt.pts != AV_NOPTS_VALUE)
2618 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2619 if(pkt.dts != AV_NOPTS_VALUE)
2620 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2623 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2624 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2625 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2626 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2627 int64_t delta= pkt_dts - ist->next_pts;
2628 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2629 input_files[ist->file_index].ts_offset -= delta;
2631 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2632 delta, input_files[ist->file_index].ts_offset);
2633 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2634 if(pkt.pts != AV_NOPTS_VALUE)
2635 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2639 /* finish if recording time exhausted */
2640 if (recording_time != INT64_MAX &&
2641 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2642 ist->is_past_recording_time = 1;
2643 goto discard_packet;
2646 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2647 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2650 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2651 ist->file_index, ist->st->index);
2654 av_free_packet(&pkt);
2659 av_free_packet(&pkt);
2661 /* dump report by using the output first video and audio streams */
2662 print_report(output_files, ost_table, nb_ostreams, 0);
2665 /* at the end of stream, we must flush the decoder buffers */
2666 for (i = 0; i < nb_input_streams; i++) {
2667 ist = &input_streams[i];
2668 if (ist->decoding_needed) {
2669 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2675 /* write the trailer if needed and close file */
2676 for(i=0;i<nb_output_files;i++) {
2677 os = output_files[i];
2678 av_write_trailer(os);
2681 /* dump report by using the first video and audio streams */
2682 print_report(output_files, ost_table, nb_ostreams, 1);
2684 /* close each encoder */
2685 for(i=0;i<nb_ostreams;i++) {
2687 if (ost->encoding_needed) {
2688 av_freep(&ost->st->codec->stats_in);
2689 avcodec_close(ost->st->codec);
2692 avfilter_graph_free(&ost->graph);
2696 /* close each decoder */
2697 for (i = 0; i < nb_input_streams; i++) {
2698 ist = &input_streams[i];
2699 if (ist->decoding_needed) {
2700 avcodec_close(ist->st->codec);
2708 av_freep(&bit_buffer);
2711 for(i=0;i<nb_ostreams;i++) {
2714 if (ost->st->stream_copy)
2715 av_freep(&ost->st->codec->extradata);
2717 fclose(ost->logfile);
2718 ost->logfile = NULL;
2720 av_fifo_free(ost->fifo); /* works even if fifo is not
2721 initialized but set to zero */
2722 av_freep(&ost->st->codec->subtitle_header);
2723 av_free(ost->pict_tmp.data[0]);
2724 av_free(ost->forced_kf_pts);
2725 if (ost->video_resample)
2726 sws_freeContext(ost->img_resample_ctx);
2728 audio_resample_close(ost->resample);
2729 if (ost->reformat_ctx)
2730 av_audio_convert_free(ost->reformat_ctx);
2739 static int opt_format(const char *opt, const char *arg)
2741 last_asked_format = arg;
2745 static int opt_video_rc_override_string(const char *opt, const char *arg)
2747 video_rc_override_string = arg;
2751 static int opt_me_threshold(const char *opt, const char *arg)
2753 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2757 static int opt_verbose(const char *opt, const char *arg)
2759 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2763 static int opt_frame_rate(const char *opt, const char *arg)
2765 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2766 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2772 static int opt_bitrate(const char *opt, const char *arg)
2774 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2776 opt_default(opt, arg);
2778 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2779 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2784 static int opt_frame_crop(const char *opt, const char *arg)
2786 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2787 return AVERROR(EINVAL);
2790 static int opt_frame_size(const char *opt, const char *arg)
2792 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2793 fprintf(stderr, "Incorrect frame size\n");
2794 return AVERROR(EINVAL);
2799 static int opt_pad(const char *opt, const char *arg) {
2800 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2804 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2806 if (strcmp(arg, "list")) {
2807 frame_pix_fmt = av_get_pix_fmt(arg);
2808 if (frame_pix_fmt == PIX_FMT_NONE) {
2809 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2810 return AVERROR(EINVAL);
2819 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2826 p = strchr(arg, ':');
2828 x = strtol(arg, &end, 10);
2830 y = strtol(end+1, &end, 10);
2832 ar = (double)x / (double)y;
2834 ar = strtod(arg, NULL);
2837 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2838 return AVERROR(EINVAL);
2840 frame_aspect_ratio = ar;
2844 static int opt_metadata(const char *opt, const char *arg)
2846 char *mid= strchr(arg, '=');
2849 fprintf(stderr, "Missing =\n");
2854 av_dict_set(&metadata, arg, mid, 0);
2859 static int opt_qscale(const char *opt, const char *arg)
2861 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2862 if (video_qscale == 0) {
2863 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2864 return AVERROR(EINVAL);
2869 static int opt_top_field_first(const char *opt, const char *arg)
2871 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2875 static int opt_thread_count(const char *opt, const char *arg)
2877 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2880 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2885 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2887 if (strcmp(arg, "list")) {
2888 audio_sample_fmt = av_get_sample_fmt(arg);
2889 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2890 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2891 return AVERROR(EINVAL);
2896 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2897 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2903 static int opt_audio_rate(const char *opt, const char *arg)
2905 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2909 static int opt_audio_channels(const char *opt, const char *arg)
2911 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2915 static int opt_video_channel(const char *opt, const char *arg)
2917 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2918 opt_default("channel", arg);
2922 static int opt_video_standard(const char *opt, const char *arg)
2924 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2925 opt_default("standard", arg);
2929 static int opt_codec(int *pstream_copy, char **pcodec_name,
2930 int codec_type, const char *arg)
2932 av_freep(pcodec_name);
2933 if (!strcmp(arg, "copy")) {
2936 *pcodec_name = av_strdup(arg);
2941 static int opt_audio_codec(const char *opt, const char *arg)
2943 return opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2946 static int opt_video_codec(const char *opt, const char *arg)
2948 return opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2951 static int opt_subtitle_codec(const char *opt, const char *arg)
2953 return opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2956 static int opt_data_codec(const char *opt, const char *arg)
2958 return opt_codec(&data_stream_copy, &data_codec_name, AVMEDIA_TYPE_DATA, arg);
2961 static int opt_codec_tag(const char *opt, const char *arg)
2964 uint32_t *codec_tag;
2966 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2967 !strcmp(opt, "vtag") ? &video_codec_tag :
2968 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2972 *codec_tag = strtol(arg, &tail, 0);
2974 *codec_tag = AV_RL32(arg);
2979 static int opt_map(const char *opt, const char *arg)
2984 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2985 m = &stream_maps[nb_stream_maps-1];
2987 m->file_index = strtol(arg, &p, 0);
2991 m->stream_index = strtol(p, &p, 0);
2994 m->sync_file_index = strtol(p, &p, 0);
2997 m->sync_stream_index = strtol(p, &p, 0);
2999 m->sync_file_index = m->file_index;
3000 m->sync_stream_index = m->stream_index;
3005 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
3016 *index = strtol(++arg, endptr, 0);
3019 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
3026 static int opt_map_metadata(const char *opt, const char *arg)
3028 MetadataMap *m, *m1;
3031 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
3032 &nb_meta_data_maps, nb_meta_data_maps + 1);
3034 m = &meta_data_maps[nb_meta_data_maps - 1][0];
3035 m->file = strtol(arg, &p, 0);
3036 parse_meta_type(p, &m->type, &m->index, &p);
3040 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
3041 m1->file = strtol(p, &p, 0);
3042 parse_meta_type(p, &m1->type, &m1->index, &p);
3044 if (m->type == 'g' || m1->type == 'g')
3045 metadata_global_autocopy = 0;
3046 if (m->type == 's' || m1->type == 's')
3047 metadata_streams_autocopy = 0;
3048 if (m->type == 'c' || m1->type == 'c')
3049 metadata_chapters_autocopy = 0;
3054 static int opt_map_meta_data(const char *opt, const char *arg)
3056 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
3057 "Use -map_metadata instead.\n");
3058 return opt_map_metadata(opt, arg);
3061 static int opt_map_chapters(const char *opt, const char *arg)
3066 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3067 nb_chapter_maps + 1);
3068 c = &chapter_maps[nb_chapter_maps - 1];
3069 c->out_file = strtol(arg, &p, 0);
3073 c->in_file = strtol(p, &p, 0);
3077 static int opt_input_ts_scale(const char *opt, const char *arg)
3079 unsigned int stream;
3083 stream = strtol(arg, &p, 0);
3086 scale= strtod(p, &p);
3088 if(stream >= MAX_STREAMS)
3091 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);
3092 input_files_ts_scale[nb_input_files][stream]= scale;
3096 static int opt_recording_time(const char *opt, const char *arg)
3098 recording_time = parse_time_or_die(opt, arg, 1);
3102 static int opt_start_time(const char *opt, const char *arg)
3104 start_time = parse_time_or_die(opt, arg, 1);
3108 static int opt_recording_timestamp(const char *opt, const char *arg)
3110 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3114 static int opt_input_ts_offset(const char *opt, const char *arg)
3116 input_ts_offset = parse_time_or_die(opt, arg, 1);
3120 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3122 const char *codec_string = encoder ? "encoder" : "decoder";
3126 return CODEC_ID_NONE;
3128 avcodec_find_encoder_by_name(name) :
3129 avcodec_find_decoder_by_name(name);
3131 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3134 if(codec->type != type) {
3135 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3138 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3139 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3140 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3141 "results.\nAdd '-strict experimental' if you want to use it.\n",
3142 codec_string, codec->name);
3144 avcodec_find_encoder(codec->id) :
3145 avcodec_find_decoder(codec->id);
3146 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3147 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3148 codec_string, codec->name);
3154 static int opt_input_file(const char *opt, const char *filename)
3156 AVFormatContext *ic;
3157 AVInputFormat *file_iformat = NULL;
3158 int err, i, ret, rfps, rfps_base;
3162 if (last_asked_format) {
3163 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3164 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3167 last_asked_format = NULL;
3170 if (!strcmp(filename, "-"))
3173 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3174 !strcmp(filename, "/dev/stdin");
3176 /* get default parameters from command line */
3177 ic = avformat_alloc_context();
3179 print_error(filename, AVERROR(ENOMEM));
3182 if (audio_sample_rate) {
3183 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3184 av_dict_set(&format_opts, "sample_rate", buf, 0);
3186 if (audio_channels) {
3187 snprintf(buf, sizeof(buf), "%d", audio_channels);
3188 av_dict_set(&format_opts, "channels", buf, 0);
3190 if (frame_rate.num) {
3191 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3192 av_dict_set(&format_opts, "framerate", buf, 0);
3194 if (frame_width && frame_height) {
3195 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3196 av_dict_set(&format_opts, "video_size", buf, 0);
3198 if (frame_pix_fmt != PIX_FMT_NONE)
3199 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3201 ic->video_codec_id =
3202 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3203 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3204 ic->audio_codec_id =
3205 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3206 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3207 ic->subtitle_codec_id=
3208 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3209 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3210 ic->flags |= AVFMT_FLAG_NONBLOCK;
3212 /* open the input file with generic libav function */
3213 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3215 print_error(filename, err);
3218 assert_avoptions(format_opts);
3223 for(i=0; i<ic->nb_streams; i++){
3224 ic->streams[i]->discard= AVDISCARD_ALL;
3226 for(i=0; i<ic->nb_programs; i++){
3227 AVProgram *p= ic->programs[i];
3228 if(p->id != opt_programid){
3229 p->discard = AVDISCARD_ALL;
3232 for(j=0; j<p->nb_stream_indexes; j++){
3233 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3238 fprintf(stderr, "Specified program id not found\n");
3245 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3246 ic->loop_input = loop_input;
3249 /* Set AVCodecContext options so they will be seen by av_find_stream_info() */
3250 for (i = 0; i < ic->nb_streams; i++) {
3251 AVCodecContext *dec = ic->streams[i]->codec;
3252 switch (dec->codec_type) {
3253 case AVMEDIA_TYPE_AUDIO:
3254 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO],
3255 AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3258 case AVMEDIA_TYPE_VIDEO:
3259 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO],
3260 AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM,
3266 /* If not enough info to get the stream parameters, we decode the
3267 first frames to get it. (used in mpeg case for example) */
3268 ret = av_find_stream_info(ic);
3269 if (ret < 0 && verbose >= 0) {
3270 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3271 av_close_input_file(ic);
3275 timestamp = start_time;
3276 /* add the stream start time */
3277 if (ic->start_time != AV_NOPTS_VALUE)
3278 timestamp += ic->start_time;
3280 /* if seeking requested, we execute it */
3281 if (start_time != 0) {
3282 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3284 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3285 filename, (double)timestamp / AV_TIME_BASE);
3287 /* reset seek info */
3291 /* update the current parameters so that they match the one of the input stream */
3292 for(i=0;i<ic->nb_streams;i++) {
3293 AVStream *st = ic->streams[i];
3294 AVCodecContext *dec = st->codec;
3297 dec->thread_count = thread_count;
3299 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3300 ist = &input_streams[nb_input_streams - 1];
3302 ist->file_index = nb_input_files;
3305 switch (dec->codec_type) {
3306 case AVMEDIA_TYPE_AUDIO:
3307 ist->dec = avcodec_find_decoder_by_name(audio_codec_name);
3308 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
3309 channel_layout = dec->channel_layout;
3310 audio_sample_fmt = dec->sample_fmt;
3312 st->discard= AVDISCARD_ALL;
3314 case AVMEDIA_TYPE_VIDEO:
3315 ist->dec = avcodec_find_decoder_by_name(video_codec_name);
3316 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, ist->dec);
3317 rfps = ic->streams[i]->r_frame_rate.num;
3318 rfps_base = ic->streams[i]->r_frame_rate.den;
3320 dec->flags |= CODEC_FLAG_EMU_EDGE;
3321 dec->height >>= dec->lowres;
3322 dec->width >>= dec->lowres;
3325 dec->debug |= FF_DEBUG_MV;
3327 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3330 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3331 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3333 (float)rfps / rfps_base, rfps, rfps_base);
3337 st->discard= AVDISCARD_ALL;
3338 else if(video_discard)
3339 st->discard= video_discard;
3341 case AVMEDIA_TYPE_DATA:
3343 case AVMEDIA_TYPE_SUBTITLE:
3344 ist->dec = avcodec_find_decoder_by_name(subtitle_codec_name);
3345 if(subtitle_disable)
3346 st->discard = AVDISCARD_ALL;
3348 case AVMEDIA_TYPE_ATTACHMENT:
3349 case AVMEDIA_TYPE_UNKNOWN:
3356 /* dump the file content */
3358 av_dump_format(ic, nb_input_files, filename, 0);
3360 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3361 input_files[nb_input_files - 1].ctx = ic;
3362 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3363 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3365 frame_rate = (AVRational){0, 0};
3366 frame_pix_fmt = PIX_FMT_NONE;
3369 audio_sample_rate = 0;
3372 av_freep(&video_codec_name);
3373 av_freep(&audio_codec_name);
3374 av_freep(&subtitle_codec_name);
3380 static void check_inputs(int *has_video_ptr,
3382 int *has_subtitle_ptr,
3385 int has_video, has_audio, has_subtitle, has_data, i, j;
3386 AVFormatContext *ic;
3393 for(j=0;j<nb_input_files;j++) {
3394 ic = input_files[j].ctx;
3395 for(i=0;i<ic->nb_streams;i++) {
3396 AVCodecContext *enc = ic->streams[i]->codec;
3397 switch(enc->codec_type) {
3398 case AVMEDIA_TYPE_AUDIO:
3401 case AVMEDIA_TYPE_VIDEO:
3404 case AVMEDIA_TYPE_SUBTITLE:
3407 case AVMEDIA_TYPE_DATA:
3408 case AVMEDIA_TYPE_ATTACHMENT:
3409 case AVMEDIA_TYPE_UNKNOWN:
3417 *has_video_ptr = has_video;
3418 *has_audio_ptr = has_audio;
3419 *has_subtitle_ptr = has_subtitle;
3420 *has_data_ptr = has_data;
3423 static void new_video_stream(AVFormatContext *oc, int file_idx)
3427 AVCodecContext *video_enc;
3428 enum CodecID codec_id = CODEC_ID_NONE;
3429 AVCodec *codec= NULL;
3431 if(!video_stream_copy){
3432 if (video_codec_name) {
3433 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3434 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3435 codec = avcodec_find_encoder_by_name(video_codec_name);
3437 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3438 codec = avcodec_find_encoder(codec_id);
3442 ost = new_output_stream(oc, file_idx, codec);
3444 if (!video_stream_copy) {
3445 ost->frame_aspect_ratio = frame_aspect_ratio;
3446 frame_aspect_ratio = 0;
3448 ost->avfilter= vfilters;
3453 ost->bitstream_filters = video_bitstream_filters;
3454 video_bitstream_filters= NULL;
3456 st->codec->thread_count= thread_count;
3458 video_enc = st->codec;
3461 video_enc->codec_tag= video_codec_tag;
3463 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3464 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3465 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3468 if (video_stream_copy) {
3469 st->stream_copy = 1;
3470 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3471 video_enc->sample_aspect_ratio =
3472 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3478 ost->frame_rate = frame_rate;
3479 video_enc->codec_id = codec_id;
3480 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3482 video_enc->width = frame_width;
3483 video_enc->height = frame_height;
3484 video_enc->pix_fmt = frame_pix_fmt;
3485 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3488 video_enc->gop_size = 0;
3489 if (video_qscale || same_quality) {
3490 video_enc->flags |= CODEC_FLAG_QSCALE;
3491 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3495 video_enc->intra_matrix = intra_matrix;
3497 video_enc->inter_matrix = inter_matrix;
3499 p= video_rc_override_string;
3502 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3504 fprintf(stderr, "error parsing rc_override\n");
3507 video_enc->rc_override=
3508 av_realloc(video_enc->rc_override,
3509 sizeof(RcOverride)*(i+1));
3510 video_enc->rc_override[i].start_frame= start;
3511 video_enc->rc_override[i].end_frame = end;
3513 video_enc->rc_override[i].qscale= q;
3514 video_enc->rc_override[i].quality_factor= 1.0;
3517 video_enc->rc_override[i].qscale= 0;
3518 video_enc->rc_override[i].quality_factor= -q/100.0;
3523 video_enc->rc_override_count=i;
3524 if (!video_enc->rc_initial_buffer_occupancy)
3525 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3526 video_enc->me_threshold= me_threshold;
3527 video_enc->intra_dc_precision= intra_dc_precision - 8;
3530 video_enc->flags|= CODEC_FLAG_PSNR;
3535 video_enc->flags |= CODEC_FLAG_PASS1;
3537 video_enc->flags |= CODEC_FLAG_PASS2;
3541 if (forced_key_frames)
3542 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3544 if (video_language) {
3545 av_dict_set(&st->metadata, "language", video_language, 0);
3546 av_freep(&video_language);
3549 /* reset some key parameters */
3551 av_freep(&video_codec_name);
3552 av_freep(&forced_key_frames);
3553 video_stream_copy = 0;
3554 frame_pix_fmt = PIX_FMT_NONE;
3557 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3561 AVCodec *codec= NULL;
3562 AVCodecContext *audio_enc;
3563 enum CodecID codec_id = CODEC_ID_NONE;
3565 if(!audio_stream_copy){
3566 if (audio_codec_name) {
3567 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3568 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3569 codec = avcodec_find_encoder_by_name(audio_codec_name);
3571 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3572 codec = avcodec_find_encoder(codec_id);
3575 ost = new_output_stream(oc, file_idx, codec);
3578 ost->bitstream_filters = audio_bitstream_filters;
3579 audio_bitstream_filters= NULL;
3581 st->codec->thread_count= thread_count;
3583 audio_enc = st->codec;
3584 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3587 audio_enc->codec_tag= audio_codec_tag;
3589 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3590 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3591 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3593 if (audio_stream_copy) {
3594 st->stream_copy = 1;
3596 audio_enc->codec_id = codec_id;
3597 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3599 if (audio_qscale > QSCALE_NONE) {
3600 audio_enc->flags |= CODEC_FLAG_QSCALE;
3601 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3604 audio_enc->channels = audio_channels;
3605 audio_enc->sample_fmt = audio_sample_fmt;
3606 if (audio_sample_rate)
3607 audio_enc->sample_rate = audio_sample_rate;
3608 audio_enc->channel_layout = channel_layout;
3609 choose_sample_fmt(st, codec);
3611 if (audio_language) {
3612 av_dict_set(&st->metadata, "language", audio_language, 0);
3613 av_freep(&audio_language);
3616 /* reset some key parameters */
3618 av_freep(&audio_codec_name);
3619 audio_stream_copy = 0;
3622 static void new_data_stream(AVFormatContext *oc, int file_idx)
3626 AVCodecContext *data_enc;
3628 ost = new_output_stream(oc, file_idx, NULL);
3630 data_enc = st->codec;
3631 if (!data_stream_copy) {
3632 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3636 data_enc->codec_type = AVMEDIA_TYPE_DATA;
3639 data_enc->codec_tag= data_codec_tag;
3641 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3642 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3643 avcodec_opts[AVMEDIA_TYPE_DATA]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3645 if (data_stream_copy) {
3646 st->stream_copy = 1;
3650 av_freep(&data_codec_name);
3651 data_stream_copy = 0;
3654 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3658 AVCodec *codec=NULL;
3659 AVCodecContext *subtitle_enc;
3660 enum CodecID codec_id = CODEC_ID_NONE;
3662 if(!subtitle_stream_copy){
3663 if (subtitle_codec_name) {
3664 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3665 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3666 codec = avcodec_find_encoder_by_name(subtitle_codec_name);
3668 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3669 codec = avcodec_find_encoder(codec_id);
3672 ost = new_output_stream(oc, file_idx, codec);
3674 subtitle_enc = st->codec;
3676 ost->bitstream_filters = subtitle_bitstream_filters;
3677 subtitle_bitstream_filters= NULL;
3679 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3681 if(subtitle_codec_tag)
3682 subtitle_enc->codec_tag= subtitle_codec_tag;
3684 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3685 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3686 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3688 if (subtitle_stream_copy) {
3689 st->stream_copy = 1;
3691 subtitle_enc->codec_id = codec_id;
3692 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3695 if (subtitle_language) {
3696 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3697 av_freep(&subtitle_language);
3700 subtitle_disable = 0;
3701 av_freep(&subtitle_codec_name);
3702 subtitle_stream_copy = 0;
3705 static int opt_new_stream(const char *opt, const char *arg)
3707 AVFormatContext *oc;
3708 int file_idx = nb_output_files - 1;
3709 if (nb_output_files <= 0) {
3710 fprintf(stderr, "At least one output file must be specified\n");
3713 oc = output_files[file_idx];
3715 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3716 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3717 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3718 else if (!strcmp(opt, "newdata" )) new_data_stream (oc, file_idx);
3723 /* arg format is "output-stream-index:streamid-value". */
3724 static int opt_streamid(const char *opt, const char *arg)
3730 av_strlcpy(idx_str, arg, sizeof(idx_str));
3731 p = strchr(idx_str, ':');
3734 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3739 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3740 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3741 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3745 static void opt_output_file(const char *filename)
3747 AVFormatContext *oc;
3748 int err, use_video, use_audio, use_subtitle, use_data;
3749 int input_has_video, input_has_audio, input_has_subtitle, input_has_data;
3750 AVOutputFormat *file_oformat;
3752 if (!strcmp(filename, "-"))
3755 oc = avformat_alloc_context();
3757 print_error(filename, AVERROR(ENOMEM));
3761 if (last_asked_format) {
3762 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3763 if (!file_oformat) {
3764 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3767 last_asked_format = NULL;
3769 file_oformat = av_guess_format(NULL, filename, NULL);
3770 if (!file_oformat) {
3771 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3777 oc->oformat = file_oformat;
3778 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3780 if (!strcmp(file_oformat->name, "ffm") &&
3781 av_strstart(filename, "http:", NULL)) {
3782 /* special case for files sent to ffserver: we get the stream
3783 parameters from ffserver */
3784 int err = read_ffserver_streams(oc, filename);
3786 print_error(filename, err);
3790 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3791 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3792 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3793 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 */
3795 /* disable if no corresponding type found */
3796 check_inputs(&input_has_video,
3798 &input_has_subtitle,
3801 if (!input_has_video)
3803 if (!input_has_audio)
3805 if (!input_has_subtitle)
3807 if (!input_has_data)
3810 /* manual disable */
3811 if (audio_disable) use_audio = 0;
3812 if (video_disable) use_video = 0;
3813 if (subtitle_disable) use_subtitle = 0;
3814 if (data_disable) use_data = 0;
3816 if (use_video) new_video_stream(oc, nb_output_files);
3817 if (use_audio) new_audio_stream(oc, nb_output_files);
3818 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3819 if (use_data) new_data_stream(oc, nb_output_files);
3821 oc->timestamp = recording_timestamp;
3823 av_dict_copy(&oc->metadata, metadata, 0);
3824 av_dict_free(&metadata);
3827 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3828 output_files[nb_output_files++] = oc;
3830 /* check filename in case of an image number is expected */
3831 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3832 if (!av_filename_number_test(oc->filename)) {
3833 print_error(oc->filename, AVERROR(EINVAL));
3838 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3839 /* test if it already exists to avoid loosing precious files */
3840 if (!file_overwrite &&
3841 (strchr(filename, ':') == NULL ||
3842 filename[1] == ':' ||
3843 av_strstart(filename, "file:", NULL))) {
3844 if (avio_check(filename, 0) == 0) {
3846 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3848 if (!read_yesno()) {
3849 fprintf(stderr, "Not overwriting - exiting\n");
3854 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3861 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3862 print_error(filename, err);
3867 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3868 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3869 if (loop_output >= 0) {
3870 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3871 oc->loop_output = loop_output;
3873 oc->flags |= AVFMT_FLAG_NONBLOCK;
3875 frame_rate = (AVRational){0, 0};
3878 audio_sample_rate = 0;
3881 av_freep(&forced_key_frames);
3886 /* same option as mencoder */
3887 static int opt_pass(const char *opt, const char *arg)
3889 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3893 static int64_t getutime(void)
3896 struct rusage rusage;
3898 getrusage(RUSAGE_SELF, &rusage);
3899 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3900 #elif HAVE_GETPROCESSTIMES
3902 FILETIME c, e, k, u;
3903 proc = GetCurrentProcess();
3904 GetProcessTimes(proc, &c, &e, &k, &u);
3905 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3907 return av_gettime();
3911 static int64_t getmaxrss(void)
3913 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3914 struct rusage rusage;
3915 getrusage(RUSAGE_SELF, &rusage);
3916 return (int64_t)rusage.ru_maxrss * 1024;
3917 #elif HAVE_GETPROCESSMEMORYINFO
3919 PROCESS_MEMORY_COUNTERS memcounters;
3920 proc = GetCurrentProcess();
3921 memcounters.cb = sizeof(memcounters);
3922 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3923 return memcounters.PeakPagefileUsage;
3929 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3932 const char *p = str;
3939 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3946 static void opt_inter_matrix(const char *arg)
3948 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3949 parse_matrix_coeffs(inter_matrix, arg);
3952 static void opt_intra_matrix(const char *arg)
3954 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3955 parse_matrix_coeffs(intra_matrix, arg);
3958 static void show_usage(void)
3960 printf("Hyper fast Audio and Video encoder\n");
3961 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3965 static void show_help(void)
3968 AVOutputFormat *oformat = NULL;
3969 AVInputFormat *iformat = NULL;
3971 av_log_set_callback(log_callback_help);
3973 show_help_options(options, "Main options:\n",
3974 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3975 show_help_options(options, "\nAdvanced options:\n",
3976 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3978 show_help_options(options, "\nVideo options:\n",
3979 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3981 show_help_options(options, "\nAdvanced Video options:\n",
3982 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3983 OPT_VIDEO | OPT_EXPERT);
3984 show_help_options(options, "\nAudio options:\n",
3985 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3987 show_help_options(options, "\nAdvanced Audio options:\n",
3988 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3989 OPT_AUDIO | OPT_EXPERT);
3990 show_help_options(options, "\nSubtitle options:\n",
3991 OPT_SUBTITLE | OPT_GRAB,
3993 show_help_options(options, "\nAudio/Video grab options:\n",
3997 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4000 /* individual codec options */
4002 while ((c = av_codec_next(c))) {
4003 if (c->priv_class) {
4004 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4009 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4012 /* individual muxer options */
4013 while ((oformat = av_oformat_next(oformat))) {
4014 if (oformat->priv_class) {
4015 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4020 /* individual demuxer options */
4021 while ((iformat = av_iformat_next(iformat))) {
4022 if (iformat->priv_class) {
4023 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4028 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4031 static int opt_target(const char *opt, const char *arg)
4033 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4034 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4036 if(!strncmp(arg, "pal-", 4)) {
4039 } else if(!strncmp(arg, "ntsc-", 5)) {
4042 } else if(!strncmp(arg, "film-", 5)) {
4047 /* Calculate FR via float to avoid int overflow */
4048 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4051 } else if((fr == 29970) || (fr == 23976)) {
4054 /* Try to determine PAL/NTSC by peeking in the input files */
4055 if(nb_input_files) {
4057 for (j = 0; j < nb_input_files; j++) {
4058 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4059 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4060 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4062 fr = c->time_base.den * 1000 / c->time_base.num;
4066 } else if((fr == 29970) || (fr == 23976)) {
4076 if(verbose > 0 && norm != UNKNOWN)
4077 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4080 if(norm == UNKNOWN) {
4081 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4082 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4083 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4087 if(!strcmp(arg, "vcd")) {
4088 opt_video_codec("vcodec", "mpeg1video");
4089 opt_audio_codec("vcodec", "mp2");
4090 opt_format("f", "vcd");
4092 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4093 opt_frame_rate("r", frame_rates[norm]);
4094 opt_default("g", norm == PAL ? "15" : "18");
4096 opt_default("b", "1150000");
4097 opt_default("maxrate", "1150000");
4098 opt_default("minrate", "1150000");
4099 opt_default("bufsize", "327680"); // 40*1024*8;
4101 opt_default("ab", "224000");
4102 audio_sample_rate = 44100;
4105 opt_default("packetsize", "2324");
4106 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4108 /* We have to offset the PTS, so that it is consistent with the SCR.
4109 SCR starts at 36000, but the first two packs contain only padding
4110 and the first pack from the other stream, respectively, may also have
4111 been written before.
4112 So the real data starts at SCR 36000+3*1200. */
4113 mux_preload= (36000+3*1200) / 90000.0; //0.44
4114 } else if(!strcmp(arg, "svcd")) {
4116 opt_video_codec("vcodec", "mpeg2video");
4117 opt_audio_codec("acodec", "mp2");
4118 opt_format("f", "svcd");
4120 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4121 opt_frame_rate("r", frame_rates[norm]);
4122 opt_default("g", norm == PAL ? "15" : "18");
4124 opt_default("b", "2040000");
4125 opt_default("maxrate", "2516000");
4126 opt_default("minrate", "0"); //1145000;
4127 opt_default("bufsize", "1835008"); //224*1024*8;
4128 opt_default("flags", "+scan_offset");
4131 opt_default("ab", "224000");
4132 audio_sample_rate = 44100;
4134 opt_default("packetsize", "2324");
4136 } else if(!strcmp(arg, "dvd")) {
4138 opt_video_codec("vcodec", "mpeg2video");
4139 opt_audio_codec("vcodec", "ac3");
4140 opt_format("f", "dvd");
4142 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4143 opt_frame_rate("r", frame_rates[norm]);
4144 opt_default("g", norm == PAL ? "15" : "18");
4146 opt_default("b", "6000000");
4147 opt_default("maxrate", "9000000");
4148 opt_default("minrate", "0"); //1500000;
4149 opt_default("bufsize", "1835008"); //224*1024*8;
4151 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4152 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4154 opt_default("ab", "448000");
4155 audio_sample_rate = 48000;
4157 } else if(!strncmp(arg, "dv", 2)) {
4159 opt_format("f", "dv");
4161 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4162 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4163 norm == PAL ? "yuv420p" : "yuv411p");
4164 opt_frame_rate("r", frame_rates[norm]);
4166 audio_sample_rate = 48000;
4170 fprintf(stderr, "Unknown target: %s\n", arg);
4171 return AVERROR(EINVAL);
4176 static int opt_vstats_file(const char *opt, const char *arg)
4178 av_free (vstats_filename);
4179 vstats_filename=av_strdup (arg);
4183 static int opt_vstats(const char *opt, const char *arg)
4186 time_t today2 = time(NULL);
4187 struct tm *today = localtime(&today2);
4189 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4191 return opt_vstats_file(opt, filename);
4194 static int opt_bsf(const char *opt, const char *arg)
4196 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4197 AVBitStreamFilterContext **bsfp;
4200 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4204 bsfp= *opt == 'v' ? &video_bitstream_filters :
4205 *opt == 'a' ? &audio_bitstream_filters :
4206 &subtitle_bitstream_filters;
4208 bsfp= &(*bsfp)->next;
4215 static int opt_preset(const char *opt, const char *arg)
4218 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4219 char *codec_name = *opt == 'v' ? video_codec_name :
4220 *opt == 'a' ? audio_codec_name :
4221 subtitle_codec_name;
4223 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4224 fprintf(stderr, "File for preset '%s' not found\n", arg);
4229 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4230 if(line[0] == '#' && !e)
4232 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4234 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4237 if(!strcmp(tmp, "acodec")){
4238 opt_audio_codec(tmp, tmp2);
4239 }else if(!strcmp(tmp, "vcodec")){
4240 opt_video_codec(tmp, tmp2);
4241 }else if(!strcmp(tmp, "scodec")){
4242 opt_subtitle_codec(tmp, tmp2);
4243 }else if(!strcmp(tmp, "dcodec")){
4244 opt_data_codec(tmp, tmp2);
4245 }else if(opt_default(tmp, tmp2) < 0){
4246 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4256 static const OptionDef options[] = {
4258 #include "cmdutils_common_opts.h"
4259 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4260 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4261 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4262 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4263 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4264 "outfile[,metadata]:infile[,metadata]" },
4265 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4266 "outfile[,metadata]:infile[,metadata]" },
4267 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4268 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4269 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4270 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4271 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4272 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4273 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4274 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4275 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4276 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4277 "add timings for benchmarking" },
4278 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4279 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4280 "dump each input packet" },
4281 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4282 "when dumping packets, also dump the payload" },
4283 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4284 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4285 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4286 { "v", HAS_ARG, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4287 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4288 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4289 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4290 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4291 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4292 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4293 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4294 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4295 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4296 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4297 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4298 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4301 { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4302 { "vb", HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4303 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4304 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4305 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4306 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4307 { "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" },
4308 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4309 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4310 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4311 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4312 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4313 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4314 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4315 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4316 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4317 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4318 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4319 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4320 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4321 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4322 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4323 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4324 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4325 "use same quantizer as source (implies VBR)" },
4326 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4327 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4328 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4329 "deinterlace pictures" },
4330 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4331 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4332 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4334 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4336 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4337 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4338 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4339 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4340 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4341 { "newvideo", OPT_VIDEO, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4342 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4343 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4344 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4345 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4346 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4349 { "ab", HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4350 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4351 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4352 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4353 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4354 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4355 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4356 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4357 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4358 { "newaudio", OPT_AUDIO, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4359 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4360 { "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" },
4362 /* subtitle options */
4363 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4364 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4365 { "newsubtitle", OPT_SUBTITLE, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4366 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4367 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4370 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4371 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4372 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4375 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4376 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4378 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4379 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4380 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4382 { "apre", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4383 { "vpre", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4384 { "spre", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4385 { "fpre", HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4386 /* data codec support */
4387 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4389 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4393 int main(int argc, char **argv)
4397 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4399 avcodec_register_all();
4401 avdevice_register_all();
4404 avfilter_register_all();
4408 avio_set_interrupt_cb(decode_interrupt_cb);
4415 parse_options(argc, argv, options, opt_output_file);
4417 if(nb_output_files <= 0 && nb_input_files == 0) {
4419 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4423 /* file converter / grab */
4424 if (nb_output_files <= 0) {
4425 fprintf(stderr, "At least one output file must be specified\n");
4429 if (nb_input_files == 0) {
4430 fprintf(stderr, "At least one input file must be specified\n");
4435 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4436 stream_maps, nb_stream_maps) < 0)
4438 ti = getutime() - ti;
4440 int maxrss = getmaxrss() / 1024;
4441 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4444 return ffmpeg_exit(0);