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 int64_t timer_start;
227 static uint8_t *audio_buf;
228 static uint8_t *audio_out;
229 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
231 static short *samples;
233 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
234 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
235 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
237 #define DEFAULT_PASS_LOGFILENAME_PREFIX "ffmpeg2pass"
241 typedef struct OutputStream {
242 int file_index; /* file index */
243 int index; /* stream index in the output file */
244 int source_index; /* InputStream index */
245 AVStream *st; /* stream in the output file */
246 int encoding_needed; /* true if encoding needed for this stream */
248 /* input pts and corresponding output pts
250 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
251 struct InputStream *sync_ist; /* input stream to sync against */
252 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
253 AVBitStreamFilterContext *bitstream_filters;
258 AVFrame resample_frame; /* temporary frame for image resampling */
259 struct SwsContext *img_resample_ctx; /* for image resampling */
262 int resample_pix_fmt;
263 AVRational frame_rate;
265 float frame_aspect_ratio;
267 /* forced key frames */
268 int64_t *forced_kf_pts;
274 ReSampleContext *resample; /* for audio resampling */
275 int resample_sample_fmt;
276 int resample_channels;
277 int resample_sample_rate;
279 AVAudioConvert *reformat_ctx;
280 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
284 AVFilterContext *output_video_filter;
285 AVFilterContext *input_video_filter;
286 AVFilterBufferRef *picref;
288 AVFilterGraph *graph;
295 typedef struct InputStream {
298 int discard; /* true if stream data should be discarded */
299 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
302 int64_t start; /* time when read started */
303 int64_t next_pts; /* synthetic pts for cases where pkt.pts
305 int64_t pts; /* current pts */
307 int is_start; /* is 1 at the start and after a discontinuity */
308 int showed_multi_packet_warning;
309 int is_past_recording_time;
313 typedef struct InputFile {
314 AVFormatContext *ctx;
315 int eof_reached; /* true if eof reached */
316 int ist_index; /* index of first stream in ist_table */
317 int buffer_size; /* current total buffer size */
324 /* init terminal so that we can grab keys */
325 static struct termios oldtty;
328 typedef struct OutputFile {
329 AVFormatContext *ctx;
331 int ost_index; /* index of the first stream in output_streams */
334 static InputStream *input_streams = NULL;
335 static int nb_input_streams = 0;
336 static InputFile *input_files = NULL;
337 static int nb_input_files = 0;
339 static OutputStream *output_streams = NULL;
340 static int nb_output_streams = 0;
341 static OutputFile *output_files = NULL;
342 static int nb_output_files = 0;
346 static int configure_video_filters(InputStream *ist, OutputStream *ost)
348 AVFilterContext *last_filter, *filter;
349 /** filter graph containing all filters including input & output */
350 AVCodecContext *codec = ost->st->codec;
351 AVCodecContext *icodec = ist->st->codec;
352 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
353 AVRational sample_aspect_ratio;
357 ost->graph = avfilter_graph_alloc();
359 if (ist->st->sample_aspect_ratio.num){
360 sample_aspect_ratio = ist->st->sample_aspect_ratio;
362 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
364 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
365 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
366 sample_aspect_ratio.num, sample_aspect_ratio.den);
368 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
369 "src", args, NULL, ost->graph);
372 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
373 "out", NULL, pix_fmts, ost->graph);
376 last_filter = ost->input_video_filter;
378 if (codec->width != icodec->width || codec->height != icodec->height) {
379 snprintf(args, 255, "%d:%d:flags=0x%X",
383 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
384 NULL, args, NULL, ost->graph)) < 0)
386 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
388 last_filter = filter;
391 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
392 ost->graph->scale_sws_opts = av_strdup(args);
395 AVFilterInOut *outputs = avfilter_inout_alloc();
396 AVFilterInOut *inputs = avfilter_inout_alloc();
398 outputs->name = av_strdup("in");
399 outputs->filter_ctx = last_filter;
400 outputs->pad_idx = 0;
401 outputs->next = NULL;
403 inputs->name = av_strdup("out");
404 inputs->filter_ctx = ost->output_video_filter;
408 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
410 av_freep(&ost->avfilter);
412 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
416 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
419 codec->width = ost->output_video_filter->inputs[0]->w;
420 codec->height = ost->output_video_filter->inputs[0]->h;
421 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
422 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
423 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
424 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
428 #endif /* CONFIG_AVFILTER */
430 static void term_exit(void)
432 av_log(NULL, AV_LOG_QUIET, "%s", "");
435 tcsetattr (0, TCSANOW, &oldtty);
439 static volatile int received_sigterm = 0;
442 sigterm_handler(int sig)
444 received_sigterm = sig;
449 static void term_init(void)
459 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
460 |INLCR|IGNCR|ICRNL|IXON);
461 tty.c_oflag |= OPOST;
462 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
463 tty.c_cflag &= ~(CSIZE|PARENB);
468 tcsetattr (0, TCSANOW, &tty);
469 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
473 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
474 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
476 signal(SIGXCPU, sigterm_handler);
480 /* read a key without blocking */
481 static int read_key(void)
496 n = select(1, &rfds, NULL, NULL, &tv);
511 static int decode_interrupt_cb(void)
513 q_pressed += read_key() == 'q';
514 return q_pressed > 1;
517 static int exit_program(int ret)
522 for(i=0;i<nb_output_files;i++) {
523 AVFormatContext *s = output_files[i].ctx;
524 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
526 avformat_free_context(s);
527 av_dict_free(&output_files[i].opts);
529 for(i=0;i<nb_input_files;i++) {
530 av_close_input_file(input_files[i].ctx);
532 for (i = 0; i < nb_input_streams; i++)
533 av_dict_free(&input_streams[i].opts);
535 av_free(intra_matrix);
536 av_free(inter_matrix);
540 av_free(vstats_filename);
542 av_free(streamid_map);
543 av_free(meta_data_maps);
545 av_freep(&input_streams);
546 av_freep(&input_files);
547 av_freep(&output_streams);
548 av_freep(&output_files);
553 allocated_audio_buf_size= allocated_audio_out_size= 0;
560 if (received_sigterm) {
562 "Received signal %d: terminating.\n",
563 (int) received_sigterm);
567 exit(ret); /* not all OS-es handle main() return value */
571 static void assert_avoptions(AVDictionary *m)
573 AVDictionaryEntry *t;
574 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
575 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
580 static void assert_codec_experimental(AVCodecContext *c, int encoder)
582 const char *codec_string = encoder ? "encoder" : "decoder";
584 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
585 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
586 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
587 "results.\nAdd '-strict experimental' if you want to use it.\n",
588 codec_string, c->codec->name);
589 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
590 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
591 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
592 codec_string, codec->name);
597 /* similar to ff_dynarray_add() and av_fast_realloc() */
598 static void *grow_array(void *array, int elem_size, int *size, int new_size)
600 if (new_size >= INT_MAX / elem_size) {
601 fprintf(stderr, "Array too big.\n");
604 if (*size < new_size) {
605 uint8_t *tmp = av_realloc(array, new_size*elem_size);
607 fprintf(stderr, "Could not alloc buffer.\n");
610 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
617 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
619 if(codec && codec->sample_fmts){
620 const enum AVSampleFormat *p= codec->sample_fmts;
622 if(*p == st->codec->sample_fmt)
626 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
627 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
628 if(av_get_sample_fmt_name(st->codec->sample_fmt))
629 av_log(NULL, AV_LOG_WARNING,
630 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
631 av_get_sample_fmt_name(st->codec->sample_fmt),
633 av_get_sample_fmt_name(codec->sample_fmts[0]));
634 st->codec->sample_fmt = codec->sample_fmts[0];
639 static void choose_sample_rate(AVStream *st, AVCodec *codec)
641 if(codec && codec->supported_samplerates){
642 const int *p= codec->supported_samplerates;
644 int best_dist=INT_MAX;
646 int dist= abs(st->codec->sample_rate - *p);
647 if(dist < best_dist){
653 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
655 st->codec->sample_rate= best;
659 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
661 if(codec && codec->pix_fmts){
662 const enum PixelFormat *p= codec->pix_fmts;
663 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
664 if(st->codec->codec_id==CODEC_ID_MJPEG){
665 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
666 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
667 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};
671 if(*p == st->codec->pix_fmt)
675 if(st->codec->pix_fmt != PIX_FMT_NONE)
676 av_log(NULL, AV_LOG_WARNING,
677 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
678 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
680 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
681 st->codec->pix_fmt = codec->pix_fmts[0];
687 get_sync_ipts(const OutputStream *ost)
689 const InputStream *ist = ost->sync_ist;
690 return (double)(ist->pts - start_time)/AV_TIME_BASE;
693 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
697 AVPacket new_pkt= *pkt;
698 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
699 &new_pkt.data, &new_pkt.size,
700 pkt->data, pkt->size,
701 pkt->flags & AV_PKT_FLAG_KEY);
704 new_pkt.destruct= av_destruct_packet;
706 fprintf(stderr, "%s failed for stream %d, codec %s",
707 bsfc->filter->name, pkt->stream_index,
708 avctx->codec ? avctx->codec->name : "copy");
718 ret= av_interleaved_write_frame(s, pkt);
720 print_error("av_interleaved_write_frame()", ret);
725 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
727 static void do_audio_out(AVFormatContext *s,
730 unsigned char *buf, int size)
733 int64_t audio_out_size, audio_buf_size;
734 int64_t allocated_for_size= size;
736 int size_out, frame_bytes, ret, resample_changed;
737 AVCodecContext *enc= ost->st->codec;
738 AVCodecContext *dec= ist->st->codec;
739 int osize = av_get_bytes_per_sample(enc->sample_fmt);
740 int isize = av_get_bytes_per_sample(dec->sample_fmt);
741 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
744 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
745 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
746 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
747 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
748 audio_buf_size*= osize*enc->channels;
750 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
751 if(coded_bps > 8*osize)
752 audio_out_size= audio_out_size * coded_bps / (8*osize);
753 audio_out_size += FF_MIN_BUFFER_SIZE;
755 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
756 fprintf(stderr, "Buffer sizes too large\n");
760 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
761 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
762 if (!audio_buf || !audio_out){
763 fprintf(stderr, "Out of memory in do_audio_out\n");
767 if (enc->channels != dec->channels)
768 ost->audio_resample = 1;
770 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
771 ost->resample_channels != dec->channels ||
772 ost->resample_sample_rate != dec->sample_rate;
774 if ((ost->audio_resample && !ost->resample) || resample_changed) {
775 if (resample_changed) {
776 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",
777 ist->file_index, ist->st->index,
778 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
779 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
780 ost->resample_sample_fmt = dec->sample_fmt;
781 ost->resample_channels = dec->channels;
782 ost->resample_sample_rate = dec->sample_rate;
784 audio_resample_close(ost->resample);
786 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
787 if (audio_sync_method <= 1 &&
788 ost->resample_sample_fmt == enc->sample_fmt &&
789 ost->resample_channels == enc->channels &&
790 ost->resample_sample_rate == enc->sample_rate) {
791 ost->resample = NULL;
792 ost->audio_resample = 0;
794 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
795 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
796 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
797 enc->sample_rate, dec->sample_rate,
798 enc->sample_fmt, dec->sample_fmt,
800 if (!ost->resample) {
801 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
802 dec->channels, dec->sample_rate,
803 enc->channels, enc->sample_rate);
809 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
810 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
811 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
812 if (ost->reformat_ctx)
813 av_audio_convert_free(ost->reformat_ctx);
814 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
815 dec->sample_fmt, 1, NULL, 0);
816 if (!ost->reformat_ctx) {
817 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
818 av_get_sample_fmt_name(dec->sample_fmt),
819 av_get_sample_fmt_name(enc->sample_fmt));
822 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
825 if(audio_sync_method){
826 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
827 - av_fifo_size(ost->fifo)/(enc->channels * 2);
828 double idelta= delta*dec->sample_rate / enc->sample_rate;
829 int byte_delta= ((int)idelta)*2*dec->channels;
831 //FIXME resample delay
832 if(fabs(delta) > 50){
833 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
835 byte_delta= FFMAX(byte_delta, -size);
839 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
844 static uint8_t *input_tmp= NULL;
845 input_tmp= av_realloc(input_tmp, byte_delta + size);
847 if(byte_delta > allocated_for_size - size){
848 allocated_for_size= byte_delta + (int64_t)size;
853 memset(input_tmp, 0, byte_delta);
854 memcpy(input_tmp + byte_delta, buf, size);
858 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
860 }else if(audio_sync_method>1){
861 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
862 av_assert0(ost->audio_resample);
864 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
865 // 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));
866 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
870 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
871 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
873 if (ost->audio_resample) {
875 size_out = audio_resample(ost->resample,
876 (short *)buftmp, (short *)buf,
877 size / (dec->channels * isize));
878 size_out = size_out * enc->channels * osize;
884 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
885 const void *ibuf[6]= {buftmp};
886 void *obuf[6]= {audio_buf};
887 int istride[6]= {isize};
888 int ostride[6]= {osize};
889 int len= size_out/istride[0];
890 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
891 printf("av_audio_convert() failed\n");
897 size_out = len*osize;
900 /* now encode as many frames as possible */
901 if (enc->frame_size > 1) {
902 /* output resampled raw samples */
903 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
904 fprintf(stderr, "av_fifo_realloc2() failed\n");
907 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
909 frame_bytes = enc->frame_size * osize * enc->channels;
911 while (av_fifo_size(ost->fifo) >= frame_bytes) {
913 av_init_packet(&pkt);
915 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
917 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
919 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
922 fprintf(stderr, "Audio encoding failed\n");
926 pkt.stream_index= ost->index;
929 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
930 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
931 pkt.flags |= AV_PKT_FLAG_KEY;
932 write_frame(s, &pkt, enc, ost->bitstream_filters);
934 ost->sync_opts += enc->frame_size;
938 av_init_packet(&pkt);
940 ost->sync_opts += size_out / (osize * enc->channels);
942 /* output a pcm frame */
943 /* determine the size of the coded buffer */
946 size_out = size_out*coded_bps/8;
948 if(size_out > audio_out_size){
949 fprintf(stderr, "Internal error, buffer size too small\n");
953 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
954 ret = avcodec_encode_audio(enc, audio_out, size_out,
957 fprintf(stderr, "Audio encoding failed\n");
961 pkt.stream_index= ost->index;
964 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
965 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
966 pkt.flags |= AV_PKT_FLAG_KEY;
967 write_frame(s, &pkt, enc, ost->bitstream_filters);
971 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
975 AVPicture picture_tmp;
978 dec = ist->st->codec;
980 /* deinterlace : must be done before any resize */
981 if (do_deinterlace) {
984 /* create temporary picture */
985 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
986 buf = av_malloc(size);
990 picture2 = &picture_tmp;
991 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
993 if(avpicture_deinterlace(picture2, picture,
994 dec->pix_fmt, dec->width, dec->height) < 0) {
995 /* if error, do not deinterlace */
996 fprintf(stderr, "Deinterlacing failed\n");
1005 if (picture != picture2)
1006 *picture = *picture2;
1010 /* we begin to correct av delay at this threshold */
1011 #define AV_DELAY_MAX 0.100
1013 static void do_subtitle_out(AVFormatContext *s,
1019 static uint8_t *subtitle_out = NULL;
1020 int subtitle_out_max_size = 1024 * 1024;
1021 int subtitle_out_size, nb, i;
1022 AVCodecContext *enc;
1025 if (pts == AV_NOPTS_VALUE) {
1026 fprintf(stderr, "Subtitle packets must have a pts\n");
1032 enc = ost->st->codec;
1034 if (!subtitle_out) {
1035 subtitle_out = av_malloc(subtitle_out_max_size);
1038 /* Note: DVB subtitle need one packet to draw them and one other
1039 packet to clear them */
1040 /* XXX: signal it in the codec context ? */
1041 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1046 for(i = 0; i < nb; i++) {
1047 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1048 // start_display_time is required to be 0
1049 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1050 sub->end_display_time -= sub->start_display_time;
1051 sub->start_display_time = 0;
1052 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1053 subtitle_out_max_size, sub);
1054 if (subtitle_out_size < 0) {
1055 fprintf(stderr, "Subtitle encoding failed\n");
1059 av_init_packet(&pkt);
1060 pkt.stream_index = ost->index;
1061 pkt.data = subtitle_out;
1062 pkt.size = subtitle_out_size;
1063 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1064 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1065 /* XXX: the pts correction is handled here. Maybe handling
1066 it in the codec would be better */
1068 pkt.pts += 90 * sub->start_display_time;
1070 pkt.pts += 90 * sub->end_display_time;
1072 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1076 static int bit_buffer_size= 1024*256;
1077 static uint8_t *bit_buffer= NULL;
1079 static void do_video_resample(OutputStream *ost,
1081 AVFrame *in_picture,
1082 AVFrame **out_picture)
1084 int resample_changed = 0;
1085 AVCodecContext *dec = ist->st->codec;
1086 *out_picture = in_picture;
1087 #if !CONFIG_AVFILTER
1088 resample_changed = ost->resample_width != dec->width ||
1089 ost->resample_height != dec->height ||
1090 ost->resample_pix_fmt != dec->pix_fmt;
1092 if (resample_changed) {
1093 av_log(NULL, AV_LOG_INFO,
1094 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1095 ist->file_index, ist->st->index,
1096 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1097 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1098 ost->resample_width = dec->width;
1099 ost->resample_height = dec->height;
1100 ost->resample_pix_fmt = dec->pix_fmt;
1103 ost->video_resample = dec->width != enc->width ||
1104 dec->height != enc->height ||
1105 dec->pix_fmt != enc->pix_fmt;
1107 if (ost->video_resample) {
1108 *out_picture = &ost->resample_frame;
1109 if (!ost->img_resample_ctx || resample_changed) {
1110 /* initialize the destination picture */
1111 if (!ost->resample_frame.data[0]) {
1112 avcodec_get_frame_defaults(&ost->resample_frame);
1113 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1114 enc->width, enc->height)) {
1115 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1119 /* initialize a new scaler context */
1120 sws_freeContext(ost->img_resample_ctx);
1121 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1122 enc->width, enc->height, enc->pix_fmt,
1123 ost->sws_flags, NULL, NULL, NULL);
1124 if (ost->img_resample_ctx == NULL) {
1125 fprintf(stderr, "Cannot get resampling context\n");
1129 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1130 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1136 static void do_video_out(AVFormatContext *s,
1139 AVFrame *in_picture,
1140 int *frame_size, float quality)
1142 int nb_frames, i, ret, format_video_sync;
1143 AVFrame *final_picture;
1144 AVCodecContext *enc, *dec;
1147 enc = ost->st->codec;
1148 dec = ist->st->codec;
1150 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1152 /* by default, we output a single frame */
1157 format_video_sync = video_sync_method;
1158 if (format_video_sync < 0)
1159 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1161 if (format_video_sync) {
1162 double vdelta = sync_ipts - ost->sync_opts;
1163 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1166 else if (format_video_sync == 2) {
1169 }else if(vdelta>0.6)
1170 ost->sync_opts= lrintf(sync_ipts);
1171 }else if (vdelta > 1.1)
1172 nb_frames = lrintf(vdelta);
1173 //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);
1174 if (nb_frames == 0){
1177 fprintf(stderr, "*** drop!\n");
1178 }else if (nb_frames > 1) {
1179 nb_frames_dup += nb_frames - 1;
1181 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1184 ost->sync_opts= lrintf(sync_ipts);
1186 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1190 do_video_resample(ost, ist, in_picture, &final_picture);
1192 /* duplicates frame if needed */
1193 for(i=0;i<nb_frames;i++) {
1195 av_init_packet(&pkt);
1196 pkt.stream_index= ost->index;
1198 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1199 /* raw pictures are written as AVPicture structure to
1200 avoid any copies. We support temorarily the older
1202 AVFrame* old_frame = enc->coded_frame;
1203 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1204 pkt.data= (uint8_t *)final_picture;
1205 pkt.size= sizeof(AVPicture);
1206 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1207 pkt.flags |= AV_PKT_FLAG_KEY;
1209 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1210 enc->coded_frame = old_frame;
1212 AVFrame big_picture;
1214 big_picture= *final_picture;
1215 /* better than nothing: use input picture interlaced
1217 big_picture.interlaced_frame = in_picture->interlaced_frame;
1218 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1219 if(top_field_first == -1)
1220 big_picture.top_field_first = in_picture->top_field_first;
1222 big_picture.top_field_first = top_field_first;
1225 /* handles same_quant here. This is not correct because it may
1226 not be a global option */
1227 big_picture.quality = quality;
1229 big_picture.pict_type = 0;
1230 // big_picture.pts = AV_NOPTS_VALUE;
1231 big_picture.pts= ost->sync_opts;
1232 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1233 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1234 if (ost->forced_kf_index < ost->forced_kf_count &&
1235 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1236 big_picture.pict_type = AV_PICTURE_TYPE_I;
1237 ost->forced_kf_index++;
1239 ret = avcodec_encode_video(enc,
1240 bit_buffer, bit_buffer_size,
1243 fprintf(stderr, "Video encoding failed\n");
1248 pkt.data= bit_buffer;
1250 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1251 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1252 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1253 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1254 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1256 if(enc->coded_frame->key_frame)
1257 pkt.flags |= AV_PKT_FLAG_KEY;
1258 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1261 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1262 // enc->frame_number-1, ret, enc->pict_type);
1263 /* if two pass, output log */
1264 if (ost->logfile && enc->stats_out) {
1265 fprintf(ost->logfile, "%s", enc->stats_out);
1270 ost->frame_number++;
1274 static double psnr(double d){
1275 return -10.0*log(d)/log(10.0);
1278 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1281 AVCodecContext *enc;
1283 double ti1, bitrate, avg_bitrate;
1285 /* this is executed just the first time do_video_stats is called */
1287 vstats_file = fopen(vstats_filename, "w");
1294 enc = ost->st->codec;
1295 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1296 frame_number = ost->frame_number;
1297 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1298 if (enc->flags&CODEC_FLAG_PSNR)
1299 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1301 fprintf(vstats_file,"f_size= %6d ", frame_size);
1302 /* compute pts value */
1303 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1307 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1308 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1309 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1310 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1311 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1315 static void print_report(OutputFile *output_files,
1316 OutputStream *ost_table, int nb_ostreams,
1321 AVFormatContext *oc;
1323 AVCodecContext *enc;
1324 int frame_number, vid, i;
1326 int64_t pts = INT64_MAX;
1327 static int64_t last_time = -1;
1328 static int qp_histogram[52];
1330 if (!is_last_report) {
1332 /* display the report every 0.5 seconds */
1333 cur_time = av_gettime();
1334 if (last_time == -1) {
1335 last_time = cur_time;
1338 if ((cur_time - last_time) < 500000)
1340 last_time = cur_time;
1344 oc = output_files[0].ctx;
1346 total_size = avio_size(oc->pb);
1347 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1348 total_size= avio_tell(oc->pb);
1352 for(i=0;i<nb_ostreams;i++) {
1354 ost = &ost_table[i];
1355 enc = ost->st->codec;
1356 if (!ost->st->stream_copy && enc->coded_frame)
1357 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1358 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1359 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1361 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1362 float t = (av_gettime()-timer_start) / 1000000.0;
1364 frame_number = ost->frame_number;
1365 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1366 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1368 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1372 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1375 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1377 if (enc->flags&CODEC_FLAG_PSNR){
1379 double error, error_sum=0;
1380 double scale, scale_sum=0;
1381 char type[3]= {'Y','U','V'};
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1385 error= enc->error[j];
1386 scale= enc->width*enc->height*255.0*255.0*frame_number;
1388 error= enc->coded_frame->error[j];
1389 scale= enc->width*enc->height*255.0*255.0;
1394 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1396 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1400 /* compute min output value */
1401 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1402 ost->st->time_base, AV_TIME_BASE_Q));
1405 if (verbose > 0 || is_last_report) {
1406 int hours, mins, secs, us;
1407 secs = pts / AV_TIME_BASE;
1408 us = pts % AV_TIME_BASE;
1414 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1416 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1417 "size=%8.0fkB time=", total_size / 1024.0);
1418 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1419 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1420 (100 * us) / AV_TIME_BASE);
1421 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1422 "bitrate=%6.1fkbits/s", bitrate);
1424 if (nb_frames_dup || nb_frames_drop)
1425 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1426 nb_frames_dup, nb_frames_drop);
1429 fprintf(stderr, "%s \r", buf);
1434 if (is_last_report && verbose >= 0){
1435 int64_t raw= audio_size + video_size + extra_size;
1436 fprintf(stderr, "\n");
1437 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1441 100.0*(total_size - raw)/raw
1446 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1448 int fill_char = 0x00;
1449 if (sample_fmt == AV_SAMPLE_FMT_U8)
1451 memset(buf, fill_char, size);
1454 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1455 static int output_packet(InputStream *ist, int ist_index,
1456 OutputStream *ost_table, int nb_ostreams,
1457 const AVPacket *pkt)
1459 AVFormatContext *os;
1464 void *buffer_to_free = NULL;
1465 static unsigned int samples_size= 0;
1466 AVSubtitle subtitle, *subtitle_to_free;
1467 int64_t pkt_pts = AV_NOPTS_VALUE;
1469 int frame_available;
1474 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1476 if(ist->next_pts == AV_NOPTS_VALUE)
1477 ist->next_pts= ist->pts;
1481 av_init_packet(&avpkt);
1489 if(pkt->dts != AV_NOPTS_VALUE)
1490 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1491 if(pkt->pts != AV_NOPTS_VALUE)
1492 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1494 //while we have more to decode or while the decoder did output something on EOF
1495 while (avpkt.size > 0 || (!pkt && got_output)) {
1496 uint8_t *data_buf, *decoded_data_buf;
1497 int data_size, decoded_data_size;
1499 ist->pts= ist->next_pts;
1501 if(avpkt.size && avpkt.size != pkt->size &&
1502 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1503 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1504 ist->showed_multi_packet_warning=1;
1507 /* decode the packet if needed */
1508 decoded_data_buf = NULL; /* fail safe */
1509 decoded_data_size= 0;
1510 data_buf = avpkt.data;
1511 data_size = avpkt.size;
1512 subtitle_to_free = NULL;
1513 if (ist->decoding_needed) {
1514 switch(ist->st->codec->codec_type) {
1515 case AVMEDIA_TYPE_AUDIO:{
1516 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1517 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1519 samples= av_malloc(samples_size);
1521 decoded_data_size= samples_size;
1522 /* XXX: could avoid copy if PCM 16 bits with same
1523 endianness as CPU */
1524 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1531 got_output = decoded_data_size > 0;
1532 /* Some bug in mpeg audio decoder gives */
1533 /* decoded_data_size < 0, it seems they are overflows */
1535 /* no audio frame */
1538 decoded_data_buf = (uint8_t *)samples;
1539 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1540 (ist->st->codec->sample_rate * ist->st->codec->channels);
1542 case AVMEDIA_TYPE_VIDEO:
1543 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1544 /* XXX: allocate picture correctly */
1545 avcodec_get_frame_defaults(&picture);
1546 avpkt.pts = pkt_pts;
1547 avpkt.dts = ist->pts;
1548 pkt_pts = AV_NOPTS_VALUE;
1550 ret = avcodec_decode_video2(ist->st->codec,
1551 &picture, &got_output, &avpkt);
1552 quality = same_quant ? picture.quality : 0;
1556 /* no picture yet */
1557 goto discard_packet;
1559 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1560 if (ist->st->codec->time_base.num != 0) {
1561 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1562 ist->next_pts += ((int64_t)AV_TIME_BASE *
1563 ist->st->codec->time_base.num * ticks) /
1564 ist->st->codec->time_base.den;
1567 buffer_to_free = NULL;
1568 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1570 case AVMEDIA_TYPE_SUBTITLE:
1571 ret = avcodec_decode_subtitle2(ist->st->codec,
1572 &subtitle, &got_output, &avpkt);
1576 goto discard_packet;
1578 subtitle_to_free = &subtitle;
1585 switch(ist->st->codec->codec_type) {
1586 case AVMEDIA_TYPE_AUDIO:
1587 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1588 ist->st->codec->sample_rate;
1590 case AVMEDIA_TYPE_VIDEO:
1591 if (ist->st->codec->time_base.num != 0) {
1592 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1593 ist->next_pts += ((int64_t)AV_TIME_BASE *
1594 ist->st->codec->time_base.num * ticks) /
1595 ist->st->codec->time_base.den;
1604 if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
1605 if (start_time == 0 || ist->pts >= start_time) {
1606 for(i=0;i<nb_ostreams;i++) {
1607 ost = &ost_table[i];
1608 if (ost->input_video_filter && ost->source_index == ist_index) {
1609 if (!picture.sample_aspect_ratio.num)
1610 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1611 picture.pts = ist->pts;
1613 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1619 // preprocess audio (volume)
1620 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1621 if (audio_volume != 256) {
1624 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1625 int v = ((*volp) * audio_volume + 128) >> 8;
1626 if (v < -32768) v = -32768;
1627 if (v > 32767) v = 32767;
1633 /* frame rate emulation */
1635 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1636 int64_t now = av_gettime() - ist->start;
1640 /* if output time reached then transcode raw format,
1641 encode packets and output them */
1642 if (start_time == 0 || ist->pts >= start_time)
1643 for(i=0;i<nb_ostreams;i++) {
1646 ost = &ost_table[i];
1648 /* finish if recording time exhausted */
1649 if (recording_time != INT64_MAX &&
1650 av_compare_ts(ist->pts, AV_TIME_BASE_Q, recording_time + start_time, (AVRational){1, 1000000})
1652 ist->is_past_recording_time = 1;
1655 if (ost->source_index == ist_index) {
1657 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1658 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1659 while (frame_available) {
1660 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1661 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1662 if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1665 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1666 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1670 os = output_files[ost->file_index].ctx;
1672 /* set the input output pts pairs */
1673 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1675 if (ost->encoding_needed) {
1676 av_assert0(ist->decoding_needed);
1677 switch(ost->st->codec->codec_type) {
1678 case AVMEDIA_TYPE_AUDIO:
1679 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1681 case AVMEDIA_TYPE_VIDEO:
1683 if (ost->picref->video && !ost->frame_aspect_ratio)
1684 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1686 do_video_out(os, ost, ist, &picture, &frame_size,
1687 same_quant ? quality : ost->st->codec->global_quality);
1688 if (vstats_filename && frame_size)
1689 do_video_stats(os, ost, frame_size);
1691 case AVMEDIA_TYPE_SUBTITLE:
1692 do_subtitle_out(os, ost, ist, &subtitle,
1699 AVFrame avframe; //FIXME/XXX remove this
1702 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1704 av_init_packet(&opkt);
1706 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1707 #if !CONFIG_AVFILTER
1713 /* no reencoding needed : output the packet directly */
1714 /* force the input stream PTS */
1716 avcodec_get_frame_defaults(&avframe);
1717 ost->st->codec->coded_frame= &avframe;
1718 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1720 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1721 audio_size += data_size;
1722 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1723 video_size += data_size;
1727 opkt.stream_index= ost->index;
1728 if(pkt->pts != AV_NOPTS_VALUE)
1729 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1731 opkt.pts= AV_NOPTS_VALUE;
1733 if (pkt->dts == AV_NOPTS_VALUE)
1734 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1736 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1737 opkt.dts -= ost_tb_start_time;
1739 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1740 opkt.flags= pkt->flags;
1742 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1743 if( ost->st->codec->codec_id != CODEC_ID_H264
1744 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1745 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1747 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1748 opkt.destruct= av_destruct_packet;
1750 opkt.data = data_buf;
1751 opkt.size = data_size;
1754 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1755 /* store AVPicture in AVPacket, as expected by the output format */
1756 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1757 opkt.data = (uint8_t *)&pict;
1758 opkt.size = sizeof(AVPicture);
1759 opkt.flags |= AV_PKT_FLAG_KEY;
1761 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1762 ost->st->codec->frame_number++;
1763 ost->frame_number++;
1764 av_free_packet(&opkt);
1768 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1769 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1770 avfilter_unref_buffer(ost->picref);
1776 av_free(buffer_to_free);
1777 /* XXX: allocate the subtitles in the codec ? */
1778 if (subtitle_to_free) {
1779 avsubtitle_free(subtitle_to_free);
1780 subtitle_to_free = NULL;
1787 for(i=0;i<nb_ostreams;i++) {
1788 ost = &ost_table[i];
1789 if (ost->source_index == ist_index) {
1790 AVCodecContext *enc= ost->st->codec;
1791 os = output_files[ost->file_index].ctx;
1793 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1795 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1798 if (ost->encoding_needed) {
1802 av_init_packet(&pkt);
1803 pkt.stream_index= ost->index;
1805 switch(ost->st->codec->codec_type) {
1806 case AVMEDIA_TYPE_AUDIO:
1807 fifo_bytes = av_fifo_size(ost->fifo);
1809 /* encode any samples remaining in fifo */
1810 if (fifo_bytes > 0) {
1811 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1812 int fs_tmp = enc->frame_size;
1814 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1815 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1816 enc->frame_size = fifo_bytes / (osize * enc->channels);
1818 int frame_bytes = enc->frame_size*osize*enc->channels;
1819 if (allocated_audio_buf_size < frame_bytes)
1821 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1824 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1825 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1826 ost->st->time_base.num, enc->sample_rate);
1827 enc->frame_size = fs_tmp;
1830 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1833 fprintf(stderr, "Audio encoding failed\n");
1837 pkt.flags |= AV_PKT_FLAG_KEY;
1839 case AVMEDIA_TYPE_VIDEO:
1840 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1842 fprintf(stderr, "Video encoding failed\n");
1846 if(enc->coded_frame && enc->coded_frame->key_frame)
1847 pkt.flags |= AV_PKT_FLAG_KEY;
1848 if (ost->logfile && enc->stats_out) {
1849 fprintf(ost->logfile, "%s", enc->stats_out);
1858 pkt.data= bit_buffer;
1860 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1861 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1862 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1872 static void print_sdp(OutputFile *output_files, int n)
1876 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1880 for (i = 0; i < n; i++)
1881 avc[i] = output_files[i].ctx;
1883 av_sdp_create(avc, n, sdp, sizeof(sdp));
1884 printf("SDP:\n%s\n", sdp);
1890 * The following code is the main loop of the file converter
1892 static int transcode(OutputFile *output_files,
1893 int nb_output_files,
1894 InputFile *input_files,
1898 AVFormatContext *is, *os;
1899 AVCodecContext *codec, *icodec;
1906 int no_packet_count=0;
1908 if (!(no_packet = av_mallocz(nb_input_files)))
1912 for (i = 0; i < nb_input_streams; i++)
1913 input_streams[i].start = av_gettime();
1915 /* output stream init */
1916 for(i=0;i<nb_output_files;i++) {
1917 os = output_files[i].ctx;
1918 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1919 av_dump_format(os, i, os->filename, 1);
1920 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1921 ret = AVERROR(EINVAL);
1926 /* for each output stream, we compute the right encoding parameters */
1927 for (i = 0; i < nb_output_streams; i++) {
1928 ost = &output_streams[i];
1929 os = output_files[ost->file_index].ctx;
1930 ist = &input_streams[ost->source_index];
1932 codec = ost->st->codec;
1933 icodec = ist->st->codec;
1935 ost->st->disposition = ist->st->disposition;
1936 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1937 codec->chroma_sample_location = icodec->chroma_sample_location;
1939 if (ost->st->stream_copy) {
1940 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1942 if (extra_size > INT_MAX)
1945 /* if stream_copy is selected, no need to decode or encode */
1946 codec->codec_id = icodec->codec_id;
1947 codec->codec_type = icodec->codec_type;
1949 if(!codec->codec_tag){
1950 if( !os->oformat->codec_tag
1951 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1952 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1953 codec->codec_tag = icodec->codec_tag;
1956 codec->bit_rate = icodec->bit_rate;
1957 codec->rc_max_rate = icodec->rc_max_rate;
1958 codec->rc_buffer_size = icodec->rc_buffer_size;
1959 codec->extradata= av_mallocz(extra_size);
1960 if (!codec->extradata)
1962 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1963 codec->extradata_size= icodec->extradata_size;
1965 codec->time_base = ist->st->time_base;
1966 if(!strcmp(os->oformat->name, "avi")) {
1967 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){
1968 codec->time_base = icodec->time_base;
1969 codec->time_base.num *= icodec->ticks_per_frame;
1970 codec->time_base.den *= 2;
1972 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
1973 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){
1974 codec->time_base = icodec->time_base;
1975 codec->time_base.num *= icodec->ticks_per_frame;
1978 av_reduce(&codec->time_base.num, &codec->time_base.den,
1979 codec->time_base.num, codec->time_base.den, INT_MAX);
1981 switch(codec->codec_type) {
1982 case AVMEDIA_TYPE_AUDIO:
1983 if(audio_volume != 256) {
1984 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1987 codec->channel_layout = icodec->channel_layout;
1988 codec->sample_rate = icodec->sample_rate;
1989 codec->channels = icodec->channels;
1990 codec->frame_size = icodec->frame_size;
1991 codec->audio_service_type = icodec->audio_service_type;
1992 codec->block_align= icodec->block_align;
1993 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1994 codec->block_align= 0;
1995 if(codec->codec_id == CODEC_ID_AC3)
1996 codec->block_align= 0;
1998 case AVMEDIA_TYPE_VIDEO:
1999 codec->pix_fmt = icodec->pix_fmt;
2000 codec->width = icodec->width;
2001 codec->height = icodec->height;
2002 codec->has_b_frames = icodec->has_b_frames;
2003 if (!codec->sample_aspect_ratio.num) {
2004 codec->sample_aspect_ratio =
2005 ost->st->sample_aspect_ratio =
2006 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2007 ist->st->codec->sample_aspect_ratio.num ?
2008 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2011 case AVMEDIA_TYPE_SUBTITLE:
2012 codec->width = icodec->width;
2013 codec->height = icodec->height;
2015 case AVMEDIA_TYPE_DATA:
2022 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2023 switch(codec->codec_type) {
2024 case AVMEDIA_TYPE_AUDIO:
2025 ost->fifo= av_fifo_alloc(1024);
2028 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2029 if (!codec->sample_rate) {
2030 codec->sample_rate = icodec->sample_rate;
2032 choose_sample_rate(ost->st, ost->enc);
2033 codec->time_base = (AVRational){1, codec->sample_rate};
2034 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2035 codec->sample_fmt = icodec->sample_fmt;
2036 choose_sample_fmt(ost->st, ost->enc);
2037 if (!codec->channels) {
2038 codec->channels = icodec->channels;
2039 codec->channel_layout = icodec->channel_layout;
2041 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2042 codec->channel_layout = 0;
2043 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2044 icodec->request_channels = codec->channels;
2045 ist->decoding_needed = 1;
2046 ost->encoding_needed = 1;
2047 ost->resample_sample_fmt = icodec->sample_fmt;
2048 ost->resample_sample_rate = icodec->sample_rate;
2049 ost->resample_channels = icodec->channels;
2051 case AVMEDIA_TYPE_VIDEO:
2052 if (codec->pix_fmt == PIX_FMT_NONE)
2053 codec->pix_fmt = icodec->pix_fmt;
2054 choose_pixel_fmt(ost->st, ost->enc);
2056 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2057 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2061 if (!codec->width || !codec->height) {
2062 codec->width = icodec->width;
2063 codec->height = icodec->height;
2066 ost->video_resample = codec->width != icodec->width ||
2067 codec->height != icodec->height ||
2068 codec->pix_fmt != icodec->pix_fmt;
2069 if (ost->video_resample) {
2070 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2073 ost->resample_height = icodec->height;
2074 ost->resample_width = icodec->width;
2075 ost->resample_pix_fmt= icodec->pix_fmt;
2076 ost->encoding_needed = 1;
2077 ist->decoding_needed = 1;
2079 if (!ost->frame_rate.num)
2080 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2081 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2082 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2083 ost->frame_rate = ost->enc->supported_framerates[idx];
2085 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2086 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2087 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2088 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2089 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2093 if (configure_video_filters(ist, ost)) {
2094 fprintf(stderr, "Error opening filters!\n");
2099 case AVMEDIA_TYPE_SUBTITLE:
2100 ost->encoding_needed = 1;
2101 ist->decoding_needed = 1;
2108 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2109 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2110 char logfilename[1024];
2113 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2114 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2116 if (codec->flags & CODEC_FLAG_PASS1) {
2117 f = fopen(logfilename, "wb");
2119 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2125 size_t logbuffer_size;
2126 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2127 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2130 codec->stats_in = logbuffer;
2134 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2135 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2136 int size= codec->width * codec->height;
2137 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2142 bit_buffer = av_malloc(bit_buffer_size);
2144 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2146 ret = AVERROR(ENOMEM);
2150 /* open each encoder */
2151 for (i = 0; i < nb_output_streams; i++) {
2152 ost = &output_streams[i];
2153 if (ost->encoding_needed) {
2154 AVCodec *codec = ost->enc;
2155 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2157 snprintf(error, sizeof(error), "Encoder (codec %s) not found for output stream #%d.%d",
2158 avcodec_get_name(ost->st->codec->codec_id), ost->file_index, ost->index);
2159 ret = AVERROR(EINVAL);
2162 if (dec->subtitle_header) {
2163 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2164 if (!ost->st->codec->subtitle_header) {
2165 ret = AVERROR(ENOMEM);
2168 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2169 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2171 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2172 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2173 ost->file_index, ost->index);
2174 ret = AVERROR(EINVAL);
2177 assert_codec_experimental(ost->st->codec, 1);
2178 assert_avoptions(ost->opts);
2179 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2180 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2181 "It takes bits/s as argument, not kbits/s\n");
2182 extra_size += ost->st->codec->extradata_size;
2186 /* open each decoder */
2187 for (i = 0; i < nb_input_streams; i++) {
2188 ist = &input_streams[i];
2189 if (ist->decoding_needed) {
2190 AVCodec *codec = ist->dec;
2192 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2194 snprintf(error, sizeof(error), "Decoder (codec %s) not found for input stream #%d.%d",
2195 avcodec_get_name(ist->st->codec->codec_id), ist->file_index, ist->st->index);
2196 ret = AVERROR(EINVAL);
2199 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2200 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2201 ist->file_index, ist->st->index);
2202 ret = AVERROR(EINVAL);
2205 assert_codec_experimental(ist->st->codec, 0);
2206 assert_avoptions(ost->opts);
2211 for (i = 0; i < nb_input_streams; i++) {
2213 ist = &input_streams[i];
2215 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2216 ist->next_pts = AV_NOPTS_VALUE;
2220 /* open files and write file headers */
2221 for (i = 0; i < nb_output_files; i++) {
2222 os = output_files[i].ctx;
2223 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2224 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2225 ret = AVERROR(EINVAL);
2228 // assert_avoptions(output_files[i].opts);
2229 if (strcmp(os->oformat->name, "rtp")) {
2235 /* dump the file output parameters - cannot be done before in case
2237 for(i=0;i<nb_output_files;i++) {
2238 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2241 /* dump the stream mapping */
2243 fprintf(stderr, "Stream mapping:\n");
2244 for (i = 0; i < nb_output_streams;i ++) {
2245 ost = &output_streams[i];
2246 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2247 input_streams[ost->source_index].file_index,
2248 input_streams[ost->source_index].st->index,
2251 if (ost->sync_ist != &input_streams[ost->source_index])
2252 fprintf(stderr, " [sync #%d.%d]",
2253 ost->sync_ist->file_index,
2254 ost->sync_ist->st->index);
2255 if(ost->encoding_needed)
2256 fprintf(stderr, ": %s -> %s",
2257 input_streams[ost->source_index].dec ?
2258 input_streams[ost->source_index].dec->name : "?",
2259 ost->enc ? ost->enc->name : "?");
2261 fprintf(stderr, ": copy");
2262 fprintf(stderr, "\n");
2267 fprintf(stderr, "%s\n", error);
2272 print_sdp(output_files, nb_output_files);
2277 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2278 avio_set_interrupt_cb(decode_interrupt_cb);
2282 timer_start = av_gettime();
2284 for(; received_sigterm == 0;) {
2285 int file_index, ist_index;
2291 ipts_min= INT64_MAX;
2293 /* if 'q' pressed, exits */
2297 /* read_key() returns 0 on EOF */
2301 if (key == '+') verbose++;
2302 if (key == '-') verbose--;
2303 if (key == 's') qp_hist ^= 1;
2306 do_hex_dump = do_pkt_dump = 0;
2307 } else if(do_pkt_dump){
2311 av_log_set_level(AV_LOG_DEBUG);
2313 if (key == 'c' || key == 'C'){
2314 char ret[4096], target[64], cmd[256], arg[256]={0};
2316 fprintf(stderr, "\nEnter command: <target> <time> <command>[ <argument>]\n");
2317 if(scanf("%4095[^\n\r]%*c", ret) == 1 && sscanf(ret, "%63[^ ] %lf %255[^ ] %255[^\n]", target, &ts, cmd, arg) >= 3){
2318 for(i=0;i<nb_output_streams;i++) {
2320 ost = &output_streams[i];
2323 r= avfilter_graph_send_command(ost->graph, target, cmd, arg, ret, sizeof(ret), key == 'c' ? AVFILTER_CMD_FLAG_ONE : 0);
2324 fprintf(stderr, "Command reply for %d: %d, %s\n", i, r, ret);
2326 r= avfilter_graph_queue_command(ost->graph, target, cmd, arg, 0, ts);
2331 fprintf(stderr, "Parse error\n");
2334 if (key == 'd' || key == 'D'){
2337 debug = input_streams[0].st->codec->debug<<1;
2338 if(!debug) debug = 1;
2339 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2342 scanf("%d", &debug);
2343 for(i=0;i<nb_input_streams;i++) {
2344 input_streams[i].st->codec->debug = debug;
2346 for(i=0;i<nb_output_streams;i++) {
2347 ost = &output_streams[i];
2348 ost->st->codec->debug = debug;
2350 if(debug) av_log_set_level(AV_LOG_DEBUG);
2351 fprintf(stderr,"debug=%d\n", debug);
2354 fprintf(stderr, "key function\n"
2355 "? show this help\n"
2356 "+ increase verbosity\n"
2357 "- decrease verbosity\n"
2358 "c Send command to filtergraph\n"
2359 "D cycle through available debug modes\n"
2360 "h dump packets/hex press to cycle through the 3 states\n"
2362 "s Show QP histogram\n"
2367 /* select the stream that we must read now by looking at the
2368 smallest output pts */
2370 for (i = 0; i < nb_output_streams; i++) {
2373 ost = &output_streams[i];
2374 os = output_files[ost->file_index].ctx;
2375 ist = &input_streams[ost->source_index];
2376 if(ist->is_past_recording_time || no_packet[ist->file_index])
2378 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2380 if (!input_files[ist->file_index].eof_reached){
2381 if(ipts < ipts_min) {
2383 if(input_sync ) file_index = ist->file_index;
2385 if(opts < opts_min) {
2387 if(!input_sync) file_index = ist->file_index;
2390 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2395 /* if none, if is finished */
2396 if (file_index < 0) {
2397 if(no_packet_count){
2399 memset(no_packet, 0, nb_input_files);
2406 /* finish if limit size exhausted */
2407 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2410 /* read a frame from it and output it in the fifo */
2411 is = input_files[file_index].ctx;
2412 ret= av_read_frame(is, &pkt);
2413 if(ret == AVERROR(EAGAIN)){
2414 no_packet[file_index]=1;
2419 input_files[file_index].eof_reached = 1;
2427 memset(no_packet, 0, nb_input_files);
2430 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2431 is->streams[pkt.stream_index]);
2433 /* the following test is needed in case new streams appear
2434 dynamically in stream : we ignore them */
2435 if (pkt.stream_index >= input_files[file_index].nb_streams)
2436 goto discard_packet;
2437 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2438 ist = &input_streams[ist_index];
2440 goto discard_packet;
2442 if (pkt.dts != AV_NOPTS_VALUE)
2443 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2444 if (pkt.pts != AV_NOPTS_VALUE)
2445 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2447 if (ist->ts_scale) {
2448 if(pkt.pts != AV_NOPTS_VALUE)
2449 pkt.pts *= ist->ts_scale;
2450 if(pkt.dts != AV_NOPTS_VALUE)
2451 pkt.dts *= ist->ts_scale;
2454 // 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);
2455 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2456 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2457 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2458 int64_t delta= pkt_dts - ist->next_pts;
2459 if((delta < -1LL*dts_delta_threshold*AV_TIME_BASE ||
2460 (delta > 1LL*dts_delta_threshold*AV_TIME_BASE &&
2461 ist->st->codec->codec_type != AVMEDIA_TYPE_SUBTITLE) ||
2462 pkt_dts+1<ist->pts)&& !copy_ts){
2463 input_files[ist->file_index].ts_offset -= delta;
2465 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2466 delta, input_files[ist->file_index].ts_offset);
2467 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2468 if(pkt.pts != AV_NOPTS_VALUE)
2469 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2473 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2474 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2477 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2478 ist->file_index, ist->st->index);
2481 av_free_packet(&pkt);
2486 av_free_packet(&pkt);
2488 /* dump report by using the output first video and audio streams */
2489 print_report(output_files, output_streams, nb_output_streams, 0);
2492 /* at the end of stream, we must flush the decoder buffers */
2493 for (i = 0; i < nb_input_streams; i++) {
2494 ist = &input_streams[i];
2495 if (ist->decoding_needed) {
2496 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2502 /* write the trailer if needed and close file */
2503 for(i=0;i<nb_output_files;i++) {
2504 os = output_files[i].ctx;
2505 av_write_trailer(os);
2508 /* dump report by using the first video and audio streams */
2509 print_report(output_files, output_streams, nb_output_streams, 1);
2511 /* close each encoder */
2512 for (i = 0; i < nb_output_streams; i++) {
2513 ost = &output_streams[i];
2514 if (ost->encoding_needed) {
2515 av_freep(&ost->st->codec->stats_in);
2516 avcodec_close(ost->st->codec);
2519 avfilter_graph_free(&ost->graph);
2523 /* close each decoder */
2524 for (i = 0; i < nb_input_streams; i++) {
2525 ist = &input_streams[i];
2526 if (ist->decoding_needed) {
2527 avcodec_close(ist->st->codec);
2535 av_freep(&bit_buffer);
2536 av_freep(&no_packet);
2538 if (output_streams) {
2539 for (i = 0; i < nb_output_streams; i++) {
2540 ost = &output_streams[i];
2542 if (ost->st->stream_copy)
2543 av_freep(&ost->st->codec->extradata);
2545 fclose(ost->logfile);
2546 ost->logfile = NULL;
2548 av_fifo_free(ost->fifo); /* works even if fifo is not
2549 initialized but set to zero */
2550 av_freep(&ost->st->codec->subtitle_header);
2551 av_free(ost->resample_frame.data[0]);
2552 av_free(ost->forced_kf_pts);
2553 if (ost->video_resample)
2554 sws_freeContext(ost->img_resample_ctx);
2556 audio_resample_close(ost->resample);
2557 if (ost->reformat_ctx)
2558 av_audio_convert_free(ost->reformat_ctx);
2559 av_dict_free(&ost->opts);
2566 static int opt_format(const char *opt, const char *arg)
2568 last_asked_format = arg;
2572 static int opt_video_rc_override_string(const char *opt, const char *arg)
2574 video_rc_override_string = arg;
2578 static int opt_me_threshold(const char *opt, const char *arg)
2580 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2584 static int opt_verbose(const char *opt, const char *arg)
2586 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2590 static int opt_frame_rate(const char *opt, const char *arg)
2592 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2593 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2599 static int opt_frame_crop(const char *opt, const char *arg)
2601 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2602 return AVERROR(EINVAL);
2605 static int opt_frame_size(const char *opt, const char *arg)
2607 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2608 fprintf(stderr, "Incorrect frame size\n");
2609 return AVERROR(EINVAL);
2614 static int opt_pad(const char *opt, const char *arg) {
2615 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2619 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2621 if (strcmp(arg, "list")) {
2622 frame_pix_fmt = av_get_pix_fmt(arg);
2623 if (frame_pix_fmt == PIX_FMT_NONE) {
2624 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2625 return AVERROR(EINVAL);
2628 opt_pix_fmts(NULL, NULL);
2634 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2641 p = strchr(arg, ':');
2643 x = strtol(arg, &end, 10);
2645 y = strtol(end+1, &end, 10);
2647 ar = (double)x / (double)y;
2649 ar = strtod(arg, NULL);
2652 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2653 return AVERROR(EINVAL);
2655 frame_aspect_ratio = ar;
2659 static int opt_metadata(const char *opt, const char *arg)
2661 char *mid= strchr(arg, '=');
2664 fprintf(stderr, "Missing =\n");
2669 av_dict_set(&metadata, arg, mid, 0);
2674 static int opt_qscale(const char *opt, const char *arg)
2676 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2677 if (video_qscale <= 0 || video_qscale > 255) {
2678 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2679 return AVERROR(EINVAL);
2684 static int opt_top_field_first(const char *opt, const char *arg)
2686 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2687 return opt_default(opt, arg);
2690 static int opt_thread_count(const char *opt, const char *arg)
2692 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2695 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2700 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2702 if (strcmp(arg, "list")) {
2703 audio_sample_fmt = av_get_sample_fmt(arg);
2704 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2705 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2706 return AVERROR(EINVAL);
2711 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2712 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2718 static int opt_audio_rate(const char *opt, const char *arg)
2720 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2724 static int opt_audio_channels(const char *opt, const char *arg)
2726 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2730 static int opt_video_channel(const char *opt, const char *arg)
2732 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -channel.\n");
2733 return opt_default("channel", arg);
2736 static int opt_video_standard(const char *opt, const char *arg)
2738 av_log(NULL, AV_LOG_WARNING, "This option is deprecated, use -standard.\n");
2739 return opt_default("standard", arg);
2742 static int opt_codec(const char *opt, const char *arg)
2744 return av_dict_set(&codec_names, opt, arg, 0);
2747 static int opt_audio_codec(const char *opt, const char *arg)
2749 return opt_codec("codec:a", arg);
2752 static int opt_video_codec(const char *opt, const char *arg)
2754 return opt_codec("codec:v", arg);
2757 static int opt_subtitle_codec(const char *opt, const char *arg)
2759 return opt_codec("codec:s", arg);
2762 static int opt_data_codec(const char *opt, const char *arg)
2764 return opt_codec("codec:d", arg);
2767 static int opt_codec_tag(const char *opt, const char *arg)
2770 uint32_t *codec_tag;
2772 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2773 !strcmp(opt, "vtag") ? &video_codec_tag :
2774 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2778 *codec_tag = strtol(arg, &tail, 0);
2780 *codec_tag = AV_RL32(arg);
2785 static int opt_map(const char *opt, const char *arg)
2787 StreamMap *m = NULL;
2788 int i, negative = 0, file_idx;
2789 int sync_file_idx = -1, sync_stream_idx;
2797 map = av_strdup(arg);
2799 /* parse sync stream first, just pick first matching stream */
2800 if (sync = strchr(map, ',')) {
2802 sync_file_idx = strtol(sync + 1, &sync, 0);
2803 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2804 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2809 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2810 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2811 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2812 sync_stream_idx = i;
2815 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2816 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2817 "match any streams.\n", arg);
2823 file_idx = strtol(map, &p, 0);
2824 if (file_idx >= nb_input_files || file_idx < 0) {
2825 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2829 /* disable some already defined maps */
2830 for (i = 0; i < nb_stream_maps; i++) {
2831 m = &stream_maps[i];
2832 if (check_stream_specifier(input_files[m->file_index].ctx,
2833 input_files[m->file_index].ctx->streams[m->stream_index],
2834 *p == ':' ? p + 1 : p) > 0)
2838 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2839 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2840 *p == ':' ? p + 1 : p) <= 0)
2842 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2843 m = &stream_maps[nb_stream_maps - 1];
2845 m->file_index = file_idx;
2846 m->stream_index = i;
2848 if (sync_file_idx >= 0) {
2849 m->sync_file_index = sync_file_idx;
2850 m->sync_stream_index = sync_stream_idx;
2852 m->sync_file_index = file_idx;
2853 m->sync_stream_index = i;
2858 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2866 static void parse_meta_type(char *arg, char *type, int *index)
2876 if (*(++arg) == ':')
2877 *index = strtol(++arg, NULL, 0);
2880 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2887 static int opt_map_metadata(const char *opt, const char *arg)
2889 MetadataMap *m, *m1;
2892 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2893 &nb_meta_data_maps, nb_meta_data_maps + 1);
2895 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2896 m->file = strtol(arg, &p, 0);
2897 parse_meta_type(p, &m->type, &m->index);
2899 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2900 if (p = strchr(opt, ':'))
2901 parse_meta_type(p, &m1->type, &m1->index);
2905 if (m->type == 'g' || m1->type == 'g')
2906 metadata_global_autocopy = 0;
2907 if (m->type == 's' || m1->type == 's')
2908 metadata_streams_autocopy = 0;
2909 if (m->type == 'c' || m1->type == 'c')
2910 metadata_chapters_autocopy = 0;
2915 static int opt_map_meta_data(const char *opt, const char *arg)
2917 fprintf(stderr, "-map_meta_data is deprecated and will be removed soon. "
2918 "Use -map_metadata instead.\n");
2919 return opt_map_metadata(opt, arg);
2922 static int opt_input_ts_scale(const char *opt, const char *arg)
2924 return av_dict_set(&ts_scale, opt, arg, 0);
2927 static int opt_recording_time(const char *opt, const char *arg)
2929 recording_time = parse_time_or_die(opt, arg, 1);
2933 static int opt_start_time(const char *opt, const char *arg)
2935 start_time = parse_time_or_die(opt, arg, 1);
2939 static int opt_recording_timestamp(const char *opt, const char *arg)
2942 int64_t recording_timestamp = parse_time_or_die(opt, arg, 0) / 1E6;
2943 struct tm time = *gmtime((time_t*)&recording_timestamp);
2944 strftime(buf, sizeof(buf), "creation_time=%FT%T%z", &time);
2945 opt_metadata("metadata", buf);
2947 av_log(NULL, AV_LOG_WARNING, "%s is deprecated, set the 'creation_time' metadata "
2948 "tag instead.\n", opt);
2952 static int opt_input_ts_offset(const char *opt, const char *arg)
2954 input_ts_offset = parse_time_or_die(opt, arg, 1);
2958 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2960 const char *codec_string = encoder ? "encoder" : "decoder";
2964 return CODEC_ID_NONE;
2966 avcodec_find_encoder_by_name(name) :
2967 avcodec_find_decoder_by_name(name);
2969 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2972 if(codec->type != type) {
2973 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2979 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2981 AVDictionaryEntry *e = NULL;
2982 char *codec_name = NULL;
2985 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2986 char *p = strchr(e->key, ':');
2988 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2989 codec_name = e->value;
2996 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2997 return avcodec_find_encoder(st->codec->codec_id);
2999 } else if (!strcmp(codec_name, "copy"))
3000 st->stream_copy = 1;
3002 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
3003 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
3004 avcodec_find_decoder_by_name(codec_name);
3011 * Add all the streams from the given input file to the global
3012 * list of input streams.
3014 static void add_input_streams(AVFormatContext *ic)
3016 int i, rfps, rfps_base, ret;
3018 for (i = 0; i < ic->nb_streams; i++) {
3019 AVStream *st = ic->streams[i];
3020 AVCodecContext *dec = st->codec;
3021 AVDictionaryEntry *e = NULL;
3025 dec->thread_count = thread_count;
3027 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
3028 ist = &input_streams[nb_input_streams - 1];
3030 ist->file_index = nb_input_files;
3032 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
3034 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
3035 char *p = strchr(e->key, ':');
3037 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
3043 ist->ts_scale = strtod(scale, NULL);
3045 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
3047 switch (dec->codec_type) {
3048 case AVMEDIA_TYPE_AUDIO:
3050 ist->dec = avcodec_find_decoder(dec->codec_id);
3052 st->discard= AVDISCARD_ALL;
3054 case AVMEDIA_TYPE_VIDEO:
3056 ist->dec = avcodec_find_decoder(dec->codec_id);
3057 rfps = ic->streams[i]->r_frame_rate.num;
3058 rfps_base = ic->streams[i]->r_frame_rate.den;
3060 dec->flags |= CODEC_FLAG_EMU_EDGE;
3063 dec->debug |= FF_DEBUG_MV;
3065 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
3068 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3069 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3071 (float)rfps / rfps_base, rfps, rfps_base);
3075 st->discard= AVDISCARD_ALL;
3076 else if(video_discard)
3077 st->discard= video_discard;
3079 case AVMEDIA_TYPE_DATA:
3081 case AVMEDIA_TYPE_SUBTITLE:
3083 ist->dec = avcodec_find_decoder(dec->codec_id);
3084 if(subtitle_disable)
3085 st->discard = AVDISCARD_ALL;
3087 case AVMEDIA_TYPE_ATTACHMENT:
3088 case AVMEDIA_TYPE_UNKNOWN:
3096 static int opt_input_file(const char *opt, const char *filename)
3098 AVFormatContext *ic;
3099 AVInputFormat *file_iformat = NULL;
3103 AVDictionary **opts;
3104 int orig_nb_streams; // number of streams before avformat_find_stream_info
3106 if (last_asked_format) {
3107 if (!(file_iformat = av_find_input_format(last_asked_format))) {
3108 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
3111 last_asked_format = NULL;
3114 if (!strcmp(filename, "-"))
3117 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3118 !strcmp(filename, "/dev/stdin");
3120 /* get default parameters from command line */
3121 ic = avformat_alloc_context();
3123 print_error(filename, AVERROR(ENOMEM));
3126 if (audio_sample_rate) {
3127 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3128 av_dict_set(&format_opts, "sample_rate", buf, 0);
3130 if (audio_channels) {
3131 snprintf(buf, sizeof(buf), "%d", audio_channels);
3132 av_dict_set(&format_opts, "channels", buf, 0);
3134 if (frame_rate.num) {
3135 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3136 av_dict_set(&format_opts, "framerate", buf, 0);
3138 if (frame_width && frame_height) {
3139 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3140 av_dict_set(&format_opts, "video_size", buf, 0);
3142 if (frame_pix_fmt != PIX_FMT_NONE)
3143 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3145 ic->flags |= AVFMT_FLAG_NONBLOCK;
3148 av_log(NULL, AV_LOG_WARNING, "-loop_input is deprecated, use -loop 1\n");
3149 ic->loop_input = loop_input;
3152 /* open the input file with generic libav function */
3153 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3155 print_error(filename, err);
3158 assert_avoptions(format_opts);
3163 for(i=0; i<ic->nb_streams; i++){
3164 ic->streams[i]->discard= AVDISCARD_ALL;
3166 for(i=0; i<ic->nb_programs; i++){
3167 AVProgram *p= ic->programs[i];
3168 if(p->id != opt_programid){
3169 p->discard = AVDISCARD_ALL;
3172 for(j=0; j<p->nb_stream_indexes; j++){
3173 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3178 fprintf(stderr, "Specified program id not found\n");
3184 /* apply forced codec ids */
3185 for (i = 0; i < ic->nb_streams; i++)
3186 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3188 /* Set AVCodecContext options for avformat_find_stream_info */
3189 opts = setup_find_stream_info_opts(ic, codec_opts);
3190 orig_nb_streams = ic->nb_streams;
3192 /* If not enough info to get the stream parameters, we decode the
3193 first frames to get it. (used in mpeg case for example) */
3194 ret = avformat_find_stream_info(ic, opts);
3195 if (ret < 0 && verbose >= 0) {
3196 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3197 av_close_input_file(ic);
3201 timestamp = start_time;
3202 /* add the stream start time */
3203 if (ic->start_time != AV_NOPTS_VALUE)
3204 timestamp += ic->start_time;
3206 /* if seeking requested, we execute it */
3207 if (start_time != 0) {
3208 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3210 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3211 filename, (double)timestamp / AV_TIME_BASE);
3213 /* reset seek info */
3217 /* update the current parameters so that they match the one of the input stream */
3218 add_input_streams(ic);
3220 /* dump the file content */
3222 av_dump_format(ic, nb_input_files, filename, 0);
3224 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3225 input_files[nb_input_files - 1].ctx = ic;
3226 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3227 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3228 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3230 top_field_first = -1;
3231 frame_rate = (AVRational){0, 0};
3232 frame_pix_fmt = PIX_FMT_NONE;
3235 audio_sample_rate = 0;
3237 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3238 av_dict_free(&ts_scale);
3240 for (i = 0; i < orig_nb_streams; i++)
3241 av_dict_free(&opts[i]);
3243 av_dict_free(&codec_names);
3249 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3250 AVCodecContext *avctx)
3256 for (p = kf; *p; p++)
3259 ost->forced_kf_count = n;
3260 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3261 if (!ost->forced_kf_pts) {
3262 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3265 for (i = 0; i < n; i++) {
3266 p = i ? strchr(p, ',') + 1 : kf;
3267 t = parse_time_or_die("force_key_frames", p, 1);
3268 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3272 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3275 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3276 int idx = oc->nb_streams - 1;
3279 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3283 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3284 nb_output_streams + 1);
3285 ost = &output_streams[nb_output_streams - 1];
3286 ost->file_index = nb_output_files;
3289 st->codec->codec_type = type;
3290 ost->enc = choose_codec(oc, st, type, codec_names);
3292 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3295 avcodec_get_context_defaults3(st->codec, ost->enc);
3296 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3298 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3302 static OutputStream *new_video_stream(AVFormatContext *oc)
3306 AVCodecContext *video_enc;
3308 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3310 if (!st->stream_copy) {
3311 ost->frame_aspect_ratio = frame_aspect_ratio;
3312 frame_aspect_ratio = 0;
3314 ost->avfilter = vfilters;
3319 ost->bitstream_filters = video_bitstream_filters;
3320 video_bitstream_filters= NULL;
3322 st->codec->thread_count= thread_count;
3324 video_enc = st->codec;
3327 video_enc->codec_tag= video_codec_tag;
3329 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3330 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3333 if (st->stream_copy) {
3334 video_enc->sample_aspect_ratio =
3335 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3341 ost->frame_rate = frame_rate;
3343 video_enc->width = frame_width;
3344 video_enc->height = frame_height;
3345 video_enc->pix_fmt = frame_pix_fmt;
3346 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3347 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3350 video_enc->gop_size = 0;
3351 if (video_qscale || same_quant) {
3352 video_enc->flags |= CODEC_FLAG_QSCALE;
3353 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3357 video_enc->intra_matrix = intra_matrix;
3359 video_enc->inter_matrix = inter_matrix;
3361 p= video_rc_override_string;
3364 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3366 fprintf(stderr, "error parsing rc_override\n");
3369 video_enc->rc_override=
3370 av_realloc(video_enc->rc_override,
3371 sizeof(RcOverride)*(i+1));
3372 video_enc->rc_override[i].start_frame= start;
3373 video_enc->rc_override[i].end_frame = end;
3375 video_enc->rc_override[i].qscale= q;
3376 video_enc->rc_override[i].quality_factor= 1.0;
3379 video_enc->rc_override[i].qscale= 0;
3380 video_enc->rc_override[i].quality_factor= -q/100.0;
3385 video_enc->rc_override_count=i;
3386 if (!video_enc->rc_initial_buffer_occupancy)
3387 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3388 video_enc->me_threshold= me_threshold;
3389 video_enc->intra_dc_precision= intra_dc_precision - 8;
3392 video_enc->flags|= CODEC_FLAG_PSNR;
3397 video_enc->flags |= CODEC_FLAG_PASS1;
3399 video_enc->flags |= CODEC_FLAG_PASS2;
3403 if (forced_key_frames)
3404 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3406 if (video_language) {
3407 av_dict_set(&st->metadata, "language", video_language, 0);
3408 av_freep(&video_language);
3411 /* reset some key parameters */
3413 av_freep(&forced_key_frames);
3414 frame_pix_fmt = PIX_FMT_NONE;
3418 static OutputStream *new_audio_stream(AVFormatContext *oc)
3422 AVCodecContext *audio_enc;
3424 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3427 ost->bitstream_filters = audio_bitstream_filters;
3428 audio_bitstream_filters= NULL;
3430 st->codec->thread_count= thread_count;
3432 audio_enc = st->codec;
3433 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3436 audio_enc->codec_tag= audio_codec_tag;
3438 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3439 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3441 if (!st->stream_copy) {
3442 if (audio_qscale > QSCALE_NONE) {
3443 audio_enc->flags |= CODEC_FLAG_QSCALE;
3444 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3447 audio_enc->channels = audio_channels;
3448 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3449 audio_enc->sample_fmt = audio_sample_fmt;
3450 if (audio_sample_rate)
3451 audio_enc->sample_rate = audio_sample_rate;
3453 if (audio_language) {
3454 av_dict_set(&st->metadata, "language", audio_language, 0);
3455 av_freep(&audio_language);
3458 /* reset some key parameters */
3464 static OutputStream *new_data_stream(AVFormatContext *oc)
3468 AVCodecContext *data_enc;
3470 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3472 data_enc = st->codec;
3473 if (!st->stream_copy) {
3474 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3479 data_enc->codec_tag= data_codec_tag;
3481 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3482 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3489 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3493 AVCodecContext *subtitle_enc;
3495 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3497 subtitle_enc = st->codec;
3499 ost->bitstream_filters = subtitle_bitstream_filters;
3500 subtitle_bitstream_filters= NULL;
3502 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3504 if(subtitle_codec_tag)
3505 subtitle_enc->codec_tag= subtitle_codec_tag;
3507 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3508 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3511 if (subtitle_language) {
3512 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3513 av_freep(&subtitle_language);
3516 subtitle_disable = 0;
3520 /* arg format is "output-stream-index:streamid-value". */
3521 static int opt_streamid(const char *opt, const char *arg)
3527 av_strlcpy(idx_str, arg, sizeof(idx_str));
3528 p = strchr(idx_str, ':');
3531 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3536 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3537 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3538 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3541 static int read_ffserver_streams(AVFormatContext *s, const char *filename)
3544 AVFormatContext *ic = NULL;
3546 err = avformat_open_input(&ic, filename, NULL, NULL);
3549 /* copy stream format */
3550 for(i=0;i<ic->nb_streams;i++) {
3555 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3556 ost = new_output_stream(s, codec->type);
3559 // FIXME: a more elegant solution is needed
3560 memcpy(st, ic->streams[i], sizeof(AVStream));
3561 st->info = av_malloc(sizeof(*st->info));
3562 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3563 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3565 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3566 choose_sample_fmt(st, codec);
3567 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3568 choose_pixel_fmt(st, codec);
3571 av_close_input_file(ic);
3576 static int copy_chapters(int infile, int outfile)
3578 AVFormatContext *is = input_files[infile].ctx;
3579 AVFormatContext *os = output_files[outfile].ctx;
3582 for (i = 0; i < is->nb_chapters; i++) {
3583 AVChapter *in_ch = is->chapters[i], *out_ch;
3584 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3585 AV_TIME_BASE_Q, in_ch->time_base);
3586 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3587 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3590 if (in_ch->end < ts_off)
3592 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3595 out_ch = av_mallocz(sizeof(AVChapter));
3597 return AVERROR(ENOMEM);
3599 out_ch->id = in_ch->id;
3600 out_ch->time_base = in_ch->time_base;
3601 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3602 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3604 if (metadata_chapters_autocopy)
3605 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3608 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3610 return AVERROR(ENOMEM);
3611 os->chapters[os->nb_chapters - 1] = out_ch;
3616 static int opt_output_file(const char *opt, const char *filename)
3618 AVFormatContext *oc;
3620 AVOutputFormat *file_oformat;
3624 if (!strcmp(filename, "-"))
3627 err = avformat_alloc_output_context2(&oc, NULL, last_asked_format, filename);
3628 last_asked_format = NULL;
3630 print_error(filename, err);
3633 file_oformat= oc->oformat;
3635 if (!strcmp(file_oformat->name, "ffm") &&
3636 av_strstart(filename, "http:", NULL)) {
3637 /* special case for files sent to ffserver: we get the stream
3638 parameters from ffserver */
3639 int err = read_ffserver_streams(oc, filename);
3641 print_error(filename, err);
3644 } else if (!nb_stream_maps) {
3645 /* pick the "best" stream of each type */
3646 #define NEW_STREAM(type, index)\
3648 ost = new_ ## type ## _stream(oc);\
3649 ost->source_index = index;\
3650 ost->sync_ist = &input_streams[index];\
3651 input_streams[index].discard = 0;\
3654 /* video: highest resolution */
3655 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3656 int area = 0, idx = -1;
3657 for (i = 0; i < nb_input_streams; i++) {
3658 ist = &input_streams[i];
3659 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3660 ist->st->codec->width * ist->st->codec->height > area) {
3661 area = ist->st->codec->width * ist->st->codec->height;
3665 NEW_STREAM(video, idx);
3668 /* audio: most channels */
3669 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3670 int channels = 0, idx = -1;
3671 for (i = 0; i < nb_input_streams; i++) {
3672 ist = &input_streams[i];
3673 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3674 ist->st->codec->channels > channels) {
3675 channels = ist->st->codec->channels;
3679 NEW_STREAM(audio, idx);
3682 /* subtitles: pick first */
3683 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3684 for (i = 0; i < nb_input_streams; i++)
3685 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3686 NEW_STREAM(subtitle, i);
3690 /* do something with data? */
3692 for (i = 0; i < nb_stream_maps; i++) {
3693 StreamMap *map = &stream_maps[i];
3698 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3699 switch (ist->st->codec->codec_type) {
3700 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3701 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3702 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3703 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3705 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3706 map->file_index, map->stream_index);
3710 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3711 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3712 map->sync_stream_index];
3717 av_dict_copy(&oc->metadata, metadata, 0);
3718 av_dict_free(&metadata);
3721 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3722 output_files[nb_output_files - 1].ctx = oc;
3723 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3724 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3726 /* check filename in case of an image number is expected */
3727 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3728 if (!av_filename_number_test(oc->filename)) {
3729 print_error(oc->filename, AVERROR(EINVAL));
3734 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3735 /* test if it already exists to avoid loosing precious files */
3736 if (!file_overwrite &&
3737 (strchr(filename, ':') == NULL ||
3738 filename[1] == ':' ||
3739 av_strstart(filename, "file:", NULL))) {
3740 if (avio_check(filename, 0) == 0) {
3742 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3744 if (!read_yesno()) {
3745 fprintf(stderr, "Not overwriting - exiting\n");
3750 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3757 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3758 print_error(filename, err);
3763 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3764 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3766 if (loop_output >= 0) {
3767 av_log(NULL, AV_LOG_WARNING, "-loop_output is deprecated, use -loop\n");
3768 oc->loop_output = loop_output;
3772 if (chapters_input_file >= nb_input_files) {
3773 if (chapters_input_file == INT_MAX) {
3774 /* copy chapters from the first input file that has them*/
3775 chapters_input_file = -1;
3776 for (i = 0; i < nb_input_files; i++)
3777 if (input_files[i].ctx->nb_chapters) {
3778 chapters_input_file = i;
3782 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3783 chapters_input_file);
3787 if (chapters_input_file >= 0)
3788 copy_chapters(chapters_input_file, nb_output_files - 1);
3791 for (i = 0; i < nb_meta_data_maps; i++) {
3792 AVFormatContext *files[2];
3793 AVDictionary **meta[2];
3796 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3797 if ((index) < 0 || (index) >= (nb_elems)) {\
3798 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3803 int in_file_index = meta_data_maps[i][1].file;
3804 if (in_file_index < 0)
3806 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3809 files[1] = input_files[in_file_index].ctx;
3811 for (j = 0; j < 2; j++) {
3812 MetadataMap *map = &meta_data_maps[i][j];
3814 switch (map->type) {
3816 meta[j] = &files[j]->metadata;
3819 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3820 meta[j] = &files[j]->streams[map->index]->metadata;
3823 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3824 meta[j] = &files[j]->chapters[map->index]->metadata;
3827 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3828 meta[j] = &files[j]->programs[map->index]->metadata;
3833 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3836 /* copy global metadata by default */
3837 if (metadata_global_autocopy && nb_input_files)
3838 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3839 AV_DICT_DONT_OVERWRITE);
3840 if (metadata_streams_autocopy)
3841 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3842 InputStream *ist = &input_streams[output_streams[i].source_index];
3843 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3846 frame_rate = (AVRational){0, 0};
3849 audio_sample_rate = 0;
3851 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3852 chapters_input_file = INT_MAX;
3854 av_freep(&meta_data_maps);
3855 nb_meta_data_maps = 0;
3856 metadata_global_autocopy = 1;
3857 metadata_streams_autocopy = 1;
3858 metadata_chapters_autocopy = 1;
3859 av_freep(&stream_maps);
3862 av_dict_free(&codec_names);
3864 av_freep(&forced_key_frames);
3870 /* same option as mencoder */
3871 static int opt_pass(const char *opt, const char *arg)
3873 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3877 static int64_t getutime(void)
3880 struct rusage rusage;
3882 getrusage(RUSAGE_SELF, &rusage);
3883 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3884 #elif HAVE_GETPROCESSTIMES
3886 FILETIME c, e, k, u;
3887 proc = GetCurrentProcess();
3888 GetProcessTimes(proc, &c, &e, &k, &u);
3889 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3891 return av_gettime();
3895 static int64_t getmaxrss(void)
3897 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3898 struct rusage rusage;
3899 getrusage(RUSAGE_SELF, &rusage);
3900 return (int64_t)rusage.ru_maxrss * 1024;
3901 #elif HAVE_GETPROCESSMEMORYINFO
3903 PROCESS_MEMORY_COUNTERS memcounters;
3904 proc = GetCurrentProcess();
3905 memcounters.cb = sizeof(memcounters);
3906 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3907 return memcounters.PeakPagefileUsage;
3913 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3916 const char *p = str;
3923 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3930 static int opt_inter_matrix(const char *opt, const char *arg)
3932 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3933 parse_matrix_coeffs(inter_matrix, arg);
3937 static int opt_intra_matrix(const char *opt, const char *arg)
3939 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3940 parse_matrix_coeffs(intra_matrix, arg);
3944 static void show_usage(void)
3946 printf("Hyper fast Audio and Video encoder\n");
3947 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3951 static int opt_help(const char *opt, const char *arg)
3954 AVOutputFormat *oformat = NULL;
3955 AVInputFormat *iformat = NULL;
3957 av_log_set_callback(log_callback_help);
3959 show_help_options(options, "Main options:\n",
3960 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3961 show_help_options(options, "\nAdvanced options:\n",
3962 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3964 show_help_options(options, "\nVideo options:\n",
3965 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3967 show_help_options(options, "\nAdvanced Video options:\n",
3968 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3969 OPT_VIDEO | OPT_EXPERT);
3970 show_help_options(options, "\nAudio options:\n",
3971 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3973 show_help_options(options, "\nAdvanced Audio options:\n",
3974 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3975 OPT_AUDIO | OPT_EXPERT);
3976 show_help_options(options, "\nSubtitle options:\n",
3977 OPT_SUBTITLE | OPT_GRAB,
3979 show_help_options(options, "\nAudio/Video grab options:\n",
3983 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3986 /* individual codec options */
3988 while ((c = av_codec_next(c))) {
3989 if (c->priv_class) {
3990 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3995 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3998 /* individual muxer options */
3999 while ((oformat = av_oformat_next(oformat))) {
4000 if (oformat->priv_class) {
4001 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
4006 /* individual demuxer options */
4007 while ((iformat = av_iformat_next(iformat))) {
4008 if (iformat->priv_class) {
4009 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
4014 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
4018 static int opt_target(const char *opt, const char *arg)
4020 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
4021 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
4023 if(!strncmp(arg, "pal-", 4)) {
4026 } else if(!strncmp(arg, "ntsc-", 5)) {
4029 } else if(!strncmp(arg, "film-", 5)) {
4034 /* Calculate FR via float to avoid int overflow */
4035 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
4038 } else if((fr == 29970) || (fr == 23976)) {
4041 /* Try to determine PAL/NTSC by peeking in the input files */
4042 if(nb_input_files) {
4044 for (j = 0; j < nb_input_files; j++) {
4045 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
4046 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
4047 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
4049 fr = c->time_base.den * 1000 / c->time_base.num;
4053 } else if((fr == 29970) || (fr == 23976)) {
4063 if(verbose > 0 && norm != UNKNOWN)
4064 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
4067 if(norm == UNKNOWN) {
4068 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
4069 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
4070 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
4074 if(!strcmp(arg, "vcd")) {
4075 opt_codec("c:v", "mpeg1video");
4076 opt_codec("c:a", "mp2");
4077 opt_format("f", "vcd");
4079 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
4080 opt_frame_rate("r", frame_rates[norm]);
4081 opt_default("g", norm == PAL ? "15" : "18");
4083 opt_default("b", "1150000");
4084 opt_default("maxrate", "1150000");
4085 opt_default("minrate", "1150000");
4086 opt_default("bufsize", "327680"); // 40*1024*8;
4088 opt_default("b:a", "224000");
4089 audio_sample_rate = 44100;
4092 opt_default("packetsize", "2324");
4093 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4095 /* We have to offset the PTS, so that it is consistent with the SCR.
4096 SCR starts at 36000, but the first two packs contain only padding
4097 and the first pack from the other stream, respectively, may also have
4098 been written before.
4099 So the real data starts at SCR 36000+3*1200. */
4100 mux_preload= (36000+3*1200) / 90000.0; //0.44
4101 } else if(!strcmp(arg, "svcd")) {
4103 opt_codec("c:v", "mpeg2video");
4104 opt_codec("c:a", "mp2");
4105 opt_format("f", "svcd");
4107 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4108 opt_frame_rate("r", frame_rates[norm]);
4109 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4110 opt_default("g", norm == PAL ? "15" : "18");
4112 opt_default("b", "2040000");
4113 opt_default("maxrate", "2516000");
4114 opt_default("minrate", "0"); //1145000;
4115 opt_default("bufsize", "1835008"); //224*1024*8;
4116 opt_default("flags", "+scan_offset");
4119 opt_default("b:a", "224000");
4120 audio_sample_rate = 44100;
4122 opt_default("packetsize", "2324");
4124 } else if(!strcmp(arg, "dvd")) {
4126 opt_codec("c:v", "mpeg2video");
4127 opt_codec("c:a", "ac3");
4128 opt_format("f", "dvd");
4130 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4131 opt_frame_rate("r", frame_rates[norm]);
4132 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4133 opt_default("g", norm == PAL ? "15" : "18");
4135 opt_default("b", "6000000");
4136 opt_default("maxrate", "9000000");
4137 opt_default("minrate", "0"); //1500000;
4138 opt_default("bufsize", "1835008"); //224*1024*8;
4140 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4141 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4143 opt_default("b:a", "448000");
4144 audio_sample_rate = 48000;
4146 } else if(!strncmp(arg, "dv", 2)) {
4148 opt_format("f", "dv");
4150 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4151 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4152 norm == PAL ? "yuv420p" : "yuv411p");
4153 opt_frame_rate("r", frame_rates[norm]);
4155 audio_sample_rate = 48000;
4159 fprintf(stderr, "Unknown target: %s\n", arg);
4160 return AVERROR(EINVAL);
4165 static int opt_vstats_file(const char *opt, const char *arg)
4167 av_free (vstats_filename);
4168 vstats_filename=av_strdup (arg);
4172 static int opt_vstats(const char *opt, const char *arg)
4175 time_t today2 = time(NULL);
4176 struct tm *today = localtime(&today2);
4178 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4180 return opt_vstats_file(opt, filename);
4183 static int opt_bsf(const char *opt, const char *arg)
4185 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4186 AVBitStreamFilterContext **bsfp;
4189 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4193 bsfp= *opt == 'v' ? &video_bitstream_filters :
4194 *opt == 'a' ? &audio_bitstream_filters :
4195 &subtitle_bitstream_filters;
4197 bsfp= &(*bsfp)->next;
4204 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4208 static int opt_passlogfile(const char *opt, const char *arg)
4210 pass_logfilename_prefix = arg;
4211 #if CONFIG_LIBX264_ENCODER
4212 return opt_default("passlogfile", arg);
4218 static const OptionDef options[] = {
4220 #include "cmdutils_common_opts.h"
4221 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4222 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4223 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4224 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4225 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4226 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4227 { "map_meta_data", HAS_ARG | OPT_EXPERT, {(void*)opt_map_meta_data}, "DEPRECATED set meta data information of outfile from infile",
4228 "outfile[,metadata]:infile[,metadata]" },
4229 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4230 "outfile[,metadata]:infile[,metadata]" },
4231 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4232 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4233 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4234 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4235 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4236 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4237 { "timestamp", HAS_ARG, {(void*)opt_recording_timestamp}, "set the recording timestamp ('now' to set the current time)", "time" },
4238 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4239 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4240 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4241 "add timings for benchmarking" },
4242 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4243 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4244 "dump each input packet" },
4245 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4246 "when dumping packets, also dump the payload" },
4247 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4248 { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "deprecated, use -loop" },
4249 { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "deprecated, use -loop", "" },
4250 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4251 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4252 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4253 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4254 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4255 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4256 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4257 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4258 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4259 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4260 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4261 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4262 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4265 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4266 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4267 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4268 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4269 { "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" },
4270 { "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" },
4271 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4272 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4273 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4274 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4275 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4276 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4277 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4278 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4279 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4280 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4281 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4282 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4283 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4284 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4285 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4286 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4287 { "sameq", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4288 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant}, "use same quantizer as source (implies VBR)" },
4289 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4290 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4291 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4292 "deinterlace pictures" },
4293 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4294 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4295 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4297 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4299 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4300 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4301 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4302 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4303 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4304 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4305 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4306 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4307 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4308 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4311 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4312 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4313 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4314 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4315 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4316 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4317 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4318 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4319 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4320 { "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" },
4322 /* subtitle options */
4323 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4324 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4325 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4326 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4329 { "vc", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_channel}, "deprecated, use -channel", "channel" },
4330 { "tvstd", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_GRAB, {(void*)opt_video_standard}, "deprecated, use -standard", "standard" },
4331 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4334 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4335 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4337 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4338 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4339 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4341 /* data codec support */
4342 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4344 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4348 int main(int argc, char **argv)
4352 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4354 if(argc>1 && !strcmp(argv[1], "-d")){
4357 av_log_set_callback(log_callback_null);
4362 avcodec_register_all();
4364 avdevice_register_all();
4367 avfilter_register_all();
4372 if(isatty(STDIN_FILENO))
4373 avio_set_interrupt_cb(decode_interrupt_cb);
4382 parse_options(argc, argv, options, opt_output_file);
4384 if(nb_output_files <= 0 && nb_input_files == 0) {
4386 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4390 /* file converter / grab */
4391 if (nb_output_files <= 0) {
4392 fprintf(stderr, "At least one output file must be specified\n");
4396 if (nb_input_files == 0) {
4397 fprintf(stderr, "At least one input file must be specified\n");
4402 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4404 ti = getutime() - ti;
4406 int maxrss = getmaxrss() / 1024;
4407 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4410 return exit_program(0);