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
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
49 #include "libavformat/ffm.h" // not public API
52 # include "libavfilter/avcodec.h"
53 # include "libavfilter/avfilter.h"
54 # include "libavfilter/avfiltergraph.h"
55 # include "libavfilter/vsink_buffer.h"
56 # include "libavfilter/vsrc_buffer.h"
59 #if HAVE_SYS_RESOURCE_H
60 #include <sys/types.h>
62 #include <sys/resource.h>
63 #elif HAVE_GETPROCESSTIMES
66 #if HAVE_GETPROCESSMEMORYINFO
72 #include <sys/select.h>
77 #include <sys/ioctl.h>
87 #include "libavutil/avassert.h"
89 const char program_name[] = "ffmpeg";
90 const int program_birth_year = 2000;
92 /* select an input stream for an output stream */
93 typedef struct StreamMap {
94 int disabled; /** 1 is this mapping is disabled by a negative map */
98 int sync_stream_index;
102 * select an input file for an output file
104 typedef struct MetadataMap {
105 int file; ///< file index
106 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
107 int index; ///< stream/chapter/program number
110 static const OptionDef options[];
112 #define MAX_STREAMS 1024 /* arbitrary sanity check value */
113 static const char *last_asked_format = NULL;
114 static AVDictionary *ts_scale;
116 static StreamMap *stream_maps = NULL;
117 static int nb_stream_maps;
119 static AVDictionary *codec_names;
121 /* first item specifies output metadata, second is input */
122 static MetadataMap (*meta_data_maps)[2] = NULL;
123 static int nb_meta_data_maps;
124 static int metadata_global_autocopy = 1;
125 static int metadata_streams_autocopy = 1;
126 static int metadata_chapters_autocopy = 1;
128 static int chapters_input_file = INT_MAX;
130 /* indexed by output file stream index */
131 static int *streamid_map = NULL;
132 static int nb_streamid_map = 0;
134 static int frame_width = 0;
135 static int frame_height = 0;
136 static float frame_aspect_ratio = 0;
137 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
138 static int frame_bits_per_raw_sample = 0;
139 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
140 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
141 static AVRational frame_rate;
142 static float video_qscale = 0;
143 static uint16_t *intra_matrix = NULL;
144 static uint16_t *inter_matrix = NULL;
145 static const char *video_rc_override_string=NULL;
146 static int video_disable = 0;
147 static int video_discard = 0;
148 static unsigned int video_codec_tag = 0;
149 static char *video_language = NULL;
150 static int same_quant = 0;
151 static int do_deinterlace = 0;
152 static int top_field_first = -1;
153 static int me_threshold = 0;
154 static int intra_dc_precision = 8;
155 static int loop_input = 0;
156 static int loop_output = AVFMT_NOOUTPUTLOOP;
157 static int qp_hist = 0;
159 static char *vfilters = NULL;
162 static int intra_only = 0;
163 static int audio_sample_rate = 0;
164 #define QSCALE_NONE -99999
165 static float audio_qscale = QSCALE_NONE;
166 static int audio_disable = 0;
167 static int audio_channels = 0;
168 static unsigned int audio_codec_tag = 0;
169 static char *audio_language = NULL;
171 static int subtitle_disable = 0;
172 static char *subtitle_language = NULL;
173 static unsigned int subtitle_codec_tag = 0;
175 static int data_disable = 0;
176 static unsigned int data_codec_tag = 0;
178 static float mux_preload= 0.5;
179 static float mux_max_delay= 0.7;
181 static int64_t recording_time = INT64_MAX;
182 static int64_t start_time = 0;
183 static int64_t input_ts_offset = 0;
184 static int file_overwrite = 0;
185 static AVDictionary *metadata;
186 static int do_benchmark = 0;
187 static int do_hex_dump = 0;
188 static int do_pkt_dump = 0;
189 static int do_psnr = 0;
190 static int do_pass = 0;
191 static const char *pass_logfilename_prefix;
192 static int video_sync_method= -1;
193 static int audio_sync_method= 0;
194 static float audio_drift_threshold= 0.1;
195 static int copy_ts= 0;
196 static int copy_tb= 0;
197 static int opt_shortest = 0;
198 static char *vstats_filename;
199 static FILE *vstats_file;
200 static int opt_programid = 0;
201 static int copy_initial_nonkeyframes = 0;
203 static int rate_emu = 0;
205 static int audio_volume = 256;
207 static int exit_on_error = 0;
208 static int using_stdin = 0;
209 static int verbose = 1;
210 static int run_as_daemon = 0;
211 static int thread_count= 1;
212 static int q_pressed = 0;
213 static int64_t video_size = 0;
214 static int64_t audio_size = 0;
215 static int64_t extra_size = 0;
216 static int nb_frames_dup = 0;
217 static int nb_frames_drop = 0;
218 static int input_sync;
219 static uint64_t limit_filesize = 0;
220 static int force_fps = 0;
221 static char *forced_key_frames = NULL;
223 static float dts_delta_threshold = 10;
225 static uint8_t *audio_buf;
226 static uint8_t *audio_out;
227 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
229 static short *samples;
231 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
232 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
233 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
235 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
237 typedef struct InputStream {
240 int discard; /* true if stream data should be discarded */
241 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
244 int64_t start; /* time when read started */
245 int64_t next_pts; /* synthetic pts for cases where pkt.pts
247 int64_t pts; /* current pts */
249 int is_start; /* is 1 at the start and after a discontinuity */
250 int showed_multi_packet_warning;
254 typedef struct InputFile {
255 AVFormatContext *ctx;
256 int eof_reached; /* true if eof reached */
257 int ist_index; /* index of first stream in ist_table */
258 int buffer_size; /* current total buffer size */
263 typedef struct OutputStream {
264 int file_index; /* file index */
265 int index; /* stream index in the output file */
266 int source_index; /* InputStream index */
267 AVStream *st; /* stream in the output file */
268 int encoding_needed; /* true if encoding needed for this stream */
270 /* input pts and corresponding output pts
272 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
273 struct InputStream *sync_ist; /* input stream to sync against */
274 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
275 AVBitStreamFilterContext *bitstream_filters;
280 AVFrame resample_frame; /* temporary frame for image resampling */
281 struct SwsContext *img_resample_ctx; /* for image resampling */
284 int resample_pix_fmt;
285 AVRational frame_rate;
287 float frame_aspect_ratio;
289 /* forced key frames */
290 int64_t *forced_kf_pts;
296 ReSampleContext *resample; /* for audio resampling */
297 int resample_sample_fmt;
298 int resample_channels;
299 int resample_sample_rate;
301 AVAudioConvert *reformat_ctx;
302 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
306 AVFilterContext *output_video_filter;
307 AVFilterContext *input_video_filter;
308 AVFilterBufferRef *picref;
310 AVFilterGraph *graph;
315 int is_past_recording_time;
321 /* init terminal so that we can grab keys */
322 static struct termios oldtty;
325 typedef struct OutputFile {
326 AVFormatContext *ctx;
328 int ost_index; /* index of the first stream in output_streams */
329 int64_t recording_time; /* desired length of the resulting file in microseconds */
330 int64_t start_time; /* start time in microseconds */
333 static InputStream *input_streams = NULL;
334 static int nb_input_streams = 0;
335 static InputFile *input_files = NULL;
336 static int nb_input_files = 0;
338 static OutputStream *output_streams = NULL;
339 static int nb_output_streams = 0;
340 static OutputFile *output_files = NULL;
341 static int nb_output_files = 0;
345 static int configure_video_filters(InputStream *ist, OutputStream *ost)
347 AVFilterContext *last_filter, *filter;
348 /** filter graph containing all filters including input & output */
349 AVCodecContext *codec = ost->st->codec;
350 AVCodecContext *icodec = ist->st->codec;
351 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
352 AVRational sample_aspect_ratio;
356 ost->graph = avfilter_graph_alloc();
358 if (ist->st->sample_aspect_ratio.num){
359 sample_aspect_ratio = ist->st->sample_aspect_ratio;
361 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
363 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
364 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
365 sample_aspect_ratio.num, sample_aspect_ratio.den);
367 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
368 "src", args, NULL, ost->graph);
371 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
372 "out", NULL, pix_fmts, ost->graph);
375 last_filter = ost->input_video_filter;
377 if (codec->width != icodec->width || codec->height != icodec->height) {
378 snprintf(args, 255, "%d:%d:flags=0x%X",
382 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
383 NULL, args, NULL, ost->graph)) < 0)
385 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
387 last_filter = filter;
390 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
391 ost->graph->scale_sws_opts = av_strdup(args);
394 AVFilterInOut *outputs = avfilter_inout_alloc();
395 AVFilterInOut *inputs = avfilter_inout_alloc();
397 outputs->name = av_strdup("in");
398 outputs->filter_ctx = last_filter;
399 outputs->pad_idx = 0;
400 outputs->next = NULL;
402 inputs->name = av_strdup("out");
403 inputs->filter_ctx = ost->output_video_filter;
407 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
409 av_freep(&ost->avfilter);
411 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
415 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
418 codec->width = ost->output_video_filter->inputs[0]->w;
419 codec->height = ost->output_video_filter->inputs[0]->h;
420 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
421 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
422 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
423 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
427 #endif /* CONFIG_AVFILTER */
429 static void term_exit(void)
431 av_log(NULL, AV_LOG_QUIET, "%s", "");
434 tcsetattr (0, TCSANOW, &oldtty);
438 static volatile int received_sigterm = 0;
441 sigterm_handler(int sig)
443 received_sigterm = sig;
448 static void term_init(void)
458 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
459 |INLCR|IGNCR|ICRNL|IXON);
460 tty.c_oflag |= OPOST;
461 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
462 tty.c_cflag &= ~(CSIZE|PARENB);
467 tcsetattr (0, TCSANOW, &tty);
468 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
472 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
473 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
475 signal(SIGXCPU, sigterm_handler);
479 /* read a key without blocking */
480 static int read_key(void)
495 n = select(1, &rfds, NULL, NULL, &tv);
510 static int decode_interrupt_cb(void)
512 q_pressed += read_key() == 'q';
513 return q_pressed > 1;
516 static int exit_program(int ret)
521 for(i=0;i<nb_output_files;i++) {
522 AVFormatContext *s = output_files[i].ctx;
523 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
525 avformat_free_context(s);
526 av_dict_free(&output_files[i].opts);
528 for(i=0;i<nb_input_files;i++) {
529 av_close_input_file(input_files[i].ctx);
531 for (i = 0; i < nb_input_streams; i++)
532 av_dict_free(&input_streams[i].opts);
534 av_free(intra_matrix);
535 av_free(inter_matrix);
539 av_free(vstats_filename);
541 av_free(meta_data_maps);
543 av_freep(&input_streams);
544 av_freep(&input_files);
545 av_freep(&output_streams);
546 av_freep(&output_files);
551 allocated_audio_buf_size= allocated_audio_out_size= 0;
558 if (received_sigterm) {
560 "Received signal %d: terminating.\n",
561 (int) received_sigterm);
565 exit(ret); /* not all OS-es handle main() return value */
569 static void assert_avoptions(AVDictionary *m)
571 AVDictionaryEntry *t;
572 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
573 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
578 static void assert_codec_experimental(AVCodecContext *c, int encoder)
580 const char *codec_string = encoder ? "encoder" : "decoder";
582 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
583 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
584 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
585 "results.\nAdd '-strict experimental' if you want to use it.\n",
586 codec_string, c->codec->name);
587 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
588 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
589 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
590 codec_string, codec->name);
595 /* similar to ff_dynarray_add() and av_fast_realloc() */
596 static void *grow_array(void *array, int elem_size, int *size, int new_size)
598 if (new_size >= INT_MAX / elem_size) {
599 fprintf(stderr, "Array too big.\n");
602 if (*size < new_size) {
603 uint8_t *tmp = av_realloc(array, new_size*elem_size);
605 fprintf(stderr, "Could not alloc buffer.\n");
608 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
615 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
617 if(codec && codec->sample_fmts){
618 const enum AVSampleFormat *p= codec->sample_fmts;
620 if(*p == st->codec->sample_fmt)
624 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
625 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
626 if(av_get_sample_fmt_name(st->codec->sample_fmt))
627 av_log(NULL, AV_LOG_WARNING,
628 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
629 av_get_sample_fmt_name(st->codec->sample_fmt),
631 av_get_sample_fmt_name(codec->sample_fmts[0]));
632 st->codec->sample_fmt = codec->sample_fmts[0];
637 static void choose_sample_rate(AVStream *st, AVCodec *codec)
639 if(codec && codec->supported_samplerates){
640 const int *p= codec->supported_samplerates;
642 int best_dist=INT_MAX;
644 int dist= abs(st->codec->sample_rate - *p);
645 if(dist < best_dist){
651 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
653 st->codec->sample_rate= best;
657 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
659 if(codec && codec->pix_fmts){
660 const enum PixelFormat *p= codec->pix_fmts;
661 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
662 if(st->codec->codec_id==CODEC_ID_MJPEG){
663 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
664 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
665 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};
669 if(*p == st->codec->pix_fmt)
673 if(st->codec->pix_fmt != PIX_FMT_NONE)
674 av_log(NULL, AV_LOG_WARNING,
675 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
676 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
678 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
679 st->codec->pix_fmt = codec->pix_fmts[0];
685 get_sync_ipts(const OutputStream *ost)
687 const InputStream *ist = ost->sync_ist;
688 OutputFile *of = &output_files[ost->file_index];
689 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
692 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
696 AVPacket new_pkt= *pkt;
697 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
698 &new_pkt.data, &new_pkt.size,
699 pkt->data, pkt->size,
700 pkt->flags & AV_PKT_FLAG_KEY);
703 new_pkt.destruct= av_destruct_packet;
705 fprintf(stderr, "%s failed for stream %d, codec %s",
706 bsfc->filter->name, pkt->stream_index,
707 avctx->codec ? avctx->codec->name : "copy");
717 ret= av_interleaved_write_frame(s, pkt);
719 print_error("av_interleaved_write_frame()", ret);
724 static void do_audio_out(AVFormatContext *s,
727 unsigned char *buf, int size)
730 int64_t audio_out_size, audio_buf_size;
731 int64_t allocated_for_size= size;
733 int size_out, frame_bytes, ret, resample_changed;
734 AVCodecContext *enc= ost->st->codec;
735 AVCodecContext *dec= ist->st->codec;
736 int osize = av_get_bytes_per_sample(enc->sample_fmt);
737 int isize = av_get_bytes_per_sample(dec->sample_fmt);
738 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
741 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
742 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
743 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
744 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
745 audio_buf_size*= osize*enc->channels;
747 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
748 if(coded_bps > 8*osize)
749 audio_out_size= audio_out_size * coded_bps / (8*osize);
750 audio_out_size += FF_MIN_BUFFER_SIZE;
752 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
753 fprintf(stderr, "Buffer sizes too large\n");
757 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
758 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
759 if (!audio_buf || !audio_out){
760 fprintf(stderr, "Out of memory in do_audio_out\n");
764 if (enc->channels != dec->channels)
765 ost->audio_resample = 1;
767 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
768 ost->resample_channels != dec->channels ||
769 ost->resample_sample_rate != dec->sample_rate;
771 if ((ost->audio_resample && !ost->resample) || resample_changed) {
772 if (resample_changed) {
773 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",
774 ist->file_index, ist->st->index,
775 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
776 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
777 ost->resample_sample_fmt = dec->sample_fmt;
778 ost->resample_channels = dec->channels;
779 ost->resample_sample_rate = dec->sample_rate;
781 audio_resample_close(ost->resample);
783 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
784 if (audio_sync_method <= 1 &&
785 ost->resample_sample_fmt == enc->sample_fmt &&
786 ost->resample_channels == enc->channels &&
787 ost->resample_sample_rate == enc->sample_rate) {
788 ost->resample = NULL;
789 ost->audio_resample = 0;
791 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
792 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
793 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
794 enc->sample_rate, dec->sample_rate,
795 enc->sample_fmt, dec->sample_fmt,
797 if (!ost->resample) {
798 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
799 dec->channels, dec->sample_rate,
800 enc->channels, enc->sample_rate);
806 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
807 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
808 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
809 if (ost->reformat_ctx)
810 av_audio_convert_free(ost->reformat_ctx);
811 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
812 dec->sample_fmt, 1, NULL, 0);
813 if (!ost->reformat_ctx) {
814 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
815 av_get_sample_fmt_name(dec->sample_fmt),
816 av_get_sample_fmt_name(enc->sample_fmt));
819 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
822 if(audio_sync_method){
823 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
824 - av_fifo_size(ost->fifo)/(enc->channels * 2);
825 double idelta= delta*dec->sample_rate / enc->sample_rate;
826 int byte_delta= ((int)idelta)*2*dec->channels;
828 //FIXME resample delay
829 if(fabs(delta) > 50){
830 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
832 byte_delta= FFMAX(byte_delta, -size);
836 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
841 static uint8_t *input_tmp= NULL;
842 input_tmp= av_realloc(input_tmp, byte_delta + size);
844 if(byte_delta > allocated_for_size - size){
845 allocated_for_size= byte_delta + (int64_t)size;
850 memset(input_tmp, 0, byte_delta);
851 memcpy(input_tmp + byte_delta, buf, size);
855 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
857 }else if(audio_sync_method>1){
858 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
859 av_assert0(ost->audio_resample);
861 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
862 // 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));
863 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
867 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
868 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
870 if (ost->audio_resample) {
872 size_out = audio_resample(ost->resample,
873 (short *)buftmp, (short *)buf,
874 size / (dec->channels * isize));
875 size_out = size_out * enc->channels * osize;
881 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
882 const void *ibuf[6]= {buftmp};
883 void *obuf[6]= {audio_buf};
884 int istride[6]= {isize};
885 int ostride[6]= {osize};
886 int len= size_out/istride[0];
887 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
888 printf("av_audio_convert() failed\n");
894 size_out = len*osize;
897 /* now encode as many frames as possible */
898 if (enc->frame_size > 1) {
899 /* output resampled raw samples */
900 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
901 fprintf(stderr, "av_fifo_realloc2() failed\n");
904 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
906 frame_bytes = enc->frame_size * osize * enc->channels;
908 while (av_fifo_size(ost->fifo) >= frame_bytes) {
910 av_init_packet(&pkt);
912 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
914 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
916 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
919 fprintf(stderr, "Audio encoding failed\n");
923 pkt.stream_index= ost->index;
926 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
927 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
928 pkt.flags |= AV_PKT_FLAG_KEY;
929 write_frame(s, &pkt, enc, ost->bitstream_filters);
931 ost->sync_opts += enc->frame_size;
935 av_init_packet(&pkt);
937 ost->sync_opts += size_out / (osize * enc->channels);
939 /* output a pcm frame */
940 /* determine the size of the coded buffer */
943 size_out = size_out*coded_bps/8;
945 if(size_out > audio_out_size){
946 fprintf(stderr, "Internal error, buffer size too small\n");
950 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
951 ret = avcodec_encode_audio(enc, audio_out, size_out,
954 fprintf(stderr, "Audio encoding failed\n");
958 pkt.stream_index= ost->index;
961 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
962 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
963 pkt.flags |= AV_PKT_FLAG_KEY;
964 write_frame(s, &pkt, enc, ost->bitstream_filters);
968 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
972 AVPicture picture_tmp;
975 dec = ist->st->codec;
977 /* deinterlace : must be done before any resize */
978 if (do_deinterlace) {
981 /* create temporary picture */
982 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
983 buf = av_malloc(size);
987 picture2 = &picture_tmp;
988 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
990 if(avpicture_deinterlace(picture2, picture,
991 dec->pix_fmt, dec->width, dec->height) < 0) {
992 /* if error, do not deinterlace */
993 fprintf(stderr, "Deinterlacing failed\n");
1002 if (picture != picture2)
1003 *picture = *picture2;
1007 static void do_subtitle_out(AVFormatContext *s,
1013 static uint8_t *subtitle_out = NULL;
1014 int subtitle_out_max_size = 1024 * 1024;
1015 int subtitle_out_size, nb, i;
1016 AVCodecContext *enc;
1019 if (pts == AV_NOPTS_VALUE) {
1020 fprintf(stderr, "Subtitle packets must have a pts\n");
1026 enc = ost->st->codec;
1028 if (!subtitle_out) {
1029 subtitle_out = av_malloc(subtitle_out_max_size);
1032 /* Note: DVB subtitle need one packet to draw them and one other
1033 packet to clear them */
1034 /* XXX: signal it in the codec context ? */
1035 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1040 for(i = 0; i < nb; i++) {
1041 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1042 // start_display_time is required to be 0
1043 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1044 sub->end_display_time -= sub->start_display_time;
1045 sub->start_display_time = 0;
1046 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1047 subtitle_out_max_size, sub);
1048 if (subtitle_out_size < 0) {
1049 fprintf(stderr, "Subtitle encoding failed\n");
1053 av_init_packet(&pkt);
1054 pkt.stream_index = ost->index;
1055 pkt.data = subtitle_out;
1056 pkt.size = subtitle_out_size;
1057 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1058 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1059 /* XXX: the pts correction is handled here. Maybe handling
1060 it in the codec would be better */
1062 pkt.pts += 90 * sub->start_display_time;
1064 pkt.pts += 90 * sub->end_display_time;
1066 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1070 static int bit_buffer_size= 1024*256;
1071 static uint8_t *bit_buffer= NULL;
1073 static void do_video_resample(OutputStream *ost,
1075 AVFrame *in_picture,
1076 AVFrame **out_picture)
1078 int resample_changed = 0;
1079 AVCodecContext *dec = ist->st->codec;
1080 *out_picture = in_picture;
1081 #if !CONFIG_AVFILTER
1082 resample_changed = ost->resample_width != dec->width ||
1083 ost->resample_height != dec->height ||
1084 ost->resample_pix_fmt != dec->pix_fmt;
1086 if (resample_changed) {
1087 av_log(NULL, AV_LOG_INFO,
1088 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1089 ist->file_index, ist->st->index,
1090 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1091 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1092 ost->resample_width = dec->width;
1093 ost->resample_height = dec->height;
1094 ost->resample_pix_fmt = dec->pix_fmt;
1097 ost->video_resample = dec->width != enc->width ||
1098 dec->height != enc->height ||
1099 dec->pix_fmt != enc->pix_fmt;
1101 if (ost->video_resample) {
1102 *out_picture = &ost->resample_frame;
1103 if (!ost->img_resample_ctx || resample_changed) {
1104 /* initialize the destination picture */
1105 if (!ost->resample_frame.data[0]) {
1106 avcodec_get_frame_defaults(&ost->resample_frame);
1107 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1108 enc->width, enc->height)) {
1109 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1113 /* initialize a new scaler context */
1114 sws_freeContext(ost->img_resample_ctx);
1115 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1116 enc->width, enc->height, enc->pix_fmt,
1117 ost->sws_flags, NULL, NULL, NULL);
1118 if (ost->img_resample_ctx == NULL) {
1119 fprintf(stderr, "Cannot get resampling context\n");
1123 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1124 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1130 static void do_video_out(AVFormatContext *s,
1133 AVFrame *in_picture,
1134 int *frame_size, float quality)
1136 int nb_frames, i, ret, format_video_sync;
1137 AVFrame *final_picture;
1138 AVCodecContext *enc, *dec;
1141 enc = ost->st->codec;
1142 dec = ist->st->codec;
1144 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1146 /* by default, we output a single frame */
1151 format_video_sync = video_sync_method;
1152 if (format_video_sync < 0)
1153 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1155 if (format_video_sync) {
1156 double vdelta = sync_ipts - ost->sync_opts;
1157 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1160 else if (format_video_sync == 2) {
1163 }else if(vdelta>0.6)
1164 ost->sync_opts= lrintf(sync_ipts);
1165 }else if (vdelta > 1.1)
1166 nb_frames = lrintf(vdelta);
1167 //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);
1168 if (nb_frames == 0){
1171 fprintf(stderr, "*** drop!\n");
1172 }else if (nb_frames > 1) {
1173 nb_frames_dup += nb_frames - 1;
1175 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1178 ost->sync_opts= lrintf(sync_ipts);
1180 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1184 do_video_resample(ost, ist, in_picture, &final_picture);
1186 /* duplicates frame if needed */
1187 for(i=0;i<nb_frames;i++) {
1189 av_init_packet(&pkt);
1190 pkt.stream_index= ost->index;
1192 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1193 /* raw pictures are written as AVPicture structure to
1194 avoid any copies. We support temorarily the older
1196 AVFrame* old_frame = enc->coded_frame;
1197 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1198 pkt.data= (uint8_t *)final_picture;
1199 pkt.size= sizeof(AVPicture);
1200 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1201 pkt.flags |= AV_PKT_FLAG_KEY;
1203 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1204 enc->coded_frame = old_frame;
1206 AVFrame big_picture;
1208 big_picture= *final_picture;
1209 /* better than nothing: use input picture interlaced
1211 big_picture.interlaced_frame = in_picture->interlaced_frame;
1212 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1213 if(top_field_first == -1)
1214 big_picture.top_field_first = in_picture->top_field_first;
1216 big_picture.top_field_first = top_field_first;
1219 /* handles same_quant here. This is not correct because it may
1220 not be a global option */
1221 big_picture.quality = quality;
1223 big_picture.pict_type = 0;
1224 // big_picture.pts = AV_NOPTS_VALUE;
1225 big_picture.pts= ost->sync_opts;
1226 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1227 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1228 if (ost->forced_kf_index < ost->forced_kf_count &&
1229 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1230 big_picture.pict_type = AV_PICTURE_TYPE_I;
1231 ost->forced_kf_index++;
1233 ret = avcodec_encode_video(enc,
1234 bit_buffer, bit_buffer_size,
1237 fprintf(stderr, "Video encoding failed\n");
1242 pkt.data= bit_buffer;
1244 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1245 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1246 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1247 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1248 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1250 if(enc->coded_frame->key_frame)
1251 pkt.flags |= AV_PKT_FLAG_KEY;
1252 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1255 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1256 // enc->frame_number-1, ret, enc->pict_type);
1257 /* if two pass, output log */
1258 if (ost->logfile && enc->stats_out) {
1259 fprintf(ost->logfile, "%s", enc->stats_out);
1264 ost->frame_number++;
1268 static double psnr(double d){
1269 return -10.0*log(d)/log(10.0);
1272 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1275 AVCodecContext *enc;
1277 double ti1, bitrate, avg_bitrate;
1279 /* this is executed just the first time do_video_stats is called */
1281 vstats_file = fopen(vstats_filename, "w");
1288 enc = ost->st->codec;
1289 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1290 frame_number = ost->frame_number;
1291 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1292 if (enc->flags&CODEC_FLAG_PSNR)
1293 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1295 fprintf(vstats_file,"f_size= %6d ", frame_size);
1296 /* compute pts value */
1297 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1301 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1302 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1303 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1304 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1305 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1309 static void print_report(OutputFile *output_files,
1310 OutputStream *ost_table, int nb_ostreams,
1311 int is_last_report, int64_t timer_start)
1315 AVFormatContext *oc;
1317 AVCodecContext *enc;
1318 int frame_number, vid, i;
1320 int64_t pts = INT64_MAX;
1321 static int64_t last_time = -1;
1322 static int qp_histogram[52];
1324 if (!is_last_report) {
1326 /* display the report every 0.5 seconds */
1327 cur_time = av_gettime();
1328 if (last_time == -1) {
1329 last_time = cur_time;
1332 if ((cur_time - last_time) < 500000)
1334 last_time = cur_time;
1338 oc = output_files[0].ctx;
1340 total_size = avio_size(oc->pb);
1341 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1342 total_size= avio_tell(oc->pb);
1346 for(i=0;i<nb_ostreams;i++) {
1348 ost = &ost_table[i];
1349 enc = ost->st->codec;
1350 if (!ost->st->stream_copy && enc->coded_frame)
1351 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1352 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1355 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1356 float t = (av_gettime()-timer_start) / 1000000.0;
1358 frame_number = ost->frame_number;
1359 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1360 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1362 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1366 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1371 if (enc->flags&CODEC_FLAG_PSNR){
1373 double error, error_sum=0;
1374 double scale, scale_sum=0;
1375 char type[3]= {'Y','U','V'};
1376 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1379 error= enc->error[j];
1380 scale= enc->width*enc->height*255.0*255.0*frame_number;
1382 error= enc->coded_frame->error[j];
1383 scale= enc->width*enc->height*255.0*255.0;
1388 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1390 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1394 /* compute min output value */
1395 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1396 ost->st->time_base, AV_TIME_BASE_Q));
1399 if (verbose > 0 || is_last_report) {
1400 int hours, mins, secs, us;
1401 secs = pts / AV_TIME_BASE;
1402 us = pts % AV_TIME_BASE;
1408 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1411 "size=%8.0fkB time=", total_size / 1024.0);
1412 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1413 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1414 (100 * us) / AV_TIME_BASE);
1415 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1416 "bitrate=%6.1fkbits/s", bitrate);
1418 if (nb_frames_dup || nb_frames_drop)
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1420 nb_frames_dup, nb_frames_drop);
1423 fprintf(stderr, "%s \r", buf);
1428 if (is_last_report && verbose >= 0){
1429 int64_t raw= audio_size + video_size + extra_size;
1430 fprintf(stderr, "\n");
1431 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1435 100.0*(total_size - raw)/raw
1440 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1442 int fill_char = 0x00;
1443 if (sample_fmt == AV_SAMPLE_FMT_U8)
1445 memset(buf, fill_char, size);
1448 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1449 static int output_packet(InputStream *ist, int ist_index,
1450 OutputStream *ost_table, int nb_ostreams,
1451 const AVPacket *pkt)
1453 AVFormatContext *os;
1458 void *buffer_to_free = NULL;
1459 static unsigned int samples_size= 0;
1460 AVSubtitle subtitle, *subtitle_to_free;
1461 int64_t pkt_pts = AV_NOPTS_VALUE;
1463 int frame_available;
1468 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1470 if(ist->next_pts == AV_NOPTS_VALUE)
1471 ist->next_pts= ist->pts;
1475 av_init_packet(&avpkt);
1483 if(pkt->dts != AV_NOPTS_VALUE)
1484 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1485 if(pkt->pts != AV_NOPTS_VALUE)
1486 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1488 //while we have more to decode or while the decoder did output something on EOF
1489 while (avpkt.size > 0 || (!pkt && got_output)) {
1490 uint8_t *data_buf, *decoded_data_buf;
1491 int data_size, decoded_data_size;
1493 ist->pts= ist->next_pts;
1495 if(avpkt.size && avpkt.size != pkt->size &&
1496 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1497 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1498 ist->showed_multi_packet_warning=1;
1501 /* decode the packet if needed */
1502 decoded_data_buf = NULL; /* fail safe */
1503 decoded_data_size= 0;
1504 data_buf = avpkt.data;
1505 data_size = avpkt.size;
1506 subtitle_to_free = NULL;
1507 if (ist->decoding_needed) {
1508 switch(ist->st->codec->codec_type) {
1509 case AVMEDIA_TYPE_AUDIO:{
1510 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1511 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1513 samples= av_malloc(samples_size);
1515 decoded_data_size= samples_size;
1516 /* XXX: could avoid copy if PCM 16 bits with same
1517 endianness as CPU */
1518 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1525 got_output = decoded_data_size > 0;
1526 /* Some bug in mpeg audio decoder gives */
1527 /* decoded_data_size < 0, it seems they are overflows */
1529 /* no audio frame */
1532 decoded_data_buf = (uint8_t *)samples;
1533 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1534 (ist->st->codec->sample_rate * ist->st->codec->channels);
1536 case AVMEDIA_TYPE_VIDEO:
1537 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1538 /* XXX: allocate picture correctly */
1539 avcodec_get_frame_defaults(&picture);
1540 avpkt.pts = pkt_pts;
1541 avpkt.dts = ist->pts;
1542 pkt_pts = AV_NOPTS_VALUE;
1544 ret = avcodec_decode_video2(ist->st->codec,
1545 &picture, &got_output, &avpkt);
1546 quality = same_quant ? picture.quality : 0;
1550 /* no picture yet */
1551 goto discard_packet;
1553 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1554 if (ist->st->codec->time_base.num != 0) {
1555 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1556 ist->next_pts += ((int64_t)AV_TIME_BASE *
1557 ist->st->codec->time_base.num * ticks) /
1558 ist->st->codec->time_base.den;
1561 buffer_to_free = NULL;
1562 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1564 case AVMEDIA_TYPE_SUBTITLE:
1565 ret = avcodec_decode_subtitle2(ist->st->codec,
1566 &subtitle, &got_output, &avpkt);
1570 goto discard_packet;
1572 subtitle_to_free = &subtitle;
1579 switch(ist->st->codec->codec_type) {
1580 case AVMEDIA_TYPE_AUDIO:
1581 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1582 ist->st->codec->sample_rate;
1584 case AVMEDIA_TYPE_VIDEO:
1585 if (ist->st->codec->time_base.num != 0) {
1586 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1587 ist->next_pts += ((int64_t)AV_TIME_BASE *
1588 ist->st->codec->time_base.num * ticks) /
1589 ist->st->codec->time_base.den;
1598 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1599 if (start_time == 0 || ist->pts >= start_time) {
1600 for(i=0;i<nb_ostreams;i++) {
1601 ost = &ost_table[i];
1602 if (ost->input_video_filter && ost->source_index == ist_index) {
1603 if (!picture.sample_aspect_ratio.num)
1604 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1605 picture.pts = ist->pts;
1607 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1613 // preprocess audio (volume)
1614 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1615 if (audio_volume != 256) {
1618 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1619 int v = ((*volp) * audio_volume + 128) >> 8;
1620 if (v < -32768) v = -32768;
1621 if (v > 32767) v = 32767;
1627 /* frame rate emulation */
1629 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1630 int64_t now = av_gettime() - ist->start;
1634 /* if output time reached then transcode raw format,
1635 encode packets and output them */
1636 for (i = 0; i < nb_ostreams; i++) {
1637 OutputFile *of = &output_files[ost_table[i].file_index];
1640 ost = &ost_table[i];
1641 if (ost->source_index != ist_index)
1644 if (of->start_time && ist->pts < of->start_time)
1647 if (of->recording_time != INT64_MAX &&
1648 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1649 (AVRational){1, 1000000}) >= 0) {
1650 ost->is_past_recording_time = 1;
1655 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1656 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1657 while (frame_available) {
1658 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1659 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1660 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1663 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1664 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1668 os = output_files[ost->file_index].ctx;
1670 /* set the input output pts pairs */
1671 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1673 if (ost->encoding_needed) {
1674 av_assert0(ist->decoding_needed);
1675 switch(ost->st->codec->codec_type) {
1676 case AVMEDIA_TYPE_AUDIO:
1677 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1679 case AVMEDIA_TYPE_VIDEO:
1681 if (ost->picref->video && !ost->frame_aspect_ratio)
1682 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1684 do_video_out(os, ost, ist, &picture, &frame_size,
1685 same_quant ? quality : ost->st->codec->global_quality);
1686 if (vstats_filename && frame_size)
1687 do_video_stats(os, ost, frame_size);
1689 case AVMEDIA_TYPE_SUBTITLE:
1690 do_subtitle_out(os, ost, ist, &subtitle,
1697 AVFrame avframe; //FIXME/XXX remove this
1700 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1701 av_init_packet(&opkt);
1703 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1704 #if !CONFIG_AVFILTER
1710 /* no reencoding needed : output the packet directly */
1711 /* force the input stream PTS */
1713 avcodec_get_frame_defaults(&avframe);
1714 ost->st->codec->coded_frame= &avframe;
1715 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1717 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1718 audio_size += data_size;
1719 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1720 video_size += data_size;
1724 opkt.stream_index= ost->index;
1725 if(pkt->pts != AV_NOPTS_VALUE)
1726 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1728 opkt.pts= AV_NOPTS_VALUE;
1730 if (pkt->dts == AV_NOPTS_VALUE)
1731 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1733 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1734 opkt.dts -= ost_tb_start_time;
1736 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1737 opkt.flags= pkt->flags;
1739 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1740 if( ost->st->codec->codec_id != CODEC_ID_H264
1741 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1742 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1744 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1745 opkt.destruct= av_destruct_packet;
1747 opkt.data = data_buf;
1748 opkt.size = data_size;
1751 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1752 /* store AVPicture in AVPacket, as expected by the output format */
1753 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1754 opkt.data = (uint8_t *)&pict;
1755 opkt.size = sizeof(AVPicture);
1756 opkt.flags |= AV_PKT_FLAG_KEY;
1758 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1759 ost->st->codec->frame_number++;
1760 ost->frame_number++;
1761 av_free_packet(&opkt);
1765 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1766 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1767 avfilter_unref_buffer(ost->picref);
1772 av_free(buffer_to_free);
1773 /* XXX: allocate the subtitles in the codec ? */
1774 if (subtitle_to_free) {
1775 avsubtitle_free(subtitle_to_free);
1776 subtitle_to_free = NULL;
1783 for(i=0;i<nb_ostreams;i++) {
1784 ost = &ost_table[i];
1785 if (ost->source_index == ist_index) {
1786 AVCodecContext *enc= ost->st->codec;
1787 os = output_files[ost->file_index].ctx;
1789 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1791 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1794 if (ost->encoding_needed) {
1798 av_init_packet(&pkt);
1799 pkt.stream_index= ost->index;
1801 switch(ost->st->codec->codec_type) {
1802 case AVMEDIA_TYPE_AUDIO:
1803 fifo_bytes = av_fifo_size(ost->fifo);
1805 /* encode any samples remaining in fifo */
1806 if (fifo_bytes > 0) {
1807 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1808 int fs_tmp = enc->frame_size;
1810 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1811 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1812 enc->frame_size = fifo_bytes / (osize * enc->channels);
1814 int frame_bytes = enc->frame_size*osize*enc->channels;
1815 if (allocated_audio_buf_size < frame_bytes)
1817 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1820 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1821 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1822 ost->st->time_base.num, enc->sample_rate);
1823 enc->frame_size = fs_tmp;
1826 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1829 fprintf(stderr, "Audio encoding failed\n");
1833 pkt.flags |= AV_PKT_FLAG_KEY;
1835 case AVMEDIA_TYPE_VIDEO:
1836 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1838 fprintf(stderr, "Video encoding failed\n");
1842 if(enc->coded_frame && enc->coded_frame->key_frame)
1843 pkt.flags |= AV_PKT_FLAG_KEY;
1844 if (ost->logfile && enc->stats_out) {
1845 fprintf(ost->logfile, "%s", enc->stats_out);
1854 pkt.data= bit_buffer;
1856 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1857 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1858 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1868 static void print_sdp(OutputFile *output_files, int n)
1872 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1876 for (i = 0; i < n; i++)
1877 avc[i] = output_files[i].ctx;
1879 av_sdp_create(avc, n, sdp, sizeof(sdp));
1880 printf("SDP:\n%s\n", sdp);
1886 * The following code is the main loop of the file converter
1888 static int transcode(OutputFile *output_files,
1889 int nb_output_files,
1890 InputFile *input_files,
1894 AVFormatContext *is, *os;
1895 AVCodecContext *codec, *icodec;
1902 int no_packet_count=0;
1903 int64_t timer_start;
1905 if (!(no_packet = av_mallocz(nb_input_files)))
1909 for (i = 0; i < nb_input_streams; i++)
1910 input_streams[i].start = av_gettime();
1912 /* output stream init */
1913 for(i=0;i<nb_output_files;i++) {
1914 os = output_files[i].ctx;
1915 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1916 av_dump_format(os, i, os->filename, 1);
1917 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1918 ret = AVERROR(EINVAL);
1923 /* for each output stream, we compute the right encoding parameters */
1924 for (i = 0; i < nb_output_streams; i++) {
1925 ost = &output_streams[i];
1926 os = output_files[ost->file_index].ctx;
1927 ist = &input_streams[ost->source_index];
1929 codec = ost->st->codec;
1930 icodec = ist->st->codec;
1932 ost->st->disposition = ist->st->disposition;
1933 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1934 codec->chroma_sample_location = icodec->chroma_sample_location;
1936 if (ost->st->stream_copy) {
1937 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1939 if (extra_size > INT_MAX)
1942 /* if stream_copy is selected, no need to decode or encode */
1943 codec->codec_id = icodec->codec_id;
1944 codec->codec_type = icodec->codec_type;
1946 if(!codec->codec_tag){
1947 if( !os->oformat->codec_tag
1948 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1949 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1950 codec->codec_tag = icodec->codec_tag;
1953 codec->bit_rate = icodec->bit_rate;
1954 codec->rc_max_rate = icodec->rc_max_rate;
1955 codec->rc_buffer_size = icodec->rc_buffer_size;
1956 codec->extradata= av_mallocz(extra_size);
1957 if (!codec->extradata)
1959 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1960 codec->extradata_size= icodec->extradata_size;
1962 codec->time_base = ist->st->time_base;
1963 if(!strcmp(os->oformat->name, "avi")) {
1964 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > 2*av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
1965 codec->time_base = icodec->time_base;
1966 codec->time_base.num *= icodec->ticks_per_frame;
1967 codec->time_base.den *= 2;
1969 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
1970 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){
1971 codec->time_base = icodec->time_base;
1972 codec->time_base.num *= icodec->ticks_per_frame;
1975 av_reduce(&codec->time_base.num, &codec->time_base.den,
1976 codec->time_base.num, codec->time_base.den, INT_MAX);
1978 switch(codec->codec_type) {
1979 case AVMEDIA_TYPE_AUDIO:
1980 if(audio_volume != 256) {
1981 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1984 codec->channel_layout = icodec->channel_layout;
1985 codec->sample_rate = icodec->sample_rate;
1986 codec->channels = icodec->channels;
1987 codec->frame_size = icodec->frame_size;
1988 codec->audio_service_type = icodec->audio_service_type;
1989 codec->block_align= icodec->block_align;
1990 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1991 codec->block_align= 0;
1992 if(codec->codec_id == CODEC_ID_AC3)
1993 codec->block_align= 0;
1995 case AVMEDIA_TYPE_VIDEO:
1996 codec->pix_fmt = icodec->pix_fmt;
1997 codec->width = icodec->width;
1998 codec->height = icodec->height;
1999 codec->has_b_frames = icodec->has_b_frames;
2000 if (!codec->sample_aspect_ratio.num) {
2001 codec->sample_aspect_ratio =
2002 ost->st->sample_aspect_ratio =
2003 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2004 ist->st->codec->sample_aspect_ratio.num ?
2005 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2008 case AVMEDIA_TYPE_SUBTITLE:
2009 codec->width = icodec->width;
2010 codec->height = icodec->height;
2012 case AVMEDIA_TYPE_DATA:
2019 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2020 switch(codec->codec_type) {
2021 case AVMEDIA_TYPE_AUDIO:
2022 ost->fifo= av_fifo_alloc(1024);
2025 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2026 if (!codec->sample_rate) {
2027 codec->sample_rate = icodec->sample_rate;
2029 choose_sample_rate(ost->st, ost->enc);
2030 codec->time_base = (AVRational){1, codec->sample_rate};
2031 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2032 codec->sample_fmt = icodec->sample_fmt;
2033 choose_sample_fmt(ost->st, ost->enc);
2034 if (!codec->channels) {
2035 codec->channels = icodec->channels;
2036 codec->channel_layout = icodec->channel_layout;
2038 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2039 codec->channel_layout = 0;
2040 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2041 icodec->request_channels = codec->channels;
2042 ist->decoding_needed = 1;
2043 ost->encoding_needed = 1;
2044 ost->resample_sample_fmt = icodec->sample_fmt;
2045 ost->resample_sample_rate = icodec->sample_rate;
2046 ost->resample_channels = icodec->channels;
2048 case AVMEDIA_TYPE_VIDEO:
2049 if (codec->pix_fmt == PIX_FMT_NONE)
2050 codec->pix_fmt = icodec->pix_fmt;
2051 choose_pixel_fmt(ost->st, ost->enc);
2053 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2054 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2058 if (!codec->width || !codec->height) {
2059 codec->width = icodec->width;
2060 codec->height = icodec->height;
2063 ost->video_resample = codec->width != icodec->width ||
2064 codec->height != icodec->height ||
2065 codec->pix_fmt != icodec->pix_fmt;
2066 if (ost->video_resample) {
2067 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2070 ost->resample_height = icodec->height;
2071 ost->resample_width = icodec->width;
2072 ost->resample_pix_fmt= icodec->pix_fmt;
2073 ost->encoding_needed = 1;
2074 ist->decoding_needed = 1;
2076 if (!ost->frame_rate.num)
2077 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2078 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2079 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2080 ost->frame_rate = ost->enc->supported_framerates[idx];
2082 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2083 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2084 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2085 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2086 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2090 if (configure_video_filters(ist, ost)) {
2091 fprintf(stderr, "Error opening filters!\n");
2096 case AVMEDIA_TYPE_SUBTITLE:
2097 ost->encoding_needed = 1;
2098 ist->decoding_needed = 1;
2105 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2106 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2107 char logfilename[1024];
2110 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2111 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2113 if (codec->flags & CODEC_FLAG_PASS1) {
2114 f = fopen(logfilename, "wb");
2116 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2122 size_t logbuffer_size;
2123 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2124 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2127 codec->stats_in = logbuffer;
2131 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2132 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2133 int size= codec->width * codec->height;
2134 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2139 bit_buffer = av_malloc(bit_buffer_size);
2141 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2143 ret = AVERROR(ENOMEM);
2147 /* open each encoder */
2148 for (i = 0; i < nb_output_streams; i++) {
2149 ost = &output_streams[i];
2150 if (ost->encoding_needed) {
2151 AVCodec *codec = ost->enc;
2152 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2154 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2155 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2156 ret = AVERROR(EINVAL);
2159 if (dec->subtitle_header) {
2160 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2161 if (!ost->st->codec->subtitle_header) {
2162 ret = AVERROR(ENOMEM);
2165 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2166 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2168 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2169 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2170 ost->file_index, ost->index);
2171 ret = AVERROR(EINVAL);
2174 assert_codec_experimental(ost->st->codec, 1);
2175 assert_avoptions(ost->opts);
2176 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2177 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2178 "It takes bits/s as argument, not kbits/s\n");
2179 extra_size += ost->st->codec->extradata_size;
2183 /* open each decoder */
2184 for (i = 0; i < nb_input_streams; i++) {
2185 ist = &input_streams[i];
2186 if (ist->decoding_needed) {
2187 AVCodec *codec = ist->dec;
2189 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2191 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
2192 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2193 ret = AVERROR(EINVAL);
2196 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2197 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2198 ist->file_index, ist->st->index);
2199 ret = AVERROR(EINVAL);
2202 assert_codec_experimental(ist->st->codec, 0);
2203 assert_avoptions(ost->opts);
2208 for (i = 0; i < nb_input_streams; i++) {
2210 ist = &input_streams[i];
2212 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2213 ist->next_pts = AV_NOPTS_VALUE;
2217 /* open files and write file headers */
2218 for (i = 0; i < nb_output_files; i++) {
2219 os = output_files[i].ctx;
2220 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2221 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2222 ret = AVERROR(EINVAL);
2225 // assert_avoptions(output_files[i].opts);
2226 if (strcmp(os->oformat->name, "rtp")) {
2232 /* dump the file output parameters - cannot be done before in case
2234 for(i=0;i<nb_output_files;i++) {
2235 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2238 /* dump the stream mapping */
2240 fprintf(stderr, "Stream mapping:\n");
2241 for (i = 0; i < nb_output_streams;i ++) {
2242 ost = &output_streams[i];
2243 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2244 input_streams[ost->source_index].file_index,
2245 input_streams[ost->source_index].st->index,
2248 if (ost->sync_ist != &input_streams[ost->source_index])
2249 fprintf(stderr, " [sync #%d.%d]",
2250 ost->sync_ist->file_index,
2251 ost->sync_ist->st->index);
2252 if(ost->encoding_needed)
2253 fprintf(stderr, ": %s -> %s",
2254 input_streams[ost->source_index].dec ?
2255 input_streams[ost->source_index].dec->name : "?",
2256 ost->enc ? ost->enc->name : "?");
2258 fprintf(stderr, ": copy");
2259 fprintf(stderr, "\n");
2264 fprintf(stderr, "%s\n", error);
2269 print_sdp(output_files, nb_output_files);
2274 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2275 avio_set_interrupt_cb(decode_interrupt_cb);
2279 timer_start = av_gettime();
2281 for(; received_sigterm == 0;) {
2282 int file_index, ist_index;
2288 ipts_min= INT64_MAX;
2290 /* if 'q' pressed, exits */
2294 /* read_key() returns 0 on EOF */
2298 if (key == '+') verbose++;
2299 if (key == '-') verbose--;
2300 if (key == 's') qp_hist ^= 1;
2303 do_hex_dump = do_pkt_dump = 0;
2304 } else if(do_pkt_dump){
2308 av_log_set_level(AV_LOG_DEBUG);
2310 if (key == 'c' || key == 'C'){
2311 char ret[4096], target[64], cmd[256], arg[256]={0};
2313 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2314 if(scanf("%4095[^\n\r]%*c", ret) == 1 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2315 for(i=0;i<nb_output_streams;i++) {
2317 ost = &output_streams[i];
2320 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2321 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2323 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2328 fprintf(stderr, "Parse error\n");
2331 if (key == 'd' || key == 'D'){
2334 debug = input_streams[0].st->codec->debug<<1;
2335 if(!debug) debug = 1;
2336 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2339 scanf("%d", &debug);
2340 for(i=0;i<nb_input_streams;i++) {
2341 input_streams[i].st->codec->debug = debug;
2343 for(i=0;i<nb_output_streams;i++) {
2344 ost = &output_streams[i];
2345 ost->st->codec->debug = debug;
2347 if(debug) av_log_set_level(AV_LOG_DEBUG);
2348 fprintf(stderr,"debug=%d\n", debug);
2351 fprintf(stderr, "key function\n"
2352 "? show this help\n"
2353 "+ increase verbosity\n"
2354 "- decrease verbosity\n"
2355 "c Send command to filtergraph\n"
2356 "D cycle through available debug modes\n"
2357 "h dump packets/hex press to cycle through the 3 states\n"
2359 "s Show QP histogram\n"
2364 /* select the stream that we must read now by looking at the
2365 smallest output pts */
2367 for (i = 0; i < nb_output_streams; i++) {
2370 ost = &output_streams[i];
2371 os = output_files[ost->file_index].ctx;
2372 ist = &input_streams[ost->source_index];
2373 if(ost->is_past_recording_time || no_packet[ist->file_index])
2375 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2377 if (!input_files[ist->file_index].eof_reached){
2378 if(ipts < ipts_min) {
2380 if(input_sync ) file_index = ist->file_index;
2382 if(opts < opts_min) {
2384 if(!input_sync) file_index = ist->file_index;
2387 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2392 /* if none, if is finished */
2393 if (file_index < 0) {
2394 if(no_packet_count){
2396 memset(no_packet, 0, nb_input_files);
2403 /* finish if limit size exhausted */
2404 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2407 /* read a frame from it and output it in the fifo */
2408 is = input_files[file_index].ctx;
2409 ret= av_read_frame(is, &pkt);
2410 if(ret == AVERROR(EAGAIN)){
2411 no_packet[file_index]=1;
2416 input_files[file_index].eof_reached = 1;
2424 memset(no_packet, 0, nb_input_files);
2427 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2428 is->streams[pkt.stream_index]);
2430 /* the following test is needed in case new streams appear
2431 dynamically in stream : we ignore them */
2432 if (pkt.stream_index >= input_files[file_index].nb_streams)
2433 goto discard_packet;
2434 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2435 ist = &input_streams[ist_index];
2437 goto discard_packet;
2439 if (pkt.dts != AV_NOPTS_VALUE)
2440 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2441 if (pkt.pts != AV_NOPTS_VALUE)
2442 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2444 if (ist->ts_scale) {
2445 if(pkt.pts != AV_NOPTS_VALUE)
2446 pkt.pts *= ist->ts_scale;
2447 if(pkt.dts != AV_NOPTS_VALUE)
2448 pkt.dts *= ist->ts_scale;
2451 // fprintf(stderr, "next:%"PRId64" dts:%"PRId64" off:%"PRId64" %d\n", ist->next_pts, pkt.dts, input_files[ist->file_index].ts_offset, ist->st->codec->codec_type);
2452 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2453 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2454 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2455 int64_t delta= pkt_dts - ist->next_pts;
2456 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2457 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2458 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2459 pkt_dts+1<ist->pts)&& !copy_ts){
2460 input_files[ist->file_index].ts_offset -= delta;
2462 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2463 delta, input_files[ist->file_index].ts_offset);
2464 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2465 if(pkt.pts != AV_NOPTS_VALUE)
2466 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2470 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2471 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2474 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2475 ist->file_index, ist->st->index);
2478 av_free_packet(&pkt);
2483 av_free_packet(&pkt);
2485 /* dump report by using the output first video and audio streams */
2486 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2489 /* at the end of stream, we must flush the decoder buffers */
2490 for (i = 0; i < nb_input_streams; i++) {
2491 ist = &input_streams[i];
2492 if (ist->decoding_needed) {
2493 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2499 /* write the trailer if needed and close file */
2500 for(i=0;i<nb_output_files;i++) {
2501 os = output_files[i].ctx;
2502 av_write_trailer(os);
2505 /* dump report by using the first video and audio streams */
2506 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2508 /* close each encoder */
2509 for (i = 0; i < nb_output_streams; i++) {
2510 ost = &output_streams[i];
2511 if (ost->encoding_needed) {
2512 av_freep(&ost->st->codec->stats_in);
2513 avcodec_close(ost->st->codec);
2516 avfilter_graph_free(&ost->graph);
2520 /* close each decoder */
2521 for (i = 0; i < nb_input_streams; i++) {
2522 ist = &input_streams[i];
2523 if (ist->decoding_needed) {
2524 avcodec_close(ist->st->codec);
2532 av_freep(&bit_buffer);
2533 av_freep(&no_packet);
2535 if (output_streams) {
2536 for (i = 0; i < nb_output_streams; i++) {
2537 ost = &output_streams[i];
2539 if (ost->st->stream_copy)
2540 av_freep(&ost->st->codec->extradata);
2542 fclose(ost->logfile);
2543 ost->logfile = NULL;
2545 av_fifo_free(ost->fifo); /* works even if fifo is not
2546 initialized but set to zero */
2547 av_freep(&ost->st->codec->subtitle_header);
2548 av_free(ost->resample_frame.data[0]);
2549 av_free(ost->forced_kf_pts);
2550 if (ost->video_resample)
2551 sws_freeContext(ost->img_resample_ctx);
2553 audio_resample_close(ost->resample);
2554 if (ost->reformat_ctx)
2555 av_audio_convert_free(ost->reformat_ctx);
2556 av_dict_free(&ost->opts);
2563 static int opt_format(const char *opt, const char *arg)
2565 last_asked_format = arg;
2569 static int opt_video_rc_override_string(const char *opt, const char *arg)
2571 video_rc_override_string = arg;
2575 static int opt_me_threshold(const char *opt, const char *arg)
2577 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2581 static int opt_verbose(const char *opt, const char *arg)
2583 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2587 static int opt_frame_rate(const char *opt, const char *arg)
2589 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2590 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2596 static int opt_frame_crop(const char *opt, const char *arg)
2598 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2599 return AVERROR(EINVAL);
2602 static int opt_frame_size(const char *opt, const char *arg)
2604 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2605 fprintf(stderr, "Incorrect frame size\n");
2606 return AVERROR(EINVAL);
2611 static int opt_pad(const char *opt, const char *arg) {
2612 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2616 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2618 if (strcmp(arg, "list")) {
2619 frame_pix_fmt = av_get_pix_fmt(arg);
2620 if (frame_pix_fmt == PIX_FMT_NONE) {
2621 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2622 return AVERROR(EINVAL);
2625 opt_pix_fmts(NULL, NULL);
2631 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2638 p = strchr(arg, ':');
2640 x = strtol(arg, &end, 10);
2642 y = strtol(end+1, &end, 10);
2644 ar = (double)x / (double)y;
2646 ar = strtod(arg, NULL);
2649 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2650 return AVERROR(EINVAL);
2652 frame_aspect_ratio = ar;
2656 static int opt_metadata(const char *opt, const char *arg)
2658 char *mid= strchr(arg, '=');
2661 fprintf(stderr, "Missing =\n");
2666 av_dict_set(&metadata, arg, mid, 0);
2671 static int opt_qscale(const char *opt, const char *arg)
2673 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2674 if (video_qscale <= 0 || video_qscale > 255) {
2675 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2676 return AVERROR(EINVAL);
2681 static int opt_top_field_first(const char *opt, const char *arg)
2683 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2684 return opt_default(opt, arg);
2687 static int opt_thread_count(const char *opt, const char *arg)
2689 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2692 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2697 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2699 if (strcmp(arg, "list")) {
2700 audio_sample_fmt = av_get_sample_fmt(arg);
2701 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2702 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2703 return AVERROR(EINVAL);
2708 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2709 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2715 static int opt_audio_rate(const char *opt, const char *arg)
2717 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2721 static int opt_audio_channels(const char *opt, const char *arg)
2723 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2727 static int opt_video_channel(const char *opt, const char *arg)
2729 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2730 return opt_default("channel", arg);
2733 static int opt_video_standard(const char *opt, const char *arg)
2735 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2736 return opt_default("standard", arg);
2739 static int opt_codec(const char *opt, const char *arg)
2741 return av_dict_set(&codec_names, opt, arg, 0);
2744 static int opt_audio_codec(const char *opt, const char *arg)
2746 return opt_codec("codec:a", arg);
2749 static int opt_video_codec(const char *opt, const char *arg)
2751 return opt_codec("codec:v", arg);
2754 static int opt_subtitle_codec(const char *opt, const char *arg)
2756 return opt_codec("codec:s", arg);
2759 static int opt_data_codec(const char *opt, const char *arg)
2761 return opt_codec("codec:d", arg);
2764 static int opt_codec_tag(const char *opt, const char *arg)
2767 uint32_t *codec_tag;
2769 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2770 !strcmp(opt, "vtag") ? &video_codec_tag :
2771 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2775 *codec_tag = strtol(arg, &tail, 0);
2777 *codec_tag = AV_RL32(arg);
2782 static int opt_map(const char *opt, const char *arg)
2784 StreamMap *m = NULL;
2785 int i, negative = 0, file_idx;
2786 int sync_file_idx = -1, sync_stream_idx;
2794 map = av_strdup(arg);
2796 /* parse sync stream first, just pick first matching stream */
2797 if (sync = strchr(map, ',')) {
2799 sync_file_idx = strtol(sync + 1, &sync, 0);
2800 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2801 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2806 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2807 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2808 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2809 sync_stream_idx = i;
2812 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2813 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2814 "match any streams.\n", arg);
2820 file_idx = strtol(map, &p, 0);
2821 if (file_idx >= nb_input_files || file_idx < 0) {
2822 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2826 /* disable some already defined maps */
2827 for (i = 0; i < nb_stream_maps; i++) {
2828 m = &stream_maps[i];
2829 if (check_stream_specifier(input_files[m->file_index].ctx,
2830 input_files[m->file_index].ctx->streams[m->stream_index],
2831 *p == ':' ? p + 1 : p) > 0)
2835 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2836 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2837 *p == ':' ? p + 1 : p) <= 0)
2839 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2840 m = &stream_maps[nb_stream_maps - 1];
2842 m->file_index = file_idx;
2843 m->stream_index = i;
2845 if (sync_file_idx >= 0) {
2846 m->sync_file_index = sync_file_idx;
2847 m->sync_stream_index = sync_stream_idx;
2849 m->sync_file_index = file_idx;
2850 m->sync_stream_index = i;
2855 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2863 static void parse_meta_type(char *arg, char *type, int *index)
2873 if (*(++arg) == ':')
2874 *index = strtol(++arg, NULL, 0);
2877 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2884 static int opt_map_metadata(const char *opt, const char *arg)
2886 MetadataMap *m, *m1;
2889 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2890 &nb_meta_data_maps, nb_meta_data_maps + 1);
2892 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2893 m->file = strtol(arg, &p, 0);
2894 parse_meta_type(p, &m->type, &m->index);
2896 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2897 if (p = strchr(opt, ':'))
2898 parse_meta_type(p, &m1->type, &m1->index);
2902 if (m->type == 'g' || m1->type == 'g')
2903 metadata_global_autocopy = 0;
2904 if (m->type == 's' || m1->type == 's')
2905 metadata_streams_autocopy = 0;
2906 if (m->type == 'c' || m1->type == 'c')
2907 metadata_chapters_autocopy = 0;
2912 static int opt_map_meta_data(const char *opt, const char *arg)
2914 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2915 "Use -map_metadata instead.\n");
2916 return opt_map_metadata(opt, arg);
2919 static int opt_input_ts_scale(const char *opt, const char *arg)
2921 return av_dict_set(&ts_scale, opt, arg, 0);
2924 static int opt_recording_time(const char *opt, const char *arg)
2926 recording_time = parse_time_or_die(opt, arg, 1);
2930 static int opt_start_time(const char *opt, const char *arg)
2932 start_time = parse_time_or_die(opt, arg, 1);
2936 static int opt_recording_timestamp(const char *opt, const char *arg)
2939 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2940 struct tm time = *gmtime((time_t*)&recording_timestamp);
2941 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2942 opt_metadata("metadata", buf);
2944 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2945 "tag instead.\n", opt);
2949 static int opt_input_ts_offset(const char *opt, const char *arg)
2951 input_ts_offset = parse_time_or_die(opt, arg, 1);
2955 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2957 const char *codec_string = encoder ? "encoder" : "decoder";
2961 return CODEC_ID_NONE;
2963 avcodec_find_encoder_by_name(name) :
2964 avcodec_find_decoder_by_name(name);
2966 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2969 if(codec->type != type) {
2970 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2976 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2978 AVDictionaryEntry *e = NULL;
2979 char *codec_name = NULL;
2982 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2983 char *p = strchr(e->key, ':');
2985 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2986 codec_name = e->value;
2993 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2994 return avcodec_find_encoder(st->codec->codec_id);
2996 } else if (!strcmp(codec_name, "copy"))
2997 st->stream_copy = 1;
2999 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3000 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3001 avcodec_find_decoder_by_name(codec_name);
3008 * Add all the streams from the given input file to the global
3009 * list of input streams.
3011 static void add_input_streams(AVFormatContext *ic)
3013 int i, rfps, rfps_base, ret;
3015 for (i = 0; i < ic->nb_streams; i++) {
3016 AVStream *st = ic->streams[i];
3017 AVCodecContext *dec = st->codec;
3018 AVDictionaryEntry *e = NULL;
3022 dec->thread_count = thread_count;
3024 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3025 ist = &input_streams[nb_input_streams - 1];
3027 ist->file_index = nb_input_files;
3029 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3031 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
3032 char *p = strchr(e->key, ':');
3034 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
3040 ist->ts_scale = strtod(scale, NULL);
3042 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3044 switch (dec->codec_type) {
3045 case AVMEDIA_TYPE_AUDIO:
3047 ist->dec = avcodec_find_decoder(dec->codec_id);
3049 st->discard= AVDISCARD_ALL;
3051 case AVMEDIA_TYPE_VIDEO:
3053 ist->dec = avcodec_find_decoder(dec->codec_id);
3054 rfps = ic->streams[i]->r_frame_rate.num;
3055 rfps_base = ic->streams[i]->r_frame_rate.den;
3057 dec->flags |= CODEC_FLAG_EMU_EDGE;
3060 dec->debug |= FF_DEBUG_MV;
3062 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3065 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3066 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3068 (float)rfps / rfps_base, rfps, rfps_base);
3072 st->discard= AVDISCARD_ALL;
3073 else if(video_discard)
3074 st->discard= video_discard;
3076 case AVMEDIA_TYPE_DATA:
3078 case AVMEDIA_TYPE_SUBTITLE:
3080 ist->dec = avcodec_find_decoder(dec->codec_id);
3081 if(subtitle_disable)
3082 st->discard = AVDISCARD_ALL;
3084 case AVMEDIA_TYPE_ATTACHMENT:
3085 case AVMEDIA_TYPE_UNKNOWN:
3093 static int opt_input_file(const char *opt, const char *filename)
3095 AVFormatContext *ic;
3096 AVInputFormat *file_iformat = NULL;
3100 AVDictionary **opts;
3101 int orig_nb_streams; // number of streams before avformat_find_stream_info
3103 if (last_asked_format) {
3104 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3105 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3108 last_asked_format = NULL;
3111 if (!strcmp(filename, "-"))
3114 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3115 !strcmp(filename, "/dev/stdin");
3117 /* get default parameters from command line */
3118 ic = avformat_alloc_context();
3120 print_error(filename, AVERROR(ENOMEM));
3123 if (audio_sample_rate) {
3124 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3125 av_dict_set(&format_opts, "sample_rate", buf, 0);
3127 if (audio_channels) {
3128 snprintf(buf, sizeof(buf), "%d", audio_channels);
3129 av_dict_set(&format_opts, "channels", buf, 0);
3131 if (frame_rate.num) {
3132 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3133 av_dict_set(&format_opts, "framerate", buf, 0);
3135 if (frame_width && frame_height) {
3136 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3137 av_dict_set(&format_opts, "video_size", buf, 0);
3139 if (frame_pix_fmt != PIX_FMT_NONE)
3140 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3142 ic->flags |= AVFMT_FLAG_NONBLOCK;
3145 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3146 ic->loop_input = loop_input;
3149 /* open the input file with generic libav function */
3150 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3152 print_error(filename, err);
3155 assert_avoptions(format_opts);
3160 for(i=0; i<ic->nb_streams; i++){
3161 ic->streams[i]->discard= AVDISCARD_ALL;
3163 for(i=0; i<ic->nb_programs; i++){
3164 AVProgram *p= ic->programs[i];
3165 if(p->id != opt_programid){
3166 p->discard = AVDISCARD_ALL;
3169 for(j=0; j<p->nb_stream_indexes; j++){
3170 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3175 fprintf(stderr, "Specified program id not found\n");
3181 /* apply forced codec ids */
3182 for (i = 0; i < ic->nb_streams; i++)
3183 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3185 /* Set AVCodecContext options for avformat_find_stream_info */
3186 opts = setup_find_stream_info_opts(ic, codec_opts);
3187 orig_nb_streams = ic->nb_streams;
3189 /* If not enough info to get the stream parameters, we decode the
3190 first frames to get it. (used in mpeg case for example) */
3191 ret = avformat_find_stream_info(ic, opts);
3192 if (ret < 0 && verbose >= 0) {
3193 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3194 av_close_input_file(ic);
3198 timestamp = start_time;
3199 /* add the stream start time */
3200 if (ic->start_time != AV_NOPTS_VALUE)
3201 timestamp += ic->start_time;
3203 /* if seeking requested, we execute it */
3204 if (start_time != 0) {
3205 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3207 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3208 filename, (double)timestamp / AV_TIME_BASE);
3210 /* reset seek info */
3214 /* update the current parameters so that they match the one of the input stream */
3215 add_input_streams(ic);
3217 /* dump the file content */
3219 av_dump_format(ic, nb_input_files, filename, 0);
3221 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3222 input_files[nb_input_files - 1].ctx = ic;
3223 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3224 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3225 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3227 top_field_first = -1;
3228 frame_rate = (AVRational){0, 0};
3229 frame_pix_fmt = PIX_FMT_NONE;
3232 audio_sample_rate = 0;
3234 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3235 av_dict_free(&ts_scale);
3237 for (i = 0; i < orig_nb_streams; i++)
3238 av_dict_free(&opts[i]);
3240 av_dict_free(&codec_names);
3246 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3247 AVCodecContext *avctx)
3253 for (p = kf; *p; p++)
3256 ost->forced_kf_count = n;
3257 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3258 if (!ost->forced_kf_pts) {
3259 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3262 for (i = 0; i < n; i++) {
3263 p = i ? strchr(p, ',') + 1 : kf;
3264 t = parse_time_or_die("force_key_frames", p, 1);
3265 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3269 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3272 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3273 int idx = oc->nb_streams - 1;
3276 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3280 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3281 nb_output_streams + 1);
3282 ost = &output_streams[nb_output_streams - 1];
3283 ost->file_index = nb_output_files;
3286 st->codec->codec_type = type;
3287 ost->enc = choose_codec(oc, st, type, codec_names);
3289 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3292 avcodec_get_context_defaults3(st->codec, ost->enc);
3293 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3295 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3299 static OutputStream *new_video_stream(AVFormatContext *oc)
3303 AVCodecContext *video_enc;
3305 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3307 if (!st->stream_copy) {
3308 ost->frame_aspect_ratio = frame_aspect_ratio;
3309 frame_aspect_ratio = 0;
3311 ost->avfilter = vfilters;
3316 ost->bitstream_filters = video_bitstream_filters;
3317 video_bitstream_filters= NULL;
3319 st->codec->thread_count= thread_count;
3321 video_enc = st->codec;
3324 video_enc->codec_tag= video_codec_tag;
3326 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3327 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3330 if (st->stream_copy) {
3331 video_enc->sample_aspect_ratio =
3332 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3338 ost->frame_rate = frame_rate;
3340 video_enc->width = frame_width;
3341 video_enc->height = frame_height;
3342 video_enc->pix_fmt = frame_pix_fmt;
3343 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3344 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3347 video_enc->gop_size = 0;
3348 if (video_qscale || same_quant) {
3349 video_enc->flags |= CODEC_FLAG_QSCALE;
3350 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3354 video_enc->intra_matrix = intra_matrix;
3356 video_enc->inter_matrix = inter_matrix;
3358 p= video_rc_override_string;
3361 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3363 fprintf(stderr, "error parsing rc_override\n");
3366 video_enc->rc_override=
3367 av_realloc(video_enc->rc_override,
3368 sizeof(RcOverride)*(i+1));
3369 video_enc->rc_override[i].start_frame= start;
3370 video_enc->rc_override[i].end_frame = end;
3372 video_enc->rc_override[i].qscale= q;
3373 video_enc->rc_override[i].quality_factor= 1.0;
3376 video_enc->rc_override[i].qscale= 0;
3377 video_enc->rc_override[i].quality_factor= -q/100.0;
3382 video_enc->rc_override_count=i;
3383 if (!video_enc->rc_initial_buffer_occupancy)
3384 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3385 video_enc->me_threshold= me_threshold;
3386 video_enc->intra_dc_precision= intra_dc_precision - 8;
3389 video_enc->flags|= CODEC_FLAG_PSNR;
3394 video_enc->flags |= CODEC_FLAG_PASS1;
3396 video_enc->flags |= CODEC_FLAG_PASS2;
3400 if (forced_key_frames)
3401 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3403 if (video_language) {
3404 av_dict_set(&st->metadata, "language", video_language, 0);
3405 av_freep(&video_language);
3408 /* reset some key parameters */
3410 av_freep(&forced_key_frames);
3411 frame_pix_fmt = PIX_FMT_NONE;
3415 static OutputStream *new_audio_stream(AVFormatContext *oc)
3419 AVCodecContext *audio_enc;
3421 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3424 ost->bitstream_filters = audio_bitstream_filters;
3425 audio_bitstream_filters= NULL;
3427 st->codec->thread_count= thread_count;
3429 audio_enc = st->codec;
3430 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3433 audio_enc->codec_tag= audio_codec_tag;
3435 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3436 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3438 if (!st->stream_copy) {
3439 if (audio_qscale > QSCALE_NONE) {
3440 audio_enc->flags |= CODEC_FLAG_QSCALE;
3441 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3444 audio_enc->channels = audio_channels;
3445 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3446 audio_enc->sample_fmt = audio_sample_fmt;
3447 if (audio_sample_rate)
3448 audio_enc->sample_rate = audio_sample_rate;
3450 if (audio_language) {
3451 av_dict_set(&st->metadata, "language", audio_language, 0);
3452 av_freep(&audio_language);
3455 /* reset some key parameters */
3461 static OutputStream *new_data_stream(AVFormatContext *oc)
3465 AVCodecContext *data_enc;
3467 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3469 data_enc = st->codec;
3470 if (!st->stream_copy) {
3471 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3476 data_enc->codec_tag= data_codec_tag;
3478 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3479 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3486 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3490 AVCodecContext *subtitle_enc;
3492 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3494 subtitle_enc = st->codec;
3496 ost->bitstream_filters = subtitle_bitstream_filters;
3497 subtitle_bitstream_filters= NULL;
3499 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3501 if(subtitle_codec_tag)
3502 subtitle_enc->codec_tag= subtitle_codec_tag;
3504 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3505 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3508 if (subtitle_language) {
3509 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3510 av_freep(&subtitle_language);
3513 subtitle_disable = 0;
3517 /* arg format is "output-stream-index:streamid-value". */
3518 static int opt_streamid(const char *opt, const char *arg)
3524 av_strlcpy(idx_str, arg, sizeof(idx_str));
3525 p = strchr(idx_str, ':');
3528 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3533 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3534 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3535 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3538 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
3541 AVFormatContext *ic = NULL;
3543 err = avformat_open_input(&ic, filename, NULL, NULL);
3546 /* copy stream format */
3547 for(i=0;i<ic->nb_streams;i++) {
3552 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3553 ost = new_output_stream(s, codec->type);
3556 // FIXME: a more elegant solution is needed
3557 memcpy(st, ic->streams[i], sizeof(AVStream));
3558 st->info = av_malloc(sizeof(*st->info));
3559 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3560 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3562 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3563 choose_sample_fmt(st, codec);
3564 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3565 choose_pixel_fmt(st, codec);
3568 av_close_input_file(ic);
3573 static int copy_chapters(int infile, int outfile)
3575 AVFormatContext *is = input_files[infile].ctx;
3576 AVFormatContext *os = output_files[outfile].ctx;
3579 for (i = 0; i < is->nb_chapters; i++) {
3580 AVChapter *in_ch = is->chapters[i], *out_ch;
3581 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3582 AV_TIME_BASE_Q, in_ch->time_base);
3583 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3584 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3587 if (in_ch->end < ts_off)
3589 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3592 out_ch = av_mallocz(sizeof(AVChapter));
3594 return AVERROR(ENOMEM);
3596 out_ch->id = in_ch->id;
3597 out_ch->time_base = in_ch->time_base;
3598 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3599 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3601 if (metadata_chapters_autocopy)
3602 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3605 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3607 return AVERROR(ENOMEM);
3608 os->chapters[os->nb_chapters - 1] = out_ch;
3613 static int opt_output_file(const char *opt, const char *filename)
3615 AVFormatContext *oc;
3617 AVOutputFormat *file_oformat;
3621 if (!strcmp(filename, "-"))
3624 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3625 last_asked_format = NULL;
3627 print_error(filename, err);
3630 file_oformat= oc->oformat;
3632 if (!strcmp(file_oformat->name, "ffm") &&
3633 av_strstart(filename, "http:", NULL)) {
3634 /* special case for files sent to ffserver: we get the stream
3635 parameters from ffserver */
3636 int err = read_ffserver_streams(oc, filename);
3638 print_error(filename, err);
3641 } else if (!nb_stream_maps) {
3642 /* pick the "best" stream of each type */
3643 #define NEW_STREAM(type, index)\
3645 ost = new_ ## type ## _stream(oc);\
3646 ost->source_index = index;\
3647 ost->sync_ist = &input_streams[index];\
3648 input_streams[index].discard = 0;\
3651 /* video: highest resolution */
3652 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3653 int area = 0, idx = -1;
3654 for (i = 0; i < nb_input_streams; i++) {
3655 ist = &input_streams[i];
3656 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3657 ist->st->codec->width * ist->st->codec->height > area) {
3658 area = ist->st->codec->width * ist->st->codec->height;
3662 NEW_STREAM(video, idx);
3665 /* audio: most channels */
3666 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3667 int channels = 0, idx = -1;
3668 for (i = 0; i < nb_input_streams; i++) {
3669 ist = &input_streams[i];
3670 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3671 ist->st->codec->channels > channels) {
3672 channels = ist->st->codec->channels;
3676 NEW_STREAM(audio, idx);
3679 /* subtitles: pick first */
3680 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3681 for (i = 0; i < nb_input_streams; i++)
3682 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3683 NEW_STREAM(subtitle, i);
3687 /* do something with data? */
3689 for (i = 0; i < nb_stream_maps; i++) {
3690 StreamMap *map = &stream_maps[i];
3695 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3696 switch (ist->st->codec->codec_type) {
3697 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3698 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3699 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3700 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3702 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3703 map->file_index, map->stream_index);
3707 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3708 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3709 map->sync_stream_index];
3714 av_dict_copy(&oc->metadata, metadata, 0);
3715 av_dict_free(&metadata);
3718 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3719 output_files[nb_output_files - 1].ctx = oc;
3720 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3721 output_files[nb_output_files - 1].recording_time = recording_time;
3722 output_files[nb_output_files - 1].start_time = start_time;
3723 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3725 /* check filename in case of an image number is expected */
3726 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3727 if (!av_filename_number_test(oc->filename)) {
3728 print_error(oc->filename, AVERROR(EINVAL));
3733 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3734 /* test if it already exists to avoid loosing precious files */
3735 if (!file_overwrite &&
3736 (strchr(filename, ':') == NULL ||
3737 filename[1] == ':' ||
3738 av_strstart(filename, "file:", NULL))) {
3739 if (avio_check(filename, 0) == 0) {
3741 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3743 if (!read_yesno()) {
3744 fprintf(stderr, "Not overwriting - exiting\n");
3749 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3756 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3757 print_error(filename, err);
3762 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3763 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3765 if (loop_output >= 0) {
3766 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3767 oc->loop_output = loop_output;
3771 if (chapters_input_file >= nb_input_files) {
3772 if (chapters_input_file == INT_MAX) {
3773 /* copy chapters from the first input file that has them*/
3774 chapters_input_file = -1;
3775 for (i = 0; i < nb_input_files; i++)
3776 if (input_files[i].ctx->nb_chapters) {
3777 chapters_input_file = i;
3781 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3782 chapters_input_file);
3786 if (chapters_input_file >= 0)
3787 copy_chapters(chapters_input_file, nb_output_files - 1);
3790 for (i = 0; i < nb_meta_data_maps; i++) {
3791 AVFormatContext *files[2];
3792 AVDictionary **meta[2];
3795 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3796 if ((index) < 0 || (index) >= (nb_elems)) {\
3797 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3802 int in_file_index = meta_data_maps[i][1].file;
3803 if (in_file_index < 0)
3805 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3808 files[1] = input_files[in_file_index].ctx;
3810 for (j = 0; j < 2; j++) {
3811 MetadataMap *map = &meta_data_maps[i][j];
3813 switch (map->type) {
3815 meta[j] = &files[j]->metadata;
3818 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3819 meta[j] = &files[j]->streams[map->index]->metadata;
3822 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3823 meta[j] = &files[j]->chapters[map->index]->metadata;
3826 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3827 meta[j] = &files[j]->programs[map->index]->metadata;
3832 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3835 /* copy global metadata by default */
3836 if (metadata_global_autocopy && nb_input_files)
3837 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3838 AV_DICT_DONT_OVERWRITE);
3839 if (metadata_streams_autocopy)
3840 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3841 InputStream *ist = &input_streams[output_streams[i].source_index];
3842 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3845 frame_rate = (AVRational){0, 0};
3848 audio_sample_rate = 0;
3850 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3851 chapters_input_file = INT_MAX;
3852 recording_time = INT64_MAX;
3855 av_freep(&meta_data_maps);
3856 nb_meta_data_maps = 0;
3857 metadata_global_autocopy = 1;
3858 metadata_streams_autocopy = 1;
3859 metadata_chapters_autocopy = 1;
3860 av_freep(&stream_maps);
3862 av_freep(&streamid_map);
3863 nb_streamid_map = 0;
3865 av_dict_free(&codec_names);
3867 av_freep(&forced_key_frames);
3873 /* same option as mencoder */
3874 static int opt_pass(const char *opt, const char *arg)
3876 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3880 static int64_t getutime(void)
3883 struct rusage rusage;
3885 getrusage(RUSAGE_SELF, &rusage);
3886 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3887 #elif HAVE_GETPROCESSTIMES
3889 FILETIME c, e, k, u;
3890 proc = GetCurrentProcess();
3891 GetProcessTimes(proc, &c, &e, &k, &u);
3892 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3894 return av_gettime();
3898 static int64_t getmaxrss(void)
3900 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3901 struct rusage rusage;
3902 getrusage(RUSAGE_SELF, &rusage);
3903 return (int64_t)rusage.ru_maxrss * 1024;
3904 #elif HAVE_GETPROCESSMEMORYINFO
3906 PROCESS_MEMORY_COUNTERS memcounters;
3907 proc = GetCurrentProcess();
3908 memcounters.cb = sizeof(memcounters);
3909 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3910 return memcounters.PeakPagefileUsage;
3916 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3919 const char *p = str;
3926 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3933 static int opt_inter_matrix(const char *opt, const char *arg)
3935 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3936 parse_matrix_coeffs(inter_matrix, arg);
3940 static int opt_intra_matrix(const char *opt, const char *arg)
3942 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3943 parse_matrix_coeffs(intra_matrix, arg);
3947 static void show_usage(void)
3949 printf("Hyper fast Audio and Video encoder\n");
3950 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3954 static int opt_help(const char *opt, const char *arg)
3957 AVOutputFormat *oformat = NULL;
3958 AVInputFormat *iformat = NULL;
3960 av_log_set_callback(log_callback_help);
3962 show_help_options(options, "Main options:\n",
3963 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3964 show_help_options(options, "\nAdvanced options:\n",
3965 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3967 show_help_options(options, "\nVideo options:\n",
3968 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3970 show_help_options(options, "\nAdvanced Video options:\n",
3971 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3972 OPT_VIDEO | OPT_EXPERT);
3973 show_help_options(options, "\nAudio options:\n",
3974 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3976 show_help_options(options, "\nAdvanced Audio options:\n",
3977 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3978 OPT_AUDIO | OPT_EXPERT);
3979 show_help_options(options, "\nSubtitle options:\n",
3980 OPT_SUBTITLE | OPT_GRAB,
3982 show_help_options(options, "\nAudio/Video grab options:\n",
3986 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3989 /* individual codec options */
3991 while ((c = av_codec_next(c))) {
3992 if (c->priv_class) {
3993 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3998 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4001 /* individual muxer options */
4002 while ((oformat = av_oformat_next(oformat))) {
4003 if (oformat->priv_class) {
4004 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4009 /* individual demuxer options */
4010 while ((iformat = av_iformat_next(iformat))) {
4011 if (iformat->priv_class) {
4012 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4017 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4021 static int opt_target(const char *opt, const char *arg)
4023 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4024 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4026 if(!strncmp(arg, "pal-", 4)) {
4029 } else if(!strncmp(arg, "ntsc-", 5)) {
4032 } else if(!strncmp(arg, "film-", 5)) {
4037 /* Calculate FR via float to avoid int overflow */
4038 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4041 } else if((fr == 29970) || (fr == 23976)) {
4044 /* Try to determine PAL/NTSC by peeking in the input files */
4045 if(nb_input_files) {
4047 for (j = 0; j < nb_input_files; j++) {
4048 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4049 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4050 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4052 fr = c->time_base.den * 1000 / c->time_base.num;
4056 } else if((fr == 29970) || (fr == 23976)) {
4066 if(verbose > 0 && norm != UNKNOWN)
4067 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4070 if(norm == UNKNOWN) {
4071 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4072 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4073 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4077 if(!strcmp(arg, "vcd")) {
4078 opt_codec("c:v", "mpeg1video");
4079 opt_codec("c:a", "mp2");
4080 opt_format("f", "vcd");
4082 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4083 opt_frame_rate("r", frame_rates[norm]);
4084 opt_default("g", norm == PAL ? "15" : "18");
4086 opt_default("b", "1150000");
4087 opt_default("maxrate", "1150000");
4088 opt_default("minrate", "1150000");
4089 opt_default("bufsize", "327680"); // 40*1024*8;
4091 opt_default("b:a", "224000");
4092 audio_sample_rate = 44100;
4095 opt_default("packetsize", "2324");
4096 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4098 /* We have to offset the PTS, so that it is consistent with the SCR.
4099 SCR starts at 36000, but the first two packs contain only padding
4100 and the first pack from the other stream, respectively, may also have
4101 been written before.
4102 So the real data starts at SCR 36000+3*1200. */
4103 mux_preload= (36000+3*1200) / 90000.0; //0.44
4104 } else if(!strcmp(arg, "svcd")) {
4106 opt_codec("c:v", "mpeg2video");
4107 opt_codec("c:a", "mp2");
4108 opt_format("f", "svcd");
4110 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4111 opt_frame_rate("r", frame_rates[norm]);
4112 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4113 opt_default("g", norm == PAL ? "15" : "18");
4115 opt_default("b", "2040000");
4116 opt_default("maxrate", "2516000");
4117 opt_default("minrate", "0"); //1145000;
4118 opt_default("bufsize", "1835008"); //224*1024*8;
4119 opt_default("flags", "+scan_offset");
4122 opt_default("b:a", "224000");
4123 audio_sample_rate = 44100;
4125 opt_default("packetsize", "2324");
4127 } else if(!strcmp(arg, "dvd")) {
4129 opt_codec("c:v", "mpeg2video");
4130 opt_codec("c:a", "ac3");
4131 opt_format("f", "dvd");
4133 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4134 opt_frame_rate("r", frame_rates[norm]);
4135 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4136 opt_default("g", norm == PAL ? "15" : "18");
4138 opt_default("b", "6000000");
4139 opt_default("maxrate", "9000000");
4140 opt_default("minrate", "0"); //1500000;
4141 opt_default("bufsize", "1835008"); //224*1024*8;
4143 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4144 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4146 opt_default("b:a", "448000");
4147 audio_sample_rate = 48000;
4149 } else if(!strncmp(arg, "dv", 2)) {
4151 opt_format("f", "dv");
4153 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4154 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4155 norm == PAL ? "yuv420p" : "yuv411p");
4156 opt_frame_rate("r", frame_rates[norm]);
4158 audio_sample_rate = 48000;
4162 fprintf(stderr, "Unknown target: %s\n", arg);
4163 return AVERROR(EINVAL);
4168 static int opt_vstats_file(const char *opt, const char *arg)
4170 av_free (vstats_filename);
4171 vstats_filename=av_strdup (arg);
4175 static int opt_vstats(const char *opt, const char *arg)
4178 time_t today2 = time(NULL);
4179 struct tm *today = localtime(&today2);
4181 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4183 return opt_vstats_file(opt, filename);
4186 static int opt_bsf(const char *opt, const char *arg)
4188 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4189 AVBitStreamFilterContext **bsfp;
4192 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4196 bsfp= *opt == 'v' ? &video_bitstream_filters :
4197 *opt == 'a' ? &audio_bitstream_filters :
4198 &subtitle_bitstream_filters;
4200 bsfp= &(*bsfp)->next;
4207 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4211 static int opt_passlogfile(const char *opt, const char *arg)
4213 pass_logfilename_prefix = arg;
4214 #if CONFIG_LIBX264_ENCODER
4215 return opt_default("passlogfile", arg);
4221 static const OptionDef options[] = {
4223 #include "cmdutils_common_opts.h"
4224 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4225 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4226 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4227 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4228 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4229 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4230 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4231 "outfile[,metadata]:infile[,metadata]" },
4232 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4233 "outfile[,metadata]:infile[,metadata]" },
4234 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4235 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4236 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4237 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4238 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4239 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4240 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4241 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4242 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4243 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4244 "add timings for benchmarking" },
4245 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4246 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4247 "dump each input packet" },
4248 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4249 "when dumping packets, also dump the payload" },
4250 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4251 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4252 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4253 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4254 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4255 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4256 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4257 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4258 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4259 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4260 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4261 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4262 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4263 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4264 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4265 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4268 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4269 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4270 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4271 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4272 { "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" },
4273 { "bits_per_raw_sample", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&frame_bits_per_raw_sample}, "set the number of bits per raw sample", "number" },
4274 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4275 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4276 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4277 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4278 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4279 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4280 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4281 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4282 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4283 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4284 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4285 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4286 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4287 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4288 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4289 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4290 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4291 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4292 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4293 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4294 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4295 "deinterlace pictures" },
4296 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4297 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4298 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4300 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4302 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4303 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4304 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4305 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4306 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4307 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4308 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4309 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4310 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4311 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4314 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4315 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4316 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4317 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4318 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4319 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4320 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4321 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4322 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4323 { "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" },
4325 /* subtitle options */
4326 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4327 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4328 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4329 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4332 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4333 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4334 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4337 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4338 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4340 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4341 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4342 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4344 /* data codec support */
4345 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4347 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4351 int main(int argc, char **argv)
4355 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4357 if(argc>1 && !strcmp(argv[1], "-d")){
4360 av_log_set_callback(log_callback_null);
4365 avcodec_register_all();
4367 avdevice_register_all();
4370 avfilter_register_all();
4375 if(isatty(STDIN_FILENO))
4376 avio_set_interrupt_cb(decode_interrupt_cb);
4385 parse_options(argc, argv, options, opt_output_file);
4387 if(nb_output_files <= 0 && nb_input_files == 0) {
4389 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4393 /* file converter / grab */
4394 if (nb_output_files <= 0) {
4395 fprintf(stderr, "At least one output file must be specified\n");
4399 if (nb_input_files == 0) {
4400 fprintf(stderr, "At least one input file must be specified\n");
4405 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4407 ti = getutime() - ti;
4409 int maxrss = getmaxrss() / 1024;
4410 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4413 return exit_program(0);