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
22 /* needed for usleep() */
23 #define _XOPEN_SOURCE 600
34 #include "libavformat/avformat.h"
35 #include "libavdevice/avdevice.h"
36 #include "libswscale/swscale.h"
37 #include "libavutil/opt.h"
38 #include "libavcodec/audioconvert.h"
39 #include "libavutil/audioconvert.h"
40 #include "libavutil/parseutils.h"
41 #include "libavutil/samplefmt.h"
42 #include "libavutil/colorspace.h"
43 #include "libavutil/fifo.h"
44 #include "libavutil/intreadwrite.h"
45 #include "libavutil/pixdesc.h"
46 #include "libavutil/avstring.h"
47 #include "libavutil/libm.h"
48 #include "libavformat/os_support.h"
51 # include "libavfilter/avfilter.h"
52 # include "libavfilter/avfiltergraph.h"
53 # include "libavfilter/vsrc_buffer.h"
56 #if HAVE_SYS_RESOURCE_H
57 #include <sys/types.h>
59 #include <sys/resource.h>
60 #elif HAVE_GETPROCESSTIMES
63 #if HAVE_GETPROCESSMEMORYINFO
69 #include <sys/select.h>
79 #include "libavutil/avassert.h"
81 const char program_name[] = "ffmpeg";
82 const int program_birth_year = 2000;
84 /* select an input stream for an output stream */
85 typedef struct AVStreamMap {
89 int sync_stream_index;
93 * select an input file for an output file
95 typedef struct AVMetaDataMap {
96 int file; //< file index
97 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
98 int index; //< stream/chapter/program number
101 typedef struct AVChapterMap {
106 static const OptionDef options[];
108 #define MAX_FILES 100
109 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
111 #define FFM_PACKET_SIZE 4096 //XXX a duplicate of the line in ffm.h
113 static const char *last_asked_format = NULL;
114 static AVFormatContext *input_files[MAX_FILES];
115 static int64_t input_files_ts_offset[MAX_FILES];
116 static double *input_files_ts_scale[MAX_FILES] = {NULL};
117 static AVCodec **input_codecs = NULL;
118 static int nb_input_files = 0;
119 static int nb_input_codecs = 0;
120 static int nb_input_files_ts_scale[MAX_FILES] = {0};
122 static AVFormatContext *output_files[MAX_FILES];
123 static AVCodec **output_codecs = NULL;
124 static int nb_output_files = 0;
125 static int nb_output_codecs = 0;
127 static AVStreamMap *stream_maps = NULL;
128 static int nb_stream_maps;
130 /* first item specifies output metadata, second is input */
131 static AVMetaDataMap (*meta_data_maps)[2] = NULL;
132 static int nb_meta_data_maps;
133 static int metadata_global_autocopy = 1;
134 static int metadata_streams_autocopy = 1;
135 static int metadata_chapters_autocopy = 1;
137 static AVChapterMap *chapter_maps = NULL;
138 static int nb_chapter_maps;
140 /* indexed by output file stream index */
141 static int *streamid_map = NULL;
142 static int nb_streamid_map = 0;
144 static int frame_width = 0;
145 static int frame_height = 0;
146 static float frame_aspect_ratio = 0;
147 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
148 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
149 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
150 static AVRational frame_rate;
151 static float video_qscale = 0;
152 static uint16_t *intra_matrix = NULL;
153 static uint16_t *inter_matrix = NULL;
154 static const char *video_rc_override_string=NULL;
155 static int video_disable = 0;
156 static int video_discard = 0;
157 static char *video_codec_name = NULL;
158 static unsigned int video_codec_tag = 0;
159 static char *video_language = NULL;
160 static int same_quality = 0;
161 static int do_deinterlace = 0;
162 static int top_field_first = -1;
163 static int me_threshold = 0;
164 static int intra_dc_precision = 8;
165 static int loop_input = 0;
166 static int loop_output = AVFMT_NOOUTPUTLOOP;
167 static int qp_hist = 0;
169 static char *vfilters = NULL;
170 static AVFilterGraph *graph = NULL;
173 static int intra_only = 0;
174 static int audio_sample_rate = 44100;
175 static int64_t channel_layout = 0;
176 #define QSCALE_NONE -99999
177 static float audio_qscale = QSCALE_NONE;
178 static int audio_disable = 0;
179 static int audio_channels = 1;
180 static char *audio_codec_name = NULL;
181 static unsigned int audio_codec_tag = 0;
182 static char *audio_language = NULL;
184 static int subtitle_disable = 0;
185 static char *subtitle_codec_name = NULL;
186 static char *subtitle_language = NULL;
187 static unsigned int subtitle_codec_tag = 0;
189 static float mux_preload= 0.5;
190 static float mux_max_delay= 0.7;
192 static int64_t recording_time = INT64_MAX;
193 static int64_t start_time = 0;
194 static int64_t recording_timestamp = 0;
195 static int64_t input_ts_offset = 0;
196 static int file_overwrite = 0;
197 static AVMetadata *metadata;
198 static int do_benchmark = 0;
199 static int do_hex_dump = 0;
200 static int do_pkt_dump = 0;
201 static int do_psnr = 0;
202 static int do_pass = 0;
203 static char *pass_logfilename_prefix = NULL;
204 static int audio_stream_copy = 0;
205 static int video_stream_copy = 0;
206 static int subtitle_stream_copy = 0;
207 static int video_sync_method= -1;
208 static int audio_sync_method= 0;
209 static float audio_drift_threshold= 0.1;
210 static int copy_ts= 0;
212 static int opt_shortest = 0;
213 static int video_global_header = 0;
214 static char *vstats_filename;
215 static FILE *vstats_file;
216 static int opt_programid = 0;
217 static int copy_initial_nonkeyframes = 0;
219 static int rate_emu = 0;
221 static int video_channel = 0;
222 static char *video_standard;
224 static int audio_volume = 256;
226 static int exit_on_error = 0;
227 static int using_stdin = 0;
228 static int verbose = 1;
229 static int thread_count= 1;
230 static int q_pressed = 0;
231 static int64_t video_size = 0;
232 static int64_t audio_size = 0;
233 static int64_t extra_size = 0;
234 static int nb_frames_dup = 0;
235 static int nb_frames_drop = 0;
236 static int input_sync;
237 static uint64_t limit_filesize = 0;
238 static int force_fps = 0;
239 static char *forced_key_frames = NULL;
241 static float dts_delta_threshold = 10;
243 static unsigned int sws_flags = SWS_BICUBIC;
245 static int64_t timer_start;
247 static uint8_t *audio_buf;
248 static uint8_t *audio_out;
249 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
251 static short *samples;
253 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
254 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
255 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
257 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
259 struct AVInputStream;
261 typedef struct AVOutputStream {
262 int file_index; /* file index */
263 int index; /* stream index in the output file */
264 int source_index; /* AVInputStream index */
265 AVStream *st; /* stream in the output file */
266 int encoding_needed; /* true if encoding needed for this stream */
268 /* input pts and corresponding output pts
270 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
271 struct AVInputStream *sync_ist; /* input stream to sync against */
272 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
273 AVBitStreamFilterContext *bitstream_filters;
276 AVFrame pict_tmp; /* temporary image for resampling */
277 struct SwsContext *img_resample_ctx; /* for image resampling */
280 int resample_pix_fmt;
282 /* full frame size of first frame */
286 /* forced key frames */
287 int64_t *forced_kf_pts;
293 ReSampleContext *resample; /* for audio resampling */
294 int resample_sample_fmt;
295 int resample_channels;
296 int resample_sample_rate;
298 AVAudioConvert *reformat_ctx;
299 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
303 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
304 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
306 typedef struct AVInputStream {
310 int discard; /* true if stream data should be discarded */
311 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
312 int64_t sample_index; /* current sample */
314 int64_t start; /* time when read started */
315 int64_t next_pts; /* synthetic pts for cases where pkt.pts
317 int64_t pts; /* current pts */
318 PtsCorrectionContext pts_ctx;
319 int is_start; /* is 1 at the start and after a discontinuity */
320 int showed_multi_packet_warning;
321 int is_past_recording_time;
323 AVFilterContext *output_video_filter;
324 AVFilterContext *input_video_filter;
325 AVFrame *filter_frame;
326 int has_filter_frame;
327 AVFilterBufferRef *picref;
331 typedef struct AVInputFile {
332 int eof_reached; /* true if eof reached */
333 int ist_index; /* index of first stream in ist_table */
334 int buffer_size; /* current total buffer size */
335 int nb_streams; /* nb streams we are aware of */
340 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
342 AVFilterContext *last_filter, *filter;
343 /** filter graph containing all filters including input & output */
344 AVCodecContext *codec = ost->st->codec;
345 AVCodecContext *icodec = ist->st->codec;
346 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
347 AVRational sample_aspect_ratio;
351 graph = avfilter_graph_alloc();
353 if (ist->st->sample_aspect_ratio.num){
354 sample_aspect_ratio = ist->st->sample_aspect_ratio;
356 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
358 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
359 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
360 sample_aspect_ratio.num, sample_aspect_ratio.den);
362 ret = avfilter_graph_create_filter(&ist->input_video_filter, avfilter_get_by_name("buffer"),
363 "src", args, NULL, graph);
366 ret = avfilter_graph_create_filter(&ist->output_video_filter, &ffsink,
367 "out", NULL, &ffsink_ctx, graph);
370 last_filter = ist->input_video_filter;
372 if (codec->width != icodec->width || codec->height != icodec->height) {
373 snprintf(args, 255, "%d:%d:flags=0x%X",
376 (int)av_get_int(sws_opts, "sws_flags", NULL));
377 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
378 NULL, args, NULL, graph)) < 0)
380 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
382 last_filter = filter;
385 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
386 graph->scale_sws_opts = av_strdup(args);
389 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
390 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
392 outputs->name = av_strdup("in");
393 outputs->filter_ctx = last_filter;
394 outputs->pad_idx = 0;
395 outputs->next = NULL;
397 inputs->name = av_strdup("out");
398 inputs->filter_ctx = ist->output_video_filter;
402 if ((ret = avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL)) < 0)
406 if ((ret = avfilter_link(last_filter, 0, ist->output_video_filter, 0)) < 0)
410 if ((ret = avfilter_graph_config(graph, NULL)) < 0)
413 codec->width = ist->output_video_filter->inputs[0]->w;
414 codec->height = ist->output_video_filter->inputs[0]->h;
415 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
416 ist->output_video_filter->inputs[0]->sample_aspect_ratio;
420 #endif /* CONFIG_AVFILTER */
422 static void term_exit(void)
424 av_log(NULL, AV_LOG_QUIET, "");
427 static volatile int received_sigterm = 0;
430 sigterm_handler(int sig)
432 received_sigterm = sig;
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 /* read a key without blocking */
446 static int read_key(void)
455 static int decode_interrupt_cb(void)
457 return q_pressed || (q_pressed = read_key() == 'q');
460 static int ffmpeg_exit(int ret)
465 for(i=0;i<nb_output_files;i++) {
466 AVFormatContext *s = output_files[i];
467 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
469 avformat_free_context(s);
470 av_free(output_streams_for_file[i]);
472 for(i=0;i<nb_input_files;i++) {
473 av_close_input_file(input_files[i]);
474 av_free(input_files_ts_scale[i]);
477 av_free(intra_matrix);
478 av_free(inter_matrix);
482 av_free(vstats_filename);
484 av_free(streamid_map);
485 av_free(input_codecs);
486 av_free(output_codecs);
487 av_free(stream_maps);
488 av_free(meta_data_maps);
490 av_free(video_codec_name);
491 av_free(audio_codec_name);
492 av_free(subtitle_codec_name);
494 av_free(video_standard);
499 allocated_audio_buf_size= allocated_audio_out_size= 0;
506 if (received_sigterm) {
508 "Received signal %d: terminating.\n",
509 (int) received_sigterm);
513 exit(ret); /* not all OS-es handle main() return value */
517 /* similar to ff_dynarray_add() and av_fast_realloc() */
518 static void *grow_array(void *array, int elem_size, int *size, int new_size)
520 if (new_size >= INT_MAX / elem_size) {
521 fprintf(stderr, "Array too big.\n");
524 if (*size < new_size) {
525 uint8_t *tmp = av_realloc(array, new_size*elem_size);
527 fprintf(stderr, "Could not alloc buffer.\n");
530 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
537 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
539 if(codec && codec->sample_fmts){
540 const enum AVSampleFormat *p= codec->sample_fmts;
542 if(*p == st->codec->sample_fmt)
546 av_log(NULL, AV_LOG_WARNING,
547 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
548 av_get_sample_fmt_name(st->codec->sample_fmt),
550 av_get_sample_fmt_name(codec->sample_fmts[0]));
551 st->codec->sample_fmt = codec->sample_fmts[0];
556 static void choose_sample_rate(AVStream *st, AVCodec *codec)
558 if(codec && codec->supported_samplerates){
559 const int *p= codec->supported_samplerates;
561 int best_dist=INT_MAX;
563 int dist= abs(st->codec->sample_rate - *p);
564 if(dist < best_dist){
570 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
572 st->codec->sample_rate= best;
576 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
578 if(codec && codec->pix_fmts){
579 const enum PixelFormat *p= codec->pix_fmts;
580 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
581 if(st->codec->codec_id==CODEC_ID_MJPEG){
582 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
583 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
584 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};
588 if(*p == st->codec->pix_fmt)
592 st->codec->pix_fmt = codec->pix_fmts[0];
596 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
598 int idx = oc->nb_streams - 1;
601 output_streams_for_file[file_idx] =
602 grow_array(output_streams_for_file[file_idx],
603 sizeof(*output_streams_for_file[file_idx]),
604 &nb_output_streams_for_file[file_idx],
606 ost = output_streams_for_file[file_idx][idx] =
607 av_mallocz(sizeof(AVOutputStream));
609 fprintf(stderr, "Could not alloc output stream\n");
612 ost->file_index = file_idx;
617 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
623 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
626 /* copy stream format */
628 for(i=0;i<ic->nb_streams;i++) {
634 // FIXME: a more elegant solution is needed
635 st = av_mallocz(sizeof(AVStream));
636 memcpy(st, ic->streams[i], sizeof(AVStream));
637 st->codec = avcodec_alloc_context();
639 print_error(filename, AVERROR(ENOMEM));
642 avcodec_copy_context(st->codec, ic->streams[i]->codec);
645 codec = avcodec_find_encoder(st->codec->codec_id);
646 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
647 if (audio_stream_copy) {
650 choose_sample_fmt(st, codec);
651 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
652 if (video_stream_copy) {
655 choose_pixel_fmt(st, codec);
658 if(st->codec->flags & CODEC_FLAG_BITEXACT)
661 new_output_stream(s, nb_output_files);
665 s->timestamp = av_gettime();
667 av_close_input_file(ic);
672 get_sync_ipts(const AVOutputStream *ost)
674 const AVInputStream *ist = ost->sync_ist;
675 return (double)(ist->pts - start_time)/AV_TIME_BASE;
678 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
682 AVPacket new_pkt= *pkt;
683 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
684 &new_pkt.data, &new_pkt.size,
685 pkt->data, pkt->size,
686 pkt->flags & AV_PKT_FLAG_KEY);
689 new_pkt.destruct= av_destruct_packet;
691 fprintf(stderr, "%s failed for stream %d, codec %s",
692 bsfc->filter->name, pkt->stream_index,
693 avctx->codec ? avctx->codec->name : "copy");
703 ret= av_interleaved_write_frame(s, pkt);
705 print_error("av_interleaved_write_frame()", ret);
710 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
712 static void do_audio_out(AVFormatContext *s,
715 unsigned char *buf, int size)
718 int64_t audio_out_size, audio_buf_size;
719 int64_t allocated_for_size= size;
721 int size_out, frame_bytes, ret, resample_changed;
722 AVCodecContext *enc= ost->st->codec;
723 AVCodecContext *dec= ist->st->codec;
724 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
725 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
726 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
729 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
730 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
731 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
732 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
733 audio_buf_size*= osize*enc->channels;
735 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
736 if(coded_bps > 8*osize)
737 audio_out_size= audio_out_size * coded_bps / (8*osize);
738 audio_out_size += FF_MIN_BUFFER_SIZE;
740 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
741 fprintf(stderr, "Buffer sizes too large\n");
745 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
746 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
747 if (!audio_buf || !audio_out){
748 fprintf(stderr, "Out of memory in do_audio_out\n");
752 if (enc->channels != dec->channels)
753 ost->audio_resample = 1;
755 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
756 ost->resample_channels != dec->channels ||
757 ost->resample_sample_rate != dec->sample_rate;
759 if ((ost->audio_resample && !ost->resample) || resample_changed) {
760 if (resample_changed) {
761 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",
762 ist->file_index, ist->index,
763 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
764 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
765 ost->resample_sample_fmt = dec->sample_fmt;
766 ost->resample_channels = dec->channels;
767 ost->resample_sample_rate = dec->sample_rate;
769 audio_resample_close(ost->resample);
771 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
772 if (audio_sync_method <= 1 &&
773 ost->resample_sample_fmt == enc->sample_fmt &&
774 ost->resample_channels == enc->channels &&
775 ost->resample_sample_rate == enc->sample_rate) {
776 ost->resample = NULL;
777 ost->audio_resample = 0;
779 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
780 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
781 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
782 enc->sample_rate, dec->sample_rate,
783 enc->sample_fmt, dec->sample_fmt,
785 if (!ost->resample) {
786 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
787 dec->channels, dec->sample_rate,
788 enc->channels, enc->sample_rate);
794 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
795 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
796 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
797 if (ost->reformat_ctx)
798 av_audio_convert_free(ost->reformat_ctx);
799 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
800 dec->sample_fmt, 1, NULL, 0);
801 if (!ost->reformat_ctx) {
802 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
803 av_get_sample_fmt_name(dec->sample_fmt),
804 av_get_sample_fmt_name(enc->sample_fmt));
807 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
810 if(audio_sync_method){
811 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
812 - av_fifo_size(ost->fifo)/(enc->channels * 2);
813 double idelta= delta*dec->sample_rate / enc->sample_rate;
814 int byte_delta= ((int)idelta)*2*dec->channels;
816 //FIXME resample delay
817 if(fabs(delta) > 50){
818 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
820 byte_delta= FFMAX(byte_delta, -size);
824 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
829 static uint8_t *input_tmp= NULL;
830 input_tmp= av_realloc(input_tmp, byte_delta + size);
832 if(byte_delta > allocated_for_size - size){
833 allocated_for_size= byte_delta + (int64_t)size;
838 memset(input_tmp, 0, byte_delta);
839 memcpy(input_tmp + byte_delta, buf, size);
843 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
845 }else if(audio_sync_method>1){
846 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
847 av_assert0(ost->audio_resample);
849 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
850 // 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));
851 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
855 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
856 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
858 if (ost->audio_resample) {
860 size_out = audio_resample(ost->resample,
861 (short *)buftmp, (short *)buf,
862 size / (dec->channels * isize));
863 size_out = size_out * enc->channels * osize;
869 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
870 const void *ibuf[6]= {buftmp};
871 void *obuf[6]= {audio_buf};
872 int istride[6]= {isize};
873 int ostride[6]= {osize};
874 int len= size_out/istride[0];
875 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
876 printf("av_audio_convert() failed\n");
882 size_out = len*osize;
885 /* now encode as many frames as possible */
886 if (enc->frame_size > 1) {
887 /* output resampled raw samples */
888 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
889 fprintf(stderr, "av_fifo_realloc2() failed\n");
892 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
894 frame_bytes = enc->frame_size * osize * enc->channels;
896 while (av_fifo_size(ost->fifo) >= frame_bytes) {
898 av_init_packet(&pkt);
900 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
902 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
904 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
907 fprintf(stderr, "Audio encoding failed\n");
911 pkt.stream_index= ost->index;
914 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
915 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
916 pkt.flags |= AV_PKT_FLAG_KEY;
917 write_frame(s, &pkt, enc, ost->bitstream_filters);
919 ost->sync_opts += enc->frame_size;
923 av_init_packet(&pkt);
925 ost->sync_opts += size_out / (osize * enc->channels);
927 /* output a pcm frame */
928 /* determine the size of the coded buffer */
931 size_out = size_out*coded_bps/8;
933 if(size_out > audio_out_size){
934 fprintf(stderr, "Internal error, buffer size too small\n");
938 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
939 ret = avcodec_encode_audio(enc, audio_out, size_out,
942 fprintf(stderr, "Audio encoding failed\n");
946 pkt.stream_index= ost->index;
949 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
950 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
951 pkt.flags |= AV_PKT_FLAG_KEY;
952 write_frame(s, &pkt, enc, ost->bitstream_filters);
956 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
960 AVPicture picture_tmp;
963 dec = ist->st->codec;
965 /* deinterlace : must be done before any resize */
966 if (do_deinterlace) {
969 /* create temporary picture */
970 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
971 buf = av_malloc(size);
975 picture2 = &picture_tmp;
976 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
978 if(avpicture_deinterlace(picture2, picture,
979 dec->pix_fmt, dec->width, dec->height) < 0) {
980 /* if error, do not deinterlace */
981 fprintf(stderr, "Deinterlacing failed\n");
990 if (picture != picture2)
991 *picture = *picture2;
995 /* we begin to correct av delay at this threshold */
996 #define AV_DELAY_MAX 0.100
998 static void do_subtitle_out(AVFormatContext *s,
1004 static uint8_t *subtitle_out = NULL;
1005 int subtitle_out_max_size = 1024 * 1024;
1006 int subtitle_out_size, nb, i;
1007 AVCodecContext *enc;
1010 if (pts == AV_NOPTS_VALUE) {
1011 fprintf(stderr, "Subtitle packets must have a pts\n");
1017 enc = ost->st->codec;
1019 if (!subtitle_out) {
1020 subtitle_out = av_malloc(subtitle_out_max_size);
1023 /* Note: DVB subtitle need one packet to draw them and one other
1024 packet to clear them */
1025 /* XXX: signal it in the codec context ? */
1026 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1031 for(i = 0; i < nb; i++) {
1032 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1033 // start_display_time is required to be 0
1034 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1035 sub->end_display_time -= sub->start_display_time;
1036 sub->start_display_time = 0;
1037 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1038 subtitle_out_max_size, sub);
1039 if (subtitle_out_size < 0) {
1040 fprintf(stderr, "Subtitle encoding failed\n");
1044 av_init_packet(&pkt);
1045 pkt.stream_index = ost->index;
1046 pkt.data = subtitle_out;
1047 pkt.size = subtitle_out_size;
1048 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1049 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1050 /* XXX: the pts correction is handled here. Maybe handling
1051 it in the codec would be better */
1053 pkt.pts += 90 * sub->start_display_time;
1055 pkt.pts += 90 * sub->end_display_time;
1057 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1061 static int bit_buffer_size= 1024*256;
1062 static uint8_t *bit_buffer= NULL;
1064 static void do_video_out(AVFormatContext *s,
1065 AVOutputStream *ost,
1067 AVFrame *in_picture,
1070 int nb_frames, i, ret;
1071 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1072 AVCodecContext *enc, *dec;
1075 enc = ost->st->codec;
1076 dec = ist->st->codec;
1078 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1080 /* by default, we output a single frame */
1085 if(video_sync_method){
1086 double vdelta = sync_ipts - ost->sync_opts;
1087 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1090 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1093 }else if(vdelta>0.6)
1094 ost->sync_opts= lrintf(sync_ipts);
1095 }else if (vdelta > 1.1)
1096 nb_frames = lrintf(vdelta);
1097 //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);
1098 if (nb_frames == 0){
1101 fprintf(stderr, "*** drop!\n");
1102 }else if (nb_frames > 1) {
1103 nb_frames_dup += nb_frames - 1;
1105 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1108 ost->sync_opts= lrintf(sync_ipts);
1110 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1114 formatted_picture = in_picture;
1115 final_picture = formatted_picture;
1116 padding_src = formatted_picture;
1117 resampling_dst = &ost->pict_tmp;
1119 if ( ost->resample_height != ist->st->codec->height
1120 || ost->resample_width != ist->st->codec->width
1121 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1123 fprintf(stderr,"Input Stream #%d.%d frame size changed to %dx%d, %s\n", ist->file_index, ist->index, ist->st->codec->width, ist->st->codec->height,avcodec_get_pix_fmt_name(ist->st->codec->pix_fmt));
1124 if(!ost->video_resample)
1128 #if !CONFIG_AVFILTER
1129 if (ost->video_resample) {
1131 final_picture = &ost->pict_tmp;
1132 if( ost->resample_height != ist->st->codec->height
1133 || ost->resample_width != ist->st->codec->width
1134 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1136 /* initialize a new scaler context */
1137 sws_freeContext(ost->img_resample_ctx);
1138 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1139 ost->img_resample_ctx = sws_getContext(
1140 ist->st->codec->width,
1141 ist->st->codec->height,
1142 ist->st->codec->pix_fmt,
1143 ost->st->codec->width,
1144 ost->st->codec->height,
1145 ost->st->codec->pix_fmt,
1146 sws_flags, NULL, NULL, NULL);
1147 if (ost->img_resample_ctx == NULL) {
1148 fprintf(stderr, "Cannot get resampling context\n");
1152 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1153 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1157 /* duplicates frame if needed */
1158 for(i=0;i<nb_frames;i++) {
1160 av_init_packet(&pkt);
1161 pkt.stream_index= ost->index;
1163 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1164 /* raw pictures are written as AVPicture structure to
1165 avoid any copies. We support temorarily the older
1167 AVFrame* old_frame = enc->coded_frame;
1168 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1169 pkt.data= (uint8_t *)final_picture;
1170 pkt.size= sizeof(AVPicture);
1171 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1172 pkt.flags |= AV_PKT_FLAG_KEY;
1174 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1175 enc->coded_frame = old_frame;
1177 AVFrame big_picture;
1179 big_picture= *final_picture;
1180 /* better than nothing: use input picture interlaced
1182 big_picture.interlaced_frame = in_picture->interlaced_frame;
1183 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1184 if(top_field_first == -1)
1185 big_picture.top_field_first = in_picture->top_field_first;
1187 big_picture.top_field_first = top_field_first;
1190 /* handles sameq here. This is not correct because it may
1191 not be a global option */
1192 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1194 big_picture.pict_type = 0;
1195 // big_picture.pts = AV_NOPTS_VALUE;
1196 big_picture.pts= ost->sync_opts;
1197 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1198 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1199 if (ost->forced_kf_index < ost->forced_kf_count &&
1200 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1201 big_picture.pict_type = FF_I_TYPE;
1202 ost->forced_kf_index++;
1204 ret = avcodec_encode_video(enc,
1205 bit_buffer, bit_buffer_size,
1208 fprintf(stderr, "Video encoding failed\n");
1213 pkt.data= bit_buffer;
1215 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1216 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1217 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1218 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1219 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1221 if(enc->coded_frame->key_frame)
1222 pkt.flags |= AV_PKT_FLAG_KEY;
1223 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1226 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1227 // enc->frame_number-1, ret, enc->pict_type);
1228 /* if two pass, output log */
1229 if (ost->logfile && enc->stats_out) {
1230 fprintf(ost->logfile, "%s", enc->stats_out);
1235 ost->frame_number++;
1239 static double psnr(double d){
1240 return -10.0*log(d)/log(10.0);
1243 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1246 AVCodecContext *enc;
1248 double ti1, bitrate, avg_bitrate;
1250 /* this is executed just the first time do_video_stats is called */
1252 vstats_file = fopen(vstats_filename, "w");
1259 enc = ost->st->codec;
1260 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1261 frame_number = ost->frame_number;
1262 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1263 if (enc->flags&CODEC_FLAG_PSNR)
1264 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1266 fprintf(vstats_file,"f_size= %6d ", frame_size);
1267 /* compute pts value */
1268 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1272 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1273 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1274 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1275 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1276 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1280 static void print_report(AVFormatContext **output_files,
1281 AVOutputStream **ost_table, int nb_ostreams,
1285 AVOutputStream *ost;
1286 AVFormatContext *oc;
1288 AVCodecContext *enc;
1289 int frame_number, vid, i;
1290 double bitrate, ti1, pts;
1291 static int64_t last_time = -1;
1292 static int qp_histogram[52];
1294 if (!is_last_report) {
1296 /* display the report every 0.5 seconds */
1297 cur_time = av_gettime();
1298 if (last_time == -1) {
1299 last_time = cur_time;
1302 if ((cur_time - last_time) < 500000)
1304 last_time = cur_time;
1308 oc = output_files[0];
1310 total_size = avio_size(oc->pb);
1311 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1312 total_size= avio_tell(oc->pb);
1317 for(i=0;i<nb_ostreams;i++) {
1319 enc = ost->st->codec;
1320 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1321 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1322 !ost->st->stream_copy ?
1323 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1325 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1326 float t = (av_gettime()-timer_start) / 1000000.0;
1328 frame_number = ost->frame_number;
1329 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1330 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1331 !ost->st->stream_copy ?
1332 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1334 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1337 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1338 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1341 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1343 if (enc->flags&CODEC_FLAG_PSNR){
1345 double error, error_sum=0;
1346 double scale, scale_sum=0;
1347 char type[3]= {'Y','U','V'};
1348 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1351 error= enc->error[j];
1352 scale= enc->width*enc->height*255.0*255.0*frame_number;
1354 error= enc->coded_frame->error[j];
1355 scale= enc->width*enc->height*255.0*255.0;
1360 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1362 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1366 /* compute min output value */
1367 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1368 if ((pts < ti1) && (pts > 0))
1374 if (verbose || is_last_report) {
1375 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1377 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1378 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1379 (double)total_size / 1024, ti1, bitrate);
1381 if (nb_frames_dup || nb_frames_drop)
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1383 nb_frames_dup, nb_frames_drop);
1386 fprintf(stderr, "%s \r", buf);
1391 if (is_last_report && verbose >= 0){
1392 int64_t raw= audio_size + video_size + extra_size;
1393 fprintf(stderr, "\n");
1394 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1398 100.0*(total_size - raw)/raw
1403 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1405 int fill_char = 0x00;
1406 if (sample_fmt == AV_SAMPLE_FMT_U8)
1408 memset(buf, fill_char, size);
1411 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1412 static int output_packet(AVInputStream *ist, int ist_index,
1413 AVOutputStream **ost_table, int nb_ostreams,
1414 const AVPacket *pkt)
1416 AVFormatContext *os;
1417 AVOutputStream *ost;
1421 void *buffer_to_free;
1422 static unsigned int samples_size= 0;
1423 AVSubtitle subtitle, *subtitle_to_free;
1424 int64_t pkt_pts = AV_NOPTS_VALUE;
1426 int frame_available;
1430 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1432 if(ist->next_pts == AV_NOPTS_VALUE)
1433 ist->next_pts= ist->pts;
1437 av_init_packet(&avpkt);
1445 if(pkt->dts != AV_NOPTS_VALUE)
1446 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1447 if(pkt->pts != AV_NOPTS_VALUE)
1448 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1450 //while we have more to decode or while the decoder did output something on EOF
1451 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1452 uint8_t *data_buf, *decoded_data_buf;
1453 int data_size, decoded_data_size;
1455 ist->pts= ist->next_pts;
1457 if(avpkt.size && avpkt.size != pkt->size &&
1458 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1459 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1460 ist->showed_multi_packet_warning=1;
1463 /* decode the packet if needed */
1464 decoded_data_buf = NULL; /* fail safe */
1465 decoded_data_size= 0;
1466 data_buf = avpkt.data;
1467 data_size = avpkt.size;
1468 subtitle_to_free = NULL;
1469 if (ist->decoding_needed) {
1470 switch(ist->st->codec->codec_type) {
1471 case AVMEDIA_TYPE_AUDIO:{
1472 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1473 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1475 samples= av_malloc(samples_size);
1477 decoded_data_size= samples_size;
1478 /* XXX: could avoid copy if PCM 16 bits with same
1479 endianness as CPU */
1480 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1487 /* Some bug in mpeg audio decoder gives */
1488 /* decoded_data_size < 0, it seems they are overflows */
1489 if (decoded_data_size <= 0) {
1490 /* no audio frame */
1493 decoded_data_buf = (uint8_t *)samples;
1494 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1495 (ist->st->codec->sample_rate * ist->st->codec->channels);
1497 case AVMEDIA_TYPE_VIDEO:
1498 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1499 /* XXX: allocate picture correctly */
1500 avcodec_get_frame_defaults(&picture);
1501 avpkt.pts = pkt_pts;
1502 avpkt.dts = ist->pts;
1503 pkt_pts = AV_NOPTS_VALUE;
1505 ret = avcodec_decode_video2(ist->st->codec,
1506 &picture, &got_picture, &avpkt);
1507 ist->st->quality= picture.quality;
1511 /* no picture yet */
1512 goto discard_packet;
1514 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1515 if (ist->st->codec->time_base.num != 0) {
1516 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1517 ist->next_pts += ((int64_t)AV_TIME_BASE *
1518 ist->st->codec->time_base.num * ticks) /
1519 ist->st->codec->time_base.den;
1523 case AVMEDIA_TYPE_SUBTITLE:
1524 ret = avcodec_decode_subtitle2(ist->st->codec,
1525 &subtitle, &got_picture, &avpkt);
1529 goto discard_packet;
1531 subtitle_to_free = &subtitle;
1538 switch(ist->st->codec->codec_type) {
1539 case AVMEDIA_TYPE_AUDIO:
1540 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1541 ist->st->codec->sample_rate;
1543 case AVMEDIA_TYPE_VIDEO:
1544 if (ist->st->codec->time_base.num != 0) {
1545 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1546 ist->next_pts += ((int64_t)AV_TIME_BASE *
1547 ist->st->codec->time_base.num * ticks) /
1548 ist->st->codec->time_base.den;
1556 buffer_to_free = NULL;
1557 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1558 pre_process_video_frame(ist, (AVPicture *)&picture,
1563 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->input_video_filter) {
1565 if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
1566 else sar = ist->st->codec->sample_aspect_ratio;
1567 // add it to be filtered
1568 av_vsrc_buffer_add_frame(ist->input_video_filter, &picture,
1574 // preprocess audio (volume)
1575 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1576 if (audio_volume != 256) {
1579 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1580 int v = ((*volp) * audio_volume + 128) >> 8;
1581 if (v < -32768) v = -32768;
1582 if (v > 32767) v = 32767;
1588 /* frame rate emulation */
1590 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1591 int64_t now = av_gettime() - ist->start;
1596 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1597 !ist->output_video_filter || avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1599 /* if output time reached then transcode raw format,
1600 encode packets and output them */
1601 if (start_time == 0 || ist->pts >= start_time)
1603 while (frame_available) {
1604 AVRational ist_pts_tb;
1605 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ist->output_video_filter)
1606 get_filtered_video_frame(ist->output_video_filter, &picture, &ist->picref, &ist_pts_tb);
1608 ist->pts = av_rescale_q(ist->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1610 for(i=0;i<nb_ostreams;i++) {
1614 if (ost->source_index == ist_index) {
1615 os = output_files[ost->file_index];
1617 /* set the input output pts pairs */
1618 //ost->sync_ipts = (double)(ist->pts + input_files_ts_offset[ist->file_index] - start_time)/ AV_TIME_BASE;
1620 if (ost->encoding_needed) {
1621 av_assert0(ist->decoding_needed);
1622 switch(ost->st->codec->codec_type) {
1623 case AVMEDIA_TYPE_AUDIO:
1624 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1626 case AVMEDIA_TYPE_VIDEO:
1628 if (ist->picref->video)
1629 ost->st->codec->sample_aspect_ratio = ist->picref->video->pixel_aspect;
1631 do_video_out(os, ost, ist, &picture, &frame_size);
1632 if (vstats_filename && frame_size)
1633 do_video_stats(os, ost, frame_size);
1635 case AVMEDIA_TYPE_SUBTITLE:
1636 do_subtitle_out(os, ost, ist, &subtitle,
1643 AVFrame avframe; //FIXME/XXX remove this
1645 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1647 av_init_packet(&opkt);
1649 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1652 /* no reencoding needed : output the packet directly */
1653 /* force the input stream PTS */
1655 avcodec_get_frame_defaults(&avframe);
1656 ost->st->codec->coded_frame= &avframe;
1657 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1659 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1660 audio_size += data_size;
1661 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1662 video_size += data_size;
1666 opkt.stream_index= ost->index;
1667 if(pkt->pts != AV_NOPTS_VALUE)
1668 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1670 opkt.pts= AV_NOPTS_VALUE;
1672 if (pkt->dts == AV_NOPTS_VALUE)
1673 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1675 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1676 opkt.dts -= ost_tb_start_time;
1678 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1679 opkt.flags= pkt->flags;
1681 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1682 if( ost->st->codec->codec_id != CODEC_ID_H264
1683 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1684 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1686 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1687 opkt.destruct= av_destruct_packet;
1689 opkt.data = data_buf;
1690 opkt.size = data_size;
1693 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1694 ost->st->codec->frame_number++;
1695 ost->frame_number++;
1696 av_free_packet(&opkt);
1702 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1703 ist->output_video_filter && avfilter_poll_frame(ist->output_video_filter->inputs[0]);
1705 avfilter_unref_buffer(ist->picref);
1708 av_free(buffer_to_free);
1709 /* XXX: allocate the subtitles in the codec ? */
1710 if (subtitle_to_free) {
1711 avsubtitle_free(subtitle_to_free);
1712 subtitle_to_free = NULL;
1719 for(i=0;i<nb_ostreams;i++) {
1721 if (ost->source_index == ist_index) {
1722 AVCodecContext *enc= ost->st->codec;
1723 os = output_files[ost->file_index];
1725 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1727 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1730 if (ost->encoding_needed) {
1734 av_init_packet(&pkt);
1735 pkt.stream_index= ost->index;
1737 switch(ost->st->codec->codec_type) {
1738 case AVMEDIA_TYPE_AUDIO:
1739 fifo_bytes = av_fifo_size(ost->fifo);
1741 /* encode any samples remaining in fifo */
1742 if (fifo_bytes > 0) {
1743 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1744 int fs_tmp = enc->frame_size;
1746 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1747 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1748 enc->frame_size = fifo_bytes / (osize * enc->channels);
1750 int frame_bytes = enc->frame_size*osize*enc->channels;
1751 if (allocated_audio_buf_size < frame_bytes)
1753 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1756 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1757 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1758 ost->st->time_base.num, enc->sample_rate);
1759 enc->frame_size = fs_tmp;
1762 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1765 fprintf(stderr, "Audio encoding failed\n");
1769 pkt.flags |= AV_PKT_FLAG_KEY;
1771 case AVMEDIA_TYPE_VIDEO:
1772 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1774 fprintf(stderr, "Video encoding failed\n");
1778 if(enc->coded_frame && enc->coded_frame->key_frame)
1779 pkt.flags |= AV_PKT_FLAG_KEY;
1780 if (ost->logfile && enc->stats_out) {
1781 fprintf(ost->logfile, "%s", enc->stats_out);
1790 pkt.data= bit_buffer;
1792 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1793 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1794 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1806 static void print_sdp(AVFormatContext **avc, int n)
1810 av_sdp_create(avc, n, sdp, sizeof(sdp));
1811 printf("SDP:\n%s\n", sdp);
1815 static int copy_chapters(int infile, int outfile)
1817 AVFormatContext *is = input_files[infile];
1818 AVFormatContext *os = output_files[outfile];
1821 for (i = 0; i < is->nb_chapters; i++) {
1822 AVChapter *in_ch = is->chapters[i], *out_ch;
1823 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1824 AV_TIME_BASE_Q, in_ch->time_base);
1825 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1826 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1829 if (in_ch->end < ts_off)
1831 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1834 out_ch = av_mallocz(sizeof(AVChapter));
1836 return AVERROR(ENOMEM);
1838 out_ch->id = in_ch->id;
1839 out_ch->time_base = in_ch->time_base;
1840 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1841 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1843 if (metadata_chapters_autocopy)
1844 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1847 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1849 return AVERROR(ENOMEM);
1850 os->chapters[os->nb_chapters - 1] = out_ch;
1855 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1856 AVCodecContext *avctx)
1862 for (p = kf; *p; p++)
1865 ost->forced_kf_count = n;
1866 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1867 if (!ost->forced_kf_pts) {
1868 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1871 for (i = 0; i < n; i++) {
1872 p = i ? strchr(p, ',') + 1 : kf;
1873 t = parse_time_or_die("force_key_frames", p, 1);
1874 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1879 * The following code is the main loop of the file converter
1881 static int transcode(AVFormatContext **output_files,
1882 int nb_output_files,
1883 AVFormatContext **input_files,
1885 AVStreamMap *stream_maps, int nb_stream_maps)
1887 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1888 AVFormatContext *is, *os;
1889 AVCodecContext *codec, *icodec;
1890 AVOutputStream *ost, **ost_table = NULL;
1891 AVInputStream *ist, **ist_table = NULL;
1892 AVInputFile *file_table;
1896 uint8_t no_packet[MAX_FILES]={0};
1897 int no_packet_count=0;
1899 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1903 /* input stream init */
1905 for(i=0;i<nb_input_files;i++) {
1906 is = input_files[i];
1907 file_table[i].ist_index = j;
1908 file_table[i].nb_streams = is->nb_streams;
1909 j += is->nb_streams;
1913 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1917 for(i=0;i<nb_istreams;i++) {
1918 ist = av_mallocz(sizeof(AVInputStream));
1924 for(i=0;i<nb_input_files;i++) {
1925 is = input_files[i];
1926 for(k=0;k<is->nb_streams;k++) {
1927 ist = ist_table[j++];
1928 ist->st = is->streams[k];
1929 ist->file_index = i;
1931 ist->discard = 1; /* the stream is discarded by default
1935 ist->start = av_gettime();
1940 /* output stream init */
1942 for(i=0;i<nb_output_files;i++) {
1943 os = output_files[i];
1944 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1945 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1946 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1947 ret = AVERROR(EINVAL);
1950 nb_ostreams += os->nb_streams;
1952 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1953 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1954 ret = AVERROR(EINVAL);
1958 /* Sanity check the mapping args -- do the input files & streams exist? */
1959 for(i=0;i<nb_stream_maps;i++) {
1960 int fi = stream_maps[i].file_index;
1961 int si = stream_maps[i].stream_index;
1963 if (fi < 0 || fi > nb_input_files - 1 ||
1964 si < 0 || si > file_table[fi].nb_streams - 1) {
1965 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1966 ret = AVERROR(EINVAL);
1969 fi = stream_maps[i].sync_file_index;
1970 si = stream_maps[i].sync_stream_index;
1971 if (fi < 0 || fi > nb_input_files - 1 ||
1972 si < 0 || si > file_table[fi].nb_streams - 1) {
1973 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1974 ret = AVERROR(EINVAL);
1979 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1983 for(k=0;k<nb_output_files;k++) {
1984 os = output_files[k];
1985 for(i=0;i<os->nb_streams;i++,n++) {
1987 ost = ost_table[n] = output_streams_for_file[k][i];
1988 ost->st = os->streams[i];
1989 if (nb_stream_maps > 0) {
1990 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1991 stream_maps[n].stream_index;
1993 /* Sanity check that the stream types match */
1994 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
1995 int i= ost->file_index;
1996 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1997 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
1998 stream_maps[n].file_index, stream_maps[n].stream_index,
1999 ost->file_index, ost->index);
2004 int best_nb_frames=-1;
2005 /* get corresponding input stream index : we select the first one with the right type */
2007 for(j=0;j<nb_istreams;j++) {
2012 AVFormatContext *f= input_files[ ist->file_index ];
2014 for(pi=0; pi<f->nb_programs; pi++){
2015 AVProgram *p= f->programs[pi];
2016 if(p->id == opt_programid)
2017 for(si=0; si<p->nb_stream_indexes; si++){
2018 if(f->streams[ p->stream_index[si] ] == ist->st)
2023 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2024 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2025 if(best_nb_frames < ist->st->codec_info_nb_frames){
2026 best_nb_frames= ist->st->codec_info_nb_frames;
2027 ost->source_index = j;
2034 if(! opt_programid) {
2035 /* try again and reuse existing stream */
2036 for(j=0;j<nb_istreams;j++) {
2038 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2039 && ist->st->discard != AVDISCARD_ALL) {
2040 ost->source_index = j;
2046 int i= ost->file_index;
2047 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2048 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2049 ost->file_index, ost->index);
2054 ist = ist_table[ost->source_index];
2056 ost->sync_ist = (nb_stream_maps > 0) ?
2057 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2058 stream_maps[n].sync_stream_index] : ist;
2062 /* for each output stream, we compute the right encoding parameters */
2063 for(i=0;i<nb_ostreams;i++) {
2065 os = output_files[ost->file_index];
2066 ist = ist_table[ost->source_index];
2068 codec = ost->st->codec;
2069 icodec = ist->st->codec;
2071 if (metadata_streams_autocopy)
2072 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2073 AV_METADATA_DONT_OVERWRITE);
2075 ost->st->disposition = ist->st->disposition;
2076 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2077 codec->chroma_sample_location = icodec->chroma_sample_location;
2079 if (ost->st->stream_copy) {
2080 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2082 if (extra_size > INT_MAX)
2085 /* if stream_copy is selected, no need to decode or encode */
2086 codec->codec_id = icodec->codec_id;
2087 codec->codec_type = icodec->codec_type;
2089 if(!codec->codec_tag){
2090 if( !os->oformat->codec_tag
2091 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2092 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2093 codec->codec_tag = icodec->codec_tag;
2096 codec->bit_rate = icodec->bit_rate;
2097 codec->rc_max_rate = icodec->rc_max_rate;
2098 codec->rc_buffer_size = icodec->rc_buffer_size;
2099 codec->extradata= av_mallocz(extra_size);
2100 if (!codec->extradata)
2102 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2103 codec->extradata_size= icodec->extradata_size;
2104 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){
2105 codec->time_base = icodec->time_base;
2106 codec->time_base.num *= icodec->ticks_per_frame;
2107 av_reduce(&codec->time_base.num, &codec->time_base.den,
2108 codec->time_base.num, codec->time_base.den, INT_MAX);
2110 codec->time_base = ist->st->time_base;
2111 switch(codec->codec_type) {
2112 case AVMEDIA_TYPE_AUDIO:
2113 if(audio_volume != 256) {
2114 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2117 codec->channel_layout = icodec->channel_layout;
2118 codec->sample_rate = icodec->sample_rate;
2119 codec->channels = icodec->channels;
2120 codec->frame_size = icodec->frame_size;
2121 codec->audio_service_type = icodec->audio_service_type;
2122 codec->block_align= icodec->block_align;
2123 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2124 codec->block_align= 0;
2125 if(codec->codec_id == CODEC_ID_AC3)
2126 codec->block_align= 0;
2128 case AVMEDIA_TYPE_VIDEO:
2129 codec->pix_fmt = icodec->pix_fmt;
2130 codec->width = icodec->width;
2131 codec->height = icodec->height;
2132 codec->has_b_frames = icodec->has_b_frames;
2134 case AVMEDIA_TYPE_SUBTITLE:
2135 codec->width = icodec->width;
2136 codec->height = icodec->height;
2142 switch(codec->codec_type) {
2143 case AVMEDIA_TYPE_AUDIO:
2144 ost->fifo= av_fifo_alloc(1024);
2147 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2148 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2149 icodec->request_channels = codec->channels;
2150 ist->decoding_needed = 1;
2151 ost->encoding_needed = 1;
2152 ost->resample_sample_fmt = icodec->sample_fmt;
2153 ost->resample_sample_rate = icodec->sample_rate;
2154 ost->resample_channels = icodec->channels;
2156 case AVMEDIA_TYPE_VIDEO:
2157 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2158 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2161 ost->video_resample = (codec->width != icodec->width ||
2162 codec->height != icodec->height ||
2163 (codec->pix_fmt != icodec->pix_fmt));
2164 if (ost->video_resample) {
2165 #if !CONFIG_AVFILTER
2166 avcodec_get_frame_defaults(&ost->pict_tmp);
2167 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2168 codec->width, codec->height)) {
2169 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2172 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2173 ost->img_resample_ctx = sws_getContext(
2180 sws_flags, NULL, NULL, NULL);
2181 if (ost->img_resample_ctx == NULL) {
2182 fprintf(stderr, "Cannot get resampling context\n");
2186 ost->original_height = icodec->height;
2187 ost->original_width = icodec->width;
2189 codec->bits_per_raw_sample= 0;
2191 ost->resample_height = icodec->height;
2192 ost->resample_width = icodec->width;
2193 ost->resample_pix_fmt= icodec->pix_fmt;
2194 ost->encoding_needed = 1;
2195 ist->decoding_needed = 1;
2198 if (configure_filters(ist, ost)) {
2199 fprintf(stderr, "Error opening filters!\n");
2204 case AVMEDIA_TYPE_SUBTITLE:
2205 ost->encoding_needed = 1;
2206 ist->decoding_needed = 1;
2213 if (ost->encoding_needed &&
2214 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2215 char logfilename[1024];
2218 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2219 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2221 if (codec->flags & CODEC_FLAG_PASS1) {
2222 f = fopen(logfilename, "wb");
2224 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2230 size_t logbuffer_size;
2231 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2232 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2235 codec->stats_in = logbuffer;
2239 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2240 int size= codec->width * codec->height;
2241 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2246 bit_buffer = av_malloc(bit_buffer_size);
2248 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2250 ret = AVERROR(ENOMEM);
2254 /* open each encoder */
2255 for(i=0;i<nb_ostreams;i++) {
2257 if (ost->encoding_needed) {
2258 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2259 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2261 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2263 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2264 ost->st->codec->codec_id, ost->file_index, ost->index);
2265 ret = AVERROR(EINVAL);
2268 if (dec->subtitle_header) {
2269 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2270 if (!ost->st->codec->subtitle_header) {
2271 ret = AVERROR(ENOMEM);
2274 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2275 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2277 if (avcodec_open(ost->st->codec, codec) < 0) {
2278 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2279 ost->file_index, ost->index);
2280 ret = AVERROR(EINVAL);
2283 extra_size += ost->st->codec->extradata_size;
2287 /* open each decoder */
2288 for(i=0;i<nb_istreams;i++) {
2290 if (ist->decoding_needed) {
2291 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2293 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2295 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2296 ist->st->codec->codec_id, ist->file_index, ist->index);
2297 ret = AVERROR(EINVAL);
2300 if (avcodec_open(ist->st->codec, codec) < 0) {
2301 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2302 ist->file_index, ist->index);
2303 ret = AVERROR(EINVAL);
2306 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2307 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2312 for(i=0;i<nb_istreams;i++) {
2316 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2317 ist->next_pts = AV_NOPTS_VALUE;
2318 init_pts_correction(&ist->pts_ctx);
2322 /* set meta data information from input file if required */
2323 for (i=0;i<nb_meta_data_maps;i++) {
2324 AVFormatContext *files[2];
2325 AVMetadata **meta[2];
2328 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2329 if ((index) < 0 || (index) >= (nb_elems)) {\
2330 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2332 ret = AVERROR(EINVAL);\
2336 int out_file_index = meta_data_maps[i][0].file;
2337 int in_file_index = meta_data_maps[i][1].file;
2338 if (in_file_index < 0 || out_file_index < 0)
2340 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2341 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2343 files[0] = output_files[out_file_index];
2344 files[1] = input_files[in_file_index];
2346 for (j = 0; j < 2; j++) {
2347 AVMetaDataMap *map = &meta_data_maps[i][j];
2349 switch (map->type) {
2351 meta[j] = &files[j]->metadata;
2354 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2355 meta[j] = &files[j]->streams[map->index]->metadata;
2358 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2359 meta[j] = &files[j]->chapters[map->index]->metadata;
2362 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2363 meta[j] = &files[j]->programs[map->index]->metadata;
2368 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2371 /* copy global metadata by default */
2372 if (metadata_global_autocopy) {
2374 for (i = 0; i < nb_output_files; i++)
2375 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2376 AV_METADATA_DONT_OVERWRITE);
2379 /* copy chapters according to chapter maps */
2380 for (i = 0; i < nb_chapter_maps; i++) {
2381 int infile = chapter_maps[i].in_file;
2382 int outfile = chapter_maps[i].out_file;
2384 if (infile < 0 || outfile < 0)
2386 if (infile >= nb_input_files) {
2387 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2388 ret = AVERROR(EINVAL);
2391 if (outfile >= nb_output_files) {
2392 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2393 ret = AVERROR(EINVAL);
2396 copy_chapters(infile, outfile);
2399 /* copy chapters from the first input file that has them*/
2400 if (!nb_chapter_maps)
2401 for (i = 0; i < nb_input_files; i++) {
2402 if (!input_files[i]->nb_chapters)
2405 for (j = 0; j < nb_output_files; j++)
2406 if ((ret = copy_chapters(i, j)) < 0)
2411 /* open files and write file headers */
2412 for(i=0;i<nb_output_files;i++) {
2413 os = output_files[i];
2414 if (av_write_header(os) < 0) {
2415 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2416 ret = AVERROR(EINVAL);
2419 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2425 /* dump the file output parameters - cannot be done before in case
2427 for(i=0;i<nb_output_files;i++) {
2428 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2431 /* dump the stream mapping */
2433 fprintf(stderr, "Stream mapping:\n");
2434 for(i=0;i<nb_ostreams;i++) {
2436 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2437 ist_table[ost->source_index]->file_index,
2438 ist_table[ost->source_index]->index,
2441 if (ost->sync_ist != ist_table[ost->source_index])
2442 fprintf(stderr, " [sync #%d.%d]",
2443 ost->sync_ist->file_index,
2444 ost->sync_ist->index);
2445 fprintf(stderr, "\n");
2450 fprintf(stderr, "%s\n", error);
2455 print_sdp(output_files, nb_output_files);
2458 if (!using_stdin && verbose >= 0) {
2460 fprintf(stderr, "Press [q] to stop encoding\n");
2462 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2464 avio_set_interrupt_cb(decode_interrupt_cb);
2468 timer_start = av_gettime();
2470 for(; received_sigterm == 0;) {
2471 int file_index, ist_index;
2479 /* if 'q' pressed, exits */
2483 /* read_key() returns 0 on EOF */
2489 /* select the stream that we must read now by looking at the
2490 smallest output pts */
2492 for(i=0;i<nb_ostreams;i++) {
2495 os = output_files[ost->file_index];
2496 ist = ist_table[ost->source_index];
2497 if(ist->is_past_recording_time || no_packet[ist->file_index])
2499 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2500 ipts = (double)ist->pts;
2501 if (!file_table[ist->file_index].eof_reached){
2502 if(ipts < ipts_min) {
2504 if(input_sync ) file_index = ist->file_index;
2506 if(opts < opts_min) {
2508 if(!input_sync) file_index = ist->file_index;
2511 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2516 /* if none, if is finished */
2517 if (file_index < 0) {
2518 if(no_packet_count){
2520 memset(no_packet, 0, sizeof(no_packet));
2527 /* finish if limit size exhausted */
2528 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2531 /* read a frame from it and output it in the fifo */
2532 is = input_files[file_index];
2533 ret= av_read_frame(is, &pkt);
2534 if(ret == AVERROR(EAGAIN)){
2535 no_packet[file_index]=1;
2540 file_table[file_index].eof_reached = 1;
2548 memset(no_packet, 0, sizeof(no_packet));
2551 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2552 is->streams[pkt.stream_index]);
2554 /* the following test is needed in case new streams appear
2555 dynamically in stream : we ignore them */
2556 if (pkt.stream_index >= file_table[file_index].nb_streams)
2557 goto discard_packet;
2558 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2559 ist = ist_table[ist_index];
2561 goto discard_packet;
2563 if (pkt.dts != AV_NOPTS_VALUE)
2564 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2565 if (pkt.pts != AV_NOPTS_VALUE)
2566 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2568 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2569 && input_files_ts_scale[file_index][pkt.stream_index]){
2570 if(pkt.pts != AV_NOPTS_VALUE)
2571 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2572 if(pkt.dts != AV_NOPTS_VALUE)
2573 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2576 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type);
2577 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2578 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2579 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2580 int64_t delta= pkt_dts - ist->next_pts;
2581 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2582 input_files_ts_offset[ist->file_index]-= delta;
2584 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2585 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2586 if(pkt.pts != AV_NOPTS_VALUE)
2587 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2591 /* finish if recording time exhausted */
2592 if (recording_time != INT64_MAX &&
2593 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2594 ist->is_past_recording_time = 1;
2595 goto discard_packet;
2598 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2599 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2602 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2603 ist->file_index, ist->index);
2606 av_free_packet(&pkt);
2611 av_free_packet(&pkt);
2613 /* dump report by using the output first video and audio streams */
2614 print_report(output_files, ost_table, nb_ostreams, 0);
2617 /* at the end of stream, we must flush the decoder buffers */
2618 for(i=0;i<nb_istreams;i++) {
2620 if (ist->decoding_needed) {
2621 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2627 /* write the trailer if needed and close file */
2628 for(i=0;i<nb_output_files;i++) {
2629 os = output_files[i];
2630 av_write_trailer(os);
2633 /* dump report by using the first video and audio streams */
2634 print_report(output_files, ost_table, nb_ostreams, 1);
2636 /* close each encoder */
2637 for(i=0;i<nb_ostreams;i++) {
2639 if (ost->encoding_needed) {
2640 av_freep(&ost->st->codec->stats_in);
2641 avcodec_close(ost->st->codec);
2645 /* close each decoder */
2646 for(i=0;i<nb_istreams;i++) {
2648 if (ist->decoding_needed) {
2649 avcodec_close(ist->st->codec);
2653 avfilter_graph_free(&graph);
2660 av_freep(&bit_buffer);
2661 av_free(file_table);
2664 for(i=0;i<nb_istreams;i++) {
2671 for(i=0;i<nb_ostreams;i++) {
2674 if (ost->st->stream_copy)
2675 av_freep(&ost->st->codec->extradata);
2677 fclose(ost->logfile);
2678 ost->logfile = NULL;
2680 av_fifo_free(ost->fifo); /* works even if fifo is not
2681 initialized but set to zero */
2682 av_freep(&ost->st->codec->subtitle_header);
2683 av_free(ost->pict_tmp.data[0]);
2684 av_free(ost->forced_kf_pts);
2685 if (ost->video_resample)
2686 sws_freeContext(ost->img_resample_ctx);
2688 audio_resample_close(ost->resample);
2689 if (ost->reformat_ctx)
2690 av_audio_convert_free(ost->reformat_ctx);
2699 static void opt_format(const char *arg)
2701 last_asked_format = arg;
2704 static void opt_video_rc_override_string(const char *arg)
2706 video_rc_override_string = arg;
2709 static int opt_me_threshold(const char *opt, const char *arg)
2711 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2715 static int opt_verbose(const char *opt, const char *arg)
2717 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2721 static int opt_frame_rate(const char *opt, const char *arg)
2723 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2724 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2730 static int opt_bitrate(const char *opt, const char *arg)
2732 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2734 opt_default(opt, arg);
2736 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2737 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2742 static int opt_frame_crop(const char *opt, const char *arg)
2744 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2745 return AVERROR(EINVAL);
2748 static void opt_frame_size(const char *arg)
2750 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2751 fprintf(stderr, "Incorrect frame size\n");
2756 static int opt_pad(const char *opt, const char *arg) {
2757 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2761 static void opt_frame_pix_fmt(const char *arg)
2763 if (strcmp(arg, "list")) {
2764 frame_pix_fmt = av_get_pix_fmt(arg);
2765 if (frame_pix_fmt == PIX_FMT_NONE) {
2766 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2775 static void opt_frame_aspect_ratio(const char *arg)
2782 p = strchr(arg, ':');
2784 x = strtol(arg, &end, 10);
2786 y = strtol(end+1, &end, 10);
2788 ar = (double)x / (double)y;
2790 ar = strtod(arg, NULL);
2793 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2796 frame_aspect_ratio = ar;
2798 x = vfilters ? strlen(vfilters) : 0;
2799 vfilters = av_realloc(vfilters, x+100);
2800 snprintf(vfilters+x, x+100, "%csetdar=%f\n", x?',':' ', ar);
2803 static int opt_metadata(const char *opt, const char *arg)
2805 char *mid= strchr(arg, '=');
2808 fprintf(stderr, "Missing =\n");
2813 av_metadata_set2(&metadata, arg, mid, 0);
2818 static void opt_qscale(const char *arg)
2820 video_qscale = atof(arg);
2821 if (video_qscale <= 0 ||
2822 video_qscale > 255) {
2823 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2828 static void opt_top_field_first(const char *arg)
2830 top_field_first= atoi(arg);
2833 static int opt_thread_count(const char *opt, const char *arg)
2835 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2838 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2843 static void opt_audio_sample_fmt(const char *arg)
2845 if (strcmp(arg, "list")) {
2846 audio_sample_fmt = av_get_sample_fmt(arg);
2847 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2848 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2852 list_fmts(av_get_sample_fmt_string, AV_SAMPLE_FMT_NB);
2857 static int opt_audio_rate(const char *opt, const char *arg)
2859 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2863 static int opt_audio_channels(const char *opt, const char *arg)
2865 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2869 static void opt_video_channel(const char *arg)
2871 video_channel = strtol(arg, NULL, 0);
2874 static void opt_video_standard(const char *arg)
2876 video_standard = av_strdup(arg);
2879 static void opt_codec(int *pstream_copy, char **pcodec_name,
2880 int codec_type, const char *arg)
2882 av_freep(pcodec_name);
2883 if (!strcmp(arg, "copy")) {
2886 *pcodec_name = av_strdup(arg);
2890 static void opt_audio_codec(const char *arg)
2892 opt_codec(&audio_stream_copy, &audio_codec_name, AVMEDIA_TYPE_AUDIO, arg);
2895 static void opt_video_codec(const char *arg)
2897 opt_codec(&video_stream_copy, &video_codec_name, AVMEDIA_TYPE_VIDEO, arg);
2900 static void opt_subtitle_codec(const char *arg)
2902 opt_codec(&subtitle_stream_copy, &subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, arg);
2905 static int opt_codec_tag(const char *opt, const char *arg)
2908 uint32_t *codec_tag;
2910 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2911 !strcmp(opt, "vtag") ? &video_codec_tag :
2912 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2916 *codec_tag = strtol(arg, &tail, 0);
2918 *codec_tag = AV_RL32(arg);
2923 static void opt_map(const char *arg)
2928 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2929 m = &stream_maps[nb_stream_maps-1];
2931 m->file_index = strtol(arg, &p, 0);
2935 m->stream_index = strtol(p, &p, 0);
2938 m->sync_file_index = strtol(p, &p, 0);
2941 m->sync_stream_index = strtol(p, &p, 0);
2943 m->sync_file_index = m->file_index;
2944 m->sync_stream_index = m->stream_index;
2948 static void parse_meta_type(char *arg, char *type, int *index, char **endptr)
2959 *index = strtol(++arg, endptr, 0);
2962 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2969 static void opt_map_metadata(const char *arg)
2971 AVMetaDataMap *m, *m1;
2974 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2975 &nb_meta_data_maps, nb_meta_data_maps + 1);
2977 m = &meta_data_maps[nb_meta_data_maps - 1][0];
2978 m->file = strtol(arg, &p, 0);
2979 parse_meta_type(p, &m->type, &m->index, &p);
2983 m1 = &meta_data_maps[nb_meta_data_maps - 1][1];
2984 m1->file = strtol(p, &p, 0);
2985 parse_meta_type(p, &m1->type, &m1->index, &p);
2987 if (m->type == 'g' || m1->type == 'g')
2988 metadata_global_autocopy = 0;
2989 if (m->type == 's' || m1->type == 's')
2990 metadata_streams_autocopy = 0;
2991 if (m->type == 'c' || m1->type == 'c')
2992 metadata_chapters_autocopy = 0;
2995 static void opt_map_meta_data(const char *arg)
2997 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2998 "Use -map_metadata instead.\n");
2999 opt_map_metadata(arg);
3002 static void opt_map_chapters(const char *arg)
3007 chapter_maps = grow_array(chapter_maps, sizeof(*chapter_maps), &nb_chapter_maps,
3008 nb_chapter_maps + 1);
3009 c = &chapter_maps[nb_chapter_maps - 1];
3010 c->out_file = strtol(arg, &p, 0);
3014 c->in_file = strtol(p, &p, 0);
3017 static void opt_input_ts_scale(const char *arg)
3019 unsigned int stream;
3023 stream = strtol(arg, &p, 0);
3026 scale= strtod(p, &p);
3028 if(stream >= MAX_STREAMS)
3031 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);
3032 input_files_ts_scale[nb_input_files][stream]= scale;
3035 static int opt_recording_time(const char *opt, const char *arg)
3037 recording_time = parse_time_or_die(opt, arg, 1);
3041 static int opt_start_time(const char *opt, const char *arg)
3043 start_time = parse_time_or_die(opt, arg, 1);
3047 static int opt_recording_timestamp(const char *opt, const char *arg)
3049 recording_timestamp = parse_time_or_die(opt, arg, 0) / 1000000;
3053 static int opt_input_ts_offset(const char *opt, const char *arg)
3055 input_ts_offset = parse_time_or_die(opt, arg, 1);
3059 static enum CodecID find_codec_or_die(const char *name, int type, int encoder, int strict)
3061 const char *codec_string = encoder ? "encoder" : "decoder";
3065 return CODEC_ID_NONE;
3067 avcodec_find_encoder_by_name(name) :
3068 avcodec_find_decoder_by_name(name);
3070 fprintf(stderr, "Unknown %s '%s'\n", codec_string, name);
3073 if(codec->type != type) {
3074 fprintf(stderr, "Invalid %s type '%s'\n", codec_string, name);
3077 if(codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
3078 strict > FF_COMPLIANCE_EXPERIMENTAL) {
3079 fprintf(stderr, "%s '%s' is experimental and might produce bad "
3080 "results.\nAdd '-strict experimental' if you want to use it.\n",
3081 codec_string, codec->name);
3083 avcodec_find_encoder(codec->id) :
3084 avcodec_find_decoder(codec->id);
3085 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
3086 fprintf(stderr, "Or use the non experimental %s '%s'.\n",
3087 codec_string, codec->name);
3093 static void opt_input_file(const char *filename)
3095 AVFormatContext *ic;
3096 AVFormatParameters params, *ap = ¶ms;
3097 AVInputFormat *file_iformat = NULL;
3098 int err, i, ret, rfps, rfps_base;
3101 if (last_asked_format) {
3102 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3103 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3106 last_asked_format = NULL;
3109 if (!strcmp(filename, "-"))
3112 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3113 !strcmp(filename, "/dev/stdin");
3115 /* get default parameters from command line */
3116 ic = avformat_alloc_context();
3118 print_error(filename, AVERROR(ENOMEM));
3122 memset(ap, 0, sizeof(*ap));
3123 ap->prealloced_context = 1;
3124 ap->sample_rate = audio_sample_rate;
3125 ap->channels = audio_channels;
3126 ap->time_base.den = frame_rate.num;
3127 ap->time_base.num = frame_rate.den;
3128 ap->width = frame_width;
3129 ap->height = frame_height;
3130 ap->pix_fmt = frame_pix_fmt;
3131 // ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
3132 ap->channel = video_channel;
3133 ap->standard = video_standard;
3135 set_context_opts(ic, avformat_opts, AV_OPT_FLAG_DECODING_PARAM, NULL);
3137 ic->video_codec_id =
3138 find_codec_or_die(video_codec_name , AVMEDIA_TYPE_VIDEO , 0,
3139 avcodec_opts[AVMEDIA_TYPE_VIDEO ]->strict_std_compliance);
3140 ic->audio_codec_id =
3141 find_codec_or_die(audio_codec_name , AVMEDIA_TYPE_AUDIO , 0,
3142 avcodec_opts[AVMEDIA_TYPE_AUDIO ]->strict_std_compliance);
3143 ic->subtitle_codec_id=
3144 find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 0,
3145 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3146 ic->flags |= AVFMT_FLAG_NONBLOCK;
3148 /* open the input file with generic libav function */
3149 err = av_open_input_file(&ic, filename, file_iformat, 0, ap);
3151 print_error(filename, err);
3157 for(i=0; i<ic->nb_streams; i++){
3158 ic->streams[i]->discard= AVDISCARD_ALL;
3160 for(i=0; i<ic->nb_programs; i++){
3161 AVProgram *p= ic->programs[i];
3162 if(p->id != opt_programid){
3163 p->discard = AVDISCARD_ALL;
3166 for(j=0; j<p->nb_stream_indexes; j++){
3167 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3172 fprintf(stderr, "Specified program id not found\n");
3178 ic->loop_input = loop_input;
3180 /* If not enough info to get the stream parameters, we decode the
3181 first frames to get it. (used in mpeg case for example) */
3182 ret = av_find_stream_info(ic);
3183 if (ret < 0 && verbose >= 0) {
3184 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3185 av_close_input_file(ic);
3189 timestamp = start_time;
3190 /* add the stream start time */
3191 if (ic->start_time != AV_NOPTS_VALUE)
3192 timestamp += ic->start_time;
3194 /* if seeking requested, we execute it */
3195 if (start_time != 0) {
3196 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3198 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3199 filename, (double)timestamp / AV_TIME_BASE);
3201 /* reset seek info */
3205 /* update the current parameters so that they match the one of the input stream */
3206 for(i=0;i<ic->nb_streams;i++) {
3207 AVStream *st = ic->streams[i];
3208 AVCodecContext *dec = st->codec;
3209 dec->thread_count = thread_count;
3210 input_codecs = grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
3211 switch (dec->codec_type) {
3212 case AVMEDIA_TYPE_AUDIO:
3213 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(audio_codec_name);
3214 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3215 channel_layout = dec->channel_layout;
3216 audio_channels = dec->channels;
3217 audio_sample_rate = dec->sample_rate;
3218 audio_sample_fmt = dec->sample_fmt;
3220 st->discard= AVDISCARD_ALL;
3221 /* Note that av_find_stream_info can add more streams, and we
3222 * currently have no chance of setting up lowres decoding
3223 * early enough for them. */
3225 audio_sample_rate >>= dec->lowres;
3227 case AVMEDIA_TYPE_VIDEO:
3228 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3229 set_context_opts(dec, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM, input_codecs[nb_input_codecs-1]);
3230 frame_height = dec->height;
3231 frame_width = dec->width;
3232 if(ic->streams[i]->sample_aspect_ratio.num)
3233 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3235 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3236 frame_aspect_ratio *= (float) dec->width / dec->height;
3237 frame_pix_fmt = dec->pix_fmt;
3238 rfps = ic->streams[i]->r_frame_rate.num;
3239 rfps_base = ic->streams[i]->r_frame_rate.den;
3241 dec->flags |= CODEC_FLAG_EMU_EDGE;
3242 frame_height >>= dec->lowres;
3243 frame_width >>= dec->lowres;
3244 dec->height = frame_height;
3245 dec->width = frame_width;
3248 dec->debug |= FF_DEBUG_MV;
3250 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3253 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3254 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3256 (float)rfps / rfps_base, rfps, rfps_base);
3258 /* update the current frame rate to match the stream frame rate */
3259 frame_rate.num = rfps;
3260 frame_rate.den = rfps_base;
3263 st->discard= AVDISCARD_ALL;
3264 else if(video_discard)
3265 st->discard= video_discard;
3267 case AVMEDIA_TYPE_DATA:
3269 case AVMEDIA_TYPE_SUBTITLE:
3270 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3271 if(subtitle_disable)
3272 st->discard = AVDISCARD_ALL;
3274 case AVMEDIA_TYPE_ATTACHMENT:
3275 case AVMEDIA_TYPE_UNKNOWN:
3282 input_files[nb_input_files] = ic;
3283 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3284 /* dump the file content */
3286 av_dump_format(ic, nb_input_files, filename, 0);
3292 av_freep(&video_codec_name);
3293 av_freep(&audio_codec_name);
3294 av_freep(&subtitle_codec_name);
3297 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3298 int *has_subtitle_ptr)
3300 int has_video, has_audio, has_subtitle, i, j;
3301 AVFormatContext *ic;
3306 for(j=0;j<nb_input_files;j++) {
3307 ic = input_files[j];
3308 for(i=0;i<ic->nb_streams;i++) {
3309 AVCodecContext *enc = ic->streams[i]->codec;
3310 switch(enc->codec_type) {
3311 case AVMEDIA_TYPE_AUDIO:
3314 case AVMEDIA_TYPE_VIDEO:
3317 case AVMEDIA_TYPE_SUBTITLE:
3320 case AVMEDIA_TYPE_DATA:
3321 case AVMEDIA_TYPE_ATTACHMENT:
3322 case AVMEDIA_TYPE_UNKNOWN:
3329 *has_video_ptr = has_video;
3330 *has_audio_ptr = has_audio;
3331 *has_subtitle_ptr = has_subtitle;
3334 static void new_video_stream(AVFormatContext *oc, int file_idx)
3337 AVOutputStream *ost;
3338 AVCodecContext *video_enc;
3339 enum CodecID codec_id = CODEC_ID_NONE;
3340 AVCodec *codec= NULL;
3342 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3344 fprintf(stderr, "Could not alloc stream\n");
3347 ost = new_output_stream(oc, file_idx);
3349 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3350 if(!video_stream_copy){
3351 if (video_codec_name) {
3352 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3353 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3354 codec = avcodec_find_encoder_by_name(video_codec_name);
3355 output_codecs[nb_output_codecs-1] = codec;
3357 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3358 codec = avcodec_find_encoder(codec_id);
3362 avcodec_get_context_defaults3(st->codec, codec);
3363 ost->bitstream_filters = video_bitstream_filters;
3364 video_bitstream_filters= NULL;
3366 st->codec->thread_count= thread_count;
3368 video_enc = st->codec;
3371 video_enc->codec_tag= video_codec_tag;
3373 if( (video_global_header&1)
3374 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3375 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3376 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3378 if(video_global_header&2){
3379 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3380 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3383 if (video_stream_copy) {
3384 st->stream_copy = 1;
3385 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3386 video_enc->sample_aspect_ratio =
3387 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3391 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3393 video_enc->codec_id = codec_id;
3394 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3396 if (codec && codec->supported_framerates && !force_fps)
3397 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3398 video_enc->time_base.den = fps.num;
3399 video_enc->time_base.num = fps.den;
3401 video_enc->width = frame_width;
3402 video_enc->height = frame_height;
3403 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3404 video_enc->pix_fmt = frame_pix_fmt;
3405 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3407 choose_pixel_fmt(st, codec);
3410 video_enc->gop_size = 0;
3411 if (video_qscale || same_quality) {
3412 video_enc->flags |= CODEC_FLAG_QSCALE;
3413 video_enc->global_quality=
3414 st->quality = FF_QP2LAMBDA * video_qscale;
3418 video_enc->intra_matrix = intra_matrix;
3420 video_enc->inter_matrix = inter_matrix;
3422 p= video_rc_override_string;
3425 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3427 fprintf(stderr, "error parsing rc_override\n");
3430 video_enc->rc_override=
3431 av_realloc(video_enc->rc_override,
3432 sizeof(RcOverride)*(i+1));
3433 video_enc->rc_override[i].start_frame= start;
3434 video_enc->rc_override[i].end_frame = end;
3436 video_enc->rc_override[i].qscale= q;
3437 video_enc->rc_override[i].quality_factor= 1.0;
3440 video_enc->rc_override[i].qscale= 0;
3441 video_enc->rc_override[i].quality_factor= -q/100.0;
3446 video_enc->rc_override_count=i;
3447 if (!video_enc->rc_initial_buffer_occupancy)
3448 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3449 video_enc->me_threshold= me_threshold;
3450 video_enc->intra_dc_precision= intra_dc_precision - 8;
3453 video_enc->flags|= CODEC_FLAG_PSNR;
3458 video_enc->flags |= CODEC_FLAG_PASS1;
3460 video_enc->flags |= CODEC_FLAG_PASS2;
3464 if (forced_key_frames)
3465 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3467 if (video_language) {
3468 av_metadata_set2(&st->metadata, "language", video_language, 0);
3469 av_freep(&video_language);
3472 /* reset some key parameters */
3474 av_freep(&video_codec_name);
3475 av_freep(&forced_key_frames);
3476 video_stream_copy = 0;
3477 frame_pix_fmt = PIX_FMT_NONE;
3480 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3483 AVOutputStream *ost;
3484 AVCodec *codec= NULL;
3485 AVCodecContext *audio_enc;
3486 enum CodecID codec_id = CODEC_ID_NONE;
3488 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3490 fprintf(stderr, "Could not alloc stream\n");
3493 ost = new_output_stream(oc, file_idx);
3495 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3496 if(!audio_stream_copy){
3497 if (audio_codec_name) {
3498 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3499 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3500 codec = avcodec_find_encoder_by_name(audio_codec_name);
3501 output_codecs[nb_output_codecs-1] = codec;
3503 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3504 codec = avcodec_find_encoder(codec_id);
3508 avcodec_get_context_defaults3(st->codec, codec);
3510 ost->bitstream_filters = audio_bitstream_filters;
3511 audio_bitstream_filters= NULL;
3513 st->codec->thread_count= thread_count;
3515 audio_enc = st->codec;
3516 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3519 audio_enc->codec_tag= audio_codec_tag;
3521 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3522 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3523 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3525 if (audio_stream_copy) {
3526 st->stream_copy = 1;
3527 audio_enc->channels = audio_channels;
3528 audio_enc->sample_rate = audio_sample_rate;
3530 audio_enc->codec_id = codec_id;
3531 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3533 if (audio_qscale > QSCALE_NONE) {
3534 audio_enc->flags |= CODEC_FLAG_QSCALE;
3535 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3537 audio_enc->channels = audio_channels;
3538 audio_enc->sample_fmt = audio_sample_fmt;
3539 audio_enc->sample_rate = audio_sample_rate;
3540 audio_enc->channel_layout = channel_layout;
3541 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3542 audio_enc->channel_layout = 0;
3543 choose_sample_fmt(st, codec);
3544 choose_sample_rate(st, codec);
3546 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3547 if (audio_language) {
3548 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3549 av_freep(&audio_language);
3552 /* reset some key parameters */
3554 av_freep(&audio_codec_name);
3555 audio_stream_copy = 0;
3558 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3561 AVOutputStream *ost;
3562 AVCodec *codec=NULL;
3563 AVCodecContext *subtitle_enc;
3564 enum CodecID codec_id = CODEC_ID_NONE;
3566 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3568 fprintf(stderr, "Could not alloc stream\n");
3571 ost = new_output_stream(oc, file_idx);
3572 subtitle_enc = st->codec;
3573 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3574 if(!subtitle_stream_copy){
3575 if (subtitle_codec_name) {
3576 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3577 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3578 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3580 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3581 codec = avcodec_find_encoder(codec_id);
3584 avcodec_get_context_defaults3(st->codec, codec);
3586 ost->bitstream_filters = subtitle_bitstream_filters;
3587 subtitle_bitstream_filters= NULL;
3589 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3591 if(subtitle_codec_tag)
3592 subtitle_enc->codec_tag= subtitle_codec_tag;
3594 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3595 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3596 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3598 if (subtitle_stream_copy) {
3599 st->stream_copy = 1;
3601 subtitle_enc->codec_id = codec_id;
3602 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3605 if (subtitle_language) {
3606 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3607 av_freep(&subtitle_language);
3610 subtitle_disable = 0;
3611 av_freep(&subtitle_codec_name);
3612 subtitle_stream_copy = 0;
3615 static int opt_new_stream(const char *opt, const char *arg)
3617 AVFormatContext *oc;
3618 int file_idx = nb_output_files - 1;
3619 if (nb_output_files <= 0) {
3620 fprintf(stderr, "At least one output file must be specified\n");
3623 oc = output_files[file_idx];
3625 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3626 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3627 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3632 /* arg format is "output-stream-index:streamid-value". */
3633 static int opt_streamid(const char *opt, const char *arg)
3639 strncpy(idx_str, arg, sizeof(idx_str));
3640 idx_str[sizeof(idx_str)-1] = '\0';
3641 p = strchr(idx_str, ':');
3644 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3649 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3650 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3651 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3655 static void opt_output_file(const char *filename)
3657 AVFormatContext *oc;
3658 int err, use_video, use_audio, use_subtitle;
3659 int input_has_video, input_has_audio, input_has_subtitle;
3660 AVFormatParameters params, *ap = ¶ms;
3661 AVOutputFormat *file_oformat;
3663 if (!strcmp(filename, "-"))
3666 oc = avformat_alloc_context();
3668 print_error(filename, AVERROR(ENOMEM));
3672 if (last_asked_format) {
3673 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3674 if (!file_oformat) {
3675 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3678 last_asked_format = NULL;
3680 file_oformat = av_guess_format(NULL, filename, NULL);
3681 if (!file_oformat) {
3682 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3688 oc->oformat = file_oformat;
3689 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3691 if (!strcmp(file_oformat->name, "ffm") &&
3692 av_strstart(filename, "http:", NULL)) {
3693 /* special case for files sent to ffserver: we get the stream
3694 parameters from ffserver */
3695 int err = read_ffserver_streams(oc, filename);
3697 print_error(filename, err);
3701 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3702 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3703 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3705 /* disable if no corresponding type found and at least one
3707 if (nb_input_files > 0) {
3708 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3709 &input_has_subtitle);
3710 if (!input_has_video)
3712 if (!input_has_audio)
3714 if (!input_has_subtitle)
3718 /* manual disable */
3719 if (audio_disable) use_audio = 0;
3720 if (video_disable) use_video = 0;
3721 if (subtitle_disable) use_subtitle = 0;
3723 if (use_video) new_video_stream(oc, nb_output_files);
3724 if (use_audio) new_audio_stream(oc, nb_output_files);
3725 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3727 oc->timestamp = recording_timestamp;
3729 av_metadata_copy(&oc->metadata, metadata, 0);
3730 av_metadata_free(&metadata);
3733 output_files[nb_output_files++] = oc;
3735 /* check filename in case of an image number is expected */
3736 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3737 if (!av_filename_number_test(oc->filename)) {
3738 print_error(oc->filename, AVERROR(EINVAL));
3743 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3744 /* test if it already exists to avoid loosing precious files */
3745 if (!file_overwrite &&
3746 (strchr(filename, ':') == NULL ||
3747 filename[1] == ':' ||
3748 av_strstart(filename, "file:", NULL))) {
3749 if (avio_check(filename, 0) == 0) {
3751 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3753 if (!read_yesno()) {
3754 fprintf(stderr, "Not overwriting - exiting\n");
3759 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3766 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3767 print_error(filename, err);
3772 memset(ap, 0, sizeof(*ap));
3773 if (av_set_parameters(oc, ap) < 0) {
3774 fprintf(stderr, "%s: Invalid encoding parameters\n",
3779 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3780 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3781 oc->loop_output = loop_output;
3782 oc->flags |= AVFMT_FLAG_NONBLOCK;
3784 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3786 av_freep(&forced_key_frames);
3789 /* same option as mencoder */
3790 static void opt_pass(const char *pass_str)
3793 pass = atoi(pass_str);
3794 if (pass != 1 && pass != 2) {
3795 fprintf(stderr, "pass number can be only 1 or 2\n");
3801 static int64_t getutime(void)
3804 struct rusage rusage;
3806 getrusage(RUSAGE_SELF, &rusage);
3807 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3808 #elif HAVE_GETPROCESSTIMES
3810 FILETIME c, e, k, u;
3811 proc = GetCurrentProcess();
3812 GetProcessTimes(proc, &c, &e, &k, &u);
3813 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3815 return av_gettime();
3819 static int64_t getmaxrss(void)
3821 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3822 struct rusage rusage;
3823 getrusage(RUSAGE_SELF, &rusage);
3824 return (int64_t)rusage.ru_maxrss * 1024;
3825 #elif HAVE_GETPROCESSMEMORYINFO
3827 PROCESS_MEMORY_COUNTERS memcounters;
3828 proc = GetCurrentProcess();
3829 memcounters.cb = sizeof(memcounters);
3830 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3831 return memcounters.PeakPagefileUsage;
3837 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3840 const char *p = str;
3847 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3854 static void opt_inter_matrix(const char *arg)
3856 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3857 parse_matrix_coeffs(inter_matrix, arg);
3860 static void opt_intra_matrix(const char *arg)
3862 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3863 parse_matrix_coeffs(intra_matrix, arg);
3866 static void show_usage(void)
3868 printf("Hyper fast Audio and Video encoder\n");
3869 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3873 static void show_help(void)
3876 AVOutputFormat *oformat = NULL;
3878 av_log_set_callback(log_callback_help);
3880 show_help_options(options, "Main options:\n",
3881 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3882 show_help_options(options, "\nAdvanced options:\n",
3883 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3885 show_help_options(options, "\nVideo options:\n",
3886 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3888 show_help_options(options, "\nAdvanced Video options:\n",
3889 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3890 OPT_VIDEO | OPT_EXPERT);
3891 show_help_options(options, "\nAudio options:\n",
3892 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3894 show_help_options(options, "\nAdvanced Audio options:\n",
3895 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3896 OPT_AUDIO | OPT_EXPERT);
3897 show_help_options(options, "\nSubtitle options:\n",
3898 OPT_SUBTITLE | OPT_GRAB,
3900 show_help_options(options, "\nAudio/Video grab options:\n",
3904 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3907 /* individual codec options */
3909 while ((c = av_codec_next(c))) {
3910 if (c->priv_class) {
3911 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3916 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3919 /* individual muxer options */
3920 while ((oformat = av_oformat_next(oformat))) {
3921 if (oformat->priv_class) {
3922 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3927 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3930 static void opt_target(const char *arg)
3932 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3933 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3935 if(!strncmp(arg, "pal-", 4)) {
3938 } else if(!strncmp(arg, "ntsc-", 5)) {
3941 } else if(!strncmp(arg, "film-", 5)) {
3946 /* Calculate FR via float to avoid int overflow */
3947 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3950 } else if((fr == 29970) || (fr == 23976)) {
3953 /* Try to determine PAL/NTSC by peeking in the input files */
3954 if(nb_input_files) {
3956 for(j = 0; j < nb_input_files; j++) {
3957 for(i = 0; i < input_files[j]->nb_streams; i++) {
3958 AVCodecContext *c = input_files[j]->streams[i]->codec;
3959 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3961 fr = c->time_base.den * 1000 / c->time_base.num;
3965 } else if((fr == 29970) || (fr == 23976)) {
3975 if(verbose && norm != UNKNOWN)
3976 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3979 if(norm == UNKNOWN) {
3980 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3981 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3982 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3986 if(!strcmp(arg, "vcd")) {
3988 opt_video_codec("mpeg1video");
3989 opt_audio_codec("mp2");
3992 opt_frame_size(norm == PAL ? "352x288" : "352x240");
3993 opt_frame_rate(NULL, frame_rates[norm]);
3994 opt_default("g", norm == PAL ? "15" : "18");
3996 opt_default("b", "1150000");
3997 opt_default("maxrate", "1150000");
3998 opt_default("minrate", "1150000");
3999 opt_default("bufsize", "327680"); // 40*1024*8;
4001 opt_default("ab", "224000");
4002 audio_sample_rate = 44100;
4005 opt_default("packetsize", "2324");
4006 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4008 /* We have to offset the PTS, so that it is consistent with the SCR.
4009 SCR starts at 36000, but the first two packs contain only padding
4010 and the first pack from the other stream, respectively, may also have
4011 been written before.
4012 So the real data starts at SCR 36000+3*1200. */
4013 mux_preload= (36000+3*1200) / 90000.0; //0.44
4014 } else if(!strcmp(arg, "svcd")) {
4016 opt_video_codec("mpeg2video");
4017 opt_audio_codec("mp2");
4020 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4021 opt_frame_rate(NULL, frame_rates[norm]);
4022 opt_default("g", norm == PAL ? "15" : "18");
4024 opt_default("b", "2040000");
4025 opt_default("maxrate", "2516000");
4026 opt_default("minrate", "0"); //1145000;
4027 opt_default("bufsize", "1835008"); //224*1024*8;
4028 opt_default("flags", "+scan_offset");
4031 opt_default("ab", "224000");
4032 audio_sample_rate = 44100;
4034 opt_default("packetsize", "2324");
4036 } else if(!strcmp(arg, "dvd")) {
4038 opt_video_codec("mpeg2video");
4039 opt_audio_codec("ac3");
4042 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4043 opt_frame_rate(NULL, frame_rates[norm]);
4044 opt_default("g", norm == PAL ? "15" : "18");
4046 opt_default("b", "6000000");
4047 opt_default("maxrate", "9000000");
4048 opt_default("minrate", "0"); //1500000;
4049 opt_default("bufsize", "1835008"); //224*1024*8;
4051 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4052 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4054 opt_default("ab", "448000");
4055 audio_sample_rate = 48000;
4057 } else if(!strncmp(arg, "dv", 2)) {
4061 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4062 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4063 (norm == PAL ? "yuv420p" : "yuv411p"));
4064 opt_frame_rate(NULL, frame_rates[norm]);
4066 audio_sample_rate = 48000;
4070 fprintf(stderr, "Unknown target: %s\n", arg);
4075 static void opt_vstats_file (const char *arg)
4077 av_free (vstats_filename);
4078 vstats_filename=av_strdup (arg);
4081 static void opt_vstats (void)
4084 time_t today2 = time(NULL);
4085 struct tm *today = localtime(&today2);
4087 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4089 opt_vstats_file(filename);
4092 static int opt_bsf(const char *opt, const char *arg)
4094 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4095 AVBitStreamFilterContext **bsfp;
4098 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4102 bsfp= *opt == 'v' ? &video_bitstream_filters :
4103 *opt == 'a' ? &audio_bitstream_filters :
4104 &subtitle_bitstream_filters;
4106 bsfp= &(*bsfp)->next;
4113 static int opt_preset(const char *opt, const char *arg)
4116 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4117 char *codec_name = *opt == 'v' ? video_codec_name :
4118 *opt == 'a' ? audio_codec_name :
4119 subtitle_codec_name;
4121 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4122 fprintf(stderr, "File for preset '%s' not found\n", arg);
4127 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4128 if(line[0] == '#' && !e)
4130 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4132 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4135 if(!strcmp(tmp, "acodec")){
4136 opt_audio_codec(tmp2);
4137 }else if(!strcmp(tmp, "vcodec")){
4138 opt_video_codec(tmp2);
4139 }else if(!strcmp(tmp, "scodec")){
4140 opt_subtitle_codec(tmp2);
4141 }else if(opt_default(tmp, tmp2) < 0){
4142 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4152 static const OptionDef options[] = {
4154 #include "cmdutils_common_opts.h"
4155 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4156 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4157 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4158 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4159 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4160 "outfile[,metadata]:infile[,metadata]" },
4161 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4162 "outfile[,metadata]:infile[,metadata]" },
4163 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4164 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4165 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4166 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4167 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4168 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4169 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4170 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4171 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4172 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4173 "add timings for benchmarking" },
4174 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4175 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4176 "dump each input packet" },
4177 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4178 "when dumping packets, also dump the payload" },
4179 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4180 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4181 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" },
4182 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4183 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4184 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4185 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4186 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4187 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4188 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4189 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4190 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4191 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4192 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4193 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4194 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4195 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4198 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4199 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4200 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4201 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4202 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4203 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4204 { "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" },
4205 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4206 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4207 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4208 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4209 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4210 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4211 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4212 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4213 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4214 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4215 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4216 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4217 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4218 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4219 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4220 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4221 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4222 "use same quantizer as source (implies VBR)" },
4223 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4224 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4225 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4226 "deinterlace pictures" },
4227 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4228 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4229 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4231 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4233 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4234 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4235 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4236 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4237 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4238 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4239 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4240 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4241 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4242 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4243 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4246 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4247 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4248 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4249 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4250 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4251 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4252 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4253 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4254 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4255 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4256 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4257 { "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" },
4259 /* subtitle options */
4260 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4261 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4262 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4263 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4264 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4267 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4268 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4269 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4272 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4273 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4275 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4276 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4277 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4279 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4280 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4281 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4282 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4284 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4288 int main(int argc, char **argv)
4292 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4294 avcodec_register_all();
4296 avdevice_register_all();
4299 avfilter_register_all();
4304 if(isatty(STDIN_FILENO))
4305 avio_set_interrupt_cb(decode_interrupt_cb);
4313 parse_options(argc, argv, options, opt_output_file);
4315 if(nb_output_files <= 0 && nb_input_files == 0) {
4317 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4321 /* file converter / grab */
4322 if (nb_output_files <= 0) {
4323 fprintf(stderr, "At least one output file must be specified\n");
4327 if (nb_input_files == 0) {
4328 fprintf(stderr, "At least one input file must be specified\n");
4333 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4334 stream_maps, nb_stream_maps) < 0)
4336 ti = getutime() - ti;
4338 int maxrss = getmaxrss() / 1024;
4339 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4342 return ffmpeg_exit(0);