3 * Copyright (c) 2000-2003 Fabrice Bellard
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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 "libavcodec/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 #if !FF_API_MAX_STREAMS
110 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
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;
171 static unsigned int sws_flags = SWS_BICUBIC;
174 static int intra_only = 0;
175 static int audio_sample_rate = 44100;
176 static int64_t channel_layout = 0;
177 #define QSCALE_NONE -99999
178 static float audio_qscale = QSCALE_NONE;
179 static int audio_disable = 0;
180 static int audio_channels = 1;
181 static char *audio_codec_name = NULL;
182 static unsigned int audio_codec_tag = 0;
183 static char *audio_language = NULL;
185 static int subtitle_disable = 0;
186 static char *subtitle_codec_name = NULL;
187 static char *subtitle_language = NULL;
188 static unsigned int subtitle_codec_tag = 0;
190 static float mux_preload= 0.5;
191 static float mux_max_delay= 0.7;
193 static int64_t recording_time = INT64_MAX;
194 static int64_t start_time = 0;
195 static int64_t recording_timestamp = 0;
196 static int64_t input_ts_offset = 0;
197 static int file_overwrite = 0;
198 static AVMetadata *metadata;
199 static int do_benchmark = 0;
200 static int do_hex_dump = 0;
201 static int do_pkt_dump = 0;
202 static int do_psnr = 0;
203 static int do_pass = 0;
204 static char *pass_logfilename_prefix = NULL;
205 static int audio_stream_copy = 0;
206 static int video_stream_copy = 0;
207 static int subtitle_stream_copy = 0;
208 static int video_sync_method= -1;
209 static int audio_sync_method= 0;
210 static float audio_drift_threshold= 0.1;
211 static int copy_ts= 0;
213 static int opt_shortest = 0;
214 static int video_global_header = 0;
215 static char *vstats_filename;
216 static FILE *vstats_file;
217 static int opt_programid = 0;
218 static int copy_initial_nonkeyframes = 0;
220 static int rate_emu = 0;
222 static int video_channel = 0;
223 static char *video_standard;
225 static int audio_volume = 256;
227 static int exit_on_error = 0;
228 static int using_stdin = 0;
229 static int verbose = 1;
230 static int thread_count= 1;
231 static int q_pressed = 0;
232 static int64_t video_size = 0;
233 static int64_t audio_size = 0;
234 static int64_t extra_size = 0;
235 static int nb_frames_dup = 0;
236 static int nb_frames_drop = 0;
237 static int input_sync;
238 static uint64_t limit_filesize = 0;
239 static int force_fps = 0;
240 static char *forced_key_frames = NULL;
242 static float dts_delta_threshold = 10;
244 static int64_t timer_start;
246 static uint8_t *audio_buf;
247 static uint8_t *audio_out;
248 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
250 static short *samples;
252 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
253 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
254 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
256 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
258 struct AVInputStream;
260 typedef struct AVOutputStream {
261 int file_index; /* file index */
262 int index; /* stream index in the output file */
263 int source_index; /* AVInputStream index */
264 AVStream *st; /* stream in the output file */
265 int encoding_needed; /* true if encoding needed for this stream */
267 /* input pts and corresponding output pts
269 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
270 struct AVInputStream *sync_ist; /* input stream to sync against */
271 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
272 AVBitStreamFilterContext *bitstream_filters;
275 AVFrame pict_tmp; /* temporary image for resampling */
276 struct SwsContext *img_resample_ctx; /* for image resampling */
279 int resample_pix_fmt;
281 /* full frame size of first frame */
285 /* forced key frames */
286 int64_t *forced_kf_pts;
292 ReSampleContext *resample; /* for audio resampling */
293 int resample_sample_fmt;
294 int resample_channels;
295 int resample_sample_rate;
297 AVAudioConvert *reformat_ctx;
298 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
302 AVFilterContext *output_video_filter;
303 AVFilterContext *input_video_filter;
304 AVFilterBufferRef *picref;
306 AVFilterGraph *graph;
310 static AVOutputStream **output_streams_for_file[MAX_FILES] = { NULL };
311 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
313 typedef struct AVInputStream {
317 int discard; /* true if stream data should be discarded */
318 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
319 int64_t sample_index; /* current sample */
321 int64_t start; /* time when read started */
322 int64_t next_pts; /* synthetic pts for cases where pkt.pts
324 int64_t pts; /* current pts */
325 int is_start; /* is 1 at the start and after a discontinuity */
326 int showed_multi_packet_warning;
327 int is_past_recording_time;
329 AVFrame *filter_frame;
330 int has_filter_frame;
334 typedef struct AVInputFile {
335 int eof_reached; /* true if eof reached */
336 int ist_index; /* index of first stream in ist_table */
337 int buffer_size; /* current total buffer size */
338 int nb_streams; /* nb streams we are aware of */
343 static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
345 AVFilterContext *last_filter, *filter;
346 /** filter graph containing all filters including input & output */
347 AVCodecContext *codec = ost->st->codec;
348 AVCodecContext *icodec = ist->st->codec;
349 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
350 AVRational sample_aspect_ratio;
354 ost->graph = avfilter_graph_alloc();
356 if (ist->st->sample_aspect_ratio.num){
357 sample_aspect_ratio = ist->st->sample_aspect_ratio;
359 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
361 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
362 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
363 sample_aspect_ratio.num, sample_aspect_ratio.den);
365 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
366 "src", args, NULL, ost->graph);
369 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
370 "out", NULL, &ffsink_ctx, ost->graph);
373 last_filter = ost->input_video_filter;
375 if (codec->width != icodec->width || codec->height != icodec->height) {
376 snprintf(args, 255, "%d:%d:flags=0x%X",
379 (int)av_get_int(sws_opts, "sws_flags", NULL));
380 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
381 NULL, args, NULL, ost->graph)) < 0)
383 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
385 last_filter = filter;
388 snprintf(args, sizeof(args), "flags=0x%X", (int)av_get_int(sws_opts, "sws_flags", NULL));
389 ost->graph->scale_sws_opts = av_strdup(args);
392 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
393 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
395 outputs->name = av_strdup("in");
396 outputs->filter_ctx = last_filter;
397 outputs->pad_idx = 0;
398 outputs->next = NULL;
400 inputs->name = av_strdup("out");
401 inputs->filter_ctx = ost->output_video_filter;
405 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
407 av_freep(&ost->avfilter);
409 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
413 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
416 codec->width = ost->output_video_filter->inputs[0]->w;
417 codec->height = ost->output_video_filter->inputs[0]->h;
418 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
419 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
423 #endif /* CONFIG_AVFILTER */
425 static void term_exit(void)
427 av_log(NULL, AV_LOG_QUIET, "");
430 static volatile int received_sigterm = 0;
433 sigterm_handler(int sig)
435 received_sigterm = sig;
440 static void term_init(void)
442 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
443 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
445 signal(SIGXCPU, sigterm_handler);
449 /* read a key without blocking */
450 static int read_key(void)
459 static int decode_interrupt_cb(void)
461 q_pressed += read_key() == 'q';
462 return q_pressed > 1;
465 static int ffmpeg_exit(int ret)
470 for(i=0;i<nb_output_files;i++) {
471 AVFormatContext *s = output_files[i];
472 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
474 avformat_free_context(s);
475 av_free(output_streams_for_file[i]);
477 for(i=0;i<nb_input_files;i++) {
478 av_close_input_file(input_files[i]);
479 av_free(input_files_ts_scale[i]);
482 av_free(intra_matrix);
483 av_free(inter_matrix);
487 av_free(vstats_filename);
489 av_free(streamid_map);
490 av_free(input_codecs);
491 av_free(output_codecs);
492 av_free(stream_maps);
493 av_free(meta_data_maps);
495 av_free(video_codec_name);
496 av_free(audio_codec_name);
497 av_free(subtitle_codec_name);
499 av_free(video_standard);
504 allocated_audio_buf_size= allocated_audio_out_size= 0;
511 if (received_sigterm) {
513 "Received signal %d: terminating.\n",
514 (int) received_sigterm);
518 exit(ret); /* not all OS-es handle main() return value */
522 /* similar to ff_dynarray_add() and av_fast_realloc() */
523 static void *grow_array(void *array, int elem_size, int *size, int new_size)
525 if (new_size >= INT_MAX / elem_size) {
526 fprintf(stderr, "Array too big.\n");
529 if (*size < new_size) {
530 uint8_t *tmp = av_realloc(array, new_size*elem_size);
532 fprintf(stderr, "Could not alloc buffer.\n");
535 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
542 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
544 if(codec && codec->sample_fmts){
545 const enum AVSampleFormat *p= codec->sample_fmts;
547 if(*p == st->codec->sample_fmt)
551 av_log(NULL, AV_LOG_WARNING,
552 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
553 av_get_sample_fmt_name(st->codec->sample_fmt),
555 av_get_sample_fmt_name(codec->sample_fmts[0]));
556 st->codec->sample_fmt = codec->sample_fmts[0];
561 static void choose_sample_rate(AVStream *st, AVCodec *codec)
563 if(codec && codec->supported_samplerates){
564 const int *p= codec->supported_samplerates;
566 int best_dist=INT_MAX;
568 int dist= abs(st->codec->sample_rate - *p);
569 if(dist < best_dist){
575 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
577 st->codec->sample_rate= best;
581 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
583 if(codec && codec->pix_fmts){
584 const enum PixelFormat *p= codec->pix_fmts;
585 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
586 if(st->codec->codec_id==CODEC_ID_MJPEG){
587 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
588 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
589 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};
593 if(*p == st->codec->pix_fmt)
597 st->codec->pix_fmt = codec->pix_fmts[0];
601 static AVOutputStream *new_output_stream(AVFormatContext *oc, int file_idx)
603 int idx = oc->nb_streams - 1;
606 output_streams_for_file[file_idx] =
607 grow_array(output_streams_for_file[file_idx],
608 sizeof(*output_streams_for_file[file_idx]),
609 &nb_output_streams_for_file[file_idx],
611 ost = output_streams_for_file[file_idx][idx] =
612 av_mallocz(sizeof(AVOutputStream));
614 fprintf(stderr, "Could not alloc output stream\n");
617 ost->file_index = file_idx;
622 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
628 err = av_open_input_file(&ic, filename, NULL, FFM_PACKET_SIZE, NULL);
631 /* copy stream format */
633 for(i=0;i<ic->nb_streams;i++) {
639 // FIXME: a more elegant solution is needed
640 st = av_mallocz(sizeof(AVStream));
641 memcpy(st, ic->streams[i], sizeof(AVStream));
642 st->codec = avcodec_alloc_context();
644 print_error(filename, AVERROR(ENOMEM));
647 avcodec_copy_context(st->codec, ic->streams[i]->codec);
650 codec = avcodec_find_encoder(st->codec->codec_id);
651 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
652 if (audio_stream_copy) {
655 choose_sample_fmt(st, codec);
656 } else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
657 if (video_stream_copy) {
660 choose_pixel_fmt(st, codec);
663 if(st->codec->flags & CODEC_FLAG_BITEXACT)
666 new_output_stream(s, nb_output_files);
670 s->timestamp = av_gettime();
672 av_close_input_file(ic);
677 get_sync_ipts(const AVOutputStream *ost)
679 const AVInputStream *ist = ost->sync_ist;
680 return (double)(ist->pts - start_time)/AV_TIME_BASE;
683 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
687 AVPacket new_pkt= *pkt;
688 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
689 &new_pkt.data, &new_pkt.size,
690 pkt->data, pkt->size,
691 pkt->flags & AV_PKT_FLAG_KEY);
694 new_pkt.destruct= av_destruct_packet;
696 fprintf(stderr, "%s failed for stream %d, codec %s",
697 bsfc->filter->name, pkt->stream_index,
698 avctx->codec ? avctx->codec->name : "copy");
708 ret= av_interleaved_write_frame(s, pkt);
710 print_error("av_interleaved_write_frame()", ret);
715 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
717 static void do_audio_out(AVFormatContext *s,
720 unsigned char *buf, int size)
723 int64_t audio_out_size, audio_buf_size;
724 int64_t allocated_for_size= size;
726 int size_out, frame_bytes, ret, resample_changed;
727 AVCodecContext *enc= ost->st->codec;
728 AVCodecContext *dec= ist->st->codec;
729 int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
730 int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
731 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
734 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
735 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
736 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
737 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
738 audio_buf_size*= osize*enc->channels;
740 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
741 if(coded_bps > 8*osize)
742 audio_out_size= audio_out_size * coded_bps / (8*osize);
743 audio_out_size += FF_MIN_BUFFER_SIZE;
745 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
746 fprintf(stderr, "Buffer sizes too large\n");
750 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
751 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
752 if (!audio_buf || !audio_out){
753 fprintf(stderr, "Out of memory in do_audio_out\n");
757 if (enc->channels != dec->channels)
758 ost->audio_resample = 1;
760 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
761 ost->resample_channels != dec->channels ||
762 ost->resample_sample_rate != dec->sample_rate;
764 if ((ost->audio_resample && !ost->resample) || resample_changed) {
765 if (resample_changed) {
766 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",
767 ist->file_index, ist->index,
768 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
769 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
770 ost->resample_sample_fmt = dec->sample_fmt;
771 ost->resample_channels = dec->channels;
772 ost->resample_sample_rate = dec->sample_rate;
774 audio_resample_close(ost->resample);
776 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
777 if (audio_sync_method <= 1 &&
778 ost->resample_sample_fmt == enc->sample_fmt &&
779 ost->resample_channels == enc->channels &&
780 ost->resample_sample_rate == enc->sample_rate) {
781 ost->resample = NULL;
782 ost->audio_resample = 0;
784 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
785 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
786 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
787 enc->sample_rate, dec->sample_rate,
788 enc->sample_fmt, dec->sample_fmt,
790 if (!ost->resample) {
791 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
792 dec->channels, dec->sample_rate,
793 enc->channels, enc->sample_rate);
799 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
800 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
801 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
802 if (ost->reformat_ctx)
803 av_audio_convert_free(ost->reformat_ctx);
804 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
805 dec->sample_fmt, 1, NULL, 0);
806 if (!ost->reformat_ctx) {
807 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
808 av_get_sample_fmt_name(dec->sample_fmt),
809 av_get_sample_fmt_name(enc->sample_fmt));
812 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
815 if(audio_sync_method){
816 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
817 - av_fifo_size(ost->fifo)/(enc->channels * 2);
818 double idelta= delta*dec->sample_rate / enc->sample_rate;
819 int byte_delta= ((int)idelta)*2*dec->channels;
821 //FIXME resample delay
822 if(fabs(delta) > 50){
823 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
825 byte_delta= FFMAX(byte_delta, -size);
829 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
834 static uint8_t *input_tmp= NULL;
835 input_tmp= av_realloc(input_tmp, byte_delta + size);
837 if(byte_delta > allocated_for_size - size){
838 allocated_for_size= byte_delta + (int64_t)size;
843 memset(input_tmp, 0, byte_delta);
844 memcpy(input_tmp + byte_delta, buf, size);
848 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
850 }else if(audio_sync_method>1){
851 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
852 av_assert0(ost->audio_resample);
854 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
855 // 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));
856 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
860 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
861 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
863 if (ost->audio_resample) {
865 size_out = audio_resample(ost->resample,
866 (short *)buftmp, (short *)buf,
867 size / (dec->channels * isize));
868 size_out = size_out * enc->channels * osize;
874 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
875 const void *ibuf[6]= {buftmp};
876 void *obuf[6]= {audio_buf};
877 int istride[6]= {isize};
878 int ostride[6]= {osize};
879 int len= size_out/istride[0];
880 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
881 printf("av_audio_convert() failed\n");
887 size_out = len*osize;
890 /* now encode as many frames as possible */
891 if (enc->frame_size > 1) {
892 /* output resampled raw samples */
893 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
894 fprintf(stderr, "av_fifo_realloc2() failed\n");
897 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
899 frame_bytes = enc->frame_size * osize * enc->channels;
901 while (av_fifo_size(ost->fifo) >= frame_bytes) {
903 av_init_packet(&pkt);
905 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
907 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
909 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
912 fprintf(stderr, "Audio encoding failed\n");
916 pkt.stream_index= ost->index;
919 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
920 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
921 pkt.flags |= AV_PKT_FLAG_KEY;
922 write_frame(s, &pkt, enc, ost->bitstream_filters);
924 ost->sync_opts += enc->frame_size;
928 av_init_packet(&pkt);
930 ost->sync_opts += size_out / (osize * enc->channels);
932 /* output a pcm frame */
933 /* determine the size of the coded buffer */
936 size_out = size_out*coded_bps/8;
938 if(size_out > audio_out_size){
939 fprintf(stderr, "Internal error, buffer size too small\n");
943 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
944 ret = avcodec_encode_audio(enc, audio_out, size_out,
947 fprintf(stderr, "Audio encoding failed\n");
951 pkt.stream_index= ost->index;
954 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
955 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
956 pkt.flags |= AV_PKT_FLAG_KEY;
957 write_frame(s, &pkt, enc, ost->bitstream_filters);
961 static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void **bufp)
965 AVPicture picture_tmp;
968 dec = ist->st->codec;
970 /* deinterlace : must be done before any resize */
971 if (do_deinterlace) {
974 /* create temporary picture */
975 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
976 buf = av_malloc(size);
980 picture2 = &picture_tmp;
981 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
983 if(avpicture_deinterlace(picture2, picture,
984 dec->pix_fmt, dec->width, dec->height) < 0) {
985 /* if error, do not deinterlace */
986 fprintf(stderr, "Deinterlacing failed\n");
995 if (picture != picture2)
996 *picture = *picture2;
1000 /* we begin to correct av delay at this threshold */
1001 #define AV_DELAY_MAX 0.100
1003 static void do_subtitle_out(AVFormatContext *s,
1004 AVOutputStream *ost,
1009 static uint8_t *subtitle_out = NULL;
1010 int subtitle_out_max_size = 1024 * 1024;
1011 int subtitle_out_size, nb, i;
1012 AVCodecContext *enc;
1015 if (pts == AV_NOPTS_VALUE) {
1016 fprintf(stderr, "Subtitle packets must have a pts\n");
1022 enc = ost->st->codec;
1024 if (!subtitle_out) {
1025 subtitle_out = av_malloc(subtitle_out_max_size);
1028 /* Note: DVB subtitle need one packet to draw them and one other
1029 packet to clear them */
1030 /* XXX: signal it in the codec context ? */
1031 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1036 for(i = 0; i < nb; i++) {
1037 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1038 // start_display_time is required to be 0
1039 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1040 sub->end_display_time -= sub->start_display_time;
1041 sub->start_display_time = 0;
1042 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1043 subtitle_out_max_size, sub);
1044 if (subtitle_out_size < 0) {
1045 fprintf(stderr, "Subtitle encoding failed\n");
1049 av_init_packet(&pkt);
1050 pkt.stream_index = ost->index;
1051 pkt.data = subtitle_out;
1052 pkt.size = subtitle_out_size;
1053 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1054 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1055 /* XXX: the pts correction is handled here. Maybe handling
1056 it in the codec would be better */
1058 pkt.pts += 90 * sub->start_display_time;
1060 pkt.pts += 90 * sub->end_display_time;
1062 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1066 static int bit_buffer_size= 1024*256;
1067 static uint8_t *bit_buffer= NULL;
1069 static void do_video_out(AVFormatContext *s,
1070 AVOutputStream *ost,
1072 AVFrame *in_picture,
1075 int nb_frames, i, ret;
1076 AVFrame *final_picture, *formatted_picture, *resampling_dst, *padding_src;
1077 AVCodecContext *enc, *dec;
1080 enc = ost->st->codec;
1081 dec = ist->st->codec;
1083 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1085 /* by default, we output a single frame */
1090 if(video_sync_method){
1091 double vdelta = sync_ipts - ost->sync_opts;
1092 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1095 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1098 }else if(vdelta>0.6)
1099 ost->sync_opts= lrintf(sync_ipts);
1100 }else if (vdelta > 1.1)
1101 nb_frames = lrintf(vdelta);
1102 //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);
1103 if (nb_frames == 0){
1106 fprintf(stderr, "*** drop!\n");
1107 }else if (nb_frames > 1) {
1108 nb_frames_dup += nb_frames - 1;
1110 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1113 ost->sync_opts= lrintf(sync_ipts);
1115 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1119 formatted_picture = in_picture;
1120 final_picture = formatted_picture;
1121 padding_src = formatted_picture;
1122 resampling_dst = &ost->pict_tmp;
1124 if ( ost->resample_height != ist->st->codec->height
1125 || ost->resample_width != ist->st->codec->width
1126 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1128 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));
1129 if(!ost->video_resample)
1133 #if !CONFIG_AVFILTER
1134 if (ost->video_resample) {
1136 final_picture = &ost->pict_tmp;
1137 if( ost->resample_height != ist->st->codec->height
1138 || ost->resample_width != ist->st->codec->width
1139 || (ost->resample_pix_fmt!= ist->st->codec->pix_fmt) ) {
1141 /* initialize a new scaler context */
1142 sws_freeContext(ost->img_resample_ctx);
1143 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
1144 ost->img_resample_ctx = sws_getContext(
1145 ist->st->codec->width,
1146 ist->st->codec->height,
1147 ist->st->codec->pix_fmt,
1148 ost->st->codec->width,
1149 ost->st->codec->height,
1150 ost->st->codec->pix_fmt,
1151 sws_flags, NULL, NULL, NULL);
1152 if (ost->img_resample_ctx == NULL) {
1153 fprintf(stderr, "Cannot get resampling context\n");
1157 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1158 0, ost->resample_height, resampling_dst->data, resampling_dst->linesize);
1162 /* duplicates frame if needed */
1163 for(i=0;i<nb_frames;i++) {
1165 av_init_packet(&pkt);
1166 pkt.stream_index= ost->index;
1168 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1169 /* raw pictures are written as AVPicture structure to
1170 avoid any copies. We support temorarily the older
1172 AVFrame* old_frame = enc->coded_frame;
1173 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1174 pkt.data= (uint8_t *)final_picture;
1175 pkt.size= sizeof(AVPicture);
1176 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1177 pkt.flags |= AV_PKT_FLAG_KEY;
1179 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1180 enc->coded_frame = old_frame;
1182 AVFrame big_picture;
1184 big_picture= *final_picture;
1185 /* better than nothing: use input picture interlaced
1187 big_picture.interlaced_frame = in_picture->interlaced_frame;
1188 if(avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)){
1189 if(top_field_first == -1)
1190 big_picture.top_field_first = in_picture->top_field_first;
1192 big_picture.top_field_first = top_field_first;
1195 /* handles sameq here. This is not correct because it may
1196 not be a global option */
1197 big_picture.quality = same_quality ? ist->st->quality : ost->st->quality;
1199 big_picture.pict_type = 0;
1200 // big_picture.pts = AV_NOPTS_VALUE;
1201 big_picture.pts= ost->sync_opts;
1202 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1203 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1204 if (ost->forced_kf_index < ost->forced_kf_count &&
1205 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1206 big_picture.pict_type = FF_I_TYPE;
1207 ost->forced_kf_index++;
1209 ret = avcodec_encode_video(enc,
1210 bit_buffer, bit_buffer_size,
1213 fprintf(stderr, "Video encoding failed\n");
1218 pkt.data= bit_buffer;
1220 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1221 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1222 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1223 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1224 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1226 if(enc->coded_frame->key_frame)
1227 pkt.flags |= AV_PKT_FLAG_KEY;
1228 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1231 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1232 // enc->frame_number-1, ret, enc->pict_type);
1233 /* if two pass, output log */
1234 if (ost->logfile && enc->stats_out) {
1235 fprintf(ost->logfile, "%s", enc->stats_out);
1240 ost->frame_number++;
1244 static double psnr(double d){
1245 return -10.0*log(d)/log(10.0);
1248 static void do_video_stats(AVFormatContext *os, AVOutputStream *ost,
1251 AVCodecContext *enc;
1253 double ti1, bitrate, avg_bitrate;
1255 /* this is executed just the first time do_video_stats is called */
1257 vstats_file = fopen(vstats_filename, "w");
1264 enc = ost->st->codec;
1265 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1266 frame_number = ost->frame_number;
1267 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1268 if (enc->flags&CODEC_FLAG_PSNR)
1269 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1271 fprintf(vstats_file,"f_size= %6d ", frame_size);
1272 /* compute pts value */
1273 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1277 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1278 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1279 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1280 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1281 fprintf(vstats_file,"type= %c\n", av_get_pict_type_char(enc->coded_frame->pict_type));
1285 static void print_report(AVFormatContext **output_files,
1286 AVOutputStream **ost_table, int nb_ostreams,
1290 AVOutputStream *ost;
1291 AVFormatContext *oc;
1293 AVCodecContext *enc;
1294 int frame_number, vid, i;
1295 double bitrate, ti1, pts;
1296 static int64_t last_time = -1;
1297 static int qp_histogram[52];
1299 if (!is_last_report) {
1301 /* display the report every 0.5 seconds */
1302 cur_time = av_gettime();
1303 if (last_time == -1) {
1304 last_time = cur_time;
1307 if ((cur_time - last_time) < 500000)
1309 last_time = cur_time;
1313 oc = output_files[0];
1315 total_size = avio_size(oc->pb);
1316 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1317 total_size= avio_tell(oc->pb);
1322 for(i=0;i<nb_ostreams;i++) {
1324 enc = ost->st->codec;
1325 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1326 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ",
1327 !ost->st->stream_copy ?
1328 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1330 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1331 float t = (av_gettime()-timer_start) / 1000000.0;
1333 frame_number = ost->frame_number;
1334 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1335 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0,
1336 !ost->st->stream_copy ?
1337 enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
1339 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1342 int qp= lrintf(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1343 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1346 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1348 if (enc->flags&CODEC_FLAG_PSNR){
1350 double error, error_sum=0;
1351 double scale, scale_sum=0;
1352 char type[3]= {'Y','U','V'};
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1356 error= enc->error[j];
1357 scale= enc->width*enc->height*255.0*255.0*frame_number;
1359 error= enc->coded_frame->error[j];
1360 scale= enc->width*enc->height*255.0*255.0;
1365 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1367 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1371 /* compute min output value */
1372 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1373 if ((pts < ti1) && (pts > 0))
1379 if (verbose || is_last_report) {
1380 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1383 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1384 (double)total_size / 1024, ti1, bitrate);
1386 if (nb_frames_dup || nb_frames_drop)
1387 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1388 nb_frames_dup, nb_frames_drop);
1391 fprintf(stderr, "%s \r", buf);
1396 if (is_last_report && verbose >= 0){
1397 int64_t raw= audio_size + video_size + extra_size;
1398 fprintf(stderr, "\n");
1399 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1403 100.0*(total_size - raw)/raw
1408 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1409 static int output_packet(AVInputStream *ist, int ist_index,
1410 AVOutputStream **ost_table, int nb_ostreams,
1411 const AVPacket *pkt)
1413 AVFormatContext *os;
1414 AVOutputStream *ost;
1418 void *buffer_to_free;
1419 static unsigned int samples_size= 0;
1420 AVSubtitle subtitle, *subtitle_to_free;
1421 int64_t pkt_pts = AV_NOPTS_VALUE;
1423 int frame_available;
1427 int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
1429 if(ist->next_pts == AV_NOPTS_VALUE)
1430 ist->next_pts= ist->pts;
1434 av_init_packet(&avpkt);
1442 if(pkt->dts != AV_NOPTS_VALUE)
1443 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1444 if(pkt->pts != AV_NOPTS_VALUE)
1445 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1447 //while we have more to decode or while the decoder did output something on EOF
1448 while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
1449 uint8_t *data_buf, *decoded_data_buf;
1450 int data_size, decoded_data_size;
1452 ist->pts= ist->next_pts;
1454 if(avpkt.size && avpkt.size != pkt->size &&
1455 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1456 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1457 ist->showed_multi_packet_warning=1;
1460 /* decode the packet if needed */
1461 decoded_data_buf = NULL; /* fail safe */
1462 decoded_data_size= 0;
1463 data_buf = avpkt.data;
1464 data_size = avpkt.size;
1465 subtitle_to_free = NULL;
1466 if (ist->decoding_needed) {
1467 switch(ist->st->codec->codec_type) {
1468 case AVMEDIA_TYPE_AUDIO:{
1469 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1470 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1472 samples= av_malloc(samples_size);
1474 decoded_data_size= samples_size;
1475 /* XXX: could avoid copy if PCM 16 bits with same
1476 endianness as CPU */
1477 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1484 /* Some bug in mpeg audio decoder gives */
1485 /* decoded_data_size < 0, it seems they are overflows */
1486 if (decoded_data_size <= 0) {
1487 /* no audio frame */
1490 decoded_data_buf = (uint8_t *)samples;
1491 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1492 (ist->st->codec->sample_rate * ist->st->codec->channels);
1494 case AVMEDIA_TYPE_VIDEO:
1495 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1496 /* XXX: allocate picture correctly */
1497 avcodec_get_frame_defaults(&picture);
1498 avpkt.pts = pkt_pts;
1499 avpkt.dts = ist->pts;
1500 pkt_pts = AV_NOPTS_VALUE;
1502 ret = avcodec_decode_video2(ist->st->codec,
1503 &picture, &got_picture, &avpkt);
1504 ist->st->quality= picture.quality;
1508 /* no picture yet */
1509 goto discard_packet;
1511 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1512 if (ist->st->codec->time_base.num != 0) {
1513 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1514 ist->next_pts += ((int64_t)AV_TIME_BASE *
1515 ist->st->codec->time_base.num * ticks) /
1516 ist->st->codec->time_base.den;
1520 case AVMEDIA_TYPE_SUBTITLE:
1521 ret = avcodec_decode_subtitle2(ist->st->codec,
1522 &subtitle, &got_picture, &avpkt);
1526 goto discard_packet;
1528 subtitle_to_free = &subtitle;
1535 switch(ist->st->codec->codec_type) {
1536 case AVMEDIA_TYPE_AUDIO:
1537 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1538 ist->st->codec->sample_rate;
1540 case AVMEDIA_TYPE_VIDEO:
1541 if (ist->st->codec->time_base.num != 0) {
1542 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1543 ist->next_pts += ((int64_t)AV_TIME_BASE *
1544 ist->st->codec->time_base.num * ticks) /
1545 ist->st->codec->time_base.den;
1553 buffer_to_free = NULL;
1554 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1555 pre_process_video_frame(ist, (AVPicture *)&picture,
1560 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
1561 for(i=0;i<nb_ostreams;i++) {
1563 if (ost->input_video_filter && ost->source_index == ist_index) {
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(ost->input_video_filter, &picture,
1576 // preprocess audio (volume)
1577 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1578 if (audio_volume != 256) {
1581 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1582 int v = ((*volp) * audio_volume + 128) >> 8;
1583 if (v < -32768) v = -32768;
1584 if (v > 32767) v = 32767;
1590 /* frame rate emulation */
1592 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1593 int64_t now = av_gettime() - ist->start;
1597 /* if output time reached then transcode raw format,
1598 encode packets and output them */
1599 if (start_time == 0 || ist->pts >= start_time)
1600 for(i=0;i<nb_ostreams;i++) {
1604 if (ost->source_index == ist_index) {
1606 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1607 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1608 while (frame_available) {
1609 AVRational ist_pts_tb;
1610 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1611 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1613 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
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 (ost->picref->video)
1629 ost->st->codec->sample_aspect_ratio = ost->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)
1650 #if !CONFIG_AVFILTER
1656 /* no reencoding needed : output the packet directly */
1657 /* force the input stream PTS */
1659 avcodec_get_frame_defaults(&avframe);
1660 ost->st->codec->coded_frame= &avframe;
1661 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1663 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1664 audio_size += data_size;
1665 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1666 video_size += data_size;
1670 opkt.stream_index= ost->index;
1671 if(pkt->pts != AV_NOPTS_VALUE)
1672 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1674 opkt.pts= AV_NOPTS_VALUE;
1676 if (pkt->dts == AV_NOPTS_VALUE)
1677 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1679 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1680 opkt.dts -= ost_tb_start_time;
1682 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1683 opkt.flags= pkt->flags;
1685 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1686 if( ost->st->codec->codec_id != CODEC_ID_H264
1687 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1688 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1690 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1691 opkt.destruct= av_destruct_packet;
1693 opkt.data = data_buf;
1694 opkt.size = data_size;
1697 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1698 ost->st->codec->frame_number++;
1699 ost->frame_number++;
1700 av_free_packet(&opkt);
1704 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1705 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1707 avfilter_unref_buffer(ost->picref);
1713 av_free(buffer_to_free);
1714 /* XXX: allocate the subtitles in the codec ? */
1715 if (subtitle_to_free) {
1716 avsubtitle_free(subtitle_to_free);
1717 subtitle_to_free = NULL;
1724 for(i=0;i<nb_ostreams;i++) {
1726 if (ost->source_index == ist_index) {
1727 AVCodecContext *enc= ost->st->codec;
1728 os = output_files[ost->file_index];
1730 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1732 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1735 if (ost->encoding_needed) {
1739 av_init_packet(&pkt);
1740 pkt.stream_index= ost->index;
1742 switch(ost->st->codec->codec_type) {
1743 case AVMEDIA_TYPE_AUDIO:
1744 fifo_bytes = av_fifo_size(ost->fifo);
1746 /* encode any samples remaining in fifo */
1747 if (fifo_bytes > 0) {
1748 int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
1749 int fs_tmp = enc->frame_size;
1751 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1752 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1753 enc->frame_size = fifo_bytes / (osize * enc->channels);
1755 int frame_bytes = enc->frame_size*osize*enc->channels;
1756 if (allocated_audio_buf_size < frame_bytes)
1758 memset(audio_buf+fifo_bytes, 0, frame_bytes - fifo_bytes);
1761 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1762 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1763 ost->st->time_base.num, enc->sample_rate);
1764 enc->frame_size = fs_tmp;
1767 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1770 fprintf(stderr, "Audio encoding failed\n");
1774 pkt.flags |= AV_PKT_FLAG_KEY;
1776 case AVMEDIA_TYPE_VIDEO:
1777 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1779 fprintf(stderr, "Video encoding failed\n");
1783 if(enc->coded_frame && enc->coded_frame->key_frame)
1784 pkt.flags |= AV_PKT_FLAG_KEY;
1785 if (ost->logfile && enc->stats_out) {
1786 fprintf(ost->logfile, "%s", enc->stats_out);
1795 pkt.data= bit_buffer;
1797 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1798 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1799 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1811 static void print_sdp(AVFormatContext **avc, int n)
1815 avf_sdp_create(avc, n, sdp, sizeof(sdp));
1816 printf("SDP:\n%s\n", sdp);
1820 static int copy_chapters(int infile, int outfile)
1822 AVFormatContext *is = input_files[infile];
1823 AVFormatContext *os = output_files[outfile];
1826 for (i = 0; i < is->nb_chapters; i++) {
1827 AVChapter *in_ch = is->chapters[i], *out_ch;
1828 int64_t ts_off = av_rescale_q(start_time - input_files_ts_offset[infile],
1829 AV_TIME_BASE_Q, in_ch->time_base);
1830 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
1831 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
1834 if (in_ch->end < ts_off)
1836 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
1839 out_ch = av_mallocz(sizeof(AVChapter));
1841 return AVERROR(ENOMEM);
1843 out_ch->id = in_ch->id;
1844 out_ch->time_base = in_ch->time_base;
1845 out_ch->start = FFMAX(0, in_ch->start - ts_off);
1846 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
1848 if (metadata_chapters_autocopy)
1849 av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
1852 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
1854 return AVERROR(ENOMEM);
1855 os->chapters[os->nb_chapters - 1] = out_ch;
1860 static void parse_forced_key_frames(char *kf, AVOutputStream *ost,
1861 AVCodecContext *avctx)
1867 for (p = kf; *p; p++)
1870 ost->forced_kf_count = n;
1871 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
1872 if (!ost->forced_kf_pts) {
1873 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
1876 for (i = 0; i < n; i++) {
1877 p = i ? strchr(p, ',') + 1 : kf;
1878 t = parse_time_or_die("force_key_frames", p, 1);
1879 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
1884 * The following code is the main loop of the file converter
1886 static int transcode(AVFormatContext **output_files,
1887 int nb_output_files,
1888 AVFormatContext **input_files,
1890 AVStreamMap *stream_maps, int nb_stream_maps)
1892 int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0;
1893 AVFormatContext *is, *os;
1894 AVCodecContext *codec, *icodec;
1895 AVOutputStream *ost, **ost_table = NULL;
1896 AVInputStream *ist, **ist_table = NULL;
1897 AVInputFile *file_table;
1901 uint8_t no_packet[MAX_FILES]={0};
1902 int no_packet_count=0;
1904 file_table= av_mallocz(nb_input_files * sizeof(AVInputFile));
1908 /* input stream init */
1910 for(i=0;i<nb_input_files;i++) {
1911 is = input_files[i];
1912 file_table[i].ist_index = j;
1913 file_table[i].nb_streams = is->nb_streams;
1914 j += is->nb_streams;
1918 ist_table = av_mallocz(nb_istreams * sizeof(AVInputStream *));
1922 for(i=0;i<nb_istreams;i++) {
1923 ist = av_mallocz(sizeof(AVInputStream));
1929 for(i=0;i<nb_input_files;i++) {
1930 is = input_files[i];
1931 for(k=0;k<is->nb_streams;k++) {
1932 ist = ist_table[j++];
1933 ist->st = is->streams[k];
1934 ist->file_index = i;
1936 ist->discard = 1; /* the stream is discarded by default
1940 ist->start = av_gettime();
1945 /* output stream init */
1947 for(i=0;i<nb_output_files;i++) {
1948 os = output_files[i];
1949 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1950 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1951 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1952 ret = AVERROR(EINVAL);
1955 nb_ostreams += os->nb_streams;
1957 if (nb_stream_maps > 0 && nb_stream_maps != nb_ostreams) {
1958 fprintf(stderr, "Number of stream maps must match number of output streams\n");
1959 ret = AVERROR(EINVAL);
1963 /* Sanity check the mapping args -- do the input files & streams exist? */
1964 for(i=0;i<nb_stream_maps;i++) {
1965 int fi = stream_maps[i].file_index;
1966 int si = stream_maps[i].stream_index;
1968 if (fi < 0 || fi > nb_input_files - 1 ||
1969 si < 0 || si > file_table[fi].nb_streams - 1) {
1970 fprintf(stderr,"Could not find input stream #%d.%d\n", fi, si);
1971 ret = AVERROR(EINVAL);
1974 fi = stream_maps[i].sync_file_index;
1975 si = stream_maps[i].sync_stream_index;
1976 if (fi < 0 || fi > nb_input_files - 1 ||
1977 si < 0 || si > file_table[fi].nb_streams - 1) {
1978 fprintf(stderr,"Could not find sync stream #%d.%d\n", fi, si);
1979 ret = AVERROR(EINVAL);
1984 ost_table = av_mallocz(sizeof(AVOutputStream *) * nb_ostreams);
1988 for(k=0;k<nb_output_files;k++) {
1989 os = output_files[k];
1990 for(i=0;i<os->nb_streams;i++,n++) {
1992 ost = ost_table[n] = output_streams_for_file[k][i];
1993 ost->st = os->streams[i];
1994 if (nb_stream_maps > 0) {
1995 ost->source_index = file_table[stream_maps[n].file_index].ist_index +
1996 stream_maps[n].stream_index;
1998 /* Sanity check that the stream types match */
1999 if (ist_table[ost->source_index]->st->codec->codec_type != ost->st->codec->codec_type) {
2000 int i= ost->file_index;
2001 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2002 fprintf(stderr, "Codec type mismatch for mapping #%d.%d -> #%d.%d\n",
2003 stream_maps[n].file_index, stream_maps[n].stream_index,
2004 ost->file_index, ost->index);
2009 int best_nb_frames=-1;
2010 /* get corresponding input stream index : we select the first one with the right type */
2012 for(j=0;j<nb_istreams;j++) {
2017 AVFormatContext *f= input_files[ ist->file_index ];
2019 for(pi=0; pi<f->nb_programs; pi++){
2020 AVProgram *p= f->programs[pi];
2021 if(p->id == opt_programid)
2022 for(si=0; si<p->nb_stream_indexes; si++){
2023 if(f->streams[ p->stream_index[si] ] == ist->st)
2028 if (ist->discard && ist->st->discard != AVDISCARD_ALL && !skip &&
2029 ist->st->codec->codec_type == ost->st->codec->codec_type) {
2030 if(best_nb_frames < ist->st->codec_info_nb_frames){
2031 best_nb_frames= ist->st->codec_info_nb_frames;
2032 ost->source_index = j;
2039 if(! opt_programid) {
2040 /* try again and reuse existing stream */
2041 for(j=0;j<nb_istreams;j++) {
2043 if ( ist->st->codec->codec_type == ost->st->codec->codec_type
2044 && ist->st->discard != AVDISCARD_ALL) {
2045 ost->source_index = j;
2051 int i= ost->file_index;
2052 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2053 fprintf(stderr, "Could not find input stream matching output stream #%d.%d\n",
2054 ost->file_index, ost->index);
2059 ist = ist_table[ost->source_index];
2061 ost->sync_ist = (nb_stream_maps > 0) ?
2062 ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
2063 stream_maps[n].sync_stream_index] : ist;
2067 /* for each output stream, we compute the right encoding parameters */
2068 for(i=0;i<nb_ostreams;i++) {
2070 os = output_files[ost->file_index];
2071 ist = ist_table[ost->source_index];
2073 codec = ost->st->codec;
2074 icodec = ist->st->codec;
2076 if (metadata_streams_autocopy)
2077 av_metadata_copy(&ost->st->metadata, ist->st->metadata,
2078 AV_METADATA_DONT_OVERWRITE);
2080 ost->st->disposition = ist->st->disposition;
2081 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
2082 codec->chroma_sample_location = icodec->chroma_sample_location;
2084 if (ost->st->stream_copy) {
2085 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2087 if (extra_size > INT_MAX)
2090 /* if stream_copy is selected, no need to decode or encode */
2091 codec->codec_id = icodec->codec_id;
2092 codec->codec_type = icodec->codec_type;
2094 if(!codec->codec_tag){
2095 if( !os->oformat->codec_tag
2096 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2097 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2098 codec->codec_tag = icodec->codec_tag;
2101 codec->bit_rate = icodec->bit_rate;
2102 codec->rc_max_rate = icodec->rc_max_rate;
2103 codec->rc_buffer_size = icodec->rc_buffer_size;
2104 codec->extradata= av_mallocz(extra_size);
2105 if (!codec->extradata)
2107 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2108 codec->extradata_size= icodec->extradata_size;
2109 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){
2110 codec->time_base = icodec->time_base;
2111 codec->time_base.num *= icodec->ticks_per_frame;
2112 av_reduce(&codec->time_base.num, &codec->time_base.den,
2113 codec->time_base.num, codec->time_base.den, INT_MAX);
2115 codec->time_base = ist->st->time_base;
2116 switch(codec->codec_type) {
2117 case AVMEDIA_TYPE_AUDIO:
2118 if(audio_volume != 256) {
2119 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2122 codec->channel_layout = icodec->channel_layout;
2123 codec->sample_rate = icodec->sample_rate;
2124 codec->channels = icodec->channels;
2125 codec->frame_size = icodec->frame_size;
2126 codec->block_align= icodec->block_align;
2127 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2128 codec->block_align= 0;
2129 if(codec->codec_id == CODEC_ID_AC3)
2130 codec->block_align= 0;
2132 case AVMEDIA_TYPE_VIDEO:
2133 codec->pix_fmt = icodec->pix_fmt;
2134 codec->width = icodec->width;
2135 codec->height = icodec->height;
2136 codec->has_b_frames = icodec->has_b_frames;
2138 case AVMEDIA_TYPE_SUBTITLE:
2139 codec->width = icodec->width;
2140 codec->height = icodec->height;
2146 switch(codec->codec_type) {
2147 case AVMEDIA_TYPE_AUDIO:
2148 ost->fifo= av_fifo_alloc(1024);
2151 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2152 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2153 icodec->request_channels = codec->channels;
2154 ist->decoding_needed = 1;
2155 ost->encoding_needed = 1;
2156 ost->resample_sample_fmt = icodec->sample_fmt;
2157 ost->resample_sample_rate = icodec->sample_rate;
2158 ost->resample_channels = icodec->channels;
2160 case AVMEDIA_TYPE_VIDEO:
2161 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2162 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2165 ost->video_resample = (codec->width != icodec->width ||
2166 codec->height != icodec->height ||
2167 (codec->pix_fmt != icodec->pix_fmt));
2168 if (ost->video_resample) {
2169 #if !CONFIG_AVFILTER
2170 avcodec_get_frame_defaults(&ost->pict_tmp);
2171 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2172 codec->width, codec->height)) {
2173 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2176 sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2177 ost->img_resample_ctx = sws_getContext(
2184 sws_flags, NULL, NULL, NULL);
2185 if (ost->img_resample_ctx == NULL) {
2186 fprintf(stderr, "Cannot get resampling context\n");
2190 ost->original_height = icodec->height;
2191 ost->original_width = icodec->width;
2193 codec->bits_per_raw_sample= 0;
2195 ost->resample_height = icodec->height;
2196 ost->resample_width = icodec->width;
2197 ost->resample_pix_fmt= icodec->pix_fmt;
2198 ost->encoding_needed = 1;
2199 ist->decoding_needed = 1;
2202 if (configure_filters(ist, ost)) {
2203 fprintf(stderr, "Error opening filters!\n");
2208 case AVMEDIA_TYPE_SUBTITLE:
2209 ost->encoding_needed = 1;
2210 ist->decoding_needed = 1;
2217 if (ost->encoding_needed &&
2218 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2219 char logfilename[1024];
2222 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2223 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2225 if (codec->flags & CODEC_FLAG_PASS1) {
2226 f = fopen(logfilename, "wb");
2228 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2234 size_t logbuffer_size;
2235 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2236 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2239 codec->stats_in = logbuffer;
2243 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2244 int size= codec->width * codec->height;
2245 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2250 bit_buffer = av_malloc(bit_buffer_size);
2252 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2254 ret = AVERROR(ENOMEM);
2258 /* open each encoder */
2259 for(i=0;i<nb_ostreams;i++) {
2261 if (ost->encoding_needed) {
2262 AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
2263 AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
2265 codec = avcodec_find_encoder(ost->st->codec->codec_id);
2267 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2268 ost->st->codec->codec_id, ost->file_index, ost->index);
2269 ret = AVERROR(EINVAL);
2272 if (dec->subtitle_header) {
2273 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2274 if (!ost->st->codec->subtitle_header) {
2275 ret = AVERROR(ENOMEM);
2278 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2279 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2281 if (avcodec_open(ost->st->codec, codec) < 0) {
2282 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2283 ost->file_index, ost->index);
2284 ret = AVERROR(EINVAL);
2287 extra_size += ost->st->codec->extradata_size;
2291 /* open each decoder */
2292 for(i=0;i<nb_istreams;i++) {
2294 if (ist->decoding_needed) {
2295 AVCodec *codec = i < nb_input_codecs ? input_codecs[i] : NULL;
2297 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2299 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2300 ist->st->codec->codec_id, ist->file_index, ist->index);
2301 ret = AVERROR(EINVAL);
2304 if (avcodec_open(ist->st->codec, codec) < 0) {
2305 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2306 ist->file_index, ist->index);
2307 ret = AVERROR(EINVAL);
2310 //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
2311 // ist->st->codec->flags |= CODEC_FLAG_REPEAT_FIELD;
2316 for(i=0;i<nb_istreams;i++) {
2320 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2321 ist->next_pts = AV_NOPTS_VALUE;
2325 /* set meta data information from input file if required */
2326 for (i=0;i<nb_meta_data_maps;i++) {
2327 AVFormatContext *files[2];
2328 AVMetadata **meta[2];
2331 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
2332 if ((index) < 0 || (index) >= (nb_elems)) {\
2333 snprintf(error, sizeof(error), "Invalid %s index %d while processing metadata maps\n",\
2335 ret = AVERROR(EINVAL);\
2339 int out_file_index = meta_data_maps[i][0].file;
2340 int in_file_index = meta_data_maps[i][1].file;
2341 if (in_file_index < 0 || out_file_index < 0)
2343 METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
2344 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
2346 files[0] = output_files[out_file_index];
2347 files[1] = input_files[in_file_index];
2349 for (j = 0; j < 2; j++) {
2350 AVMetaDataMap *map = &meta_data_maps[i][j];
2352 switch (map->type) {
2354 meta[j] = &files[j]->metadata;
2357 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
2358 meta[j] = &files[j]->streams[map->index]->metadata;
2361 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
2362 meta[j] = &files[j]->chapters[map->index]->metadata;
2365 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
2366 meta[j] = &files[j]->programs[map->index]->metadata;
2371 av_metadata_copy(meta[0], *meta[1], AV_METADATA_DONT_OVERWRITE);
2374 /* copy global metadata by default */
2375 if (metadata_global_autocopy) {
2377 for (i = 0; i < nb_output_files; i++)
2378 av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata,
2379 AV_METADATA_DONT_OVERWRITE);
2382 /* copy chapters according to chapter maps */
2383 for (i = 0; i < nb_chapter_maps; i++) {
2384 int infile = chapter_maps[i].in_file;
2385 int outfile = chapter_maps[i].out_file;
2387 if (infile < 0 || outfile < 0)
2389 if (infile >= nb_input_files) {
2390 snprintf(error, sizeof(error), "Invalid input file index %d in chapter mapping.\n", infile);
2391 ret = AVERROR(EINVAL);
2394 if (outfile >= nb_output_files) {
2395 snprintf(error, sizeof(error), "Invalid output file index %d in chapter mapping.\n",outfile);
2396 ret = AVERROR(EINVAL);
2399 copy_chapters(infile, outfile);
2402 /* copy chapters from the first input file that has them*/
2403 if (!nb_chapter_maps)
2404 for (i = 0; i < nb_input_files; i++) {
2405 if (!input_files[i]->nb_chapters)
2408 for (j = 0; j < nb_output_files; j++)
2409 if ((ret = copy_chapters(i, j)) < 0)
2414 /* open files and write file headers */
2415 for(i=0;i<nb_output_files;i++) {
2416 os = output_files[i];
2417 if (av_write_header(os) < 0) {
2418 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2419 ret = AVERROR(EINVAL);
2422 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2428 /* dump the file output parameters - cannot be done before in case
2430 for(i=0;i<nb_output_files;i++) {
2431 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2434 /* dump the stream mapping */
2436 fprintf(stderr, "Stream mapping:\n");
2437 for(i=0;i<nb_ostreams;i++) {
2439 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2440 ist_table[ost->source_index]->file_index,
2441 ist_table[ost->source_index]->index,
2444 if (ost->sync_ist != ist_table[ost->source_index])
2445 fprintf(stderr, " [sync #%d.%d]",
2446 ost->sync_ist->file_index,
2447 ost->sync_ist->index);
2448 fprintf(stderr, "\n");
2453 fprintf(stderr, "%s\n", error);
2458 print_sdp(output_files, nb_output_files);
2464 fprintf(stderr, "Press [q] to stop encoding\n");
2466 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2468 url_set_interrupt_cb(decode_interrupt_cb);
2472 timer_start = av_gettime();
2474 for(; received_sigterm == 0;) {
2475 int file_index, ist_index;
2483 /* if 'q' pressed, exits */
2487 /* read_key() returns 0 on EOF */
2493 /* select the stream that we must read now by looking at the
2494 smallest output pts */
2496 for(i=0;i<nb_ostreams;i++) {
2499 os = output_files[ost->file_index];
2500 ist = ist_table[ost->source_index];
2501 if(ist->is_past_recording_time || no_packet[ist->file_index])
2503 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2504 ipts = (double)ist->pts;
2505 if (!file_table[ist->file_index].eof_reached){
2506 if(ipts < ipts_min) {
2508 if(input_sync ) file_index = ist->file_index;
2510 if(opts < opts_min) {
2512 if(!input_sync) file_index = ist->file_index;
2515 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2520 /* if none, if is finished */
2521 if (file_index < 0) {
2522 if(no_packet_count){
2524 memset(no_packet, 0, sizeof(no_packet));
2531 /* finish if limit size exhausted */
2532 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2535 /* read a frame from it and output it in the fifo */
2536 is = input_files[file_index];
2537 ret= av_read_frame(is, &pkt);
2538 if(ret == AVERROR(EAGAIN)){
2539 no_packet[file_index]=1;
2544 file_table[file_index].eof_reached = 1;
2552 memset(no_packet, 0, sizeof(no_packet));
2555 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2556 is->streams[pkt.stream_index]);
2558 /* the following test is needed in case new streams appear
2559 dynamically in stream : we ignore them */
2560 if (pkt.stream_index >= file_table[file_index].nb_streams)
2561 goto discard_packet;
2562 ist_index = file_table[file_index].ist_index + pkt.stream_index;
2563 ist = ist_table[ist_index];
2565 goto discard_packet;
2567 if (pkt.dts != AV_NOPTS_VALUE)
2568 pkt.dts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2569 if (pkt.pts != AV_NOPTS_VALUE)
2570 pkt.pts += av_rescale_q(input_files_ts_offset[ist->file_index], AV_TIME_BASE_Q, ist->st->time_base);
2572 if (pkt.stream_index < nb_input_files_ts_scale[file_index]
2573 && input_files_ts_scale[file_index][pkt.stream_index]){
2574 if(pkt.pts != AV_NOPTS_VALUE)
2575 pkt.pts *= input_files_ts_scale[file_index][pkt.stream_index];
2576 if(pkt.dts != AV_NOPTS_VALUE)
2577 pkt.dts *= input_files_ts_scale[file_index][pkt.stream_index];
2580 // 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);
2581 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2582 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2583 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2584 int64_t delta= pkt_dts - ist->next_pts;
2585 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2586 input_files_ts_offset[ist->file_index]-= delta;
2588 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]);
2589 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2590 if(pkt.pts != AV_NOPTS_VALUE)
2591 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2595 /* finish if recording time exhausted */
2596 if (recording_time != INT64_MAX &&
2597 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2598 ist->is_past_recording_time = 1;
2599 goto discard_packet;
2602 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->index, pkt.size);
2603 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2606 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2607 ist->file_index, ist->index);
2610 av_free_packet(&pkt);
2615 av_free_packet(&pkt);
2617 /* dump report by using the output first video and audio streams */
2618 print_report(output_files, ost_table, nb_ostreams, 0);
2621 /* at the end of stream, we must flush the decoder buffers */
2622 for(i=0;i<nb_istreams;i++) {
2624 if (ist->decoding_needed) {
2625 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2631 /* write the trailer if needed and close file */
2632 for(i=0;i<nb_output_files;i++) {
2633 os = output_files[i];
2634 av_write_trailer(os);
2637 /* dump report by using the first video and audio streams */
2638 print_report(output_files, ost_table, nb_ostreams, 1);
2640 /* close each encoder */
2641 for(i=0;i<nb_ostreams;i++) {
2643 if (ost->encoding_needed) {
2644 av_freep(&ost->st->codec->stats_in);
2645 avcodec_close(ost->st->codec);
2648 avfilter_graph_free(&ost->graph);
2652 /* close each decoder */
2653 for(i=0;i<nb_istreams;i++) {
2655 if (ist->decoding_needed) {
2656 avcodec_close(ist->st->codec);
2664 av_freep(&bit_buffer);
2665 av_free(file_table);
2668 for(i=0;i<nb_istreams;i++) {
2675 for(i=0;i<nb_ostreams;i++) {
2678 if (ost->st->stream_copy)
2679 av_freep(&ost->st->codec->extradata);
2681 fclose(ost->logfile);
2682 ost->logfile = NULL;
2684 av_fifo_free(ost->fifo); /* works even if fifo is not
2685 initialized but set to zero */
2686 av_freep(&ost->st->codec->subtitle_header);
2687 av_free(ost->pict_tmp.data[0]);
2688 av_free(ost->forced_kf_pts);
2689 if (ost->video_resample)
2690 sws_freeContext(ost->img_resample_ctx);
2692 audio_resample_close(ost->resample);
2693 if (ost->reformat_ctx)
2694 av_audio_convert_free(ost->reformat_ctx);
2703 static void opt_format(const char *arg)
2705 last_asked_format = arg;
2708 static void opt_video_rc_override_string(const char *arg)
2710 video_rc_override_string = arg;
2713 static int opt_me_threshold(const char *opt, const char *arg)
2715 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2719 static int opt_verbose(const char *opt, const char *arg)
2721 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2725 static int opt_frame_rate(const char *opt, const char *arg)
2727 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2728 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2734 static int opt_bitrate(const char *opt, const char *arg)
2736 int codec_type = opt[0]=='a' ? AVMEDIA_TYPE_AUDIO : AVMEDIA_TYPE_VIDEO;
2738 opt_default(opt, arg);
2740 if (av_get_int(avcodec_opts[codec_type], "b", NULL) < 1000)
2741 fprintf(stderr, "WARNING: The bitrate parameter is set too low. It takes bits/s as argument, not kbits/s\n");
2746 static int opt_frame_crop(const char *opt, const char *arg)
2748 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2749 return AVERROR(EINVAL);
2752 static void opt_frame_size(const char *arg)
2754 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2755 fprintf(stderr, "Incorrect frame size\n");
2760 static int opt_pad(const char *opt, const char *arg) {
2761 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2765 static void opt_frame_pix_fmt(const char *arg)
2767 if (strcmp(arg, "list")) {
2768 frame_pix_fmt = av_get_pix_fmt(arg);
2769 if (frame_pix_fmt == PIX_FMT_NONE) {
2770 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2779 static void opt_frame_aspect_ratio(const char *arg)
2786 p = strchr(arg, ':');
2788 x = strtol(arg, &end, 10);
2790 y = strtol(end+1, &end, 10);
2792 ar = (double)x / (double)y;
2794 ar = strtod(arg, NULL);
2797 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2800 frame_aspect_ratio = 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 //fprintf(stderr, "\nInput Audio channels: %d", dec->channels);
3216 channel_layout = dec->channel_layout;
3217 audio_channels = dec->channels;
3218 audio_sample_rate = dec->sample_rate;
3219 audio_sample_fmt = dec->sample_fmt;
3221 st->discard= AVDISCARD_ALL;
3222 /* Note that av_find_stream_info can add more streams, and we
3223 * currently have no chance of setting up lowres decoding
3224 * early enough for them. */
3226 audio_sample_rate >>= dec->lowres;
3228 case AVMEDIA_TYPE_VIDEO:
3229 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(video_codec_name);
3230 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]);
3231 frame_height = dec->height;
3232 frame_width = dec->width;
3233 if(ic->streams[i]->sample_aspect_ratio.num)
3234 frame_aspect_ratio=av_q2d(ic->streams[i]->sample_aspect_ratio);
3236 frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
3237 frame_aspect_ratio *= (float) dec->width / dec->height;
3238 frame_pix_fmt = dec->pix_fmt;
3239 rfps = ic->streams[i]->r_frame_rate.num;
3240 rfps_base = ic->streams[i]->r_frame_rate.den;
3242 dec->flags |= CODEC_FLAG_EMU_EDGE;
3243 frame_height >>= dec->lowres;
3244 frame_width >>= dec->lowres;
3245 dec->height = frame_height;
3246 dec->width = frame_width;
3249 dec->debug |= FF_DEBUG_MV;
3251 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3254 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3255 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3257 (float)rfps / rfps_base, rfps, rfps_base);
3259 /* update the current frame rate to match the stream frame rate */
3260 frame_rate.num = rfps;
3261 frame_rate.den = rfps_base;
3264 st->discard= AVDISCARD_ALL;
3265 else if(video_discard)
3266 st->discard= video_discard;
3268 case AVMEDIA_TYPE_DATA:
3270 case AVMEDIA_TYPE_SUBTITLE:
3271 input_codecs[nb_input_codecs-1] = avcodec_find_decoder_by_name(subtitle_codec_name);
3272 if(subtitle_disable)
3273 st->discard = AVDISCARD_ALL;
3275 case AVMEDIA_TYPE_ATTACHMENT:
3276 case AVMEDIA_TYPE_UNKNOWN:
3283 input_files[nb_input_files] = ic;
3284 input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
3285 /* dump the file content */
3287 av_dump_format(ic, nb_input_files, filename, 0);
3293 av_freep(&video_codec_name);
3294 av_freep(&audio_codec_name);
3295 av_freep(&subtitle_codec_name);
3298 static void check_audio_video_sub_inputs(int *has_video_ptr, int *has_audio_ptr,
3299 int *has_subtitle_ptr)
3301 int has_video, has_audio, has_subtitle, i, j;
3302 AVFormatContext *ic;
3307 for(j=0;j<nb_input_files;j++) {
3308 ic = input_files[j];
3309 for(i=0;i<ic->nb_streams;i++) {
3310 AVCodecContext *enc = ic->streams[i]->codec;
3311 switch(enc->codec_type) {
3312 case AVMEDIA_TYPE_AUDIO:
3315 case AVMEDIA_TYPE_VIDEO:
3318 case AVMEDIA_TYPE_SUBTITLE:
3321 case AVMEDIA_TYPE_DATA:
3322 case AVMEDIA_TYPE_ATTACHMENT:
3323 case AVMEDIA_TYPE_UNKNOWN:
3330 *has_video_ptr = has_video;
3331 *has_audio_ptr = has_audio;
3332 *has_subtitle_ptr = has_subtitle;
3335 static void new_video_stream(AVFormatContext *oc, int file_idx)
3338 AVOutputStream *ost;
3339 AVCodecContext *video_enc;
3340 enum CodecID codec_id = CODEC_ID_NONE;
3341 AVCodec *codec= NULL;
3344 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3346 fprintf(stderr, "Could not alloc stream\n");
3349 ost = new_output_stream(oc, file_idx);
3351 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3352 if(!video_stream_copy){
3353 if (video_codec_name) {
3354 codec_id = find_codec_or_die(video_codec_name, AVMEDIA_TYPE_VIDEO, 1,
3355 avcodec_opts[AVMEDIA_TYPE_VIDEO]->strict_std_compliance);
3356 codec = avcodec_find_encoder_by_name(video_codec_name);
3357 output_codecs[nb_output_codecs-1] = codec;
3359 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_VIDEO);
3360 codec = avcodec_find_encoder(codec_id);
3363 if(frame_aspect_ratio > 0){
3364 i = vfilters ? strlen(vfilters) : 0;
3365 vfilters = av_realloc(vfilters, i+100);
3366 snprintf(vfilters+i, i+100, "%csetdar=%f\n", i?',':' ', frame_aspect_ratio);
3367 frame_aspect_ratio=0;
3370 ost->avfilter= vfilters;
3375 avcodec_get_context_defaults3(st->codec, codec);
3376 ost->bitstream_filters = video_bitstream_filters;
3377 video_bitstream_filters= NULL;
3379 st->codec->thread_count= thread_count;
3381 video_enc = st->codec;
3384 video_enc->codec_tag= video_codec_tag;
3386 if( (video_global_header&1)
3387 || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))){
3388 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3389 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3391 if(video_global_header&2){
3392 video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
3393 avcodec_opts[AVMEDIA_TYPE_VIDEO]->flags2|= CODEC_FLAG2_LOCAL_HEADER;
3396 if (video_stream_copy) {
3397 st->stream_copy = 1;
3398 video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
3399 video_enc->sample_aspect_ratio =
3400 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3404 AVRational fps= frame_rate.num ? frame_rate : (AVRational){25,1};
3406 video_enc->codec_id = codec_id;
3407 set_context_opts(video_enc, avcodec_opts[AVMEDIA_TYPE_VIDEO], AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3409 if (codec && codec->supported_framerates && !force_fps)
3410 fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
3411 video_enc->time_base.den = fps.num;
3412 video_enc->time_base.num = fps.den;
3414 video_enc->width = frame_width;
3415 video_enc->height = frame_height;
3416 video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
3417 video_enc->pix_fmt = frame_pix_fmt;
3418 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3420 choose_pixel_fmt(st, codec);
3423 video_enc->gop_size = 0;
3424 if (video_qscale || same_quality) {
3425 video_enc->flags |= CODEC_FLAG_QSCALE;
3426 video_enc->global_quality=
3427 st->quality = FF_QP2LAMBDA * video_qscale;
3431 video_enc->intra_matrix = intra_matrix;
3433 video_enc->inter_matrix = inter_matrix;
3435 p= video_rc_override_string;
3438 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3440 fprintf(stderr, "error parsing rc_override\n");
3443 video_enc->rc_override=
3444 av_realloc(video_enc->rc_override,
3445 sizeof(RcOverride)*(i+1));
3446 video_enc->rc_override[i].start_frame= start;
3447 video_enc->rc_override[i].end_frame = end;
3449 video_enc->rc_override[i].qscale= q;
3450 video_enc->rc_override[i].quality_factor= 1.0;
3453 video_enc->rc_override[i].qscale= 0;
3454 video_enc->rc_override[i].quality_factor= -q/100.0;
3459 video_enc->rc_override_count=i;
3460 if (!video_enc->rc_initial_buffer_occupancy)
3461 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3462 video_enc->me_threshold= me_threshold;
3463 video_enc->intra_dc_precision= intra_dc_precision - 8;
3466 video_enc->flags|= CODEC_FLAG_PSNR;
3471 video_enc->flags |= CODEC_FLAG_PASS1;
3473 video_enc->flags |= CODEC_FLAG_PASS2;
3477 if (forced_key_frames)
3478 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3480 if (video_language) {
3481 av_metadata_set2(&st->metadata, "language", video_language, 0);
3482 av_freep(&video_language);
3485 /* reset some key parameters */
3487 av_freep(&video_codec_name);
3488 av_freep(&forced_key_frames);
3489 video_stream_copy = 0;
3490 frame_pix_fmt = PIX_FMT_NONE;
3493 static void new_audio_stream(AVFormatContext *oc, int file_idx)
3496 AVOutputStream *ost;
3497 AVCodec *codec= NULL;
3498 AVCodecContext *audio_enc;
3499 enum CodecID codec_id = CODEC_ID_NONE;
3501 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3503 fprintf(stderr, "Could not alloc stream\n");
3506 ost = new_output_stream(oc, file_idx);
3508 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3509 if(!audio_stream_copy){
3510 if (audio_codec_name) {
3511 codec_id = find_codec_or_die(audio_codec_name, AVMEDIA_TYPE_AUDIO, 1,
3512 avcodec_opts[AVMEDIA_TYPE_AUDIO]->strict_std_compliance);
3513 codec = avcodec_find_encoder_by_name(audio_codec_name);
3514 output_codecs[nb_output_codecs-1] = codec;
3516 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_AUDIO);
3517 codec = avcodec_find_encoder(codec_id);
3521 avcodec_get_context_defaults3(st->codec, codec);
3523 ost->bitstream_filters = audio_bitstream_filters;
3524 audio_bitstream_filters= NULL;
3526 st->codec->thread_count= thread_count;
3528 audio_enc = st->codec;
3529 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3532 audio_enc->codec_tag= audio_codec_tag;
3534 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3535 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3536 avcodec_opts[AVMEDIA_TYPE_AUDIO]->flags|= CODEC_FLAG_GLOBAL_HEADER;
3538 if (audio_stream_copy) {
3539 st->stream_copy = 1;
3540 audio_enc->channels = audio_channels;
3541 audio_enc->sample_rate = audio_sample_rate;
3543 audio_enc->codec_id = codec_id;
3544 set_context_opts(audio_enc, avcodec_opts[AVMEDIA_TYPE_AUDIO], AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3546 if (audio_qscale > QSCALE_NONE) {
3547 audio_enc->flags |= CODEC_FLAG_QSCALE;
3548 audio_enc->global_quality = st->quality = FF_QP2LAMBDA * audio_qscale;
3550 audio_enc->channels = audio_channels;
3551 audio_enc->sample_fmt = audio_sample_fmt;
3552 audio_enc->sample_rate = audio_sample_rate;
3553 audio_enc->channel_layout = channel_layout;
3554 if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
3555 audio_enc->channel_layout = 0;
3556 choose_sample_fmt(st, codec);
3557 choose_sample_rate(st, codec);
3559 audio_enc->time_base= (AVRational){1, audio_sample_rate};
3560 if (audio_language) {
3561 av_metadata_set2(&st->metadata, "language", audio_language, 0);
3562 av_freep(&audio_language);
3565 /* reset some key parameters */
3567 av_freep(&audio_codec_name);
3568 audio_stream_copy = 0;
3571 static void new_subtitle_stream(AVFormatContext *oc, int file_idx)
3574 AVOutputStream *ost;
3575 AVCodec *codec=NULL;
3576 AVCodecContext *subtitle_enc;
3577 enum CodecID codec_id = CODEC_ID_NONE;
3579 st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3581 fprintf(stderr, "Could not alloc stream\n");
3584 ost = new_output_stream(oc, file_idx);
3585 subtitle_enc = st->codec;
3586 output_codecs = grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
3587 if(!subtitle_stream_copy){
3588 if (subtitle_codec_name) {
3589 codec_id = find_codec_or_die(subtitle_codec_name, AVMEDIA_TYPE_SUBTITLE, 1,
3590 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->strict_std_compliance);
3591 codec= output_codecs[nb_output_codecs-1] = avcodec_find_encoder_by_name(subtitle_codec_name);
3593 codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, AVMEDIA_TYPE_SUBTITLE);
3594 codec = avcodec_find_encoder(codec_id);
3597 avcodec_get_context_defaults3(st->codec, codec);
3599 ost->bitstream_filters = subtitle_bitstream_filters;
3600 subtitle_bitstream_filters= NULL;
3602 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3604 if(subtitle_codec_tag)
3605 subtitle_enc->codec_tag= subtitle_codec_tag;
3607 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3608 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3609 avcodec_opts[AVMEDIA_TYPE_SUBTITLE]->flags |= CODEC_FLAG_GLOBAL_HEADER;
3611 if (subtitle_stream_copy) {
3612 st->stream_copy = 1;
3614 subtitle_enc->codec_id = codec_id;
3615 set_context_opts(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], subtitle_enc, AV_OPT_FLAG_SUBTITLE_PARAM | AV_OPT_FLAG_ENCODING_PARAM, codec);
3618 if (subtitle_language) {
3619 av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
3620 av_freep(&subtitle_language);
3623 subtitle_disable = 0;
3624 av_freep(&subtitle_codec_name);
3625 subtitle_stream_copy = 0;
3628 static int opt_new_stream(const char *opt, const char *arg)
3630 AVFormatContext *oc;
3631 int file_idx = nb_output_files - 1;
3632 if (nb_output_files <= 0) {
3633 fprintf(stderr, "At least one output file must be specified\n");
3636 oc = output_files[file_idx];
3638 if (!strcmp(opt, "newvideo" )) new_video_stream (oc, file_idx);
3639 else if (!strcmp(opt, "newaudio" )) new_audio_stream (oc, file_idx);
3640 else if (!strcmp(opt, "newsubtitle")) new_subtitle_stream(oc, file_idx);
3645 /* arg format is "output-stream-index:streamid-value". */
3646 static int opt_streamid(const char *opt, const char *arg)
3652 strncpy(idx_str, arg, sizeof(idx_str));
3653 idx_str[sizeof(idx_str)-1] = '\0';
3654 p = strchr(idx_str, ':');
3657 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3662 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3663 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3664 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3668 static void opt_output_file(const char *filename)
3670 AVFormatContext *oc;
3671 int err, use_video, use_audio, use_subtitle;
3672 int input_has_video, input_has_audio, input_has_subtitle;
3673 AVFormatParameters params, *ap = ¶ms;
3674 AVOutputFormat *file_oformat;
3676 if (!strcmp(filename, "-"))
3679 oc = avformat_alloc_context();
3681 print_error(filename, AVERROR(ENOMEM));
3685 if (last_asked_format) {
3686 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3687 if (!file_oformat) {
3688 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3691 last_asked_format = NULL;
3693 file_oformat = av_guess_format(NULL, filename, NULL);
3694 if (!file_oformat) {
3695 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3701 oc->oformat = file_oformat;
3702 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3704 if (!strcmp(file_oformat->name, "ffm") &&
3705 av_strstart(filename, "http:", NULL)) {
3706 /* special case for files sent to ffserver: we get the stream
3707 parameters from ffserver */
3708 int err = read_ffserver_streams(oc, filename);
3710 print_error(filename, err);
3714 use_video = file_oformat->video_codec != CODEC_ID_NONE || video_stream_copy || video_codec_name;
3715 use_audio = file_oformat->audio_codec != CODEC_ID_NONE || audio_stream_copy || audio_codec_name;
3716 use_subtitle = file_oformat->subtitle_codec != CODEC_ID_NONE || subtitle_stream_copy || subtitle_codec_name;
3718 /* disable if no corresponding type found and at least one
3720 if (nb_input_files > 0) {
3721 check_audio_video_sub_inputs(&input_has_video, &input_has_audio,
3722 &input_has_subtitle);
3723 if (!input_has_video)
3725 if (!input_has_audio)
3727 if (!input_has_subtitle)
3731 /* manual disable */
3732 if (audio_disable) use_audio = 0;
3733 if (video_disable) use_video = 0;
3734 if (subtitle_disable) use_subtitle = 0;
3736 if (use_video) new_video_stream(oc, nb_output_files);
3737 if (use_audio) new_audio_stream(oc, nb_output_files);
3738 if (use_subtitle) new_subtitle_stream(oc, nb_output_files);
3740 oc->timestamp = recording_timestamp;
3742 av_metadata_copy(&oc->metadata, metadata, 0);
3743 av_metadata_free(&metadata);
3746 output_files[nb_output_files++] = oc;
3748 /* check filename in case of an image number is expected */
3749 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3750 if (!av_filename_number_test(oc->filename)) {
3751 print_error(oc->filename, AVERROR_NUMEXPECTED);
3756 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3757 /* test if it already exists to avoid loosing precious files */
3758 if (!file_overwrite &&
3759 (strchr(filename, ':') == NULL ||
3760 filename[1] == ':' ||
3761 av_strstart(filename, "file:", NULL))) {
3762 if (url_exist(filename)) {
3764 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3766 if (!read_yesno()) {
3767 fprintf(stderr, "Not overwriting - exiting\n");
3772 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3779 if ((err = avio_open(&oc->pb, filename, URL_WRONLY)) < 0) {
3780 print_error(filename, err);
3785 memset(ap, 0, sizeof(*ap));
3786 if (av_set_parameters(oc, ap) < 0) {
3787 fprintf(stderr, "%s: Invalid encoding parameters\n",
3792 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3793 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3794 oc->loop_output = loop_output;
3796 set_context_opts(oc, avformat_opts, AV_OPT_FLAG_ENCODING_PARAM, NULL);
3798 av_freep(&forced_key_frames);
3801 /* same option as mencoder */
3802 static void opt_pass(const char *pass_str)
3805 pass = atoi(pass_str);
3806 if (pass != 1 && pass != 2) {
3807 fprintf(stderr, "pass number can be only 1 or 2\n");
3813 static int64_t getutime(void)
3816 struct rusage rusage;
3818 getrusage(RUSAGE_SELF, &rusage);
3819 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3820 #elif HAVE_GETPROCESSTIMES
3822 FILETIME c, e, k, u;
3823 proc = GetCurrentProcess();
3824 GetProcessTimes(proc, &c, &e, &k, &u);
3825 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3827 return av_gettime();
3831 static int64_t getmaxrss(void)
3833 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3834 struct rusage rusage;
3835 getrusage(RUSAGE_SELF, &rusage);
3836 return (int64_t)rusage.ru_maxrss * 1024;
3837 #elif HAVE_GETPROCESSMEMORYINFO
3839 PROCESS_MEMORY_COUNTERS memcounters;
3840 proc = GetCurrentProcess();
3841 memcounters.cb = sizeof(memcounters);
3842 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3843 return memcounters.PeakPagefileUsage;
3849 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3852 const char *p = str;
3859 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3866 static void opt_inter_matrix(const char *arg)
3868 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3869 parse_matrix_coeffs(inter_matrix, arg);
3872 static void opt_intra_matrix(const char *arg)
3874 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3875 parse_matrix_coeffs(intra_matrix, arg);
3878 static void show_usage(void)
3880 printf("Hyper fast Audio and Video encoder\n");
3881 printf("usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...\n");
3885 static void show_help(void)
3888 AVOutputFormat *oformat = NULL;
3890 av_log_set_callback(log_callback_help);
3892 show_help_options(options, "Main options:\n",
3893 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3894 show_help_options(options, "\nAdvanced options:\n",
3895 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3897 show_help_options(options, "\nVideo options:\n",
3898 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3900 show_help_options(options, "\nAdvanced Video options:\n",
3901 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3902 OPT_VIDEO | OPT_EXPERT);
3903 show_help_options(options, "\nAudio options:\n",
3904 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3906 show_help_options(options, "\nAdvanced Audio options:\n",
3907 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3908 OPT_AUDIO | OPT_EXPERT);
3909 show_help_options(options, "\nSubtitle options:\n",
3910 OPT_SUBTITLE | OPT_GRAB,
3912 show_help_options(options, "\nAudio/Video grab options:\n",
3916 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3919 /* individual codec options */
3921 while ((c = av_codec_next(c))) {
3922 if (c->priv_class) {
3923 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3928 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3931 /* individual muxer options */
3932 while ((oformat = av_oformat_next(oformat))) {
3933 if (oformat->priv_class) {
3934 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3939 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3942 static void opt_target(const char *arg)
3944 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3945 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3947 if(!strncmp(arg, "pal-", 4)) {
3950 } else if(!strncmp(arg, "ntsc-", 5)) {
3953 } else if(!strncmp(arg, "film-", 5)) {
3958 /* Calculate FR via float to avoid int overflow */
3959 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3962 } else if((fr == 29970) || (fr == 23976)) {
3965 /* Try to determine PAL/NTSC by peeking in the input files */
3966 if(nb_input_files) {
3968 for(j = 0; j < nb_input_files; j++) {
3969 for(i = 0; i < input_files[j]->nb_streams; i++) {
3970 AVCodecContext *c = input_files[j]->streams[i]->codec;
3971 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3973 fr = c->time_base.den * 1000 / c->time_base.num;
3977 } else if((fr == 29970) || (fr == 23976)) {
3987 if(verbose && norm != UNKNOWN)
3988 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3991 if(norm == UNKNOWN) {
3992 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3993 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3994 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3998 if(!strcmp(arg, "vcd")) {
4000 opt_video_codec("mpeg1video");
4001 opt_audio_codec("mp2");
4004 opt_frame_size(norm == PAL ? "352x288" : "352x240");
4005 opt_frame_rate(NULL, frame_rates[norm]);
4006 opt_default("g", norm == PAL ? "15" : "18");
4008 opt_default("b", "1150000");
4009 opt_default("maxrate", "1150000");
4010 opt_default("minrate", "1150000");
4011 opt_default("bufsize", "327680"); // 40*1024*8;
4013 opt_default("ab", "224000");
4014 audio_sample_rate = 44100;
4017 opt_default("packetsize", "2324");
4018 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4020 /* We have to offset the PTS, so that it is consistent with the SCR.
4021 SCR starts at 36000, but the first two packs contain only padding
4022 and the first pack from the other stream, respectively, may also have
4023 been written before.
4024 So the real data starts at SCR 36000+3*1200. */
4025 mux_preload= (36000+3*1200) / 90000.0; //0.44
4026 } else if(!strcmp(arg, "svcd")) {
4028 opt_video_codec("mpeg2video");
4029 opt_audio_codec("mp2");
4032 opt_frame_size(norm == PAL ? "480x576" : "480x480");
4033 opt_frame_rate(NULL, frame_rates[norm]);
4034 opt_default("g", norm == PAL ? "15" : "18");
4036 opt_default("b", "2040000");
4037 opt_default("maxrate", "2516000");
4038 opt_default("minrate", "0"); //1145000;
4039 opt_default("bufsize", "1835008"); //224*1024*8;
4040 opt_default("flags", "+scan_offset");
4043 opt_default("ab", "224000");
4044 audio_sample_rate = 44100;
4046 opt_default("packetsize", "2324");
4048 } else if(!strcmp(arg, "dvd")) {
4050 opt_video_codec("mpeg2video");
4051 opt_audio_codec("ac3");
4054 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4055 opt_frame_rate(NULL, frame_rates[norm]);
4056 opt_default("g", norm == PAL ? "15" : "18");
4058 opt_default("b", "6000000");
4059 opt_default("maxrate", "9000000");
4060 opt_default("minrate", "0"); //1500000;
4061 opt_default("bufsize", "1835008"); //224*1024*8;
4063 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4064 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4066 opt_default("ab", "448000");
4067 audio_sample_rate = 48000;
4069 } else if(!strncmp(arg, "dv", 2)) {
4073 opt_frame_size(norm == PAL ? "720x576" : "720x480");
4074 opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" :
4075 (norm == PAL ? "yuv420p" : "yuv411p"));
4076 opt_frame_rate(NULL, frame_rates[norm]);
4078 audio_sample_rate = 48000;
4082 fprintf(stderr, "Unknown target: %s\n", arg);
4087 static void opt_vstats_file (const char *arg)
4089 av_free (vstats_filename);
4090 vstats_filename=av_strdup (arg);
4093 static void opt_vstats (void)
4096 time_t today2 = time(NULL);
4097 struct tm *today = localtime(&today2);
4099 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4101 opt_vstats_file(filename);
4104 static int opt_bsf(const char *opt, const char *arg)
4106 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4107 AVBitStreamFilterContext **bsfp;
4110 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4114 bsfp= *opt == 'v' ? &video_bitstream_filters :
4115 *opt == 'a' ? &audio_bitstream_filters :
4116 &subtitle_bitstream_filters;
4118 bsfp= &(*bsfp)->next;
4125 static int opt_preset(const char *opt, const char *arg)
4128 char filename[1000], tmp[1000], tmp2[1000], line[1000];
4129 char *codec_name = *opt == 'v' ? video_codec_name :
4130 *opt == 'a' ? audio_codec_name :
4131 subtitle_codec_name;
4133 if (!(f = get_preset_file(filename, sizeof(filename), arg, *opt == 'f', codec_name))) {
4134 fprintf(stderr, "File for preset '%s' not found\n", arg);
4139 int e= fscanf(f, "%999[^\n]\n", line) - 1;
4140 if(line[0] == '#' && !e)
4142 e|= sscanf(line, "%999[^=]=%999[^\n]\n", tmp, tmp2) - 2;
4144 fprintf(stderr, "%s: Invalid syntax: '%s'\n", filename, line);
4147 if(!strcmp(tmp, "acodec")){
4148 opt_audio_codec(tmp2);
4149 }else if(!strcmp(tmp, "vcodec")){
4150 opt_video_codec(tmp2);
4151 }else if(!strcmp(tmp, "scodec")){
4152 opt_subtitle_codec(tmp2);
4153 }else if(opt_default(tmp, tmp2) < 0){
4154 fprintf(stderr, "%s: Invalid option or argument: '%s', parsed as '%s' = '%s'\n", filename, line, tmp, tmp2);
4164 static const OptionDef options[] = {
4166 #include "cmdutils_common_opts.h"
4167 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4168 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4169 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4170 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4171 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4172 "outfile[,metadata]:infile[,metadata]" },
4173 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4174 "outfile[,metadata]:infile[,metadata]" },
4175 { "map_chapters", HAS_ARG | OPT_EXPERT, {(void*)opt_map_chapters}, "set chapters mapping", "outfile:infile" },
4176 { "t", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4177 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4178 { "ss", OPT_FUNC2 | HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4179 { "itsoffset", OPT_FUNC2 | HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4180 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4181 { "timestamp", OPT_FUNC2 | HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4182 { "metadata", OPT_FUNC2 | HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4183 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4184 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4185 "add timings for benchmarking" },
4186 { "timelimit", OPT_FUNC2 | HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4187 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4188 "dump each input packet" },
4189 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4190 "when dumping packets, also dump the payload" },
4191 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4192 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" },
4193 { "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)", "" },
4194 { "v", HAS_ARG | OPT_FUNC2, {(void*)opt_verbose}, "set ffmpeg verbosity level", "number" },
4195 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4196 { "threads", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4197 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4198 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4199 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4200 { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" },
4201 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4202 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4203 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4204 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4205 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4206 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4207 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4210 { "b", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4211 { "vb", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4212 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4213 { "r", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4214 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4215 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4216 { "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" },
4217 { "croptop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4218 { "cropbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4219 { "cropleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4220 { "cropright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4221 { "padtop", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4222 { "padbottom", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4223 { "padleft", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4224 { "padright", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4225 { "padcolor", OPT_FUNC2 | HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4226 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4227 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4228 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4229 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4230 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4231 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4232 { "me_threshold", HAS_ARG | OPT_FUNC2 | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4233 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quality},
4234 "use same video quality as source (implies VBR)" },
4235 { "pass", HAS_ARG | OPT_VIDEO, {(void*)&opt_pass}, "select the pass number (1 or 2)", "n" },
4236 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4237 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4238 "deinterlace pictures" },
4239 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4240 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4241 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4243 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4245 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4246 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4247 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4248 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4249 { "vtag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4250 { "newvideo", OPT_VIDEO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new video stream to the current output stream" },
4251 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4252 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4253 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4254 { "streamid", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4255 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4258 { "ab", OPT_FUNC2 | HAS_ARG | OPT_AUDIO, {(void*)opt_bitrate}, "set bitrate (in bits/s)", "bitrate" },
4259 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4260 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4261 { "ar", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4262 { "ac", HAS_ARG | OPT_FUNC2 | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4263 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4264 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4265 { "atag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4266 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4267 { "newaudio", OPT_AUDIO | OPT_FUNC2, {(void*)opt_new_stream}, "add a new audio stream to the current output stream" },
4268 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4269 { "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" },
4271 /* subtitle options */
4272 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4273 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4274 { "newsubtitle", OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_new_stream}, "add a new subtitle stream to the current output stream" },
4275 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4276 { "stag", OPT_FUNC2 | HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4279 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "set video grab channel (DV1394 only)", "channel" },
4280 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "set television standard (NTSC, PAL (SECAM))", "standard" },
4281 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4284 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4285 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4287 { "absf", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4288 { "vbsf", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4289 { "sbsf", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4291 { "apre", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_preset}, "set the audio options to the indicated preset", "preset" },
4292 { "vpre", OPT_FUNC2 | HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_preset}, "set the video options to the indicated preset", "preset" },
4293 { "spre", OPT_FUNC2 | HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_preset}, "set the subtitle options to the indicated preset", "preset" },
4294 { "fpre", OPT_FUNC2 | HAS_ARG | OPT_EXPERT, {(void*)opt_preset}, "set options from indicated preset file", "filename" },
4296 { "default", OPT_FUNC2 | HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4300 int main(int argc, char **argv)
4304 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4306 avcodec_register_all();
4308 avdevice_register_all();
4311 avfilter_register_all();
4316 if(isatty(STDIN_FILENO))
4317 url_set_interrupt_cb(decode_interrupt_cb);
4325 parse_options(argc, argv, options, opt_output_file);
4327 if(nb_output_files <= 0 && nb_input_files == 0) {
4329 fprintf(stderr, "Use -h to get full help or, even better, run 'man ffmpeg'\n");
4333 /* file converter / grab */
4334 if (nb_output_files <= 0) {
4335 fprintf(stderr, "At least one output file must be specified\n");
4339 if (nb_input_files == 0) {
4340 fprintf(stderr, "At least one input file must be specified\n");
4345 if (transcode(output_files, nb_output_files, input_files, nb_input_files,
4346 stream_maps, nb_stream_maps) < 0)
4348 ti = getutime() - ti;
4350 int maxrss = getmaxrss() / 1024;
4351 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4354 return ffmpeg_exit(0);