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/buffersink.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[] = "avconv";
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 */
114 /* indexed by output file stream index */
115 static int *streamid_map = NULL;
116 static int nb_streamid_map = 0;
118 static int frame_width = 0;
119 static int frame_height = 0;
120 static float frame_aspect_ratio = 0;
121 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
122 static int frame_bits_per_raw_sample = 0;
123 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
124 static AVRational frame_rate;
125 static float video_qscale = 0;
126 static uint16_t *intra_matrix = NULL;
127 static uint16_t *inter_matrix = NULL;
128 static const char *video_rc_override_string=NULL;
129 static int video_discard = 0;
130 static int same_quant = 0;
131 static int do_deinterlace = 0;
132 static int top_field_first = -1;
133 static int me_threshold = 0;
134 static int intra_dc_precision = 8;
135 static int qp_hist = 0;
137 static char *vfilters = NULL;
140 static int audio_sample_rate = 0;
141 #define QSCALE_NONE -99999
142 static float audio_qscale = QSCALE_NONE;
144 static int file_overwrite = 0;
145 static int do_benchmark = 0;
146 static int do_hex_dump = 0;
147 static int do_pkt_dump = 0;
148 static int do_psnr = 0;
149 static int do_pass = 0;
150 static const char *pass_logfilename_prefix;
151 static int video_sync_method= -1;
152 static int audio_sync_method= 0;
153 static float audio_drift_threshold= 0.1;
154 static int copy_ts= 0;
155 static int copy_tb= 0;
156 static int opt_shortest = 0;
157 static char *vstats_filename;
158 static FILE *vstats_file;
159 static int opt_programid = 0;
160 static int copy_initial_nonkeyframes = 0;
162 static int audio_volume = 256;
164 static int exit_on_error = 0;
165 static int using_stdin = 0;
166 static int verbose = 1;
167 static int run_as_daemon = 0;
168 static int q_pressed = 0;
169 static int64_t video_size = 0;
170 static int64_t audio_size = 0;
171 static int64_t extra_size = 0;
172 static int nb_frames_dup = 0;
173 static int nb_frames_drop = 0;
174 static int input_sync;
175 static int force_fps = 0;
176 static char *forced_key_frames = NULL;
178 static float dts_delta_threshold = 10;
180 static uint8_t *audio_buf;
181 static uint8_t *audio_out;
182 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
184 static short *samples;
186 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
188 typedef struct InputStream {
191 int discard; /* true if stream data should be discarded */
192 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
195 int64_t start; /* time when read started */
196 int64_t next_pts; /* synthetic pts for cases where pkt.pts
198 int64_t pts; /* current pts */
200 int is_start; /* is 1 at the start and after a discontinuity */
201 int showed_multi_packet_warning;
205 typedef struct InputFile {
206 AVFormatContext *ctx;
207 int eof_reached; /* true if eof reached */
208 int ist_index; /* index of first stream in ist_table */
209 int buffer_size; /* current total buffer size */
211 int nb_streams; /* number of stream that avconv is aware of; may be different
212 from ctx.nb_streams if new streams appear during av_read_frame() */
216 typedef struct OutputStream {
217 int file_index; /* file index */
218 int index; /* stream index in the output file */
219 int source_index; /* InputStream index */
220 AVStream *st; /* stream in the output file */
221 int encoding_needed; /* true if encoding needed for this stream */
223 /* input pts and corresponding output pts
225 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
226 struct InputStream *sync_ist; /* input stream to sync against */
227 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
228 AVBitStreamFilterContext *bitstream_filters;
234 AVFrame resample_frame; /* temporary frame for image resampling */
235 struct SwsContext *img_resample_ctx; /* for image resampling */
238 int resample_pix_fmt;
239 AVRational frame_rate;
241 float frame_aspect_ratio;
243 /* forced key frames */
244 int64_t *forced_kf_pts;
250 ReSampleContext *resample; /* for audio resampling */
251 int resample_sample_fmt;
252 int resample_channels;
253 int resample_sample_rate;
255 AVAudioConvert *reformat_ctx;
256 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
260 AVFilterContext *output_video_filter;
261 AVFilterContext *input_video_filter;
262 AVFilterBufferRef *picref;
264 AVFilterGraph *graph;
269 int is_past_recording_time;
274 /* init terminal so that we can grab keys */
275 static struct termios oldtty;
278 typedef struct OutputFile {
279 AVFormatContext *ctx;
281 int ost_index; /* index of the first stream in output_streams */
282 int64_t recording_time; /* desired length of the resulting file in microseconds */
283 int64_t start_time; /* start time in microseconds */
284 uint64_t limit_filesize;
287 static InputStream *input_streams = NULL;
288 static int nb_input_streams = 0;
289 static InputFile *input_files = NULL;
290 static int nb_input_files = 0;
292 static OutputStream *output_streams = NULL;
293 static int nb_output_streams = 0;
294 static OutputFile *output_files = NULL;
295 static int nb_output_files = 0;
297 typedef struct OptionsContext {
298 /* input/output options */
302 SpecifierOpt *codec_names;
304 SpecifierOpt *audio_channels;
305 int nb_audio_channels;
308 int64_t input_ts_offset;
311 SpecifierOpt *ts_scale;
315 StreamMap *stream_maps;
317 /* first item specifies output metadata, second is input */
318 MetadataMap (*meta_data_maps)[2];
319 int nb_meta_data_maps;
320 int metadata_global_manual;
321 int metadata_streams_manual;
322 int metadata_chapters_manual;
324 int chapters_input_file;
326 int64_t recording_time;
327 uint64_t limit_filesize;
333 int subtitle_disable;
336 SpecifierOpt *metadata;
338 SpecifierOpt *max_frames;
340 SpecifierOpt *bitstream_filters;
341 int nb_bitstream_filters;
342 SpecifierOpt *codec_tags;
346 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
349 for (i = 0; i < o->nb_ ## name; i++) {\
350 char *spec = o->name[i].specifier;\
351 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
352 outvar = o->name[i].u.type;\
358 static void reset_options(OptionsContext *o)
360 const OptionDef *po = options;
362 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
364 void *dst = (uint8_t*)o + po->u.off;
366 if (po->flags & OPT_SPEC) {
367 SpecifierOpt **so = dst;
368 int i, *count = (int*)(so + 1);
369 for (i = 0; i < *count; i++) {
370 av_freep(&(*so)[i].specifier);
371 if (po->flags & OPT_STRING)
372 av_freep(&(*so)[i].u.str);
376 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
381 av_freep(&o->stream_maps);
382 av_freep(&o->meta_data_maps);
384 memset(o, 0, sizeof(*o));
386 o->mux_preload = 0.5;
387 o->mux_max_delay = 0.7;
388 o->recording_time = INT64_MAX;
389 o->limit_filesize = UINT64_MAX;
390 o->chapters_input_file = INT_MAX;
398 static int configure_video_filters(InputStream *ist, OutputStream *ost)
400 AVFilterContext *last_filter, *filter;
401 /** filter graph containing all filters including input & output */
402 AVCodecContext *codec = ost->st->codec;
403 AVCodecContext *icodec = ist->st->codec;
404 enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
405 AVBufferSinkParams *buffersink_params = av_buffersink_params_alloc();
406 AVRational sample_aspect_ratio;
410 ost->graph = avfilter_graph_alloc();
412 if (ist->st->sample_aspect_ratio.num){
413 sample_aspect_ratio = ist->st->sample_aspect_ratio;
415 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
417 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
418 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
419 sample_aspect_ratio.num, sample_aspect_ratio.den);
421 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
422 "src", args, NULL, ost->graph);
425 #if FF_API_OLD_VSINK_API
426 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
427 "out", NULL, pix_fmts, ost->graph);
429 buffersink_params->pixel_fmts = pix_fmts;
430 ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
431 "out", NULL, buffersink_params, ost->graph);
433 av_freep(&buffersink_params);
436 last_filter = ost->input_video_filter;
438 if (codec->width != icodec->width || codec->height != icodec->height) {
439 snprintf(args, 255, "%d:%d:flags=0x%X",
443 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
444 NULL, args, NULL, ost->graph)) < 0)
446 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
448 last_filter = filter;
451 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
452 ost->graph->scale_sws_opts = av_strdup(args);
455 AVFilterInOut *outputs = avfilter_inout_alloc();
456 AVFilterInOut *inputs = avfilter_inout_alloc();
458 outputs->name = av_strdup("in");
459 outputs->filter_ctx = last_filter;
460 outputs->pad_idx = 0;
461 outputs->next = NULL;
463 inputs->name = av_strdup("out");
464 inputs->filter_ctx = ost->output_video_filter;
468 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
470 av_freep(&ost->avfilter);
472 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
476 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
479 codec->width = ost->output_video_filter->inputs[0]->w;
480 codec->height = ost->output_video_filter->inputs[0]->h;
481 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
482 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
483 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
484 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
488 #endif /* CONFIG_AVFILTER */
490 static void term_exit(void)
492 av_log(NULL, AV_LOG_QUIET, "%s", "");
495 tcsetattr (0, TCSANOW, &oldtty);
499 static volatile int received_sigterm = 0;
502 sigterm_handler(int sig)
504 received_sigterm = sig;
509 static void term_init(void)
519 tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
520 |INLCR|IGNCR|ICRNL|IXON);
521 tty.c_oflag |= OPOST;
522 tty.c_lflag &= ~(ECHO|ECHONL|ICANON|IEXTEN);
523 tty.c_cflag &= ~(CSIZE|PARENB);
528 tcsetattr (0, TCSANOW, &tty);
529 signal(SIGQUIT, sigterm_handler); /* Quit (POSIX). */
533 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
534 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
536 signal(SIGXCPU, sigterm_handler);
540 /* read a key without blocking */
541 static int read_key(void)
556 n = select(1, &rfds, NULL, NULL, &tv);
571 static int decode_interrupt_cb(void)
573 q_pressed += read_key() == 'q';
574 return q_pressed > 1;
577 void exit_program(int ret)
582 for(i=0;i<nb_output_files;i++) {
583 AVFormatContext *s = output_files[i].ctx;
584 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
586 avformat_free_context(s);
587 av_dict_free(&output_files[i].opts);
589 for(i=0;i<nb_input_files;i++) {
590 av_close_input_file(input_files[i].ctx);
592 for (i = 0; i < nb_input_streams; i++)
593 av_dict_free(&input_streams[i].opts);
595 av_free(intra_matrix);
596 av_free(inter_matrix);
600 av_free(vstats_filename);
602 av_freep(&input_streams);
603 av_freep(&input_files);
604 av_freep(&output_streams);
605 av_freep(&output_files);
610 allocated_audio_buf_size= allocated_audio_out_size= 0;
617 if (received_sigterm) {
619 "Received signal %d: terminating.\n",
620 (int) received_sigterm);
624 exit(ret); /* not all OS-es handle main() return value */
627 static void assert_avoptions(AVDictionary *m)
629 AVDictionaryEntry *t;
630 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
631 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
636 static void assert_codec_experimental(AVCodecContext *c, int encoder)
638 const char *codec_string = encoder ? "encoder" : "decoder";
640 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
641 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
642 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
643 "results.\nAdd '-strict experimental' if you want to use it.\n",
644 codec_string, c->codec->name);
645 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
646 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
647 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
648 codec_string, codec->name);
653 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
655 if(codec && codec->sample_fmts){
656 const enum AVSampleFormat *p= codec->sample_fmts;
658 if(*p == st->codec->sample_fmt)
662 if((codec->capabilities & CODEC_CAP_LOSSLESS) && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
663 av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
664 if(av_get_sample_fmt_name(st->codec->sample_fmt))
665 av_log(NULL, AV_LOG_WARNING,
666 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
667 av_get_sample_fmt_name(st->codec->sample_fmt),
669 av_get_sample_fmt_name(codec->sample_fmts[0]));
670 st->codec->sample_fmt = codec->sample_fmts[0];
675 static void choose_sample_rate(AVStream *st, AVCodec *codec)
677 if(codec && codec->supported_samplerates){
678 const int *p= codec->supported_samplerates;
680 int best_dist=INT_MAX;
682 int dist= abs(st->codec->sample_rate - *p);
683 if(dist < best_dist){
689 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
691 st->codec->sample_rate= best;
695 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
697 if(codec && codec->pix_fmts){
698 const enum PixelFormat *p= codec->pix_fmts;
699 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
700 if(st->codec->codec_id==CODEC_ID_MJPEG){
701 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
702 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
703 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};
707 if(*p == st->codec->pix_fmt)
711 if(st->codec->pix_fmt != PIX_FMT_NONE)
712 av_log(NULL, AV_LOG_WARNING,
713 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
714 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
716 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
717 st->codec->pix_fmt = codec->pix_fmts[0];
723 get_sync_ipts(const OutputStream *ost)
725 const InputStream *ist = ost->sync_ist;
726 OutputFile *of = &output_files[ost->file_index];
727 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
730 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
734 AVPacket new_pkt= *pkt;
735 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
736 &new_pkt.data, &new_pkt.size,
737 pkt->data, pkt->size,
738 pkt->flags & AV_PKT_FLAG_KEY);
741 new_pkt.destruct= av_destruct_packet;
743 fprintf(stderr, "%s failed for stream %d, codec %s",
744 bsfc->filter->name, pkt->stream_index,
745 avctx->codec ? avctx->codec->name : "copy");
755 ret= av_interleaved_write_frame(s, pkt);
757 print_error("av_interleaved_write_frame()", ret);
762 static void do_audio_out(AVFormatContext *s,
765 unsigned char *buf, int size)
768 int64_t audio_out_size, audio_buf_size;
769 int64_t allocated_for_size= size;
771 int size_out, frame_bytes, ret, resample_changed;
772 AVCodecContext *enc= ost->st->codec;
773 AVCodecContext *dec= ist->st->codec;
774 int osize = av_get_bytes_per_sample(enc->sample_fmt);
775 int isize = av_get_bytes_per_sample(dec->sample_fmt);
776 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
779 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
780 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
781 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
782 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
783 audio_buf_size*= osize*enc->channels;
785 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
786 if(coded_bps > 8*osize)
787 audio_out_size= audio_out_size * coded_bps / (8*osize);
788 audio_out_size += FF_MIN_BUFFER_SIZE;
790 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
791 fprintf(stderr, "Buffer sizes too large\n");
795 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
796 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
797 if (!audio_buf || !audio_out){
798 fprintf(stderr, "Out of memory in do_audio_out\n");
802 if (enc->channels != dec->channels)
803 ost->audio_resample = 1;
805 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
806 ost->resample_channels != dec->channels ||
807 ost->resample_sample_rate != dec->sample_rate;
809 if ((ost->audio_resample && !ost->resample) || resample_changed) {
810 if (resample_changed) {
811 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",
812 ist->file_index, ist->st->index,
813 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
814 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
815 ost->resample_sample_fmt = dec->sample_fmt;
816 ost->resample_channels = dec->channels;
817 ost->resample_sample_rate = dec->sample_rate;
819 audio_resample_close(ost->resample);
821 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
822 if (audio_sync_method <= 1 &&
823 ost->resample_sample_fmt == enc->sample_fmt &&
824 ost->resample_channels == enc->channels &&
825 ost->resample_sample_rate == enc->sample_rate) {
826 ost->resample = NULL;
827 ost->audio_resample = 0;
829 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
830 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
831 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
832 enc->sample_rate, dec->sample_rate,
833 enc->sample_fmt, dec->sample_fmt,
835 if (!ost->resample) {
836 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
837 dec->channels, dec->sample_rate,
838 enc->channels, enc->sample_rate);
844 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
845 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
846 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
847 if (ost->reformat_ctx)
848 av_audio_convert_free(ost->reformat_ctx);
849 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
850 dec->sample_fmt, 1, NULL, 0);
851 if (!ost->reformat_ctx) {
852 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
853 av_get_sample_fmt_name(dec->sample_fmt),
854 av_get_sample_fmt_name(enc->sample_fmt));
857 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
860 if(audio_sync_method){
861 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
862 - av_fifo_size(ost->fifo)/(enc->channels * 2);
863 double idelta= delta*dec->sample_rate / enc->sample_rate;
864 int byte_delta= ((int)idelta)*2*dec->channels;
866 //FIXME resample delay
867 if(fabs(delta) > 50){
868 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
870 byte_delta= FFMAX(byte_delta, -size);
874 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
879 static uint8_t *input_tmp= NULL;
880 input_tmp= av_realloc(input_tmp, byte_delta + size);
882 if(byte_delta > allocated_for_size - size){
883 allocated_for_size= byte_delta + (int64_t)size;
888 memset(input_tmp, 0, byte_delta);
889 memcpy(input_tmp + byte_delta, buf, size);
893 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
895 }else if(audio_sync_method>1){
896 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
897 av_assert0(ost->audio_resample);
899 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
900 // 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));
901 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
905 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
906 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
908 if (ost->audio_resample) {
910 size_out = audio_resample(ost->resample,
911 (short *)buftmp, (short *)buf,
912 size / (dec->channels * isize));
913 size_out = size_out * enc->channels * osize;
919 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
920 const void *ibuf[6]= {buftmp};
921 void *obuf[6]= {audio_buf};
922 int istride[6]= {isize};
923 int ostride[6]= {osize};
924 int len= size_out/istride[0];
925 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
926 printf("av_audio_convert() failed\n");
932 size_out = len*osize;
935 /* now encode as many frames as possible */
936 if (enc->frame_size > 1) {
937 /* output resampled raw samples */
938 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
939 fprintf(stderr, "av_fifo_realloc2() failed\n");
942 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
944 frame_bytes = enc->frame_size * osize * enc->channels;
946 while (av_fifo_size(ost->fifo) >= frame_bytes) {
948 av_init_packet(&pkt);
950 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
952 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
954 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
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);
969 ost->sync_opts += enc->frame_size;
973 av_init_packet(&pkt);
975 ost->sync_opts += size_out / (osize * enc->channels);
977 /* output a pcm frame */
978 /* determine the size of the coded buffer */
981 size_out = size_out*coded_bps/8;
983 if(size_out > audio_out_size){
984 fprintf(stderr, "Internal error, buffer size too small\n");
988 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
989 ret = avcodec_encode_audio(enc, audio_out, size_out,
992 fprintf(stderr, "Audio encoding failed\n");
996 pkt.stream_index= ost->index;
999 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1000 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1001 pkt.flags |= AV_PKT_FLAG_KEY;
1002 write_frame(s, &pkt, enc, ost->bitstream_filters);
1006 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
1008 AVCodecContext *dec;
1009 AVPicture *picture2;
1010 AVPicture picture_tmp;
1013 dec = ist->st->codec;
1015 /* deinterlace : must be done before any resize */
1016 if (do_deinterlace) {
1019 /* create temporary picture */
1020 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
1021 buf = av_malloc(size);
1025 picture2 = &picture_tmp;
1026 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
1028 if(avpicture_deinterlace(picture2, picture,
1029 dec->pix_fmt, dec->width, dec->height) < 0) {
1030 /* if error, do not deinterlace */
1031 fprintf(stderr, "Deinterlacing failed\n");
1040 if (picture != picture2)
1041 *picture = *picture2;
1045 static void do_subtitle_out(AVFormatContext *s,
1051 static uint8_t *subtitle_out = NULL;
1052 int subtitle_out_max_size = 1024 * 1024;
1053 int subtitle_out_size, nb, i;
1054 AVCodecContext *enc;
1057 if (pts == AV_NOPTS_VALUE) {
1058 fprintf(stderr, "Subtitle packets must have a pts\n");
1064 enc = ost->st->codec;
1066 if (!subtitle_out) {
1067 subtitle_out = av_malloc(subtitle_out_max_size);
1070 /* Note: DVB subtitle need one packet to draw them and one other
1071 packet to clear them */
1072 /* XXX: signal it in the codec context ? */
1073 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1078 for(i = 0; i < nb; i++) {
1079 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1080 // start_display_time is required to be 0
1081 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1082 sub->end_display_time -= sub->start_display_time;
1083 sub->start_display_time = 0;
1084 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1085 subtitle_out_max_size, sub);
1086 if (subtitle_out_size < 0) {
1087 fprintf(stderr, "Subtitle encoding failed\n");
1091 av_init_packet(&pkt);
1092 pkt.stream_index = ost->index;
1093 pkt.data = subtitle_out;
1094 pkt.size = subtitle_out_size;
1095 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1096 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1097 /* XXX: the pts correction is handled here. Maybe handling
1098 it in the codec would be better */
1100 pkt.pts += 90 * sub->start_display_time;
1102 pkt.pts += 90 * sub->end_display_time;
1104 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1108 static int bit_buffer_size= 1024*256;
1109 static uint8_t *bit_buffer= NULL;
1111 static void do_video_resample(OutputStream *ost,
1113 AVFrame *in_picture,
1114 AVFrame **out_picture)
1116 int resample_changed = 0;
1117 AVCodecContext *dec = ist->st->codec;
1118 AVCodecContext *enc = ost->st->codec;
1119 *out_picture = in_picture;
1121 resample_changed = ost->resample_width != dec->width ||
1122 ost->resample_height != dec->height ||
1123 ost->resample_pix_fmt != dec->pix_fmt;
1125 #if !CONFIG_AVFILTER
1126 if (resample_changed) {
1127 av_log(NULL, AV_LOG_INFO,
1128 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1129 ist->file_index, ist->st->index,
1130 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1131 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1132 ost->resample_width = dec->width;
1133 ost->resample_height = dec->height;
1134 ost->resample_pix_fmt = dec->pix_fmt;
1137 ost->video_resample = dec->width != enc->width ||
1138 dec->height != enc->height ||
1139 dec->pix_fmt != enc->pix_fmt;
1141 if (ost->video_resample) {
1142 *out_picture = &ost->resample_frame;
1143 if (!ost->img_resample_ctx || resample_changed) {
1144 /* initialize the destination picture */
1145 if (!ost->resample_frame.data[0]) {
1146 avcodec_get_frame_defaults(&ost->resample_frame);
1147 if (avpicture_alloc((AVPicture *)&ost->resample_frame, enc->pix_fmt,
1148 enc->width, enc->height)) {
1149 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1153 /* initialize a new scaler context */
1154 sws_freeContext(ost->img_resample_ctx);
1155 ost->img_resample_ctx = sws_getContext(dec->width, dec->height, dec->pix_fmt,
1156 enc->width, enc->height, enc->pix_fmt,
1157 ost->sws_flags, NULL, NULL, NULL);
1158 if (ost->img_resample_ctx == NULL) {
1159 fprintf(stderr, "Cannot get resampling context\n");
1163 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1164 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1167 if (resample_changed) {
1168 avfilter_graph_free(&ost->graph);
1169 if (configure_video_filters(ist, ost)) {
1170 fprintf(stderr, "Error reinitializing filters!\n");
1175 if (resample_changed) {
1176 ost->resample_width = dec->width;
1177 ost->resample_height = dec->height;
1178 ost->resample_pix_fmt = dec->pix_fmt;
1183 static void do_video_out(AVFormatContext *s,
1186 AVFrame *in_picture,
1187 int *frame_size, float quality)
1189 int nb_frames, i, ret, format_video_sync;
1190 AVFrame *final_picture;
1191 AVCodecContext *enc;
1194 enc = ost->st->codec;
1196 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1198 /* by default, we output a single frame */
1203 format_video_sync = video_sync_method;
1204 if (format_video_sync < 0)
1205 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1207 if (format_video_sync) {
1208 double vdelta = sync_ipts - ost->sync_opts;
1209 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1212 else if (format_video_sync == 2) {
1215 }else if(vdelta>0.6)
1216 ost->sync_opts= lrintf(sync_ipts);
1217 }else if (vdelta > 1.1)
1218 nb_frames = lrintf(vdelta);
1219 //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);
1220 if (nb_frames == 0){
1223 fprintf(stderr, "*** drop!\n");
1224 }else if (nb_frames > 1) {
1225 nb_frames_dup += nb_frames - 1;
1227 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1230 ost->sync_opts= lrintf(sync_ipts);
1232 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1236 do_video_resample(ost, ist, in_picture, &final_picture);
1238 /* duplicates frame if needed */
1239 for(i=0;i<nb_frames;i++) {
1241 av_init_packet(&pkt);
1242 pkt.stream_index= ost->index;
1244 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1245 /* raw pictures are written as AVPicture structure to
1246 avoid any copies. We support temporarily the older
1248 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1249 enc->coded_frame->top_field_first = in_picture->top_field_first;
1250 pkt.data= (uint8_t *)final_picture;
1251 pkt.size= sizeof(AVPicture);
1252 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1253 pkt.flags |= AV_PKT_FLAG_KEY;
1255 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1257 AVFrame big_picture;
1259 big_picture= *final_picture;
1260 /* better than nothing: use input picture interlaced
1262 big_picture.interlaced_frame = in_picture->interlaced_frame;
1263 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1264 if(top_field_first == -1)
1265 big_picture.top_field_first = in_picture->top_field_first;
1267 big_picture.top_field_first = top_field_first;
1270 /* handles same_quant here. This is not correct because it may
1271 not be a global option */
1272 big_picture.quality = quality;
1274 big_picture.pict_type = 0;
1275 // big_picture.pts = AV_NOPTS_VALUE;
1276 big_picture.pts= ost->sync_opts;
1277 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1278 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1279 if (ost->forced_kf_index < ost->forced_kf_count &&
1280 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1281 big_picture.pict_type = AV_PICTURE_TYPE_I;
1282 ost->forced_kf_index++;
1284 ret = avcodec_encode_video(enc,
1285 bit_buffer, bit_buffer_size,
1288 fprintf(stderr, "Video encoding failed\n");
1293 pkt.data= bit_buffer;
1295 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1296 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1297 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1298 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1299 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1301 if(enc->coded_frame->key_frame)
1302 pkt.flags |= AV_PKT_FLAG_KEY;
1303 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1306 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1307 // enc->frame_number-1, ret, enc->pict_type);
1308 /* if two pass, output log */
1309 if (ost->logfile && enc->stats_out) {
1310 fprintf(ost->logfile, "%s", enc->stats_out);
1315 ost->frame_number++;
1319 static double psnr(double d){
1320 return -10.0*log(d)/log(10.0);
1323 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1326 AVCodecContext *enc;
1328 double ti1, bitrate, avg_bitrate;
1330 /* this is executed just the first time do_video_stats is called */
1332 vstats_file = fopen(vstats_filename, "w");
1339 enc = ost->st->codec;
1340 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1341 frame_number = ost->frame_number;
1342 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1343 if (enc->flags&CODEC_FLAG_PSNR)
1344 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1346 fprintf(vstats_file,"f_size= %6d ", frame_size);
1347 /* compute pts value */
1348 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1352 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1353 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1354 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1355 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1356 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1360 static void print_report(OutputFile *output_files,
1361 OutputStream *ost_table, int nb_ostreams,
1362 int is_last_report, int64_t timer_start)
1366 AVFormatContext *oc;
1368 AVCodecContext *enc;
1369 int frame_number, vid, i;
1371 int64_t pts = INT64_MAX;
1372 static int64_t last_time = -1;
1373 static int qp_histogram[52];
1375 if (!is_last_report) {
1377 /* display the report every 0.5 seconds */
1378 cur_time = av_gettime();
1379 if (last_time == -1) {
1380 last_time = cur_time;
1383 if ((cur_time - last_time) < 500000)
1385 last_time = cur_time;
1389 oc = output_files[0].ctx;
1391 total_size = avio_size(oc->pb);
1392 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1393 total_size= avio_tell(oc->pb);
1397 for(i=0;i<nb_ostreams;i++) {
1399 ost = &ost_table[i];
1400 enc = ost->st->codec;
1401 if (!ost->st->stream_copy && enc->coded_frame)
1402 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1403 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1406 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1407 float t = (av_gettime()-timer_start) / 1000000.0;
1409 frame_number = ost->frame_number;
1410 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1411 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1413 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1417 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1420 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1422 if (enc->flags&CODEC_FLAG_PSNR){
1424 double error, error_sum=0;
1425 double scale, scale_sum=0;
1426 char type[3]= {'Y','U','V'};
1427 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1430 error= enc->error[j];
1431 scale= enc->width*enc->height*255.0*255.0*frame_number;
1433 error= enc->coded_frame->error[j];
1434 scale= enc->width*enc->height*255.0*255.0;
1439 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1441 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1445 /* compute min output value */
1446 pts = FFMIN(pts, av_rescale_q(ost->st->pts.val,
1447 ost->st->time_base, AV_TIME_BASE_Q));
1450 if (verbose > 0 || is_last_report) {
1451 int hours, mins, secs, us;
1452 secs = pts / AV_TIME_BASE;
1453 us = pts % AV_TIME_BASE;
1459 bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
1461 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1462 "size=%8.0fkB time=", total_size / 1024.0);
1463 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1464 "%02d:%02d:%02d.%02d ", hours, mins, secs,
1465 (100 * us) / AV_TIME_BASE);
1466 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1467 "bitrate=%6.1fkbits/s", bitrate);
1469 if (nb_frames_dup || nb_frames_drop)
1470 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1471 nb_frames_dup, nb_frames_drop);
1474 fprintf(stderr, "%s \r", buf);
1479 if (is_last_report && verbose >= 0){
1480 int64_t raw= audio_size + video_size + extra_size;
1481 fprintf(stderr, "\n");
1482 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1486 100.0*(total_size - raw)/raw
1491 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1493 int fill_char = 0x00;
1494 if (sample_fmt == AV_SAMPLE_FMT_U8)
1496 memset(buf, fill_char, size);
1499 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1503 for (i = 0; i < nb_ostreams; i++) {
1504 OutputStream *ost = &ost_table[i];
1505 AVCodecContext *enc = ost->st->codec;
1506 AVFormatContext *os = output_files[ost->file_index].ctx;
1508 if (!ost->encoding_needed)
1511 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1513 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1519 av_init_packet(&pkt);
1520 pkt.stream_index= ost->index;
1522 switch (ost->st->codec->codec_type) {
1523 case AVMEDIA_TYPE_AUDIO:
1524 fifo_bytes = av_fifo_size(ost->fifo);
1526 /* encode any samples remaining in fifo */
1527 if (fifo_bytes > 0) {
1528 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1529 int fs_tmp = enc->frame_size;
1531 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1532 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1533 enc->frame_size = fifo_bytes / (osize * enc->channels);
1535 int frame_bytes = enc->frame_size*osize*enc->channels;
1536 if (allocated_audio_buf_size < frame_bytes)
1538 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1541 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1542 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1543 ost->st->time_base.num, enc->sample_rate);
1544 enc->frame_size = fs_tmp;
1547 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1550 fprintf(stderr, "Audio encoding failed\n");
1554 pkt.flags |= AV_PKT_FLAG_KEY;
1556 case AVMEDIA_TYPE_VIDEO:
1557 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1559 fprintf(stderr, "Video encoding failed\n");
1563 if(enc->coded_frame && enc->coded_frame->key_frame)
1564 pkt.flags |= AV_PKT_FLAG_KEY;
1565 if (ost->logfile && enc->stats_out) {
1566 fprintf(ost->logfile, "%s", enc->stats_out);
1575 pkt.data = bit_buffer;
1577 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1578 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1579 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1584 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1585 static int output_packet(InputStream *ist, int ist_index,
1586 OutputStream *ost_table, int nb_ostreams,
1587 const AVPacket *pkt)
1589 AVFormatContext *os;
1594 void *buffer_to_free = NULL;
1595 static unsigned int samples_size= 0;
1596 AVSubtitle subtitle, *subtitle_to_free;
1597 int64_t pkt_pts = AV_NOPTS_VALUE;
1599 int frame_available;
1604 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1606 if(ist->next_pts == AV_NOPTS_VALUE)
1607 ist->next_pts= ist->pts;
1611 av_init_packet(&avpkt);
1619 if(pkt->dts != AV_NOPTS_VALUE)
1620 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1621 if(pkt->pts != AV_NOPTS_VALUE)
1622 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1624 //while we have more to decode or while the decoder did output something on EOF
1625 while (avpkt.size > 0 || (!pkt && got_output)) {
1626 uint8_t *data_buf, *decoded_data_buf;
1627 int data_size, decoded_data_size;
1629 ist->pts= ist->next_pts;
1631 if(avpkt.size && avpkt.size != pkt->size &&
1632 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1633 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1634 ist->showed_multi_packet_warning=1;
1637 /* decode the packet if needed */
1638 decoded_data_buf = NULL; /* fail safe */
1639 decoded_data_size= 0;
1640 data_buf = avpkt.data;
1641 data_size = avpkt.size;
1642 subtitle_to_free = NULL;
1643 if (ist->decoding_needed) {
1644 switch(ist->st->codec->codec_type) {
1645 case AVMEDIA_TYPE_AUDIO:{
1646 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1647 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1649 samples= av_malloc(samples_size);
1651 decoded_data_size= samples_size;
1652 /* XXX: could avoid copy if PCM 16 bits with same
1653 endianness as CPU */
1654 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1661 got_output = decoded_data_size > 0;
1662 /* Some bug in mpeg audio decoder gives */
1663 /* decoded_data_size < 0, it seems they are overflows */
1665 /* no audio frame */
1668 decoded_data_buf = (uint8_t *)samples;
1669 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1670 (ist->st->codec->sample_rate * ist->st->codec->channels);
1672 case AVMEDIA_TYPE_VIDEO:
1673 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1674 /* XXX: allocate picture correctly */
1675 avcodec_get_frame_defaults(&picture);
1676 avpkt.pts = pkt_pts;
1677 avpkt.dts = ist->pts;
1678 pkt_pts = AV_NOPTS_VALUE;
1680 ret = avcodec_decode_video2(ist->st->codec,
1681 &picture, &got_output, &avpkt);
1682 quality = same_quant ? picture.quality : 0;
1686 /* no picture yet */
1687 goto discard_packet;
1689 ist->next_pts = ist->pts = picture.best_effort_timestamp;
1690 if (ist->st->codec->time_base.num != 0) {
1691 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1692 ist->next_pts += ((int64_t)AV_TIME_BASE *
1693 ist->st->codec->time_base.num * ticks) /
1694 ist->st->codec->time_base.den;
1697 buffer_to_free = NULL;
1698 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1700 case AVMEDIA_TYPE_SUBTITLE:
1701 ret = avcodec_decode_subtitle2(ist->st->codec,
1702 &subtitle, &got_output, &avpkt);
1706 goto discard_packet;
1708 subtitle_to_free = &subtitle;
1715 switch(ist->st->codec->codec_type) {
1716 case AVMEDIA_TYPE_AUDIO:
1717 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1718 ist->st->codec->sample_rate;
1720 case AVMEDIA_TYPE_VIDEO:
1721 if (ist->st->codec->time_base.num != 0) {
1722 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1723 ist->next_pts += ((int64_t)AV_TIME_BASE *
1724 ist->st->codec->time_base.num * ticks) /
1725 ist->st->codec->time_base.den;
1732 // preprocess audio (volume)
1733 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1734 if (audio_volume != 256) {
1737 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1738 int v = ((*volp) * audio_volume + 128) >> 8;
1739 *volp++ = av_clip_int16(v);
1744 /* frame rate emulation */
1745 if (input_files[ist->file_index].rate_emu) {
1746 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1747 int64_t now = av_gettime() - ist->start;
1751 /* if output time reached then transcode raw format,
1752 encode packets and output them */
1753 for (i = 0; i < nb_ostreams; i++) {
1754 OutputFile *of = &output_files[ost_table[i].file_index];
1757 ost = &ost_table[i];
1758 if (ost->source_index != ist_index)
1761 if (of->start_time && ist->pts < of->start_time)
1764 if (of->recording_time != INT64_MAX &&
1765 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1766 (AVRational){1, 1000000}) >= 0) {
1767 ost->is_past_recording_time = 1;
1772 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1773 ost->input_video_filter) {
1774 if (!picture.sample_aspect_ratio.num)
1775 picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
1776 picture.pts = ist->pts;
1778 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
1780 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1781 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1782 while (frame_available) {
1783 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
1784 AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
1785 if (av_buffersink_get_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
1788 avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
1789 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1793 os = output_files[ost->file_index].ctx;
1795 /* set the input output pts pairs */
1796 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1798 if (ost->encoding_needed) {
1799 av_assert0(ist->decoding_needed);
1800 switch(ost->st->codec->codec_type) {
1801 case AVMEDIA_TYPE_AUDIO:
1802 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1804 case AVMEDIA_TYPE_VIDEO:
1806 if (ost->picref->video && !ost->frame_aspect_ratio)
1807 ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
1809 do_video_out(os, ost, ist, &picture, &frame_size,
1810 same_quant ? quality : ost->st->codec->global_quality);
1811 if (vstats_filename && frame_size)
1812 do_video_stats(os, ost, frame_size);
1814 case AVMEDIA_TYPE_SUBTITLE:
1815 do_subtitle_out(os, ost, ist, &subtitle,
1822 AVFrame avframe; //FIXME/XXX remove this
1825 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1826 av_init_packet(&opkt);
1828 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1829 #if !CONFIG_AVFILTER
1835 /* no reencoding needed : output the packet directly */
1836 /* force the input stream PTS */
1838 avcodec_get_frame_defaults(&avframe);
1839 ost->st->codec->coded_frame= &avframe;
1840 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1842 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1843 audio_size += data_size;
1844 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1845 video_size += data_size;
1849 opkt.stream_index= ost->index;
1850 if(pkt->pts != AV_NOPTS_VALUE)
1851 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1853 opkt.pts= AV_NOPTS_VALUE;
1855 if (pkt->dts == AV_NOPTS_VALUE)
1856 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1858 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1859 opkt.dts -= ost_tb_start_time;
1861 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1862 opkt.flags= pkt->flags;
1864 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1865 if( ost->st->codec->codec_id != CODEC_ID_H264
1866 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1867 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1869 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1870 opkt.destruct= av_destruct_packet;
1872 opkt.data = data_buf;
1873 opkt.size = data_size;
1876 if (os->oformat->flags & AVFMT_RAWPICTURE) {
1877 /* store AVPicture in AVPacket, as expected by the output format */
1878 avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
1879 opkt.data = (uint8_t *)&pict;
1880 opkt.size = sizeof(AVPicture);
1881 opkt.flags |= AV_PKT_FLAG_KEY;
1883 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1884 ost->st->codec->frame_number++;
1885 ost->frame_number++;
1886 av_free_packet(&opkt);
1890 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1891 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1893 avfilter_unref_buffer(ost->picref);
1898 av_free(buffer_to_free);
1899 /* XXX: allocate the subtitles in the codec ? */
1900 if (subtitle_to_free) {
1901 avsubtitle_free(subtitle_to_free);
1902 subtitle_to_free = NULL;
1910 static void print_sdp(OutputFile *output_files, int n)
1914 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1918 for (i = 0; i < n; i++)
1919 avc[i] = output_files[i].ctx;
1921 av_sdp_create(avc, n, sdp, sizeof(sdp));
1922 printf("SDP:\n%s\n", sdp);
1927 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1928 char *error, int error_len)
1931 InputStream *ist = &input_streams[ist_index];
1932 if (ist->decoding_needed) {
1933 AVCodec *codec = ist->dec;
1935 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1936 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1937 return AVERROR(EINVAL);
1940 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1941 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1942 ist->file_index, ist->st->index);
1943 return AVERROR(EINVAL);
1945 assert_codec_experimental(ist->st->codec, 0);
1946 assert_avoptions(ist->opts);
1949 ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
1950 ist->next_pts = AV_NOPTS_VALUE;
1956 static int transcode_init(OutputFile *output_files,
1957 int nb_output_files,
1958 InputFile *input_files,
1962 AVFormatContext *os;
1963 AVCodecContext *codec, *icodec;
1969 /* init framerate emulation */
1970 for (i = 0; i < nb_input_files; i++) {
1971 InputFile *ifile = &input_files[i];
1972 if (ifile->rate_emu)
1973 for (j = 0; j < ifile->nb_streams; j++)
1974 input_streams[j + ifile->ist_index].start = av_gettime();
1977 /* output stream init */
1978 for(i=0;i<nb_output_files;i++) {
1979 os = output_files[i].ctx;
1980 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1981 av_dump_format(os, i, os->filename, 1);
1982 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1983 return AVERROR(EINVAL);
1987 /* for each output stream, we compute the right encoding parameters */
1988 for (i = 0; i < nb_output_streams; i++) {
1989 ost = &output_streams[i];
1990 os = output_files[ost->file_index].ctx;
1991 ist = &input_streams[ost->source_index];
1993 codec = ost->st->codec;
1994 icodec = ist->st->codec;
1996 ost->st->disposition = ist->st->disposition;
1997 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1998 codec->chroma_sample_location = icodec->chroma_sample_location;
2000 if (ost->st->stream_copy) {
2001 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2003 if (extra_size > INT_MAX) {
2004 return AVERROR(EINVAL);
2007 /* if stream_copy is selected, no need to decode or encode */
2008 codec->codec_id = icodec->codec_id;
2009 codec->codec_type = icodec->codec_type;
2011 if(!codec->codec_tag){
2012 if( !os->oformat->codec_tag
2013 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2014 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2015 codec->codec_tag = icodec->codec_tag;
2018 codec->bit_rate = icodec->bit_rate;
2019 codec->rc_max_rate = icodec->rc_max_rate;
2020 codec->rc_buffer_size = icodec->rc_buffer_size;
2021 codec->extradata= av_mallocz(extra_size);
2022 if (!codec->extradata) {
2023 return AVERROR(ENOMEM);
2025 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2026 codec->extradata_size= icodec->extradata_size;
2028 codec->time_base = ist->st->time_base;
2029 if(!strcmp(os->oformat->name, "avi")) {
2030 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){
2031 codec->time_base = icodec->time_base;
2032 codec->time_base.num *= icodec->ticks_per_frame;
2033 codec->time_base.den *= 2;
2035 } else if(!(os->oformat->flags & AVFMT_VARIABLE_FPS)) {
2036 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){
2037 codec->time_base = icodec->time_base;
2038 codec->time_base.num *= icodec->ticks_per_frame;
2041 av_reduce(&codec->time_base.num, &codec->time_base.den,
2042 codec->time_base.num, codec->time_base.den, INT_MAX);
2044 switch(codec->codec_type) {
2045 case AVMEDIA_TYPE_AUDIO:
2046 if(audio_volume != 256) {
2047 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
2050 codec->channel_layout = icodec->channel_layout;
2051 codec->sample_rate = icodec->sample_rate;
2052 codec->channels = icodec->channels;
2053 codec->frame_size = icodec->frame_size;
2054 codec->audio_service_type = icodec->audio_service_type;
2055 codec->block_align= icodec->block_align;
2056 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2057 codec->block_align= 0;
2058 if(codec->codec_id == CODEC_ID_AC3)
2059 codec->block_align= 0;
2061 case AVMEDIA_TYPE_VIDEO:
2062 codec->pix_fmt = icodec->pix_fmt;
2063 codec->width = icodec->width;
2064 codec->height = icodec->height;
2065 codec->has_b_frames = icodec->has_b_frames;
2066 if (!codec->sample_aspect_ratio.num) {
2067 codec->sample_aspect_ratio =
2068 ost->st->sample_aspect_ratio =
2069 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2070 ist->st->codec->sample_aspect_ratio.num ?
2071 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2074 case AVMEDIA_TYPE_SUBTITLE:
2075 codec->width = icodec->width;
2076 codec->height = icodec->height;
2078 case AVMEDIA_TYPE_DATA:
2085 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2086 switch(codec->codec_type) {
2087 case AVMEDIA_TYPE_AUDIO:
2088 ost->fifo= av_fifo_alloc(1024);
2090 return AVERROR(ENOMEM);
2092 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2093 if (!codec->sample_rate) {
2094 codec->sample_rate = icodec->sample_rate;
2096 choose_sample_rate(ost->st, ost->enc);
2097 codec->time_base = (AVRational){1, codec->sample_rate};
2098 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2099 codec->sample_fmt = icodec->sample_fmt;
2100 choose_sample_fmt(ost->st, ost->enc);
2101 if (!codec->channels) {
2102 codec->channels = icodec->channels;
2103 codec->channel_layout = icodec->channel_layout;
2105 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2106 codec->channel_layout = 0;
2107 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2108 icodec->request_channels = codec->channels;
2109 ist->decoding_needed = 1;
2110 ost->encoding_needed = 1;
2111 ost->resample_sample_fmt = icodec->sample_fmt;
2112 ost->resample_sample_rate = icodec->sample_rate;
2113 ost->resample_channels = icodec->channels;
2115 case AVMEDIA_TYPE_VIDEO:
2116 if (codec->pix_fmt == PIX_FMT_NONE)
2117 codec->pix_fmt = icodec->pix_fmt;
2118 choose_pixel_fmt(ost->st, ost->enc);
2120 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2121 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2125 if (!codec->width || !codec->height) {
2126 codec->width = icodec->width;
2127 codec->height = icodec->height;
2130 ost->video_resample = codec->width != icodec->width ||
2131 codec->height != icodec->height ||
2132 codec->pix_fmt != icodec->pix_fmt;
2133 if (ost->video_resample) {
2134 codec->bits_per_raw_sample= frame_bits_per_raw_sample;
2137 ost->resample_height = icodec->height;
2138 ost->resample_width = icodec->width;
2139 ost->resample_pix_fmt= icodec->pix_fmt;
2140 ost->encoding_needed = 1;
2141 ist->decoding_needed = 1;
2143 if (!ost->frame_rate.num)
2144 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2145 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2146 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2147 ost->frame_rate = ost->enc->supported_framerates[idx];
2149 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2150 if( av_q2d(codec->time_base) < 0.001 && video_sync_method
2151 && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
2152 av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
2153 "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
2157 if (configure_video_filters(ist, ost)) {
2158 fprintf(stderr, "Error opening filters!\n");
2163 case AVMEDIA_TYPE_SUBTITLE:
2164 ost->encoding_needed = 1;
2165 ist->decoding_needed = 1;
2172 if (ost->encoding_needed && codec->codec_id != CODEC_ID_H264 &&
2173 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2174 char logfilename[1024];
2177 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2178 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2180 if (codec->flags & CODEC_FLAG_PASS1) {
2181 f = fopen(logfilename, "wb");
2183 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2189 size_t logbuffer_size;
2190 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2191 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2194 codec->stats_in = logbuffer;
2198 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2199 /* maximum video buffer size is 6-bytes per pixel, plus DPX header size */
2200 int size= codec->width * codec->height;
2201 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 1664);
2206 bit_buffer = av_malloc(bit_buffer_size);
2208 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2210 return AVERROR(ENOMEM);
2213 /* open each encoder */
2214 for (i = 0; i < nb_output_streams; i++) {
2215 ost = &output_streams[i];
2216 if (ost->encoding_needed) {
2217 AVCodec *codec = ost->enc;
2218 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2220 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2221 ost->st->codec->codec_id, ost->file_index, ost->index);
2222 ret = AVERROR(EINVAL);
2225 if (dec->subtitle_header) {
2226 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2227 if (!ost->st->codec->subtitle_header) {
2228 ret = AVERROR(ENOMEM);
2231 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2232 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2234 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2235 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2236 ost->file_index, ost->index);
2237 ret = AVERROR(EINVAL);
2240 assert_codec_experimental(ost->st->codec, 1);
2241 assert_avoptions(ost->opts);
2242 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2243 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2244 "It takes bits/s as argument, not kbits/s\n");
2245 extra_size += ost->st->codec->extradata_size;
2249 /* init input streams */
2250 for (i = 0; i < nb_input_streams; i++)
2251 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2254 /* open files and write file headers */
2255 for (i = 0; i < nb_output_files; i++) {
2256 os = output_files[i].ctx;
2257 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2258 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2259 ret = AVERROR(EINVAL);
2262 // assert_avoptions(output_files[i].opts);
2263 if (strcmp(os->oformat->name, "rtp")) {
2269 /* dump the file output parameters - cannot be done before in case
2271 for(i=0;i<nb_output_files;i++) {
2272 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2275 /* dump the stream mapping */
2277 fprintf(stderr, "Stream mapping:\n");
2278 for (i = 0; i < nb_output_streams;i ++) {
2279 ost = &output_streams[i];
2280 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2281 input_streams[ost->source_index].file_index,
2282 input_streams[ost->source_index].st->index,
2285 if (ost->sync_ist != &input_streams[ost->source_index])
2286 fprintf(stderr, " [sync #%d.%d]",
2287 ost->sync_ist->file_index,
2288 ost->sync_ist->st->index);
2289 if (ost->st->stream_copy)
2290 fprintf(stderr, " (copy)");
2292 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2293 input_streams[ost->source_index].dec->name : "?",
2294 ost->enc ? ost->enc->name : "?");
2295 fprintf(stderr, "\n");
2300 fprintf(stderr, "%s\n", error);
2305 print_sdp(output_files, nb_output_files);
2312 * The following code is the main loop of the file converter
2314 static int transcode(OutputFile *output_files,
2315 int nb_output_files,
2316 InputFile *input_files,
2320 AVFormatContext *is, *os;
2324 int no_packet_count=0;
2325 int64_t timer_start;
2328 if (!(no_packet = av_mallocz(nb_input_files)))
2331 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2337 fprintf(stderr, "Press [q] to stop, [?] for help\n");
2338 avio_set_interrupt_cb(decode_interrupt_cb);
2342 timer_start = av_gettime();
2344 for(; received_sigterm == 0;) {
2345 int file_index, ist_index;
2350 ipts_min = INT64_MAX;
2352 /* if 'q' pressed, exits */
2356 /* read_key() returns 0 on EOF */
2360 if (key == '+') verbose++;
2361 if (key == '-') verbose--;
2362 if (key == 's') qp_hist ^= 1;
2365 do_hex_dump = do_pkt_dump = 0;
2366 } else if(do_pkt_dump){
2370 av_log_set_level(AV_LOG_DEBUG);
2372 if (key == 'd' || key == 'D'){
2375 debug = input_streams[0].st->codec->debug<<1;
2376 if(!debug) debug = 1;
2377 while(debug & (FF_DEBUG_DCT_COEFF|FF_DEBUG_VIS_QP|FF_DEBUG_VIS_MB_TYPE)) //unsupported, would just crash
2380 scanf("%d", &debug);
2381 for(i=0;i<nb_input_streams;i++) {
2382 input_streams[i].st->codec->debug = debug;
2384 for(i=0;i<nb_output_streams;i++) {
2385 ost = &output_streams[i];
2386 ost->st->codec->debug = debug;
2388 if(debug) av_log_set_level(AV_LOG_DEBUG);
2389 fprintf(stderr,"debug=%d\n", debug);
2392 fprintf(stderr, "key function\n"
2393 "? show this help\n"
2394 "+ increase verbosity\n"
2395 "- decrease verbosity\n"
2396 "D cycle through available debug modes\n"
2397 "h dump packets/hex press to cycle through the 3 states\n"
2399 "s Show QP histogram\n"
2404 /* select the stream that we must read now by looking at the
2405 smallest output pts */
2407 for (i = 0; i < nb_output_streams; i++) {
2411 ost = &output_streams[i];
2412 of = &output_files[ost->file_index];
2413 os = output_files[ost->file_index].ctx;
2414 ist = &input_streams[ost->source_index];
2415 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2416 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2418 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2420 if (!input_files[ist->file_index].eof_reached){
2421 if(ipts < ipts_min) {
2423 if(input_sync ) file_index = ist->file_index;
2425 if(opts < opts_min) {
2427 if(!input_sync) file_index = ist->file_index;
2430 if (ost->frame_number >= ost->max_frames) {
2432 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2433 output_streams[j].is_past_recording_time = 1;
2437 /* if none, if is finished */
2438 if (file_index < 0) {
2439 if(no_packet_count){
2441 memset(no_packet, 0, nb_input_files);
2448 /* read a frame from it and output it in the fifo */
2449 is = input_files[file_index].ctx;
2450 ret= av_read_frame(is, &pkt);
2451 if(ret == AVERROR(EAGAIN)){
2452 no_packet[file_index]=1;
2457 input_files[file_index].eof_reached = 1;
2465 memset(no_packet, 0, nb_input_files);
2468 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2469 is->streams[pkt.stream_index]);
2471 /* the following test is needed in case new streams appear
2472 dynamically in stream : we ignore them */
2473 if (pkt.stream_index >= input_files[file_index].nb_streams)
2474 goto discard_packet;
2475 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2476 ist = &input_streams[ist_index];
2478 goto discard_packet;
2480 if (pkt.dts != AV_NOPTS_VALUE)
2481 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2482 if (pkt.pts != AV_NOPTS_VALUE)
2483 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2485 if(pkt.pts != AV_NOPTS_VALUE)
2486 pkt.pts *= ist->ts_scale;
2487 if(pkt.dts != AV_NOPTS_VALUE)
2488 pkt.dts *= ist->ts_scale;
2490 // 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);
2491 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2492 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2493 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2494 int64_t delta= pkt_dts - ist->next_pts;
2495 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2496 input_files[ist->file_index].ts_offset -= delta;
2498 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2499 delta, input_files[ist->file_index].ts_offset);
2500 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2501 if(pkt.pts != AV_NOPTS_VALUE)
2502 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2506 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2507 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2510 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2511 ist->file_index, ist->st->index);
2514 av_free_packet(&pkt);
2519 av_free_packet(&pkt);
2521 /* dump report by using the output first video and audio streams */
2522 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2525 /* at the end of stream, we must flush the decoder buffers */
2526 for (i = 0; i < nb_input_streams; i++) {
2527 ist = &input_streams[i];
2528 if (ist->decoding_needed) {
2529 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2532 flush_encoders(output_streams, nb_output_streams);
2536 /* write the trailer if needed and close file */
2537 for(i=0;i<nb_output_files;i++) {
2538 os = output_files[i].ctx;
2539 av_write_trailer(os);
2542 /* dump report by using the first video and audio streams */
2543 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2545 /* close each encoder */
2546 for (i = 0; i < nb_output_streams; i++) {
2547 ost = &output_streams[i];
2548 if (ost->encoding_needed) {
2549 av_freep(&ost->st->codec->stats_in);
2550 avcodec_close(ost->st->codec);
2553 avfilter_graph_free(&ost->graph);
2557 /* close each decoder */
2558 for (i = 0; i < nb_input_streams; i++) {
2559 ist = &input_streams[i];
2560 if (ist->decoding_needed) {
2561 avcodec_close(ist->st->codec);
2569 av_freep(&bit_buffer);
2570 av_freep(&no_packet);
2572 if (output_streams) {
2573 for (i = 0; i < nb_output_streams; i++) {
2574 ost = &output_streams[i];
2576 if (ost->st->stream_copy)
2577 av_freep(&ost->st->codec->extradata);
2579 fclose(ost->logfile);
2580 ost->logfile = NULL;
2582 av_fifo_free(ost->fifo); /* works even if fifo is not
2583 initialized but set to zero */
2584 av_freep(&ost->st->codec->subtitle_header);
2585 av_free(ost->resample_frame.data[0]);
2586 av_free(ost->forced_kf_pts);
2587 if (ost->video_resample)
2588 sws_freeContext(ost->img_resample_ctx);
2590 audio_resample_close(ost->resample);
2591 if (ost->reformat_ctx)
2592 av_audio_convert_free(ost->reformat_ctx);
2593 av_dict_free(&ost->opts);
2600 static int opt_video_rc_override_string(const char *opt, const char *arg)
2602 video_rc_override_string = arg;
2606 static int opt_me_threshold(const char *opt, const char *arg)
2608 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2612 static int opt_verbose(const char *opt, const char *arg)
2614 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2618 static int opt_frame_rate(const char *opt, const char *arg)
2620 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2621 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2627 static int opt_frame_size(const char *opt, const char *arg)
2629 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2630 fprintf(stderr, "Incorrect frame size\n");
2631 return AVERROR(EINVAL);
2636 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2638 if (strcmp(arg, "list")) {
2639 frame_pix_fmt = av_get_pix_fmt(arg);
2640 if (frame_pix_fmt == PIX_FMT_NONE) {
2641 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2642 return AVERROR(EINVAL);
2645 opt_pix_fmts(NULL, NULL);
2651 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2658 p = strchr(arg, ':');
2660 x = strtol(arg, &end, 10);
2662 y = strtol(end+1, &end, 10);
2664 ar = (double)x / (double)y;
2666 ar = strtod(arg, NULL);
2669 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2670 return AVERROR(EINVAL);
2672 frame_aspect_ratio = ar;
2676 static int opt_qscale(const char *opt, const char *arg)
2678 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2679 if (video_qscale <= 0 || video_qscale > 255) {
2680 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2681 return AVERROR(EINVAL);
2686 static int opt_top_field_first(const char *opt, const char *arg)
2688 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2689 return opt_default(opt, arg);
2692 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2694 if (strcmp(arg, "list")) {
2695 audio_sample_fmt = av_get_sample_fmt(arg);
2696 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2697 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2698 return AVERROR(EINVAL);
2703 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2704 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2710 static int opt_audio_rate(const char *opt, const char *arg)
2712 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2716 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2718 return parse_option(o, "codec:a", arg, options);
2721 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2723 return parse_option(o, "codec:v", arg, options);
2726 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2728 return parse_option(o, "codec:s", arg, options);
2731 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2733 return parse_option(o, "codec:d", arg, options);
2736 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2738 StreamMap *m = NULL;
2739 int i, negative = 0, file_idx;
2740 int sync_file_idx = -1, sync_stream_idx;
2748 map = av_strdup(arg);
2750 /* parse sync stream first, just pick first matching stream */
2751 if (sync = strchr(map, ',')) {
2753 sync_file_idx = strtol(sync + 1, &sync, 0);
2754 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2755 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2760 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2761 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2762 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2763 sync_stream_idx = i;
2766 if (i == input_files[sync_file_idx].nb_streams) {
2767 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2768 "match any streams.\n", arg);
2774 file_idx = strtol(map, &p, 0);
2775 if (file_idx >= nb_input_files || file_idx < 0) {
2776 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2780 /* disable some already defined maps */
2781 for (i = 0; i < o->nb_stream_maps; i++) {
2782 m = &o->stream_maps[i];
2783 if (check_stream_specifier(input_files[m->file_index].ctx,
2784 input_files[m->file_index].ctx->streams[m->stream_index],
2785 *p == ':' ? p + 1 : p) > 0)
2789 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2790 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2791 *p == ':' ? p + 1 : p) <= 0)
2793 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2794 &o->nb_stream_maps, o->nb_stream_maps + 1);
2795 m = &o->stream_maps[o->nb_stream_maps - 1];
2797 m->file_index = file_idx;
2798 m->stream_index = i;
2800 if (sync_file_idx >= 0) {
2801 m->sync_file_index = sync_file_idx;
2802 m->sync_stream_index = sync_stream_idx;
2804 m->sync_file_index = file_idx;
2805 m->sync_stream_index = i;
2810 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2818 static void parse_meta_type(char *arg, char *type, int *index)
2828 if (*(++arg) == ':')
2829 *index = strtol(++arg, NULL, 0);
2832 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2839 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2841 MetadataMap *m, *m1;
2844 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2845 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2847 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2848 m->file = strtol(arg, &p, 0);
2849 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2851 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2852 if (p = strchr(opt, ':'))
2853 parse_meta_type(p + 1, &m1->type, &m1->index);
2857 if (m->type == 'g' || m1->type == 'g')
2858 o->metadata_global_manual = 1;
2859 if (m->type == 's' || m1->type == 's')
2860 o->metadata_streams_manual = 1;
2861 if (m->type == 'c' || m1->type == 'c')
2862 o->metadata_chapters_manual = 1;
2867 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2869 const char *codec_string = encoder ? "encoder" : "decoder";
2873 return CODEC_ID_NONE;
2875 avcodec_find_encoder_by_name(name) :
2876 avcodec_find_decoder_by_name(name);
2878 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2881 if(codec->type != type) {
2882 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2888 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2890 char *codec_name = NULL;
2892 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2896 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2897 return avcodec_find_encoder(st->codec->codec_id);
2899 } else if (!strcmp(codec_name, "copy"))
2900 st->stream_copy = 1;
2902 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2903 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2904 avcodec_find_decoder_by_name(codec_name);
2911 * Add all the streams from the given input file to the global
2912 * list of input streams.
2914 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2916 int i, rfps, rfps_base;
2918 for (i = 0; i < ic->nb_streams; i++) {
2919 AVStream *st = ic->streams[i];
2920 AVCodecContext *dec = st->codec;
2924 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2925 ist = &input_streams[nb_input_streams - 1];
2927 ist->file_index = nb_input_files;
2929 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2931 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2932 ist->ts_scale = scale;
2934 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2936 ist->dec = avcodec_find_decoder(dec->codec_id);
2938 switch (dec->codec_type) {
2939 case AVMEDIA_TYPE_AUDIO:
2941 ist->dec = avcodec_find_decoder(dec->codec_id);
2942 if(o->audio_disable)
2943 st->discard= AVDISCARD_ALL;
2945 case AVMEDIA_TYPE_VIDEO:
2947 ist->dec = avcodec_find_decoder(dec->codec_id);
2948 rfps = ic->streams[i]->r_frame_rate.num;
2949 rfps_base = ic->streams[i]->r_frame_rate.den;
2951 dec->flags |= CODEC_FLAG_EMU_EDGE;
2954 dec->debug |= FF_DEBUG_MV;
2956 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2959 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2960 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2962 (float)rfps / rfps_base, rfps, rfps_base);
2965 if (o->video_disable)
2966 st->discard= AVDISCARD_ALL;
2967 else if(video_discard)
2968 st->discard= video_discard;
2970 case AVMEDIA_TYPE_DATA:
2972 case AVMEDIA_TYPE_SUBTITLE:
2974 ist->dec = avcodec_find_decoder(dec->codec_id);
2975 if(o->subtitle_disable)
2976 st->discard = AVDISCARD_ALL;
2978 case AVMEDIA_TYPE_ATTACHMENT:
2979 case AVMEDIA_TYPE_UNKNOWN:
2987 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2989 AVFormatContext *ic;
2990 AVInputFormat *file_iformat = NULL;
2994 AVDictionary **opts;
2995 int orig_nb_streams; // number of streams before avformat_find_stream_info
2998 if (!(file_iformat = av_find_input_format(o->format))) {
2999 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
3004 if (!strcmp(filename, "-"))
3007 using_stdin |= !strncmp(filename, "pipe:", 5) ||
3008 !strcmp(filename, "/dev/stdin");
3010 /* get default parameters from command line */
3011 ic = avformat_alloc_context();
3013 print_error(filename, AVERROR(ENOMEM));
3016 if (audio_sample_rate) {
3017 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
3018 av_dict_set(&format_opts, "sample_rate", buf, 0);
3020 if (o->nb_audio_channels) {
3021 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
3022 av_dict_set(&format_opts, "channels", buf, 0);
3024 if (frame_rate.num) {
3025 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
3026 av_dict_set(&format_opts, "framerate", buf, 0);
3028 if (frame_width && frame_height) {
3029 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
3030 av_dict_set(&format_opts, "video_size", buf, 0);
3032 if (frame_pix_fmt != PIX_FMT_NONE)
3033 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
3035 ic->flags |= AVFMT_FLAG_NONBLOCK;
3037 /* open the input file with generic libav function */
3038 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
3040 print_error(filename, err);
3043 assert_avoptions(format_opts);
3048 for(i=0; i<ic->nb_streams; i++){
3049 ic->streams[i]->discard= AVDISCARD_ALL;
3051 for(i=0; i<ic->nb_programs; i++){
3052 AVProgram *p= ic->programs[i];
3053 if(p->id != opt_programid){
3054 p->discard = AVDISCARD_ALL;
3057 for(j=0; j<p->nb_stream_indexes; j++){
3058 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3063 fprintf(stderr, "Specified program id not found\n");
3069 /* apply forced codec ids */
3070 for (i = 0; i < ic->nb_streams; i++)
3071 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
3073 /* Set AVCodecContext options for avformat_find_stream_info */
3074 opts = setup_find_stream_info_opts(ic, codec_opts);
3075 orig_nb_streams = ic->nb_streams;
3077 /* If not enough info to get the stream parameters, we decode the
3078 first frames to get it. (used in mpeg case for example) */
3079 ret = avformat_find_stream_info(ic, opts);
3080 if (ret < 0 && verbose >= 0) {
3081 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3082 av_close_input_file(ic);
3086 timestamp = o->start_time;
3087 /* add the stream start time */
3088 if (ic->start_time != AV_NOPTS_VALUE)
3089 timestamp += ic->start_time;
3091 /* if seeking requested, we execute it */
3092 if (o->start_time != 0) {
3093 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3095 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3096 filename, (double)timestamp / AV_TIME_BASE);
3100 /* update the current parameters so that they match the one of the input stream */
3101 add_input_streams(o, ic);
3103 /* dump the file content */
3105 av_dump_format(ic, nb_input_files, filename, 0);
3107 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3108 input_files[nb_input_files - 1].ctx = ic;
3109 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3110 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3111 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3113 top_field_first = -1;
3114 frame_rate = (AVRational){0, 0};
3115 frame_pix_fmt = PIX_FMT_NONE;
3118 audio_sample_rate = 0;
3119 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3121 for (i = 0; i < orig_nb_streams; i++)
3122 av_dict_free(&opts[i]);
3129 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3130 AVCodecContext *avctx)
3136 for (p = kf; *p; p++)
3139 ost->forced_kf_count = n;
3140 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3141 if (!ost->forced_kf_pts) {
3142 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3145 for (i = 0; i < n; i++) {
3146 p = i ? strchr(p, ',') + 1 : kf;
3147 t = parse_time_or_die("force_key_frames", p, 1);
3148 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3152 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3155 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3156 int idx = oc->nb_streams - 1;
3157 int64_t max_frames = INT64_MAX;
3158 char *bsf = NULL, *next, *codec_tag = NULL;
3159 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3162 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3166 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3167 nb_output_streams + 1);
3168 ost = &output_streams[nb_output_streams - 1];
3169 ost->file_index = nb_output_files;
3172 st->codec->codec_type = type;
3173 ost->enc = choose_codec(o, oc, st, type);
3175 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3178 avcodec_get_context_defaults3(st->codec, ost->enc);
3179 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3181 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3182 ost->max_frames = max_frames;
3184 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3186 if (next = strchr(bsf, ','))
3188 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3189 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3193 bsfc_prev->next = bsfc;
3195 ost->bitstream_filters = bsfc;
3201 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3203 uint32_t tag = strtol(codec_tag, &next, 0);
3205 tag = AV_RL32(codec_tag);
3206 st->codec->codec_tag = tag;
3209 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3213 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3217 AVCodecContext *video_enc;
3219 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3221 if (!st->stream_copy) {
3222 ost->frame_aspect_ratio = frame_aspect_ratio;
3223 frame_aspect_ratio = 0;
3225 ost->avfilter = vfilters;
3230 video_enc = st->codec;
3232 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3233 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3236 if (st->stream_copy) {
3237 video_enc->sample_aspect_ratio =
3238 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3244 ost->frame_rate = frame_rate;
3246 video_enc->width = frame_width;
3247 video_enc->height = frame_height;
3248 video_enc->pix_fmt = frame_pix_fmt;
3249 video_enc->bits_per_raw_sample = frame_bits_per_raw_sample;
3250 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3252 if (video_qscale || same_quant) {
3253 video_enc->flags |= CODEC_FLAG_QSCALE;
3254 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3258 video_enc->intra_matrix = intra_matrix;
3260 video_enc->inter_matrix = inter_matrix;
3262 p= video_rc_override_string;
3265 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3267 fprintf(stderr, "error parsing rc_override\n");
3270 video_enc->rc_override=
3271 av_realloc(video_enc->rc_override,
3272 sizeof(RcOverride)*(i+1));
3273 video_enc->rc_override[i].start_frame= start;
3274 video_enc->rc_override[i].end_frame = end;
3276 video_enc->rc_override[i].qscale= q;
3277 video_enc->rc_override[i].quality_factor= 1.0;
3280 video_enc->rc_override[i].qscale= 0;
3281 video_enc->rc_override[i].quality_factor= -q/100.0;
3286 video_enc->rc_override_count=i;
3287 if (!video_enc->rc_initial_buffer_occupancy)
3288 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3289 video_enc->me_threshold= me_threshold;
3290 video_enc->intra_dc_precision= intra_dc_precision - 8;
3293 video_enc->flags|= CODEC_FLAG_PSNR;
3298 video_enc->flags |= CODEC_FLAG_PASS1;
3300 video_enc->flags |= CODEC_FLAG_PASS2;
3304 if (forced_key_frames)
3305 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3308 /* reset some key parameters */
3309 av_freep(&forced_key_frames);
3310 frame_pix_fmt = PIX_FMT_NONE;
3314 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3318 AVCodecContext *audio_enc;
3320 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3323 audio_enc = st->codec;
3324 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3326 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3327 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3329 if (!st->stream_copy) {
3330 if (audio_qscale > QSCALE_NONE) {
3331 audio_enc->flags |= CODEC_FLAG_QSCALE;
3332 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3334 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3336 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3337 audio_enc->sample_fmt = audio_sample_fmt;
3338 if (audio_sample_rate)
3339 audio_enc->sample_rate = audio_sample_rate;
3345 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3349 AVCodecContext *data_enc;
3351 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3353 data_enc = st->codec;
3354 if (!st->stream_copy) {
3355 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3359 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3360 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3366 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3370 AVCodecContext *subtitle_enc;
3372 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3374 subtitle_enc = st->codec;
3376 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3378 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3379 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3385 /* arg format is "output-stream-index:streamid-value". */
3386 static int opt_streamid(const char *opt, const char *arg)
3392 av_strlcpy(idx_str, arg, sizeof(idx_str));
3393 p = strchr(idx_str, ':');
3396 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3401 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, MAX_STREAMS-1);
3402 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3403 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3407 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3409 AVFormatContext *is = ifile->ctx;
3410 AVFormatContext *os = ofile->ctx;
3413 for (i = 0; i < is->nb_chapters; i++) {
3414 AVChapter *in_ch = is->chapters[i], *out_ch;
3415 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3416 AV_TIME_BASE_Q, in_ch->time_base);
3417 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3418 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3421 if (in_ch->end < ts_off)
3423 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3426 out_ch = av_mallocz(sizeof(AVChapter));
3428 return AVERROR(ENOMEM);
3430 out_ch->id = in_ch->id;
3431 out_ch->time_base = in_ch->time_base;
3432 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3433 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3436 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3439 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3441 return AVERROR(ENOMEM);
3442 os->chapters[os->nb_chapters - 1] = out_ch;
3447 static int read_ffserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3450 AVFormatContext *ic = NULL;
3452 err = avformat_open_input(&ic, filename, NULL, NULL);
3455 /* copy stream format */
3456 for(i=0;i<ic->nb_streams;i++) {
3461 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3462 ost = new_output_stream(o, s, codec->type);
3465 // FIXME: a more elegant solution is needed
3466 memcpy(st, ic->streams[i], sizeof(AVStream));
3467 st->info = av_malloc(sizeof(*st->info));
3468 memcpy(st->info, ic->streams[i]->info, sizeof(*st->info));
3469 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3471 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3472 choose_sample_fmt(st, codec);
3473 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3474 choose_pixel_fmt(st, codec);
3477 av_close_input_file(ic);
3481 static void opt_output_file(void *optctx, const char *filename)
3483 OptionsContext *o = optctx;
3484 AVFormatContext *oc;
3486 AVOutputFormat *file_oformat;
3490 if (!strcmp(filename, "-"))
3493 err = avformat_alloc_output_context2(&oc, NULL, o->format, filename);
3495 print_error(filename, err);
3499 file_oformat= oc->oformat;
3501 if (!strcmp(file_oformat->name, "ffm") &&
3502 av_strstart(filename, "http:", NULL)) {
3503 /* special case for files sent to ffserver: we get the stream
3504 parameters from ffserver */
3505 int err = read_ffserver_streams(o, oc, filename);
3507 print_error(filename, err);
3510 } else if (!o->nb_stream_maps) {
3511 /* pick the "best" stream of each type */
3512 #define NEW_STREAM(type, index)\
3514 ost = new_ ## type ## _stream(o, oc);\
3515 ost->source_index = index;\
3516 ost->sync_ist = &input_streams[index];\
3517 input_streams[index].discard = 0;\
3520 /* video: highest resolution */
3521 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3522 int area = 0, idx = -1;
3523 for (i = 0; i < nb_input_streams; i++) {
3524 ist = &input_streams[i];
3525 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3526 ist->st->codec->width * ist->st->codec->height > area) {
3527 area = ist->st->codec->width * ist->st->codec->height;
3531 NEW_STREAM(video, idx);
3534 /* audio: most channels */
3535 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3536 int channels = 0, idx = -1;
3537 for (i = 0; i < nb_input_streams; i++) {
3538 ist = &input_streams[i];
3539 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3540 ist->st->codec->channels > channels) {
3541 channels = ist->st->codec->channels;
3545 NEW_STREAM(audio, idx);
3548 /* subtitles: pick first */
3549 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3550 for (i = 0; i < nb_input_streams; i++)
3551 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3552 NEW_STREAM(subtitle, i);
3556 /* do something with data? */
3558 for (i = 0; i < o->nb_stream_maps; i++) {
3559 StreamMap *map = &o->stream_maps[i];
3564 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3565 switch (ist->st->codec->codec_type) {
3566 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3567 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3568 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3569 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3571 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3572 map->file_index, map->stream_index);
3576 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3577 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3578 map->sync_stream_index];
3583 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3584 output_files[nb_output_files - 1].ctx = oc;
3585 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3586 output_files[nb_output_files - 1].recording_time = o->recording_time;
3587 output_files[nb_output_files - 1].start_time = o->start_time;
3588 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3589 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3591 /* check filename in case of an image number is expected */
3592 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3593 if (!av_filename_number_test(oc->filename)) {
3594 print_error(oc->filename, AVERROR(EINVAL));
3599 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3600 /* test if it already exists to avoid loosing precious files */
3601 if (!file_overwrite &&
3602 (strchr(filename, ':') == NULL ||
3603 filename[1] == ':' ||
3604 av_strstart(filename, "file:", NULL))) {
3605 if (avio_check(filename, 0) == 0) {
3607 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3609 if (!read_yesno()) {
3610 fprintf(stderr, "Not overwriting - exiting\n");
3615 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3622 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3623 print_error(filename, err);
3628 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3629 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3632 if (o->chapters_input_file >= nb_input_files) {
3633 if (o->chapters_input_file == INT_MAX) {
3634 /* copy chapters from the first input file that has them*/
3635 o->chapters_input_file = -1;
3636 for (i = 0; i < nb_input_files; i++)
3637 if (input_files[i].ctx->nb_chapters) {
3638 o->chapters_input_file = i;
3642 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3643 o->chapters_input_file);
3647 if (o->chapters_input_file >= 0)
3648 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3649 o->metadata_chapters_manual);
3652 for (i = 0; i < o->nb_meta_data_maps; i++) {
3653 AVFormatContext *files[2];
3654 AVDictionary **meta[2];
3657 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3658 if ((index) < 0 || (index) >= (nb_elems)) {\
3659 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3664 int in_file_index = o->meta_data_maps[i][1].file;
3665 if (in_file_index < 0)
3667 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3670 files[1] = input_files[in_file_index].ctx;
3672 for (j = 0; j < 2; j++) {
3673 MetadataMap *map = &o->meta_data_maps[i][j];
3675 switch (map->type) {
3677 meta[j] = &files[j]->metadata;
3680 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3681 meta[j] = &files[j]->streams[map->index]->metadata;
3684 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3685 meta[j] = &files[j]->chapters[map->index]->metadata;
3688 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3689 meta[j] = &files[j]->programs[map->index]->metadata;
3694 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3697 /* copy global metadata by default */
3698 if (!o->metadata_global_manual && nb_input_files)
3699 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3700 AV_DICT_DONT_OVERWRITE);
3701 if (!o->metadata_streams_manual)
3702 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3703 InputStream *ist = &input_streams[output_streams[i].source_index];
3704 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3707 /* process manually set metadata */
3708 for (i = 0; i < o->nb_metadata; i++) {
3713 val = strchr(o->metadata[i].u.str, '=');
3715 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3716 o->metadata[i].u.str);
3721 parse_meta_type(o->metadata[i].specifier, &type, &index);
3727 if (index < 0 || index >= oc->nb_streams) {
3728 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3731 m = &oc->streams[i]->metadata;
3734 if (index < 0 || index >= oc->nb_chapters) {
3735 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3738 m = &oc->chapters[i]->metadata;
3741 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3745 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3748 frame_rate = (AVRational){0, 0};
3751 audio_sample_rate = 0;
3752 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3754 av_freep(&streamid_map);
3755 nb_streamid_map = 0;
3757 av_freep(&forced_key_frames);
3761 /* same option as mencoder */
3762 static int opt_pass(const char *opt, const char *arg)
3764 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3768 static int64_t getutime(void)
3771 struct rusage rusage;
3773 getrusage(RUSAGE_SELF, &rusage);
3774 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3775 #elif HAVE_GETPROCESSTIMES
3777 FILETIME c, e, k, u;
3778 proc = GetCurrentProcess();
3779 GetProcessTimes(proc, &c, &e, &k, &u);
3780 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3782 return av_gettime();
3786 static int64_t getmaxrss(void)
3788 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3789 struct rusage rusage;
3790 getrusage(RUSAGE_SELF, &rusage);
3791 return (int64_t)rusage.ru_maxrss * 1024;
3792 #elif HAVE_GETPROCESSMEMORYINFO
3794 PROCESS_MEMORY_COUNTERS memcounters;
3795 proc = GetCurrentProcess();
3796 memcounters.cb = sizeof(memcounters);
3797 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3798 return memcounters.PeakPagefileUsage;
3804 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3807 const char *p = str;
3814 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3821 static int opt_inter_matrix(const char *opt, const char *arg)
3823 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3824 parse_matrix_coeffs(inter_matrix, arg);
3828 static int opt_intra_matrix(const char *opt, const char *arg)
3830 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3831 parse_matrix_coeffs(intra_matrix, arg);
3835 static void show_usage(void)
3837 printf("Hyper fast Audio and Video encoder\n");
3838 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3842 static int opt_help(const char *opt, const char *arg)
3845 AVOutputFormat *oformat = NULL;
3846 AVInputFormat *iformat = NULL;
3847 const AVClass *class;
3849 av_log_set_callback(log_callback_help);
3851 show_help_options(options, "Main options:\n",
3852 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3853 show_help_options(options, "\nAdvanced options:\n",
3854 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3856 show_help_options(options, "\nVideo options:\n",
3857 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3859 show_help_options(options, "\nAdvanced Video options:\n",
3860 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3861 OPT_VIDEO | OPT_EXPERT);
3862 show_help_options(options, "\nAudio options:\n",
3863 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3865 show_help_options(options, "\nAdvanced Audio options:\n",
3866 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3867 OPT_AUDIO | OPT_EXPERT);
3868 show_help_options(options, "\nSubtitle options:\n",
3869 OPT_SUBTITLE | OPT_GRAB,
3871 show_help_options(options, "\nAudio/Video grab options:\n",
3875 class = avcodec_get_class();
3876 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3879 /* individual codec options */
3881 while ((c = av_codec_next(c))) {
3882 if (c->priv_class) {
3883 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3888 class = avformat_get_class();
3889 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3892 /* individual muxer options */
3893 while ((oformat = av_oformat_next(oformat))) {
3894 if (oformat->priv_class) {
3895 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3900 /* individual demuxer options */
3901 while ((iformat = av_iformat_next(iformat))) {
3902 if (iformat->priv_class) {
3903 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3908 class = sws_get_class();
3909 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3913 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3915 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3916 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3918 if(!strncmp(arg, "pal-", 4)) {
3921 } else if(!strncmp(arg, "ntsc-", 5)) {
3924 } else if(!strncmp(arg, "film-", 5)) {
3929 /* Calculate FR via float to avoid int overflow */
3930 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3933 } else if((fr == 29970) || (fr == 23976)) {
3936 /* Try to determine PAL/NTSC by peeking in the input files */
3937 if(nb_input_files) {
3939 for (j = 0; j < nb_input_files; j++) {
3940 for (i = 0; i < input_files[j].nb_streams; i++) {
3941 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3942 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3944 fr = c->time_base.den * 1000 / c->time_base.num;
3948 } else if((fr == 29970) || (fr == 23976)) {
3958 if(verbose > 0 && norm != UNKNOWN)
3959 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3962 if(norm == UNKNOWN) {
3963 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3964 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3965 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3969 if(!strcmp(arg, "vcd")) {
3970 opt_video_codec(o, "c:v", "mpeg1video");
3971 opt_audio_codec(o, "c:a", "mp2");
3972 parse_option(o, "f", "vcd", options);
3974 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3975 opt_frame_rate("r", frame_rates[norm]);
3976 opt_default("g", norm == PAL ? "15" : "18");
3978 opt_default("b", "1150000");
3979 opt_default("maxrate", "1150000");
3980 opt_default("minrate", "1150000");
3981 opt_default("bufsize", "327680"); // 40*1024*8;
3983 opt_default("b:a", "224000");
3984 audio_sample_rate = 44100;
3985 parse_option(o, "ac", "2", options);
3987 opt_default("packetsize", "2324");
3988 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3990 /* We have to offset the PTS, so that it is consistent with the SCR.
3991 SCR starts at 36000, but the first two packs contain only padding
3992 and the first pack from the other stream, respectively, may also have
3993 been written before.
3994 So the real data starts at SCR 36000+3*1200. */
3995 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3996 } else if(!strcmp(arg, "svcd")) {
3998 opt_video_codec(o, "c:v", "mpeg2video");
3999 opt_audio_codec(o, "c:a", "mp2");
4000 parse_option(o, "f", "svcd", options);
4002 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
4003 opt_frame_rate("r", frame_rates[norm]);
4004 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4005 opt_default("g", norm == PAL ? "15" : "18");
4007 opt_default("b", "2040000");
4008 opt_default("maxrate", "2516000");
4009 opt_default("minrate", "0"); //1145000;
4010 opt_default("bufsize", "1835008"); //224*1024*8;
4011 opt_default("flags", "+scan_offset");
4014 opt_default("b:a", "224000");
4015 audio_sample_rate = 44100;
4017 opt_default("packetsize", "2324");
4019 } else if(!strcmp(arg, "dvd")) {
4021 opt_video_codec(o, "c:v", "mpeg2video");
4022 opt_audio_codec(o, "c:a", "ac3");
4023 parse_option(o, "f", "dvd", options);
4025 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
4026 opt_frame_rate("r", frame_rates[norm]);
4027 opt_frame_pix_fmt("pix_fmt", "yuv420p");
4028 opt_default("g", norm == PAL ? "15" : "18");
4030 opt_default("b", "6000000");
4031 opt_default("maxrate", "9000000");
4032 opt_default("minrate", "0"); //1500000;
4033 opt_default("bufsize", "1835008"); //224*1024*8;
4035 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4036 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4038 opt_default("b:a", "448000");
4039 audio_sample_rate = 48000;
4041 } else if(!strncmp(arg, "dv", 2)) {
4043 parse_option(o, "f", "dv", options);
4045 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
4046 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4047 norm == PAL ? "yuv420p" : "yuv411p");
4048 opt_frame_rate("r", frame_rates[norm]);
4050 audio_sample_rate = 48000;
4051 parse_option(o, "ac", "2", options);
4054 fprintf(stderr, "Unknown target: %s\n", arg);
4055 return AVERROR(EINVAL);
4060 static int opt_vstats_file(const char *opt, const char *arg)
4062 av_free (vstats_filename);
4063 vstats_filename=av_strdup (arg);
4067 static int opt_vstats(const char *opt, const char *arg)
4070 time_t today2 = time(NULL);
4071 struct tm *today = localtime(&today2);
4073 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4075 return opt_vstats_file(opt, filename);
4078 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4080 return parse_option(o, "frames:v", arg, options);
4083 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4085 return parse_option(o, "frames:a", arg, options);
4088 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4090 return parse_option(o, "frames:d", arg, options);
4093 static void log_callback_null(void* ptr, int level, const char* fmt, va_list vl)
4097 static int opt_passlogfile(const char *opt, const char *arg)
4099 pass_logfilename_prefix = arg;
4100 #if CONFIG_LIBX264_ENCODER
4101 return opt_default("passlogfile", arg);
4107 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4109 return parse_option(o, "tag:v", arg, options);
4112 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4114 return parse_option(o, "tag:a", arg, options);
4117 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4119 return parse_option(o, "tag:s", arg, options);
4122 #define OFFSET(x) offsetof(OptionsContext, x)
4123 static const OptionDef options[] = {
4125 #include "cmdutils_common_opts.h"
4126 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4127 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4128 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4129 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4130 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4131 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4132 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4133 "outfile[,metadata]:infile[,metadata]" },
4134 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4135 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4136 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4137 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4138 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4139 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4140 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4141 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4142 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4143 "add timings for benchmarking" },
4144 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4145 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4146 "dump each input packet" },
4147 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4148 "when dumping packets, also dump the payload" },
4149 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4150 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4151 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4152 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4153 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4154 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4155 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4156 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4157 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4158 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4159 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4160 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4161 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4162 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4163 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4166 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4167 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4168 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4169 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4170 { "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" },
4171 { "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" },
4172 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4173 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4174 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4175 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4176 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4177 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4178 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4179 "use same quantizer as source (implies VBR)" },
4180 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4181 { "passlogfile", HAS_ARG | OPT_VIDEO, {(void*)&opt_passlogfile}, "select two pass log file name prefix", "prefix" },
4182 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4183 "deinterlace pictures" },
4184 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4185 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4186 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4188 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4190 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4191 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4192 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4193 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4194 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4195 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4196 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4197 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4198 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4201 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4202 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4203 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4204 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4205 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4206 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4207 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4208 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4209 { "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" },
4211 /* subtitle options */
4212 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4213 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4214 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4217 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4220 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4221 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4223 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4225 /* data codec support */
4226 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4228 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4232 int main(int argc, char **argv)
4234 OptionsContext o = { 0 };
4239 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4241 if(argc>1 && !strcmp(argv[1], "-d")){
4244 av_log_set_callback(log_callback_null);
4249 avcodec_register_all();
4251 avdevice_register_all();
4254 avfilter_register_all();
4259 if(isatty(STDIN_FILENO))
4260 avio_set_interrupt_cb(decode_interrupt_cb);
4267 parse_options(&o, argc, argv, options, opt_output_file);
4269 if(nb_output_files <= 0 && nb_input_files == 0) {
4271 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4275 /* file converter / grab */
4276 if (nb_output_files <= 0) {
4277 fprintf(stderr, "At least one output file must be specified\n");
4281 if (nb_input_files == 0) {
4282 fprintf(stderr, "At least one input file must be specified\n");
4287 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4289 ti = getutime() - ti;
4291 int maxrss = getmaxrss() / 1024;
4292 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);