3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
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"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "avconv";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
82 int disabled; /** 1 is this mapping is disabled by a negative map */
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct MetadataMap {
93 int file; ///< file index
94 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; ///< stream/chapter/program number
98 static const OptionDef options[];
100 static int video_discard = 0;
101 static int same_quant = 0;
102 static int do_deinterlace = 0;
103 static int intra_dc_precision = 8;
104 static int qp_hist = 0;
106 static int file_overwrite = 0;
107 static int do_benchmark = 0;
108 static int do_hex_dump = 0;
109 static int do_pkt_dump = 0;
110 static int do_pass = 0;
111 static char *pass_logfilename_prefix = NULL;
112 static int video_sync_method= -1;
113 static int audio_sync_method= 0;
114 static float audio_drift_threshold= 0.1;
115 static int copy_ts= 0;
117 static int opt_shortest = 0;
118 static char *vstats_filename;
119 static FILE *vstats_file;
120 static int copy_initial_nonkeyframes = 0;
122 static int audio_volume = 256;
124 static int exit_on_error = 0;
125 static int using_stdin = 0;
126 static int verbose = 1;
127 static int64_t video_size = 0;
128 static int64_t audio_size = 0;
129 static int64_t extra_size = 0;
130 static int nb_frames_dup = 0;
131 static int nb_frames_drop = 0;
132 static int input_sync;
134 static float dts_delta_threshold = 10;
136 static uint8_t *audio_buf;
137 static uint8_t *audio_out;
138 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
140 static short *samples;
142 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
144 typedef struct InputStream {
147 int discard; /* true if stream data should be discarded */
148 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
151 int64_t start; /* time when read started */
152 int64_t next_pts; /* synthetic pts for cases where pkt.pts
154 int64_t pts; /* current pts */
155 PtsCorrectionContext pts_ctx;
157 int is_start; /* is 1 at the start and after a discontinuity */
158 int showed_multi_packet_warning;
162 typedef struct InputFile {
163 AVFormatContext *ctx;
164 int eof_reached; /* true if eof reached */
165 int ist_index; /* index of first stream in ist_table */
166 int buffer_size; /* current total buffer size */
168 int nb_streams; /* number of stream that avconv is aware of; may be different
169 from ctx.nb_streams if new streams appear during av_read_frame() */
173 typedef struct OutputStream {
174 int file_index; /* file index */
175 int index; /* stream index in the output file */
176 int source_index; /* InputStream index */
177 AVStream *st; /* stream in the output file */
178 int encoding_needed; /* true if encoding needed for this stream */
180 /* input pts and corresponding output pts
182 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
183 struct InputStream *sync_ist; /* input stream to sync against */
184 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
185 AVBitStreamFilterContext *bitstream_filters;
191 AVFrame pict_tmp; /* temporary image for resampling */
192 struct SwsContext *img_resample_ctx; /* for image resampling */
195 int resample_pix_fmt;
196 AVRational frame_rate;
200 float frame_aspect_ratio;
202 /* forced key frames */
203 int64_t *forced_kf_pts;
209 ReSampleContext *resample; /* for audio resampling */
210 int resample_sample_fmt;
211 int resample_channels;
212 int resample_sample_rate;
214 AVAudioConvert *reformat_ctx;
215 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
219 AVFilterContext *output_video_filter;
220 AVFilterContext *input_video_filter;
221 AVFilterBufferRef *picref;
223 AVFilterGraph *graph;
228 int is_past_recording_time;
232 typedef struct OutputFile {
233 AVFormatContext *ctx;
235 int ost_index; /* index of the first stream in output_streams */
236 int64_t recording_time; /* desired length of the resulting file in microseconds */
237 int64_t start_time; /* start time in microseconds */
238 uint64_t limit_filesize;
241 static InputStream *input_streams = NULL;
242 static int nb_input_streams = 0;
243 static InputFile *input_files = NULL;
244 static int nb_input_files = 0;
246 static OutputStream *output_streams = NULL;
247 static int nb_output_streams = 0;
248 static OutputFile *output_files = NULL;
249 static int nb_output_files = 0;
251 typedef struct OptionsContext {
252 /* input/output options */
256 SpecifierOpt *codec_names;
258 SpecifierOpt *audio_channels;
259 int nb_audio_channels;
260 SpecifierOpt *audio_sample_rate;
261 int nb_audio_sample_rate;
262 SpecifierOpt *frame_rates;
264 SpecifierOpt *frame_sizes;
266 SpecifierOpt *frame_pix_fmts;
267 int nb_frame_pix_fmts;
270 int64_t input_ts_offset;
273 SpecifierOpt *ts_scale;
277 StreamMap *stream_maps;
279 /* first item specifies output metadata, second is input */
280 MetadataMap (*meta_data_maps)[2];
281 int nb_meta_data_maps;
282 int metadata_global_manual;
283 int metadata_streams_manual;
284 int metadata_chapters_manual;
286 int chapters_input_file;
288 int64_t recording_time;
289 uint64_t limit_filesize;
295 int subtitle_disable;
298 /* indexed by output file stream index */
302 SpecifierOpt *metadata;
304 SpecifierOpt *max_frames;
306 SpecifierOpt *bitstream_filters;
307 int nb_bitstream_filters;
308 SpecifierOpt *codec_tags;
310 SpecifierOpt *sample_fmts;
312 SpecifierOpt *qscale;
314 SpecifierOpt *forced_key_frames;
315 int nb_forced_key_frames;
316 SpecifierOpt *force_fps;
318 SpecifierOpt *frame_aspect_ratios;
319 int nb_frame_aspect_ratios;
320 SpecifierOpt *rc_overrides;
322 SpecifierOpt *intra_matrices;
323 int nb_intra_matrices;
324 SpecifierOpt *inter_matrices;
325 int nb_inter_matrices;
326 SpecifierOpt *top_field_first;
327 int nb_top_field_first;
329 SpecifierOpt *filters;
334 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
337 for (i = 0; i < o->nb_ ## name; i++) {\
338 char *spec = o->name[i].specifier;\
339 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
340 outvar = o->name[i].u.type;\
346 static void reset_options(OptionsContext *o)
348 const OptionDef *po = options;
350 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
352 void *dst = (uint8_t*)o + po->u.off;
354 if (po->flags & OPT_SPEC) {
355 SpecifierOpt **so = dst;
356 int i, *count = (int*)(so + 1);
357 for (i = 0; i < *count; i++) {
358 av_freep(&(*so)[i].specifier);
359 if (po->flags & OPT_STRING)
360 av_freep(&(*so)[i].u.str);
364 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
369 av_freep(&o->stream_maps);
370 av_freep(&o->meta_data_maps);
371 av_freep(&o->streamid_map);
373 memset(o, 0, sizeof(*o));
375 o->mux_preload = 0.5;
376 o->mux_max_delay = 0.7;
377 o->recording_time = INT64_MAX;
378 o->limit_filesize = UINT64_MAX;
379 o->chapters_input_file = INT_MAX;
387 static int configure_video_filters(InputStream *ist, OutputStream *ost)
389 AVFilterContext *last_filter, *filter;
390 /** filter graph containing all filters including input & output */
391 AVCodecContext *codec = ost->st->codec;
392 AVCodecContext *icodec = ist->st->codec;
393 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
394 AVRational sample_aspect_ratio;
398 ost->graph = avfilter_graph_alloc();
400 if (ist->st->sample_aspect_ratio.num){
401 sample_aspect_ratio = ist->st->sample_aspect_ratio;
403 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
405 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
406 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
407 sample_aspect_ratio.num, sample_aspect_ratio.den);
409 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
410 "src", args, NULL, ost->graph);
413 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
414 "out", NULL, &ffsink_ctx, ost->graph);
417 last_filter = ost->input_video_filter;
419 if (codec->width != icodec->width || codec->height != icodec->height) {
420 snprintf(args, 255, "%d:%d:flags=0x%X",
424 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
425 NULL, args, NULL, ost->graph)) < 0)
427 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
429 last_filter = filter;
432 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
433 ost->graph->scale_sws_opts = av_strdup(args);
436 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
437 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
439 outputs->name = av_strdup("in");
440 outputs->filter_ctx = last_filter;
441 outputs->pad_idx = 0;
442 outputs->next = NULL;
444 inputs->name = av_strdup("out");
445 inputs->filter_ctx = ost->output_video_filter;
449 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
451 av_freep(&ost->avfilter);
453 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
457 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
460 codec->width = ost->output_video_filter->inputs[0]->w;
461 codec->height = ost->output_video_filter->inputs[0]->h;
462 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
463 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
464 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
465 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
469 #endif /* CONFIG_AVFILTER */
471 static void term_exit(void)
473 av_log(NULL, AV_LOG_QUIET, "");
476 static volatile int received_sigterm = 0;
477 static volatile int received_nb_signals = 0;
480 sigterm_handler(int sig)
482 received_sigterm = sig;
483 received_nb_signals++;
487 static void term_init(void)
489 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
490 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
492 signal(SIGXCPU, sigterm_handler);
496 static int decode_interrupt_cb(void)
498 return received_nb_signals > 1;
501 void exit_program(int ret)
506 for(i=0;i<nb_output_files;i++) {
507 AVFormatContext *s = output_files[i].ctx;
508 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
510 avformat_free_context(s);
511 av_dict_free(&output_files[i].opts);
513 for(i=0;i<nb_input_files;i++) {
514 av_close_input_file(input_files[i].ctx);
516 for (i = 0; i < nb_input_streams; i++)
517 av_dict_free(&input_streams[i].opts);
521 av_free(vstats_filename);
523 av_freep(&input_streams);
524 av_freep(&input_files);
525 av_freep(&output_streams);
526 av_freep(&output_files);
531 allocated_audio_buf_size= allocated_audio_out_size= 0;
538 if (received_sigterm) {
540 "Received signal %d: terminating.\n",
541 (int) received_sigterm);
545 exit(ret); /* not all OS-es handle main() return value */
548 static void assert_avoptions(AVDictionary *m)
550 AVDictionaryEntry *t;
551 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
552 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
557 static void assert_codec_experimental(AVCodecContext *c, int encoder)
559 const char *codec_string = encoder ? "encoder" : "decoder";
561 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
562 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
563 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
564 "results.\nAdd '-strict experimental' if you want to use it.\n",
565 codec_string, c->codec->name);
566 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
567 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
568 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
569 codec_string, codec->name);
574 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
576 if(codec && codec->sample_fmts){
577 const enum AVSampleFormat *p= codec->sample_fmts;
579 if(*p == st->codec->sample_fmt)
583 av_log(NULL, AV_LOG_WARNING,
584 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
585 av_get_sample_fmt_name(st->codec->sample_fmt),
587 av_get_sample_fmt_name(codec->sample_fmts[0]));
588 st->codec->sample_fmt = codec->sample_fmts[0];
594 * Update the requested input sample format based on the output sample format.
595 * This is currently only used to request float output from decoders which
596 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
597 * Ideally this will be removed in the future when decoders do not do format
598 * conversion and only output in their native format.
600 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
603 /* if sample formats match or a decoder sample format has already been
604 requested, just return */
605 if (enc->sample_fmt == dec->sample_fmt ||
606 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
609 /* if decoder supports more than one output format */
610 if (dec_codec && dec_codec->sample_fmts &&
611 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
612 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
613 const enum AVSampleFormat *p;
614 int min_dec = -1, min_inc = -1;
616 /* find a matching sample format in the encoder */
617 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
618 if (*p == enc->sample_fmt) {
619 dec->request_sample_fmt = *p;
621 } else if (*p > enc->sample_fmt) {
622 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
624 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
627 /* if none match, provide the one that matches quality closest */
628 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
629 enc->sample_fmt - min_dec;
633 static void choose_sample_rate(AVStream *st, AVCodec *codec)
635 if(codec && codec->supported_samplerates){
636 const int *p= codec->supported_samplerates;
638 int best_dist=INT_MAX;
640 int dist= abs(st->codec->sample_rate - *p);
641 if(dist < best_dist){
647 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
649 st->codec->sample_rate= best;
653 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
655 if(codec && codec->pix_fmts){
656 const enum PixelFormat *p= codec->pix_fmts;
657 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
658 if(st->codec->codec_id==CODEC_ID_MJPEG){
659 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
660 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
661 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};
665 if(*p == st->codec->pix_fmt)
669 if(st->codec->pix_fmt != PIX_FMT_NONE)
670 av_log(NULL, AV_LOG_WARNING,
671 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
672 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
674 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
675 st->codec->pix_fmt = codec->pix_fmts[0];
681 get_sync_ipts(const OutputStream *ost)
683 const InputStream *ist = ost->sync_ist;
684 OutputFile *of = &output_files[ost->file_index];
685 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
688 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
692 AVPacket new_pkt= *pkt;
693 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
694 &new_pkt.data, &new_pkt.size,
695 pkt->data, pkt->size,
696 pkt->flags & AV_PKT_FLAG_KEY);
699 new_pkt.destruct= av_destruct_packet;
701 fprintf(stderr, "%s failed for stream %d, codec %s",
702 bsfc->filter->name, pkt->stream_index,
703 avctx->codec ? avctx->codec->name : "copy");
713 ret= av_interleaved_write_frame(s, pkt);
715 print_error("av_interleaved_write_frame()", ret);
720 static void do_audio_out(AVFormatContext *s,
723 unsigned char *buf, int size)
726 int64_t audio_out_size, audio_buf_size;
727 int64_t allocated_for_size= size;
729 int size_out, frame_bytes, ret, resample_changed;
730 AVCodecContext *enc= ost->st->codec;
731 AVCodecContext *dec= ist->st->codec;
732 int osize = av_get_bytes_per_sample(enc->sample_fmt);
733 int isize = av_get_bytes_per_sample(dec->sample_fmt);
734 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
737 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
738 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
739 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
740 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
741 audio_buf_size*= osize*enc->channels;
743 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
744 if(coded_bps > 8*osize)
745 audio_out_size= audio_out_size * coded_bps / (8*osize);
746 audio_out_size += FF_MIN_BUFFER_SIZE;
748 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
749 fprintf(stderr, "Buffer sizes too large\n");
753 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
754 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
755 if (!audio_buf || !audio_out){
756 fprintf(stderr, "Out of memory in do_audio_out\n");
760 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
761 ost->audio_resample = 1;
763 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
764 ost->resample_channels != dec->channels ||
765 ost->resample_sample_rate != dec->sample_rate;
767 if ((ost->audio_resample && !ost->resample) || resample_changed) {
768 if (resample_changed) {
769 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",
770 ist->file_index, ist->st->index,
771 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
772 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
773 ost->resample_sample_fmt = dec->sample_fmt;
774 ost->resample_channels = dec->channels;
775 ost->resample_sample_rate = dec->sample_rate;
777 audio_resample_close(ost->resample);
779 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
780 if (audio_sync_method <= 1 &&
781 ost->resample_sample_fmt == enc->sample_fmt &&
782 ost->resample_channels == enc->channels &&
783 ost->resample_sample_rate == enc->sample_rate) {
784 ost->resample = NULL;
785 ost->audio_resample = 0;
786 } else if (ost->audio_resample) {
787 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
788 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
789 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
790 enc->sample_rate, dec->sample_rate,
791 enc->sample_fmt, dec->sample_fmt,
793 if (!ost->resample) {
794 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
795 dec->channels, dec->sample_rate,
796 enc->channels, enc->sample_rate);
802 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
803 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
804 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
805 if (ost->reformat_ctx)
806 av_audio_convert_free(ost->reformat_ctx);
807 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
808 dec->sample_fmt, 1, NULL, 0);
809 if (!ost->reformat_ctx) {
810 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
811 av_get_sample_fmt_name(dec->sample_fmt),
812 av_get_sample_fmt_name(enc->sample_fmt));
815 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
818 if(audio_sync_method){
819 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
820 - av_fifo_size(ost->fifo)/(enc->channels * 2);
821 double idelta= delta*dec->sample_rate / enc->sample_rate;
822 int byte_delta= ((int)idelta)*2*dec->channels;
824 //FIXME resample delay
825 if(fabs(delta) > 50){
826 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
828 byte_delta= FFMAX(byte_delta, -size);
832 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
837 static uint8_t *input_tmp= NULL;
838 input_tmp= av_realloc(input_tmp, byte_delta + size);
840 if(byte_delta > allocated_for_size - size){
841 allocated_for_size= byte_delta + (int64_t)size;
846 memset(input_tmp, 0, byte_delta);
847 memcpy(input_tmp + byte_delta, buf, size);
851 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
853 }else if(audio_sync_method>1){
854 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
855 av_assert0(ost->audio_resample);
857 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
858 // 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));
859 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
863 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
864 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
866 if (ost->audio_resample) {
868 size_out = audio_resample(ost->resample,
869 (short *)buftmp, (short *)buf,
870 size / (dec->channels * isize));
871 size_out = size_out * enc->channels * osize;
877 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
878 const void *ibuf[6]= {buftmp};
879 void *obuf[6]= {audio_buf};
880 int istride[6]= {isize};
881 int ostride[6]= {osize};
882 int len= size_out/istride[0];
883 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
884 printf("av_audio_convert() failed\n");
890 size_out = len*osize;
893 /* now encode as many frames as possible */
894 if (enc->frame_size > 1) {
895 /* output resampled raw samples */
896 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
897 fprintf(stderr, "av_fifo_realloc2() failed\n");
900 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
902 frame_bytes = enc->frame_size * osize * enc->channels;
904 while (av_fifo_size(ost->fifo) >= frame_bytes) {
906 av_init_packet(&pkt);
908 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
910 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
912 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
915 fprintf(stderr, "Audio encoding failed\n");
919 pkt.stream_index= ost->index;
922 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
923 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
924 pkt.flags |= AV_PKT_FLAG_KEY;
925 write_frame(s, &pkt, enc, ost->bitstream_filters);
927 ost->sync_opts += enc->frame_size;
931 av_init_packet(&pkt);
933 ost->sync_opts += size_out / (osize * enc->channels);
935 /* output a pcm frame */
936 /* determine the size of the coded buffer */
939 size_out = size_out*coded_bps/8;
941 if(size_out > audio_out_size){
942 fprintf(stderr, "Internal error, buffer size too small\n");
946 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
947 ret = avcodec_encode_audio(enc, audio_out, size_out,
950 fprintf(stderr, "Audio encoding failed\n");
954 pkt.stream_index= ost->index;
957 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
958 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
959 pkt.flags |= AV_PKT_FLAG_KEY;
960 write_frame(s, &pkt, enc, ost->bitstream_filters);
964 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
968 AVPicture picture_tmp;
971 dec = ist->st->codec;
973 /* deinterlace : must be done before any resize */
974 if (do_deinterlace) {
977 /* create temporary picture */
978 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
979 buf = av_malloc(size);
983 picture2 = &picture_tmp;
984 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
986 if(avpicture_deinterlace(picture2, picture,
987 dec->pix_fmt, dec->width, dec->height) < 0) {
988 /* if error, do not deinterlace */
989 fprintf(stderr, "Deinterlacing failed\n");
998 if (picture != picture2)
999 *picture = *picture2;
1003 static void do_subtitle_out(AVFormatContext *s,
1009 static uint8_t *subtitle_out = NULL;
1010 int subtitle_out_max_size = 1024 * 1024;
1011 int subtitle_out_size, nb, i;
1012 AVCodecContext *enc;
1015 if (pts == AV_NOPTS_VALUE) {
1016 fprintf(stderr, "Subtitle packets must have a pts\n");
1022 enc = ost->st->codec;
1024 if (!subtitle_out) {
1025 subtitle_out = av_malloc(subtitle_out_max_size);
1028 /* Note: DVB subtitle need one packet to draw them and one other
1029 packet to clear them */
1030 /* XXX: signal it in the codec context ? */
1031 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1036 for(i = 0; i < nb; i++) {
1037 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1038 // start_display_time is required to be 0
1039 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1040 sub->end_display_time -= sub->start_display_time;
1041 sub->start_display_time = 0;
1042 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1043 subtitle_out_max_size, sub);
1044 if (subtitle_out_size < 0) {
1045 fprintf(stderr, "Subtitle encoding failed\n");
1049 av_init_packet(&pkt);
1050 pkt.stream_index = ost->index;
1051 pkt.data = subtitle_out;
1052 pkt.size = subtitle_out_size;
1053 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1054 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1055 /* XXX: the pts correction is handled here. Maybe handling
1056 it in the codec would be better */
1058 pkt.pts += 90 * sub->start_display_time;
1060 pkt.pts += 90 * sub->end_display_time;
1062 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1066 static int bit_buffer_size= 1024*256;
1067 static uint8_t *bit_buffer= NULL;
1069 static void do_video_resample(OutputStream *ost,
1071 AVFrame *in_picture,
1072 AVFrame **out_picture)
1074 int resample_changed = 0;
1075 AVCodecContext *dec = ist->st->codec;
1076 *out_picture = in_picture;
1078 resample_changed = ost->resample_width != dec->width ||
1079 ost->resample_height != dec->height ||
1080 ost->resample_pix_fmt != dec->pix_fmt;
1082 if (resample_changed) {
1083 av_log(NULL, AV_LOG_INFO,
1084 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1085 ist->file_index, ist->st->index,
1086 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1087 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1088 if(!ost->video_resample)
1089 ost->video_resample = 1;
1092 #if !CONFIG_AVFILTER
1093 if (ost->video_resample) {
1094 *out_picture = &ost->pict_tmp;
1095 if (resample_changed) {
1096 /* initialize a new scaler context */
1097 sws_freeContext(ost->img_resample_ctx);
1098 ost->img_resample_ctx = sws_getContext(
1099 ist->st->codec->width,
1100 ist->st->codec->height,
1101 ist->st->codec->pix_fmt,
1102 ost->st->codec->width,
1103 ost->st->codec->height,
1104 ost->st->codec->pix_fmt,
1105 ost->sws_flags, NULL, NULL, NULL);
1106 if (ost->img_resample_ctx == NULL) {
1107 fprintf(stderr, "Cannot get resampling context\n");
1111 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1112 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1115 if (resample_changed) {
1116 avfilter_graph_free(&ost->graph);
1117 if (configure_video_filters(ist, ost)) {
1118 fprintf(stderr, "Error reinitializing filters!\n");
1123 if (resample_changed) {
1124 ost->resample_width = dec->width;
1125 ost->resample_height = dec->height;
1126 ost->resample_pix_fmt = dec->pix_fmt;
1131 static void do_video_out(AVFormatContext *s,
1134 AVFrame *in_picture,
1135 int *frame_size, float quality)
1137 int nb_frames, i, ret, format_video_sync;
1138 AVFrame *final_picture;
1139 AVCodecContext *enc;
1142 enc = ost->st->codec;
1144 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1146 /* by default, we output a single frame */
1151 format_video_sync = video_sync_method;
1152 if (format_video_sync < 0)
1153 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1155 if (format_video_sync) {
1156 double vdelta = sync_ipts - ost->sync_opts;
1157 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1160 else if (format_video_sync == 2) {
1163 }else if(vdelta>0.6)
1164 ost->sync_opts= lrintf(sync_ipts);
1165 }else if (vdelta > 1.1)
1166 nb_frames = lrintf(vdelta);
1167 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1168 if (nb_frames == 0){
1171 fprintf(stderr, "*** drop!\n");
1172 }else if (nb_frames > 1) {
1173 nb_frames_dup += nb_frames - 1;
1175 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1178 ost->sync_opts= lrintf(sync_ipts);
1180 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1184 do_video_resample(ost, ist, in_picture, &final_picture);
1186 /* duplicates frame if needed */
1187 for(i=0;i<nb_frames;i++) {
1189 av_init_packet(&pkt);
1190 pkt.stream_index= ost->index;
1192 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1193 /* raw pictures are written as AVPicture structure to
1194 avoid any copies. We support temporarily the older
1196 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1197 enc->coded_frame->top_field_first = in_picture->top_field_first;
1198 pkt.data= (uint8_t *)final_picture;
1199 pkt.size= sizeof(AVPicture);
1200 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1201 pkt.flags |= AV_PKT_FLAG_KEY;
1203 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1205 AVFrame big_picture;
1207 big_picture= *final_picture;
1208 /* better than nothing: use input picture interlaced
1210 big_picture.interlaced_frame = in_picture->interlaced_frame;
1211 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1212 if (ost->top_field_first == -1)
1213 big_picture.top_field_first = in_picture->top_field_first;
1215 big_picture.top_field_first = !!ost->top_field_first;
1218 /* handles same_quant here. This is not correct because it may
1219 not be a global option */
1220 big_picture.quality = quality;
1221 if (!enc->me_threshold)
1222 big_picture.pict_type = 0;
1223 // big_picture.pts = AV_NOPTS_VALUE;
1224 big_picture.pts= ost->sync_opts;
1225 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1226 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1227 if (ost->forced_kf_index < ost->forced_kf_count &&
1228 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1229 big_picture.pict_type = AV_PICTURE_TYPE_I;
1230 ost->forced_kf_index++;
1232 ret = avcodec_encode_video(enc,
1233 bit_buffer, bit_buffer_size,
1236 fprintf(stderr, "Video encoding failed\n");
1241 pkt.data= bit_buffer;
1243 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1244 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1245 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1246 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1247 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1249 if(enc->coded_frame->key_frame)
1250 pkt.flags |= AV_PKT_FLAG_KEY;
1251 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1254 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1255 // enc->frame_number-1, ret, enc->pict_type);
1256 /* if two pass, output log */
1257 if (ost->logfile && enc->stats_out) {
1258 fprintf(ost->logfile, "%s", enc->stats_out);
1263 ost->frame_number++;
1267 static double psnr(double d){
1268 return -10.0*log(d)/log(10.0);
1271 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1274 AVCodecContext *enc;
1276 double ti1, bitrate, avg_bitrate;
1278 /* this is executed just the first time do_video_stats is called */
1280 vstats_file = fopen(vstats_filename, "w");
1287 enc = ost->st->codec;
1288 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1289 frame_number = ost->frame_number;
1290 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1291 if (enc->flags&CODEC_FLAG_PSNR)
1292 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1294 fprintf(vstats_file,"f_size= %6d ", frame_size);
1295 /* compute pts value */
1296 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1300 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1301 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1302 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1303 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1304 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1308 static void print_report(OutputFile *output_files,
1309 OutputStream *ost_table, int nb_ostreams,
1310 int is_last_report, int64_t timer_start)
1314 AVFormatContext *oc;
1316 AVCodecContext *enc;
1317 int frame_number, vid, i;
1318 double bitrate, ti1, pts;
1319 static int64_t last_time = -1;
1320 static int qp_histogram[52];
1322 if (!is_last_report) {
1324 /* display the report every 0.5 seconds */
1325 cur_time = av_gettime();
1326 if (last_time == -1) {
1327 last_time = cur_time;
1330 if ((cur_time - last_time) < 500000)
1332 last_time = cur_time;
1336 oc = output_files[0].ctx;
1338 total_size = avio_size(oc->pb);
1339 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1340 total_size= avio_tell(oc->pb);
1345 for(i=0;i<nb_ostreams;i++) {
1347 ost = &ost_table[i];
1348 enc = ost->st->codec;
1349 if (!ost->st->stream_copy && enc->coded_frame)
1350 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1351 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1352 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1354 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1355 float t = (av_gettime()-timer_start) / 1000000.0;
1357 frame_number = ost->frame_number;
1358 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1359 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1365 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1368 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1370 if (enc->flags&CODEC_FLAG_PSNR){
1372 double error, error_sum=0;
1373 double scale, scale_sum=0;
1374 char type[3]= {'Y','U','V'};
1375 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1378 error= enc->error[j];
1379 scale= enc->width*enc->height*255.0*255.0*frame_number;
1381 error= enc->coded_frame->error[j];
1382 scale= enc->width*enc->height*255.0*255.0;
1387 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1389 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1393 /* compute min output value */
1394 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1395 if ((pts < ti1) && (pts > 0))
1401 if (verbose > 0 || is_last_report) {
1402 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1405 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1406 (double)total_size / 1024, ti1, bitrate);
1408 if (nb_frames_dup || nb_frames_drop)
1409 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1410 nb_frames_dup, nb_frames_drop);
1413 fprintf(stderr, "%s \r", buf);
1418 if (is_last_report && verbose >= 0){
1419 int64_t raw= audio_size + video_size + extra_size;
1420 fprintf(stderr, "\n");
1421 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1425 100.0*(total_size - raw)/raw
1430 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1432 int fill_char = 0x00;
1433 if (sample_fmt == AV_SAMPLE_FMT_U8)
1435 memset(buf, fill_char, size);
1438 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1442 for (i = 0; i < nb_ostreams; i++) {
1443 OutputStream *ost = &ost_table[i];
1444 AVCodecContext *enc = ost->st->codec;
1445 AVFormatContext *os = output_files[ost->file_index].ctx;
1447 if (!ost->encoding_needed)
1450 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1452 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1458 av_init_packet(&pkt);
1459 pkt.stream_index= ost->index;
1461 switch (ost->st->codec->codec_type) {
1462 case AVMEDIA_TYPE_AUDIO:
1463 fifo_bytes = av_fifo_size(ost->fifo);
1465 /* encode any samples remaining in fifo */
1466 if (fifo_bytes > 0) {
1467 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1468 int fs_tmp = enc->frame_size;
1470 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1471 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1472 enc->frame_size = fifo_bytes / (osize * enc->channels);
1474 int frame_bytes = enc->frame_size*osize*enc->channels;
1475 if (allocated_audio_buf_size < frame_bytes)
1477 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1480 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1481 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1482 ost->st->time_base.num, enc->sample_rate);
1483 enc->frame_size = fs_tmp;
1486 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1489 fprintf(stderr, "Audio encoding failed\n");
1493 pkt.flags |= AV_PKT_FLAG_KEY;
1495 case AVMEDIA_TYPE_VIDEO:
1496 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1498 fprintf(stderr, "Video encoding failed\n");
1502 if(enc->coded_frame && enc->coded_frame->key_frame)
1503 pkt.flags |= AV_PKT_FLAG_KEY;
1504 if (ost->logfile && enc->stats_out) {
1505 fprintf(ost->logfile, "%s", enc->stats_out);
1514 pkt.data = bit_buffer;
1516 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1517 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1518 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1523 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1524 static int output_packet(InputStream *ist, int ist_index,
1525 OutputStream *ost_table, int nb_ostreams,
1526 const AVPacket *pkt)
1528 AVFormatContext *os;
1533 void *buffer_to_free = NULL;
1534 static unsigned int samples_size= 0;
1535 AVSubtitle subtitle, *subtitle_to_free;
1536 int64_t pkt_pts = AV_NOPTS_VALUE;
1538 int frame_available;
1543 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1545 if(ist->next_pts == AV_NOPTS_VALUE)
1546 ist->next_pts= ist->pts;
1550 av_init_packet(&avpkt);
1558 if(pkt->dts != AV_NOPTS_VALUE)
1559 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1560 if(pkt->pts != AV_NOPTS_VALUE)
1561 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1563 //while we have more to decode or while the decoder did output something on EOF
1564 while (avpkt.size > 0 || (!pkt && got_output)) {
1565 uint8_t *data_buf, *decoded_data_buf;
1566 int data_size, decoded_data_size;
1568 ist->pts= ist->next_pts;
1570 if(avpkt.size && avpkt.size != pkt->size &&
1571 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1572 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1573 ist->showed_multi_packet_warning=1;
1576 /* decode the packet if needed */
1577 decoded_data_buf = NULL; /* fail safe */
1578 decoded_data_size= 0;
1579 data_buf = avpkt.data;
1580 data_size = avpkt.size;
1581 subtitle_to_free = NULL;
1582 if (ist->decoding_needed) {
1583 switch(ist->st->codec->codec_type) {
1584 case AVMEDIA_TYPE_AUDIO:{
1585 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1586 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1588 samples= av_malloc(samples_size);
1590 decoded_data_size= samples_size;
1591 /* XXX: could avoid copy if PCM 16 bits with same
1592 endianness as CPU */
1593 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1600 got_output = decoded_data_size > 0;
1601 /* Some bug in mpeg audio decoder gives */
1602 /* decoded_data_size < 0, it seems they are overflows */
1604 /* no audio frame */
1607 decoded_data_buf = (uint8_t *)samples;
1608 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1609 (ist->st->codec->sample_rate * ist->st->codec->channels);
1611 case AVMEDIA_TYPE_VIDEO:
1612 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1613 /* XXX: allocate picture correctly */
1614 avcodec_get_frame_defaults(&picture);
1615 avpkt.pts = pkt_pts;
1616 avpkt.dts = ist->pts;
1617 pkt_pts = AV_NOPTS_VALUE;
1619 ret = avcodec_decode_video2(ist->st->codec,
1620 &picture, &got_output, &avpkt);
1621 quality = same_quant ? picture.quality : 0;
1625 /* no picture yet */
1626 goto discard_packet;
1628 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1629 if (ist->st->codec->time_base.num != 0) {
1630 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1631 ist->next_pts += ((int64_t)AV_TIME_BASE *
1632 ist->st->codec->time_base.num * ticks) /
1633 ist->st->codec->time_base.den;
1636 buffer_to_free = NULL;
1637 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1639 case AVMEDIA_TYPE_SUBTITLE:
1640 ret = avcodec_decode_subtitle2(ist->st->codec,
1641 &subtitle, &got_output, &avpkt);
1645 goto discard_packet;
1647 subtitle_to_free = &subtitle;
1654 switch(ist->st->codec->codec_type) {
1655 case AVMEDIA_TYPE_AUDIO:
1656 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1657 ist->st->codec->sample_rate;
1659 case AVMEDIA_TYPE_VIDEO:
1660 if (ist->st->codec->time_base.num != 0) {
1661 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1662 ist->next_pts += ((int64_t)AV_TIME_BASE *
1663 ist->st->codec->time_base.num * ticks) /
1664 ist->st->codec->time_base.den;
1671 // preprocess audio (volume)
1672 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1673 if (audio_volume != 256) {
1676 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1677 int v = ((*volp) * audio_volume + 128) >> 8;
1678 *volp++ = av_clip_int16(v);
1683 /* frame rate emulation */
1684 if (input_files[ist->file_index].rate_emu) {
1685 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1686 int64_t now = av_gettime() - ist->start;
1690 /* if output time reached then transcode raw format,
1691 encode packets and output them */
1692 for (i = 0; i < nb_ostreams; i++) {
1693 OutputFile *of = &output_files[ost_table[i].file_index];
1696 ost = &ost_table[i];
1697 if (ost->source_index != ist_index)
1700 if (of->start_time && ist->pts < of->start_time)
1703 if (of->recording_time != INT64_MAX &&
1704 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1705 (AVRational){1, 1000000}) >= 0) {
1706 ost->is_past_recording_time = 1;
1711 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1712 ost->input_video_filter) {
1714 if (ist->st->sample_aspect_ratio.num)
1715 sar = ist->st->sample_aspect_ratio;
1717 sar = ist->st->codec->sample_aspect_ratio;
1718 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1720 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1721 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1722 while (frame_available) {
1723 AVRational ist_pts_tb;
1724 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1725 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1727 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1729 os = output_files[ost->file_index].ctx;
1731 /* set the input output pts pairs */
1732 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1734 if (ost->encoding_needed) {
1735 av_assert0(ist->decoding_needed);
1736 switch(ost->st->codec->codec_type) {
1737 case AVMEDIA_TYPE_AUDIO:
1738 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1740 case AVMEDIA_TYPE_VIDEO:
1742 if (ost->picref->video && !ost->frame_aspect_ratio)
1743 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1745 do_video_out(os, ost, ist, &picture, &frame_size,
1746 same_quant ? quality : ost->st->codec->global_quality);
1747 if (vstats_filename && frame_size)
1748 do_video_stats(os, ost, frame_size);
1750 case AVMEDIA_TYPE_SUBTITLE:
1751 do_subtitle_out(os, ost, ist, &subtitle,
1759 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1761 av_init_packet(&opkt);
1763 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1764 #if !CONFIG_AVFILTER
1770 /* no reencoding needed : output the packet directly */
1771 /* force the input stream PTS */
1773 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1774 audio_size += data_size;
1775 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1776 video_size += data_size;
1780 opkt.stream_index= ost->index;
1781 if(pkt->pts != AV_NOPTS_VALUE)
1782 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1784 opkt.pts= AV_NOPTS_VALUE;
1786 if (pkt->dts == AV_NOPTS_VALUE)
1787 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1789 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1790 opkt.dts -= ost_tb_start_time;
1792 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1793 opkt.flags= pkt->flags;
1795 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1796 if( ost->st->codec->codec_id != CODEC_ID_H264
1797 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1798 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1800 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1801 opkt.destruct= av_destruct_packet;
1803 opkt.data = data_buf;
1804 opkt.size = data_size;
1807 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1808 ost->st->codec->frame_number++;
1809 ost->frame_number++;
1810 av_free_packet(&opkt);
1814 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1815 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1817 avfilter_unref_buffer(ost->picref);
1822 av_free(buffer_to_free);
1823 /* XXX: allocate the subtitles in the codec ? */
1824 if (subtitle_to_free) {
1825 avsubtitle_free(subtitle_to_free);
1826 subtitle_to_free = NULL;
1834 static void print_sdp(OutputFile *output_files, int n)
1838 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1842 for (i = 0; i < n; i++)
1843 avc[i] = output_files[i].ctx;
1845 av_sdp_create(avc, n, sdp, sizeof(sdp));
1846 printf("SDP:\n%s\n", sdp);
1851 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1852 char *error, int error_len)
1855 InputStream *ist = &input_streams[ist_index];
1856 if (ist->decoding_needed) {
1857 AVCodec *codec = ist->dec;
1859 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1860 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1861 return AVERROR(EINVAL);
1864 /* update requested sample format for the decoder based on the
1865 corresponding encoder sample format */
1866 for (i = 0; i < nb_output_streams; i++) {
1867 OutputStream *ost = &output_streams[i];
1868 if (ost->source_index == ist_index) {
1869 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1874 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1875 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1876 ist->file_index, ist->st->index);
1877 return AVERROR(EINVAL);
1879 assert_codec_experimental(ist->st->codec, 0);
1880 assert_avoptions(ist->opts);
1883 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;
1884 ist->next_pts = AV_NOPTS_VALUE;
1885 init_pts_correction(&ist->pts_ctx);
1891 static int transcode_init(OutputFile *output_files,
1892 int nb_output_files,
1893 InputFile *input_files,
1896 int ret = 0, i, j, k;
1897 AVFormatContext *os;
1898 AVCodecContext *codec, *icodec;
1904 /* init framerate emulation */
1905 for (i = 0; i < nb_input_files; i++) {
1906 InputFile *ifile = &input_files[i];
1907 if (ifile->rate_emu)
1908 for (j = 0; j < ifile->nb_streams; j++)
1909 input_streams[j + ifile->ist_index].start = av_gettime();
1912 /* output stream init */
1913 for(i=0;i<nb_output_files;i++) {
1914 os = output_files[i].ctx;
1915 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1916 av_dump_format(os, i, os->filename, 1);
1917 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1918 return AVERROR(EINVAL);
1922 /* for each output stream, we compute the right encoding parameters */
1923 for (i = 0; i < nb_output_streams; i++) {
1924 ost = &output_streams[i];
1925 os = output_files[ost->file_index].ctx;
1926 ist = &input_streams[ost->source_index];
1928 codec = ost->st->codec;
1929 icodec = ist->st->codec;
1931 ost->st->disposition = ist->st->disposition;
1932 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1933 codec->chroma_sample_location = icodec->chroma_sample_location;
1935 if (ost->st->stream_copy) {
1936 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1938 if (extra_size > INT_MAX) {
1939 return AVERROR(EINVAL);
1942 /* if stream_copy is selected, no need to decode or encode */
1943 codec->codec_id = icodec->codec_id;
1944 codec->codec_type = icodec->codec_type;
1946 if(!codec->codec_tag){
1947 if( !os->oformat->codec_tag
1948 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1949 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1950 codec->codec_tag = icodec->codec_tag;
1953 codec->bit_rate = icodec->bit_rate;
1954 codec->rc_max_rate = icodec->rc_max_rate;
1955 codec->rc_buffer_size = icodec->rc_buffer_size;
1956 codec->extradata= av_mallocz(extra_size);
1957 if (!codec->extradata) {
1958 return AVERROR(ENOMEM);
1960 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1961 codec->extradata_size= icodec->extradata_size;
1962 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){
1963 codec->time_base = icodec->time_base;
1964 codec->time_base.num *= icodec->ticks_per_frame;
1965 av_reduce(&codec->time_base.num, &codec->time_base.den,
1966 codec->time_base.num, codec->time_base.den, INT_MAX);
1968 codec->time_base = ist->st->time_base;
1969 switch(codec->codec_type) {
1970 case AVMEDIA_TYPE_AUDIO:
1971 if(audio_volume != 256) {
1972 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1975 codec->channel_layout = icodec->channel_layout;
1976 codec->sample_rate = icodec->sample_rate;
1977 codec->channels = icodec->channels;
1978 codec->frame_size = icodec->frame_size;
1979 codec->audio_service_type = icodec->audio_service_type;
1980 codec->block_align= icodec->block_align;
1981 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1982 codec->block_align= 0;
1983 if(codec->codec_id == CODEC_ID_AC3)
1984 codec->block_align= 0;
1986 case AVMEDIA_TYPE_VIDEO:
1987 codec->pix_fmt = icodec->pix_fmt;
1988 codec->width = icodec->width;
1989 codec->height = icodec->height;
1990 codec->has_b_frames = icodec->has_b_frames;
1991 if (!codec->sample_aspect_ratio.num) {
1992 codec->sample_aspect_ratio =
1993 ost->st->sample_aspect_ratio =
1994 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1995 ist->st->codec->sample_aspect_ratio.num ?
1996 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1999 case AVMEDIA_TYPE_SUBTITLE:
2000 codec->width = icodec->width;
2001 codec->height = icodec->height;
2003 case AVMEDIA_TYPE_DATA:
2010 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2011 switch(codec->codec_type) {
2012 case AVMEDIA_TYPE_AUDIO:
2013 ost->fifo= av_fifo_alloc(1024);
2015 return AVERROR(ENOMEM);
2017 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2018 if (!codec->sample_rate) {
2019 codec->sample_rate = icodec->sample_rate;
2021 codec->sample_rate >>= icodec->lowres;
2023 choose_sample_rate(ost->st, ost->enc);
2024 codec->time_base = (AVRational){1, codec->sample_rate};
2025 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2026 codec->sample_fmt = icodec->sample_fmt;
2027 choose_sample_fmt(ost->st, ost->enc);
2028 if (!codec->channels)
2029 codec->channels = icodec->channels;
2030 codec->channel_layout = icodec->channel_layout;
2031 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2032 codec->channel_layout = 0;
2033 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2034 icodec->request_channels = codec->channels;
2035 ist->decoding_needed = 1;
2036 ost->encoding_needed = 1;
2037 ost->resample_sample_fmt = icodec->sample_fmt;
2038 ost->resample_sample_rate = icodec->sample_rate;
2039 ost->resample_channels = icodec->channels;
2041 case AVMEDIA_TYPE_VIDEO:
2042 if (codec->pix_fmt == PIX_FMT_NONE)
2043 codec->pix_fmt = icodec->pix_fmt;
2044 choose_pixel_fmt(ost->st, ost->enc);
2046 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2047 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2051 if (!codec->width || !codec->height) {
2052 codec->width = icodec->width;
2053 codec->height = icodec->height;
2056 ost->video_resample = codec->width != icodec->width ||
2057 codec->height != icodec->height ||
2058 codec->pix_fmt != icodec->pix_fmt;
2059 if (ost->video_resample) {
2060 #if !CONFIG_AVFILTER
2061 avcodec_get_frame_defaults(&ost->pict_tmp);
2062 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2063 codec->width, codec->height)) {
2064 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2067 ost->img_resample_ctx = sws_getContext(
2074 ost->sws_flags, NULL, NULL, NULL);
2075 if (ost->img_resample_ctx == NULL) {
2076 fprintf(stderr, "Cannot get resampling context\n");
2080 codec->bits_per_raw_sample= 0;
2083 ost->resample_height = icodec->height;
2084 ost->resample_width = icodec->width;
2085 ost->resample_pix_fmt= icodec->pix_fmt;
2086 ost->encoding_needed = 1;
2087 ist->decoding_needed = 1;
2089 if (!ost->frame_rate.num)
2090 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2091 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2092 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2093 ost->frame_rate = ost->enc->supported_framerates[idx];
2095 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2098 if (configure_video_filters(ist, ost)) {
2099 fprintf(stderr, "Error opening filters!\n");
2104 case AVMEDIA_TYPE_SUBTITLE:
2105 ost->encoding_needed = 1;
2106 ist->decoding_needed = 1;
2113 if (ost->encoding_needed &&
2114 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2115 char logfilename[1024];
2118 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2119 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2121 if (codec->flags & CODEC_FLAG_PASS1) {
2122 f = fopen(logfilename, "wb");
2124 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2130 size_t logbuffer_size;
2131 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2132 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2135 codec->stats_in = logbuffer;
2139 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2140 int size= codec->width * codec->height;
2141 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2146 bit_buffer = av_malloc(bit_buffer_size);
2148 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2150 return AVERROR(ENOMEM);
2153 /* open each encoder */
2154 for (i = 0; i < nb_output_streams; i++) {
2155 ost = &output_streams[i];
2156 if (ost->encoding_needed) {
2157 AVCodec *codec = ost->enc;
2158 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2160 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2161 ost->st->codec->codec_id, ost->file_index, ost->index);
2162 ret = AVERROR(EINVAL);
2165 if (dec->subtitle_header) {
2166 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2167 if (!ost->st->codec->subtitle_header) {
2168 ret = AVERROR(ENOMEM);
2171 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2172 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2174 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2175 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2176 ost->file_index, ost->index);
2177 ret = AVERROR(EINVAL);
2180 assert_codec_experimental(ost->st->codec, 1);
2181 assert_avoptions(ost->opts);
2182 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2183 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2184 "It takes bits/s as argument, not kbits/s\n");
2185 extra_size += ost->st->codec->extradata_size;
2187 if (ost->st->codec->me_threshold)
2188 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2192 /* init input streams */
2193 for (i = 0; i < nb_input_streams; i++)
2194 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2197 /* discard unused programs */
2198 for (i = 0; i < nb_input_files; i++) {
2199 InputFile *ifile = &input_files[i];
2200 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2201 AVProgram *p = ifile->ctx->programs[j];
2202 int discard = AVDISCARD_ALL;
2204 for (k = 0; k < p->nb_stream_indexes; k++)
2205 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2206 discard = AVDISCARD_DEFAULT;
2209 p->discard = discard;
2213 /* open files and write file headers */
2214 for (i = 0; i < nb_output_files; i++) {
2215 os = output_files[i].ctx;
2216 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2217 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2218 ret = AVERROR(EINVAL);
2221 assert_avoptions(output_files[i].opts);
2222 if (strcmp(os->oformat->name, "rtp")) {
2228 /* dump the file output parameters - cannot be done before in case
2230 for(i=0;i<nb_output_files;i++) {
2231 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2234 /* dump the stream mapping */
2236 fprintf(stderr, "Stream mapping:\n");
2237 for (i = 0; i < nb_output_streams;i ++) {
2238 ost = &output_streams[i];
2239 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2240 input_streams[ost->source_index].file_index,
2241 input_streams[ost->source_index].st->index,
2244 if (ost->sync_ist != &input_streams[ost->source_index])
2245 fprintf(stderr, " [sync #%d.%d]",
2246 ost->sync_ist->file_index,
2247 ost->sync_ist->st->index);
2248 if (ost->st->stream_copy)
2249 fprintf(stderr, " (copy)");
2251 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2252 input_streams[ost->source_index].dec->name : "?",
2253 ost->enc ? ost->enc->name : "?");
2254 fprintf(stderr, "\n");
2259 fprintf(stderr, "%s\n", error);
2264 print_sdp(output_files, nb_output_files);
2271 * The following code is the main loop of the file converter
2273 static int transcode(OutputFile *output_files,
2274 int nb_output_files,
2275 InputFile *input_files,
2279 AVFormatContext *is, *os;
2283 int no_packet_count=0;
2284 int64_t timer_start;
2286 if (!(no_packet = av_mallocz(nb_input_files)))
2289 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2294 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2297 timer_start = av_gettime();
2299 for(; received_sigterm == 0;) {
2300 int file_index, ist_index;
2305 ipts_min = INT64_MAX;
2308 /* select the stream that we must read now by looking at the
2309 smallest output pts */
2311 for (i = 0; i < nb_output_streams; i++) {
2315 ost = &output_streams[i];
2316 of = &output_files[ost->file_index];
2317 os = output_files[ost->file_index].ctx;
2318 ist = &input_streams[ost->source_index];
2319 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2320 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2322 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2324 if (!input_files[ist->file_index].eof_reached){
2325 if(ipts < ipts_min) {
2327 if(input_sync ) file_index = ist->file_index;
2329 if(opts < opts_min) {
2331 if(!input_sync) file_index = ist->file_index;
2334 if (ost->frame_number >= ost->max_frames) {
2336 for (j = 0; j < of->ctx->nb_streams; j++)
2337 output_streams[of->ost_index + j].is_past_recording_time = 1;
2341 /* if none, if is finished */
2342 if (file_index < 0) {
2343 if(no_packet_count){
2345 memset(no_packet, 0, nb_input_files);
2352 /* read a frame from it and output it in the fifo */
2353 is = input_files[file_index].ctx;
2354 ret= av_read_frame(is, &pkt);
2355 if(ret == AVERROR(EAGAIN)){
2356 no_packet[file_index]=1;
2361 input_files[file_index].eof_reached = 1;
2369 memset(no_packet, 0, nb_input_files);
2372 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2373 is->streams[pkt.stream_index]);
2375 /* the following test is needed in case new streams appear
2376 dynamically in stream : we ignore them */
2377 if (pkt.stream_index >= input_files[file_index].nb_streams)
2378 goto discard_packet;
2379 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2380 ist = &input_streams[ist_index];
2382 goto discard_packet;
2384 if (pkt.dts != AV_NOPTS_VALUE)
2385 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2386 if (pkt.pts != AV_NOPTS_VALUE)
2387 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2389 if(pkt.pts != AV_NOPTS_VALUE)
2390 pkt.pts *= ist->ts_scale;
2391 if(pkt.dts != AV_NOPTS_VALUE)
2392 pkt.dts *= ist->ts_scale;
2394 // 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);
2395 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2396 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2397 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2398 int64_t delta= pkt_dts - ist->next_pts;
2399 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2400 input_files[ist->file_index].ts_offset -= delta;
2402 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2403 delta, input_files[ist->file_index].ts_offset);
2404 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2405 if(pkt.pts != AV_NOPTS_VALUE)
2406 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2410 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2411 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2414 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2415 ist->file_index, ist->st->index);
2418 av_free_packet(&pkt);
2423 av_free_packet(&pkt);
2425 /* dump report by using the output first video and audio streams */
2426 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2429 /* at the end of stream, we must flush the decoder buffers */
2430 for (i = 0; i < nb_input_streams; i++) {
2431 ist = &input_streams[i];
2432 if (ist->decoding_needed) {
2433 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2436 flush_encoders(output_streams, nb_output_streams);
2440 /* write the trailer if needed and close file */
2441 for(i=0;i<nb_output_files;i++) {
2442 os = output_files[i].ctx;
2443 av_write_trailer(os);
2446 /* dump report by using the first video and audio streams */
2447 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2449 /* close each encoder */
2450 for (i = 0; i < nb_output_streams; i++) {
2451 ost = &output_streams[i];
2452 if (ost->encoding_needed) {
2453 av_freep(&ost->st->codec->stats_in);
2454 avcodec_close(ost->st->codec);
2457 avfilter_graph_free(&ost->graph);
2461 /* close each decoder */
2462 for (i = 0; i < nb_input_streams; i++) {
2463 ist = &input_streams[i];
2464 if (ist->decoding_needed) {
2465 avcodec_close(ist->st->codec);
2473 av_freep(&bit_buffer);
2474 av_freep(&no_packet);
2476 if (output_streams) {
2477 for (i = 0; i < nb_output_streams; i++) {
2478 ost = &output_streams[i];
2480 if (ost->st->stream_copy)
2481 av_freep(&ost->st->codec->extradata);
2483 fclose(ost->logfile);
2484 ost->logfile = NULL;
2486 av_fifo_free(ost->fifo); /* works even if fifo is not
2487 initialized but set to zero */
2488 av_freep(&ost->st->codec->subtitle_header);
2489 av_free(ost->pict_tmp.data[0]);
2490 av_free(ost->forced_kf_pts);
2491 if (ost->video_resample)
2492 sws_freeContext(ost->img_resample_ctx);
2494 audio_resample_close(ost->resample);
2495 if (ost->reformat_ctx)
2496 av_audio_convert_free(ost->reformat_ctx);
2497 av_dict_free(&ost->opts);
2504 static int opt_verbose(const char *opt, const char *arg)
2506 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2510 static double parse_frame_aspect_ratio(const char *arg)
2517 p = strchr(arg, ':');
2519 x = strtol(arg, &end, 10);
2521 y = strtol(end+1, &end, 10);
2523 ar = (double)x / (double)y;
2525 ar = strtod(arg, NULL);
2528 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2534 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2536 return parse_option(o, "codec:a", arg, options);
2539 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2541 return parse_option(o, "codec:v", arg, options);
2544 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2546 return parse_option(o, "codec:s", arg, options);
2549 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2551 return parse_option(o, "codec:d", arg, options);
2554 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2556 StreamMap *m = NULL;
2557 int i, negative = 0, file_idx;
2558 int sync_file_idx = -1, sync_stream_idx;
2566 map = av_strdup(arg);
2568 /* parse sync stream first, just pick first matching stream */
2569 if (sync = strchr(map, ',')) {
2571 sync_file_idx = strtol(sync + 1, &sync, 0);
2572 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2573 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2578 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2579 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2580 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2581 sync_stream_idx = i;
2584 if (i == input_files[sync_file_idx].nb_streams) {
2585 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2586 "match any streams.\n", arg);
2592 file_idx = strtol(map, &p, 0);
2593 if (file_idx >= nb_input_files || file_idx < 0) {
2594 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2598 /* disable some already defined maps */
2599 for (i = 0; i < o->nb_stream_maps; i++) {
2600 m = &o->stream_maps[i];
2601 if (check_stream_specifier(input_files[m->file_index].ctx,
2602 input_files[m->file_index].ctx->streams[m->stream_index],
2603 *p == ':' ? p + 1 : p) > 0)
2607 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2608 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2609 *p == ':' ? p + 1 : p) <= 0)
2611 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2612 &o->nb_stream_maps, o->nb_stream_maps + 1);
2613 m = &o->stream_maps[o->nb_stream_maps - 1];
2615 m->file_index = file_idx;
2616 m->stream_index = i;
2618 if (sync_file_idx >= 0) {
2619 m->sync_file_index = sync_file_idx;
2620 m->sync_stream_index = sync_stream_idx;
2622 m->sync_file_index = file_idx;
2623 m->sync_stream_index = i;
2628 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2636 static void parse_meta_type(char *arg, char *type, int *index)
2646 if (*(++arg) == ':')
2647 *index = strtol(++arg, NULL, 0);
2650 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2657 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2659 MetadataMap *m, *m1;
2662 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2663 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2665 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2666 m->file = strtol(arg, &p, 0);
2667 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2669 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2670 if (p = strchr(opt, ':'))
2671 parse_meta_type(p + 1, &m1->type, &m1->index);
2675 if (m->type == 'g' || m1->type == 'g')
2676 o->metadata_global_manual = 1;
2677 if (m->type == 's' || m1->type == 's')
2678 o->metadata_streams_manual = 1;
2679 if (m->type == 'c' || m1->type == 'c')
2680 o->metadata_chapters_manual = 1;
2685 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2687 const char *codec_string = encoder ? "encoder" : "decoder";
2691 return CODEC_ID_NONE;
2693 avcodec_find_encoder_by_name(name) :
2694 avcodec_find_decoder_by_name(name);
2696 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2699 if(codec->type != type) {
2700 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2706 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2708 char *codec_name = NULL;
2710 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2714 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2715 return avcodec_find_encoder(st->codec->codec_id);
2717 } else if (!strcmp(codec_name, "copy"))
2718 st->stream_copy = 1;
2720 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2721 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2722 avcodec_find_decoder_by_name(codec_name);
2729 * Add all the streams from the given input file to the global
2730 * list of input streams.
2732 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2734 int i, rfps, rfps_base;
2736 for (i = 0; i < ic->nb_streams; i++) {
2737 AVStream *st = ic->streams[i];
2738 AVCodecContext *dec = st->codec;
2742 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2743 ist = &input_streams[nb_input_streams - 1];
2745 ist->file_index = nb_input_files;
2747 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2749 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2750 ist->ts_scale = scale;
2752 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2754 ist->dec = avcodec_find_decoder(dec->codec_id);
2756 switch (dec->codec_type) {
2757 case AVMEDIA_TYPE_AUDIO:
2758 if (o->audio_disable)
2759 st->discard= AVDISCARD_ALL;
2761 case AVMEDIA_TYPE_VIDEO:
2762 rfps = ic->streams[i]->r_frame_rate.num;
2763 rfps_base = ic->streams[i]->r_frame_rate.den;
2765 dec->flags |= CODEC_FLAG_EMU_EDGE;
2766 dec->height >>= dec->lowres;
2767 dec->width >>= dec->lowres;
2770 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2773 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2774 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2776 (float)rfps / rfps_base, rfps, rfps_base);
2779 if (o->video_disable)
2780 st->discard= AVDISCARD_ALL;
2781 else if(video_discard)
2782 st->discard= video_discard;
2784 case AVMEDIA_TYPE_DATA:
2786 case AVMEDIA_TYPE_SUBTITLE:
2787 if (o->subtitle_disable)
2788 st->discard = AVDISCARD_ALL;
2790 case AVMEDIA_TYPE_ATTACHMENT:
2791 case AVMEDIA_TYPE_UNKNOWN:
2799 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2801 AVFormatContext *ic;
2802 AVInputFormat *file_iformat = NULL;
2806 AVDictionary **opts;
2807 int orig_nb_streams; // number of streams before avformat_find_stream_info
2810 if (!(file_iformat = av_find_input_format(o->format))) {
2811 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2816 if (!strcmp(filename, "-"))
2819 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2820 !strcmp(filename, "/dev/stdin");
2822 /* get default parameters from command line */
2823 ic = avformat_alloc_context();
2825 print_error(filename, AVERROR(ENOMEM));
2828 if (o->nb_audio_sample_rate) {
2829 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2830 av_dict_set(&format_opts, "sample_rate", buf, 0);
2832 if (o->nb_audio_channels) {
2833 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2834 av_dict_set(&format_opts, "channels", buf, 0);
2836 if (o->nb_frame_rates) {
2837 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2839 if (o->nb_frame_sizes) {
2840 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2842 if (o->nb_frame_pix_fmts)
2843 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2845 ic->flags |= AVFMT_FLAG_NONBLOCK;
2847 /* open the input file with generic libav function */
2848 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2850 print_error(filename, err);
2853 assert_avoptions(format_opts);
2855 /* apply forced codec ids */
2856 for (i = 0; i < ic->nb_streams; i++)
2857 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2859 /* Set AVCodecContext options for avformat_find_stream_info */
2860 opts = setup_find_stream_info_opts(ic, codec_opts);
2861 orig_nb_streams = ic->nb_streams;
2863 /* If not enough info to get the stream parameters, we decode the
2864 first frames to get it. (used in mpeg case for example) */
2865 ret = avformat_find_stream_info(ic, opts);
2866 if (ret < 0 && verbose >= 0) {
2867 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2868 av_close_input_file(ic);
2872 timestamp = o->start_time;
2873 /* add the stream start time */
2874 if (ic->start_time != AV_NOPTS_VALUE)
2875 timestamp += ic->start_time;
2877 /* if seeking requested, we execute it */
2878 if (o->start_time != 0) {
2879 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2881 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2882 filename, (double)timestamp / AV_TIME_BASE);
2886 /* update the current parameters so that they match the one of the input stream */
2887 add_input_streams(o, ic);
2889 /* dump the file content */
2891 av_dump_format(ic, nb_input_files, filename, 0);
2893 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2894 input_files[nb_input_files - 1].ctx = ic;
2895 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
2896 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
2897 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
2898 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
2900 for (i = 0; i < orig_nb_streams; i++)
2901 av_dict_free(&opts[i]);
2908 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2909 AVCodecContext *avctx)
2915 for (p = kf; *p; p++)
2918 ost->forced_kf_count = n;
2919 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2920 if (!ost->forced_kf_pts) {
2921 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2924 for (i = 0; i < n; i++) {
2925 p = i ? strchr(p, ',') + 1 : kf;
2926 t = parse_time_or_die("force_key_frames", p, 1);
2927 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2931 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
2934 AVStream *st = av_new_stream(oc, oc->nb_streams < o->nb_streamid_map ? o->streamid_map[oc->nb_streams] : 0);
2935 int idx = oc->nb_streams - 1;
2936 int64_t max_frames = INT64_MAX;
2937 char *bsf = NULL, *next, *codec_tag = NULL;
2938 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
2942 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
2946 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
2947 nb_output_streams + 1);
2948 ost = &output_streams[nb_output_streams - 1];
2949 ost->file_index = nb_output_files;
2952 st->codec->codec_type = type;
2953 ost->enc = choose_codec(o, oc, st, type);
2955 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
2958 avcodec_get_context_defaults3(st->codec, ost->enc);
2959 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
2961 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
2962 ost->max_frames = max_frames;
2964 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
2966 if (next = strchr(bsf, ','))
2968 if (!(bsfc = av_bitstream_filter_init(bsf))) {
2969 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
2973 bsfc_prev->next = bsfc;
2975 ost->bitstream_filters = bsfc;
2981 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
2983 uint32_t tag = strtol(codec_tag, &next, 0);
2985 tag = AV_RL32(codec_tag);
2986 st->codec->codec_tag = tag;
2989 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
2990 if (qscale >= 0 || same_quant) {
2991 st->codec->flags |= CODEC_FLAG_QSCALE;
2992 st->codec->global_quality = FF_QP2LAMBDA * qscale;
2995 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
2999 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3002 const char *p = str;
3009 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3016 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3020 AVCodecContext *video_enc;
3022 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3024 video_enc = st->codec;
3026 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3027 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3030 if (!st->stream_copy) {
3031 const char *p = NULL;
3032 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3033 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3034 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3035 int i, force_fps = 0, top_field_first = -1;
3037 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3038 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3039 av_log(NULL, AV_LOG_ERROR, "Invalid framerate value: %s\n", frame_rate);
3043 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3044 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3045 av_log(NULL, AV_LOG_ERROR, "Invalid frame size: %s.\n", frame_size);
3049 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3050 if (frame_aspect_ratio)
3051 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3053 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3054 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3055 av_log(NULL, AV_LOG_ERROR, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3058 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3060 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3062 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3063 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for intra matrix.\n");
3066 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3068 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3070 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3071 av_log(NULL, AV_LOG_ERROR, "Could not allocate memory for inter matrix.\n");
3074 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3077 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3080 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3082 fprintf(stderr, "error parsing rc_override\n");
3085 video_enc->rc_override=
3086 av_realloc(video_enc->rc_override,
3087 sizeof(RcOverride)*(i+1));
3088 video_enc->rc_override[i].start_frame= start;
3089 video_enc->rc_override[i].end_frame = end;
3091 video_enc->rc_override[i].qscale= q;
3092 video_enc->rc_override[i].quality_factor= 1.0;
3095 video_enc->rc_override[i].qscale= 0;
3096 video_enc->rc_override[i].quality_factor= -q/100.0;
3101 video_enc->rc_override_count=i;
3102 if (!video_enc->rc_initial_buffer_occupancy)
3103 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3104 video_enc->intra_dc_precision= intra_dc_precision - 8;
3109 video_enc->flags |= CODEC_FLAG_PASS1;
3111 video_enc->flags |= CODEC_FLAG_PASS2;
3115 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3116 if (forced_key_frames)
3117 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3119 MATCH_PER_STREAM_OPT(force_fps, i, force_fps, oc, st);
3120 ost->force_fps = force_fps;
3122 MATCH_PER_STREAM_OPT(top_field_first, i, top_field_first, oc, st);
3123 ost->top_field_first = top_field_first;
3126 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3128 ost->avfilter = av_strdup(filters);
3135 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3139 AVCodecContext *audio_enc;
3141 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3144 audio_enc = st->codec;
3145 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3147 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3148 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3150 if (!st->stream_copy) {
3151 char *sample_fmt = NULL;
3153 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3155 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3157 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3158 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", sample_fmt);
3162 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3168 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3172 AVCodecContext *data_enc;
3174 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3176 data_enc = st->codec;
3177 if (!st->stream_copy) {
3178 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3182 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3183 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3189 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3193 AVCodecContext *subtitle_enc;
3195 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3197 subtitle_enc = st->codec;
3199 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3201 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3202 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3208 /* arg format is "output-stream-index:streamid-value". */
3209 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3215 av_strlcpy(idx_str, arg, sizeof(idx_str));
3216 p = strchr(idx_str, ':');
3219 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3224 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3225 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3226 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3230 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3232 AVFormatContext *is = ifile->ctx;
3233 AVFormatContext *os = ofile->ctx;
3236 for (i = 0; i < is->nb_chapters; i++) {
3237 AVChapter *in_ch = is->chapters[i], *out_ch;
3238 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3239 AV_TIME_BASE_Q, in_ch->time_base);
3240 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3241 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3244 if (in_ch->end < ts_off)
3246 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3249 out_ch = av_mallocz(sizeof(AVChapter));
3251 return AVERROR(ENOMEM);
3253 out_ch->id = in_ch->id;
3254 out_ch->time_base = in_ch->time_base;
3255 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3256 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3259 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3262 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3264 return AVERROR(ENOMEM);
3265 os->chapters[os->nb_chapters - 1] = out_ch;
3270 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3273 AVFormatContext *ic = NULL;
3275 err = avformat_open_input(&ic, filename, NULL, NULL);
3278 /* copy stream format */
3279 for(i=0;i<ic->nb_streams;i++) {
3284 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3285 ost = new_output_stream(o, s, codec->type);
3288 // FIXME: a more elegant solution is needed
3289 memcpy(st, ic->streams[i], sizeof(AVStream));
3291 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3293 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3294 choose_sample_fmt(st, codec);
3295 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3296 choose_pixel_fmt(st, codec);
3299 av_close_input_file(ic);
3303 static void opt_output_file(void *optctx, const char *filename)
3305 OptionsContext *o = optctx;
3306 AVFormatContext *oc;
3308 AVOutputFormat *file_oformat;
3312 if (!strcmp(filename, "-"))
3315 oc = avformat_alloc_context();
3317 print_error(filename, AVERROR(ENOMEM));
3322 file_oformat = av_guess_format(o->format, NULL, NULL);
3323 if (!file_oformat) {
3324 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3328 file_oformat = av_guess_format(NULL, filename, NULL);
3329 if (!file_oformat) {
3330 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3336 oc->oformat = file_oformat;
3337 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3339 if (!strcmp(file_oformat->name, "ffm") &&
3340 av_strstart(filename, "http:", NULL)) {
3341 /* special case for files sent to avserver: we get the stream
3342 parameters from avserver */
3343 int err = read_avserver_streams(o, oc, filename);
3345 print_error(filename, err);
3348 } else if (!o->nb_stream_maps) {
3349 /* pick the "best" stream of each type */
3350 #define NEW_STREAM(type, index)\
3352 ost = new_ ## type ## _stream(o, oc);\
3353 ost->source_index = index;\
3354 ost->sync_ist = &input_streams[index];\
3355 input_streams[index].discard = 0;\
3358 /* video: highest resolution */
3359 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3360 int area = 0, idx = -1;
3361 for (i = 0; i < nb_input_streams; i++) {
3362 ist = &input_streams[i];
3363 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3364 ist->st->codec->width * ist->st->codec->height > area) {
3365 area = ist->st->codec->width * ist->st->codec->height;
3369 NEW_STREAM(video, idx);
3372 /* audio: most channels */
3373 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3374 int channels = 0, idx = -1;
3375 for (i = 0; i < nb_input_streams; i++) {
3376 ist = &input_streams[i];
3377 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3378 ist->st->codec->channels > channels) {
3379 channels = ist->st->codec->channels;
3383 NEW_STREAM(audio, idx);
3386 /* subtitles: pick first */
3387 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3388 for (i = 0; i < nb_input_streams; i++)
3389 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3390 NEW_STREAM(subtitle, i);
3394 /* do something with data? */
3396 for (i = 0; i < o->nb_stream_maps; i++) {
3397 StreamMap *map = &o->stream_maps[i];
3402 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3403 switch (ist->st->codec->codec_type) {
3404 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3405 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3406 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3407 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3409 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3410 map->file_index, map->stream_index);
3414 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3415 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3416 map->sync_stream_index];
3421 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3422 output_files[nb_output_files - 1].ctx = oc;
3423 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3424 output_files[nb_output_files - 1].recording_time = o->recording_time;
3425 output_files[nb_output_files - 1].start_time = o->start_time;
3426 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3427 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3429 /* check filename in case of an image number is expected */
3430 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3431 if (!av_filename_number_test(oc->filename)) {
3432 print_error(oc->filename, AVERROR(EINVAL));
3437 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3438 /* test if it already exists to avoid loosing precious files */
3439 if (!file_overwrite &&
3440 (strchr(filename, ':') == NULL ||
3441 filename[1] == ':' ||
3442 av_strstart(filename, "file:", NULL))) {
3443 if (avio_check(filename, 0) == 0) {
3445 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3447 if (!read_yesno()) {
3448 fprintf(stderr, "Not overwriting - exiting\n");
3453 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3460 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3461 print_error(filename, err);
3466 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3467 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3468 oc->flags |= AVFMT_FLAG_NONBLOCK;
3471 if (o->chapters_input_file >= nb_input_files) {
3472 if (o->chapters_input_file == INT_MAX) {
3473 /* copy chapters from the first input file that has them*/
3474 o->chapters_input_file = -1;
3475 for (i = 0; i < nb_input_files; i++)
3476 if (input_files[i].ctx->nb_chapters) {
3477 o->chapters_input_file = i;
3481 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3482 o->chapters_input_file);
3486 if (o->chapters_input_file >= 0)
3487 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3488 !o->metadata_chapters_manual);
3491 for (i = 0; i < o->nb_meta_data_maps; i++) {
3492 AVFormatContext *files[2];
3493 AVDictionary **meta[2];
3496 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3497 if ((index) < 0 || (index) >= (nb_elems)) {\
3498 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3503 int in_file_index = o->meta_data_maps[i][1].file;
3504 if (in_file_index < 0)
3506 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3509 files[1] = input_files[in_file_index].ctx;
3511 for (j = 0; j < 2; j++) {
3512 MetadataMap *map = &o->meta_data_maps[i][j];
3514 switch (map->type) {
3516 meta[j] = &files[j]->metadata;
3519 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3520 meta[j] = &files[j]->streams[map->index]->metadata;
3523 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3524 meta[j] = &files[j]->chapters[map->index]->metadata;
3527 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3528 meta[j] = &files[j]->programs[map->index]->metadata;
3533 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3536 /* copy global metadata by default */
3537 if (!o->metadata_global_manual && nb_input_files)
3538 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3539 AV_DICT_DONT_OVERWRITE);
3540 if (!o->metadata_streams_manual)
3541 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3542 InputStream *ist = &input_streams[output_streams[i].source_index];
3543 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3546 /* process manually set metadata */
3547 for (i = 0; i < o->nb_metadata; i++) {
3552 val = strchr(o->metadata[i].u.str, '=');
3554 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3555 o->metadata[i].u.str);
3560 parse_meta_type(o->metadata[i].specifier, &type, &index);
3566 if (index < 0 || index >= oc->nb_streams) {
3567 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3570 m = &oc->streams[index]->metadata;
3573 if (index < 0 || index >= oc->nb_chapters) {
3574 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3577 m = &oc->chapters[index]->metadata;
3580 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3584 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3590 /* same option as mencoder */
3591 static int opt_pass(const char *opt, const char *arg)
3593 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3597 static int64_t getutime(void)
3600 struct rusage rusage;
3602 getrusage(RUSAGE_SELF, &rusage);
3603 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3604 #elif HAVE_GETPROCESSTIMES
3606 FILETIME c, e, k, u;
3607 proc = GetCurrentProcess();
3608 GetProcessTimes(proc, &c, &e, &k, &u);
3609 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3611 return av_gettime();
3615 static int64_t getmaxrss(void)
3617 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3618 struct rusage rusage;
3619 getrusage(RUSAGE_SELF, &rusage);
3620 return (int64_t)rusage.ru_maxrss * 1024;
3621 #elif HAVE_GETPROCESSMEMORYINFO
3623 PROCESS_MEMORY_COUNTERS memcounters;
3624 proc = GetCurrentProcess();
3625 memcounters.cb = sizeof(memcounters);
3626 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3627 return memcounters.PeakPagefileUsage;
3633 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3635 return parse_option(o, "q:a", arg, options);
3638 static void show_usage(void)
3640 printf("Hyper fast Audio and Video encoder\n");
3641 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3645 static void show_help(void)
3648 AVOutputFormat *oformat = NULL;
3649 AVInputFormat *iformat = NULL;
3650 const AVClass *class;
3652 av_log_set_callback(log_callback_help);
3654 show_help_options(options, "Main options:\n",
3655 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3656 show_help_options(options, "\nAdvanced options:\n",
3657 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3659 show_help_options(options, "\nVideo options:\n",
3660 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3662 show_help_options(options, "\nAdvanced Video options:\n",
3663 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3664 OPT_VIDEO | OPT_EXPERT);
3665 show_help_options(options, "\nAudio options:\n",
3666 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3668 show_help_options(options, "\nAdvanced Audio options:\n",
3669 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3670 OPT_AUDIO | OPT_EXPERT);
3671 show_help_options(options, "\nSubtitle options:\n",
3672 OPT_SUBTITLE | OPT_GRAB,
3674 show_help_options(options, "\nAudio/Video grab options:\n",
3678 class = avcodec_get_class();
3679 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3682 /* individual codec options */
3684 while ((c = av_codec_next(c))) {
3685 if (c->priv_class) {
3686 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3691 class = avformat_get_class();
3692 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3695 /* individual muxer options */
3696 while ((oformat = av_oformat_next(oformat))) {
3697 if (oformat->priv_class) {
3698 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3703 /* individual demuxer options */
3704 while ((iformat = av_iformat_next(iformat))) {
3705 if (iformat->priv_class) {
3706 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3711 class = sws_get_class();
3712 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3715 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3717 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3718 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3720 if(!strncmp(arg, "pal-", 4)) {
3723 } else if(!strncmp(arg, "ntsc-", 5)) {
3726 } else if(!strncmp(arg, "film-", 5)) {
3730 /* Try to determine PAL/NTSC by peeking in the input files */
3731 if(nb_input_files) {
3733 for (j = 0; j < nb_input_files; j++) {
3734 for (i = 0; i < input_files[j].nb_streams; i++) {
3735 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3736 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3738 fr = c->time_base.den * 1000 / c->time_base.num;
3742 } else if((fr == 29970) || (fr == 23976)) {
3751 if(verbose > 0 && norm != UNKNOWN)
3752 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3755 if(norm == UNKNOWN) {
3756 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3757 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3758 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3762 if(!strcmp(arg, "vcd")) {
3763 opt_video_codec(o, "c:v", "mpeg1video");
3764 opt_audio_codec(o, "c:a", "mp2");
3765 parse_option(o, "f", "vcd", options);
3767 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3768 parse_option(o, "r", frame_rates[norm], options);
3769 opt_default("g", norm == PAL ? "15" : "18");
3771 opt_default("b", "1150000");
3772 opt_default("maxrate", "1150000");
3773 opt_default("minrate", "1150000");
3774 opt_default("bufsize", "327680"); // 40*1024*8;
3776 opt_default("b:a", "224000");
3777 parse_option(o, "ar", "44100", options);
3778 parse_option(o, "ac", "2", options);
3780 opt_default("packetsize", "2324");
3781 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3783 /* We have to offset the PTS, so that it is consistent with the SCR.
3784 SCR starts at 36000, but the first two packs contain only padding
3785 and the first pack from the other stream, respectively, may also have
3786 been written before.
3787 So the real data starts at SCR 36000+3*1200. */
3788 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3789 } else if(!strcmp(arg, "svcd")) {
3791 opt_video_codec(o, "c:v", "mpeg2video");
3792 opt_audio_codec(o, "c:a", "mp2");
3793 parse_option(o, "f", "svcd", options);
3795 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
3796 parse_option(o, "r", frame_rates[norm], options);
3797 opt_default("g", norm == PAL ? "15" : "18");
3799 opt_default("b", "2040000");
3800 opt_default("maxrate", "2516000");
3801 opt_default("minrate", "0"); //1145000;
3802 opt_default("bufsize", "1835008"); //224*1024*8;
3803 opt_default("flags", "+scan_offset");
3806 opt_default("b:a", "224000");
3807 parse_option(o, "ar", "44100", options);
3809 opt_default("packetsize", "2324");
3811 } else if(!strcmp(arg, "dvd")) {
3813 opt_video_codec(o, "c:v", "mpeg2video");
3814 opt_audio_codec(o, "c:a", "ac3");
3815 parse_option(o, "f", "dvd", options);
3817 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3818 parse_option(o, "r", frame_rates[norm], options);
3819 opt_default("g", norm == PAL ? "15" : "18");
3821 opt_default("b", "6000000");
3822 opt_default("maxrate", "9000000");
3823 opt_default("minrate", "0"); //1500000;
3824 opt_default("bufsize", "1835008"); //224*1024*8;
3826 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3827 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3829 opt_default("b:a", "448000");
3830 parse_option(o, "ar", "48000", options);
3832 } else if(!strncmp(arg, "dv", 2)) {
3834 parse_option(o, "f", "dv", options);
3836 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3837 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3838 norm == PAL ? "yuv420p" : "yuv411p", options);
3839 parse_option(o, "r", frame_rates[norm], options);
3841 parse_option(o, "ar", "48000", options);
3842 parse_option(o, "ac", "2", options);
3845 fprintf(stderr, "Unknown target: %s\n", arg);
3846 return AVERROR(EINVAL);
3851 static int opt_vstats_file(const char *opt, const char *arg)
3853 av_free (vstats_filename);
3854 vstats_filename=av_strdup (arg);
3858 static int opt_vstats(const char *opt, const char *arg)
3861 time_t today2 = time(NULL);
3862 struct tm *today = localtime(&today2);
3864 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3866 return opt_vstats_file(opt, filename);
3869 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3871 return parse_option(o, "frames:v", arg, options);
3874 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3876 return parse_option(o, "frames:a", arg, options);
3879 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3881 return parse_option(o, "frames:d", arg, options);
3884 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
3886 return parse_option(o, "tag:v", arg, options);
3889 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
3891 return parse_option(o, "tag:a", arg, options);
3894 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
3896 return parse_option(o, "tag:s", arg, options);
3899 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
3901 return parse_option(o, "filter:v", arg, options);
3904 #define OFFSET(x) offsetof(OptionsContext, x)
3905 static const OptionDef options[] = {
3907 #include "cmdutils_common_opts.h"
3908 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
3909 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
3910 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3911 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3912 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3913 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
3914 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
3915 "outfile[,metadata]:infile[,metadata]" },
3916 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
3917 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3918 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
3919 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
3920 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
3921 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
3922 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
3923 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
3924 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3925 "add timings for benchmarking" },
3926 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
3927 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3928 "dump each input packet" },
3929 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3930 "when dumping packets, also dump the payload" },
3931 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
3932 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
3933 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3934 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3935 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3936 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3937 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3938 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
3939 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3940 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3941 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3942 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3943 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
3944 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
3945 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
3946 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
3948 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
3952 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
3953 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
3954 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
3955 { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
3956 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
3957 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
3958 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
3959 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
3960 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
3961 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
3962 "use same quantizer as source (implies VBR)" },
3963 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
3964 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
3965 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
3966 "deinterlace pictures" },
3967 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
3968 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
3970 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
3972 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
3973 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
3974 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
3975 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
3976 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
3977 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
3978 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
3979 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
3980 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
3983 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
3984 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
3985 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
3986 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
3987 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
3988 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
3989 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
3990 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
3991 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
3993 /* subtitle options */
3994 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
3995 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
3996 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
3999 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4002 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4003 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4005 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4007 /* data codec support */
4008 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4010 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4014 int main(int argc, char **argv)
4016 OptionsContext o = { 0 };
4021 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4023 avcodec_register_all();
4025 avdevice_register_all();
4028 avfilter_register_all();
4032 avio_set_interrupt_cb(decode_interrupt_cb);
4037 parse_options(&o, argc, argv, options, opt_output_file);
4039 if(nb_output_files <= 0 && nb_input_files == 0) {
4041 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4045 /* file converter / grab */
4046 if (nb_output_files <= 0) {
4047 fprintf(stderr, "At least one output file must be specified\n");
4051 if (nb_input_files == 0) {
4052 fprintf(stderr, "At least one input file must be specified\n");
4057 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4059 ti = getutime() - ti;
4061 int maxrss = getmaxrss() / 1024;
4062 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);