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 /* indexed by output file stream index */
101 static int *streamid_map = NULL;
102 static int nb_streamid_map = 0;
104 static int frame_width = 0;
105 static int frame_height = 0;
106 static float frame_aspect_ratio = 0;
107 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
108 static AVRational frame_rate;
109 static uint16_t *intra_matrix = NULL;
110 static uint16_t *inter_matrix = NULL;
111 static const char *video_rc_override_string=NULL;
112 static int video_discard = 0;
113 static int same_quant = 0;
114 static int do_deinterlace = 0;
115 static int top_field_first = -1;
116 static int me_threshold = 0;
117 static int intra_dc_precision = 8;
118 static int qp_hist = 0;
120 static char *vfilters = NULL;
123 static int file_overwrite = 0;
124 static int do_benchmark = 0;
125 static int do_hex_dump = 0;
126 static int do_pkt_dump = 0;
127 static int do_psnr = 0;
128 static int do_pass = 0;
129 static char *pass_logfilename_prefix = NULL;
130 static int video_sync_method= -1;
131 static int audio_sync_method= 0;
132 static float audio_drift_threshold= 0.1;
133 static int copy_ts= 0;
135 static int opt_shortest = 0;
136 static char *vstats_filename;
137 static FILE *vstats_file;
138 static int copy_initial_nonkeyframes = 0;
140 static int audio_volume = 256;
142 static int exit_on_error = 0;
143 static int using_stdin = 0;
144 static int verbose = 1;
145 static int64_t video_size = 0;
146 static int64_t audio_size = 0;
147 static int64_t extra_size = 0;
148 static int nb_frames_dup = 0;
149 static int nb_frames_drop = 0;
150 static int input_sync;
151 static int force_fps = 0;
152 static char *forced_key_frames = NULL;
154 static float dts_delta_threshold = 10;
156 static uint8_t *audio_buf;
157 static uint8_t *audio_out;
158 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
160 static short *samples;
162 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
164 typedef struct InputStream {
167 int discard; /* true if stream data should be discarded */
168 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
171 int64_t start; /* time when read started */
172 int64_t next_pts; /* synthetic pts for cases where pkt.pts
174 int64_t pts; /* current pts */
175 PtsCorrectionContext pts_ctx;
177 int is_start; /* is 1 at the start and after a discontinuity */
178 int showed_multi_packet_warning;
182 typedef struct InputFile {
183 AVFormatContext *ctx;
184 int eof_reached; /* true if eof reached */
185 int ist_index; /* index of first stream in ist_table */
186 int buffer_size; /* current total buffer size */
188 int nb_streams; /* number of stream that avconv is aware of; may be different
189 from ctx.nb_streams if new streams appear during av_read_frame() */
193 typedef struct OutputStream {
194 int file_index; /* file index */
195 int index; /* stream index in the output file */
196 int source_index; /* InputStream index */
197 AVStream *st; /* stream in the output file */
198 int encoding_needed; /* true if encoding needed for this stream */
200 /* input pts and corresponding output pts
202 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
203 struct InputStream *sync_ist; /* input stream to sync against */
204 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
205 AVBitStreamFilterContext *bitstream_filters;
211 AVFrame pict_tmp; /* temporary image for resampling */
212 struct SwsContext *img_resample_ctx; /* for image resampling */
215 int resample_pix_fmt;
216 AVRational frame_rate;
218 float frame_aspect_ratio;
220 /* forced key frames */
221 int64_t *forced_kf_pts;
227 ReSampleContext *resample; /* for audio resampling */
228 int resample_sample_fmt;
229 int resample_channels;
230 int resample_sample_rate;
232 AVAudioConvert *reformat_ctx;
233 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
237 AVFilterContext *output_video_filter;
238 AVFilterContext *input_video_filter;
239 AVFilterBufferRef *picref;
241 AVFilterGraph *graph;
246 int is_past_recording_time;
250 typedef struct OutputFile {
251 AVFormatContext *ctx;
253 int ost_index; /* index of the first stream in output_streams */
254 int64_t recording_time; /* desired length of the resulting file in microseconds */
255 int64_t start_time; /* start time in microseconds */
256 uint64_t limit_filesize;
259 static InputStream *input_streams = NULL;
260 static int nb_input_streams = 0;
261 static InputFile *input_files = NULL;
262 static int nb_input_files = 0;
264 static OutputStream *output_streams = NULL;
265 static int nb_output_streams = 0;
266 static OutputFile *output_files = NULL;
267 static int nb_output_files = 0;
269 typedef struct OptionsContext {
270 /* input/output options */
274 SpecifierOpt *codec_names;
276 SpecifierOpt *audio_channels;
277 int nb_audio_channels;
278 SpecifierOpt *audio_sample_rate;
279 int nb_audio_sample_rate;
282 int64_t input_ts_offset;
285 SpecifierOpt *ts_scale;
289 StreamMap *stream_maps;
291 /* first item specifies output metadata, second is input */
292 MetadataMap (*meta_data_maps)[2];
293 int nb_meta_data_maps;
294 int metadata_global_manual;
295 int metadata_streams_manual;
296 int metadata_chapters_manual;
298 int chapters_input_file;
300 int64_t recording_time;
301 uint64_t limit_filesize;
307 int subtitle_disable;
310 SpecifierOpt *metadata;
312 SpecifierOpt *max_frames;
314 SpecifierOpt *bitstream_filters;
315 int nb_bitstream_filters;
316 SpecifierOpt *codec_tags;
318 SpecifierOpt *sample_fmts;
320 SpecifierOpt *qscale;
324 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
327 for (i = 0; i < o->nb_ ## name; i++) {\
328 char *spec = o->name[i].specifier;\
329 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
330 outvar = o->name[i].u.type;\
336 static void reset_options(OptionsContext *o)
338 const OptionDef *po = options;
340 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
342 void *dst = (uint8_t*)o + po->u.off;
344 if (po->flags & OPT_SPEC) {
345 SpecifierOpt **so = dst;
346 int i, *count = (int*)(so + 1);
347 for (i = 0; i < *count; i++) {
348 av_freep(&(*so)[i].specifier);
349 if (po->flags & OPT_STRING)
350 av_freep(&(*so)[i].u.str);
354 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
359 av_freep(&o->stream_maps);
360 av_freep(&o->meta_data_maps);
362 memset(o, 0, sizeof(*o));
364 o->mux_preload = 0.5;
365 o->mux_max_delay = 0.7;
366 o->recording_time = INT64_MAX;
367 o->limit_filesize = UINT64_MAX;
368 o->chapters_input_file = INT_MAX;
376 static int configure_video_filters(InputStream *ist, OutputStream *ost)
378 AVFilterContext *last_filter, *filter;
379 /** filter graph containing all filters including input & output */
380 AVCodecContext *codec = ost->st->codec;
381 AVCodecContext *icodec = ist->st->codec;
382 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
383 AVRational sample_aspect_ratio;
387 ost->graph = avfilter_graph_alloc();
389 if (ist->st->sample_aspect_ratio.num){
390 sample_aspect_ratio = ist->st->sample_aspect_ratio;
392 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
394 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
395 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
396 sample_aspect_ratio.num, sample_aspect_ratio.den);
398 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
399 "src", args, NULL, ost->graph);
402 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
403 "out", NULL, &ffsink_ctx, ost->graph);
406 last_filter = ost->input_video_filter;
408 if (codec->width != icodec->width || codec->height != icodec->height) {
409 snprintf(args, 255, "%d:%d:flags=0x%X",
413 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
414 NULL, args, NULL, ost->graph)) < 0)
416 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
418 last_filter = filter;
421 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
422 ost->graph->scale_sws_opts = av_strdup(args);
425 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
426 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
428 outputs->name = av_strdup("in");
429 outputs->filter_ctx = last_filter;
430 outputs->pad_idx = 0;
431 outputs->next = NULL;
433 inputs->name = av_strdup("out");
434 inputs->filter_ctx = ost->output_video_filter;
438 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
440 av_freep(&ost->avfilter);
442 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
446 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
449 codec->width = ost->output_video_filter->inputs[0]->w;
450 codec->height = ost->output_video_filter->inputs[0]->h;
451 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
452 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
453 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
454 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
458 #endif /* CONFIG_AVFILTER */
460 static void term_exit(void)
462 av_log(NULL, AV_LOG_QUIET, "");
465 static volatile int received_sigterm = 0;
466 static volatile int received_nb_signals = 0;
469 sigterm_handler(int sig)
471 received_sigterm = sig;
472 received_nb_signals++;
476 static void term_init(void)
478 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
479 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
481 signal(SIGXCPU, sigterm_handler);
485 static int decode_interrupt_cb(void)
487 return received_nb_signals > 1;
490 void exit_program(int ret)
495 for(i=0;i<nb_output_files;i++) {
496 AVFormatContext *s = output_files[i].ctx;
497 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
499 avformat_free_context(s);
500 av_dict_free(&output_files[i].opts);
502 for(i=0;i<nb_input_files;i++) {
503 av_close_input_file(input_files[i].ctx);
505 for (i = 0; i < nb_input_streams; i++)
506 av_dict_free(&input_streams[i].opts);
508 av_free(intra_matrix);
509 av_free(inter_matrix);
513 av_free(vstats_filename);
515 av_freep(&input_streams);
516 av_freep(&input_files);
517 av_freep(&output_streams);
518 av_freep(&output_files);
523 allocated_audio_buf_size= allocated_audio_out_size= 0;
530 if (received_sigterm) {
532 "Received signal %d: terminating.\n",
533 (int) received_sigterm);
537 exit(ret); /* not all OS-es handle main() return value */
540 static void assert_avoptions(AVDictionary *m)
542 AVDictionaryEntry *t;
543 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
544 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
549 static void assert_codec_experimental(AVCodecContext *c, int encoder)
551 const char *codec_string = encoder ? "encoder" : "decoder";
553 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
554 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
555 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
556 "results.\nAdd '-strict experimental' if you want to use it.\n",
557 codec_string, c->codec->name);
558 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
559 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
560 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
561 codec_string, codec->name);
566 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
568 if(codec && codec->sample_fmts){
569 const enum AVSampleFormat *p= codec->sample_fmts;
571 if(*p == st->codec->sample_fmt)
575 av_log(NULL, AV_LOG_WARNING,
576 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
577 av_get_sample_fmt_name(st->codec->sample_fmt),
579 av_get_sample_fmt_name(codec->sample_fmts[0]));
580 st->codec->sample_fmt = codec->sample_fmts[0];
586 * Update the requested input sample format based on the output sample format.
587 * This is currently only used to request float output from decoders which
588 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
589 * Ideally this will be removed in the future when decoders do not do format
590 * conversion and only output in their native format.
592 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
595 /* if sample formats match or a decoder sample format has already been
596 requested, just return */
597 if (enc->sample_fmt == dec->sample_fmt ||
598 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
601 /* if decoder supports more than one output format */
602 if (dec_codec && dec_codec->sample_fmts &&
603 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
604 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
605 const enum AVSampleFormat *p;
606 int min_dec = -1, min_inc = -1;
608 /* find a matching sample format in the encoder */
609 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
610 if (*p == enc->sample_fmt) {
611 dec->request_sample_fmt = *p;
613 } else if (*p > enc->sample_fmt) {
614 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
616 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
619 /* if none match, provide the one that matches quality closest */
620 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
621 enc->sample_fmt - min_dec;
625 static void choose_sample_rate(AVStream *st, AVCodec *codec)
627 if(codec && codec->supported_samplerates){
628 const int *p= codec->supported_samplerates;
630 int best_dist=INT_MAX;
632 int dist= abs(st->codec->sample_rate - *p);
633 if(dist < best_dist){
639 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
641 st->codec->sample_rate= best;
645 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
647 if(codec && codec->pix_fmts){
648 const enum PixelFormat *p= codec->pix_fmts;
649 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
650 if(st->codec->codec_id==CODEC_ID_MJPEG){
651 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
652 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
653 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};
657 if(*p == st->codec->pix_fmt)
661 if(st->codec->pix_fmt != PIX_FMT_NONE)
662 av_log(NULL, AV_LOG_WARNING,
663 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
664 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
666 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
667 st->codec->pix_fmt = codec->pix_fmts[0];
673 get_sync_ipts(const OutputStream *ost)
675 const InputStream *ist = ost->sync_ist;
676 OutputFile *of = &output_files[ost->file_index];
677 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
680 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
684 AVPacket new_pkt= *pkt;
685 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
686 &new_pkt.data, &new_pkt.size,
687 pkt->data, pkt->size,
688 pkt->flags & AV_PKT_FLAG_KEY);
691 new_pkt.destruct= av_destruct_packet;
693 fprintf(stderr, "%s failed for stream %d, codec %s",
694 bsfc->filter->name, pkt->stream_index,
695 avctx->codec ? avctx->codec->name : "copy");
705 ret= av_interleaved_write_frame(s, pkt);
707 print_error("av_interleaved_write_frame()", ret);
712 static void do_audio_out(AVFormatContext *s,
715 unsigned char *buf, int size)
718 int64_t audio_out_size, audio_buf_size;
719 int64_t allocated_for_size= size;
721 int size_out, frame_bytes, ret, resample_changed;
722 AVCodecContext *enc= ost->st->codec;
723 AVCodecContext *dec= ist->st->codec;
724 int osize = av_get_bytes_per_sample(enc->sample_fmt);
725 int isize = av_get_bytes_per_sample(dec->sample_fmt);
726 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
729 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
730 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
731 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
732 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
733 audio_buf_size*= osize*enc->channels;
735 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
736 if(coded_bps > 8*osize)
737 audio_out_size= audio_out_size * coded_bps / (8*osize);
738 audio_out_size += FF_MIN_BUFFER_SIZE;
740 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
741 fprintf(stderr, "Buffer sizes too large\n");
745 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
746 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
747 if (!audio_buf || !audio_out){
748 fprintf(stderr, "Out of memory in do_audio_out\n");
752 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
753 ost->audio_resample = 1;
755 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
756 ost->resample_channels != dec->channels ||
757 ost->resample_sample_rate != dec->sample_rate;
759 if ((ost->audio_resample && !ost->resample) || resample_changed) {
760 if (resample_changed) {
761 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",
762 ist->file_index, ist->st->index,
763 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
764 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
765 ost->resample_sample_fmt = dec->sample_fmt;
766 ost->resample_channels = dec->channels;
767 ost->resample_sample_rate = dec->sample_rate;
769 audio_resample_close(ost->resample);
771 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
772 if (audio_sync_method <= 1 &&
773 ost->resample_sample_fmt == enc->sample_fmt &&
774 ost->resample_channels == enc->channels &&
775 ost->resample_sample_rate == enc->sample_rate) {
776 ost->resample = NULL;
777 ost->audio_resample = 0;
778 } else if (ost->audio_resample) {
779 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
780 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
781 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
782 enc->sample_rate, dec->sample_rate,
783 enc->sample_fmt, dec->sample_fmt,
785 if (!ost->resample) {
786 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
787 dec->channels, dec->sample_rate,
788 enc->channels, enc->sample_rate);
794 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
795 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
796 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
797 if (ost->reformat_ctx)
798 av_audio_convert_free(ost->reformat_ctx);
799 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
800 dec->sample_fmt, 1, NULL, 0);
801 if (!ost->reformat_ctx) {
802 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
803 av_get_sample_fmt_name(dec->sample_fmt),
804 av_get_sample_fmt_name(enc->sample_fmt));
807 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
810 if(audio_sync_method){
811 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
812 - av_fifo_size(ost->fifo)/(enc->channels * 2);
813 double idelta= delta*dec->sample_rate / enc->sample_rate;
814 int byte_delta= ((int)idelta)*2*dec->channels;
816 //FIXME resample delay
817 if(fabs(delta) > 50){
818 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
820 byte_delta= FFMAX(byte_delta, -size);
824 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
829 static uint8_t *input_tmp= NULL;
830 input_tmp= av_realloc(input_tmp, byte_delta + size);
832 if(byte_delta > allocated_for_size - size){
833 allocated_for_size= byte_delta + (int64_t)size;
838 memset(input_tmp, 0, byte_delta);
839 memcpy(input_tmp + byte_delta, buf, size);
843 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
845 }else if(audio_sync_method>1){
846 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
847 av_assert0(ost->audio_resample);
849 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
850 // 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));
851 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
855 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
856 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
858 if (ost->audio_resample) {
860 size_out = audio_resample(ost->resample,
861 (short *)buftmp, (short *)buf,
862 size / (dec->channels * isize));
863 size_out = size_out * enc->channels * osize;
869 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
870 const void *ibuf[6]= {buftmp};
871 void *obuf[6]= {audio_buf};
872 int istride[6]= {isize};
873 int ostride[6]= {osize};
874 int len= size_out/istride[0];
875 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
876 printf("av_audio_convert() failed\n");
882 size_out = len*osize;
885 /* now encode as many frames as possible */
886 if (enc->frame_size > 1) {
887 /* output resampled raw samples */
888 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
889 fprintf(stderr, "av_fifo_realloc2() failed\n");
892 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
894 frame_bytes = enc->frame_size * osize * enc->channels;
896 while (av_fifo_size(ost->fifo) >= frame_bytes) {
898 av_init_packet(&pkt);
900 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
902 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
904 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
907 fprintf(stderr, "Audio encoding failed\n");
911 pkt.stream_index= ost->index;
914 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
915 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
916 pkt.flags |= AV_PKT_FLAG_KEY;
917 write_frame(s, &pkt, enc, ost->bitstream_filters);
919 ost->sync_opts += enc->frame_size;
923 av_init_packet(&pkt);
925 ost->sync_opts += size_out / (osize * enc->channels);
927 /* output a pcm frame */
928 /* determine the size of the coded buffer */
931 size_out = size_out*coded_bps/8;
933 if(size_out > audio_out_size){
934 fprintf(stderr, "Internal error, buffer size too small\n");
938 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
939 ret = avcodec_encode_audio(enc, audio_out, size_out,
942 fprintf(stderr, "Audio encoding failed\n");
946 pkt.stream_index= ost->index;
949 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
950 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
951 pkt.flags |= AV_PKT_FLAG_KEY;
952 write_frame(s, &pkt, enc, ost->bitstream_filters);
956 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
960 AVPicture picture_tmp;
963 dec = ist->st->codec;
965 /* deinterlace : must be done before any resize */
966 if (do_deinterlace) {
969 /* create temporary picture */
970 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
971 buf = av_malloc(size);
975 picture2 = &picture_tmp;
976 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
978 if(avpicture_deinterlace(picture2, picture,
979 dec->pix_fmt, dec->width, dec->height) < 0) {
980 /* if error, do not deinterlace */
981 fprintf(stderr, "Deinterlacing failed\n");
990 if (picture != picture2)
991 *picture = *picture2;
995 static void do_subtitle_out(AVFormatContext *s,
1001 static uint8_t *subtitle_out = NULL;
1002 int subtitle_out_max_size = 1024 * 1024;
1003 int subtitle_out_size, nb, i;
1004 AVCodecContext *enc;
1007 if (pts == AV_NOPTS_VALUE) {
1008 fprintf(stderr, "Subtitle packets must have a pts\n");
1014 enc = ost->st->codec;
1016 if (!subtitle_out) {
1017 subtitle_out = av_malloc(subtitle_out_max_size);
1020 /* Note: DVB subtitle need one packet to draw them and one other
1021 packet to clear them */
1022 /* XXX: signal it in the codec context ? */
1023 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1028 for(i = 0; i < nb; i++) {
1029 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1030 // start_display_time is required to be 0
1031 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1032 sub->end_display_time -= sub->start_display_time;
1033 sub->start_display_time = 0;
1034 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1035 subtitle_out_max_size, sub);
1036 if (subtitle_out_size < 0) {
1037 fprintf(stderr, "Subtitle encoding failed\n");
1041 av_init_packet(&pkt);
1042 pkt.stream_index = ost->index;
1043 pkt.data = subtitle_out;
1044 pkt.size = subtitle_out_size;
1045 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1046 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1047 /* XXX: the pts correction is handled here. Maybe handling
1048 it in the codec would be better */
1050 pkt.pts += 90 * sub->start_display_time;
1052 pkt.pts += 90 * sub->end_display_time;
1054 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1058 static int bit_buffer_size= 1024*256;
1059 static uint8_t *bit_buffer= NULL;
1061 static void do_video_resample(OutputStream *ost,
1063 AVFrame *in_picture,
1064 AVFrame **out_picture)
1066 int resample_changed = 0;
1067 AVCodecContext *dec = ist->st->codec;
1068 *out_picture = in_picture;
1070 resample_changed = ost->resample_width != dec->width ||
1071 ost->resample_height != dec->height ||
1072 ost->resample_pix_fmt != dec->pix_fmt;
1074 if (resample_changed) {
1075 av_log(NULL, AV_LOG_INFO,
1076 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1077 ist->file_index, ist->st->index,
1078 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1079 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1080 if(!ost->video_resample)
1081 ost->video_resample = 1;
1084 #if !CONFIG_AVFILTER
1085 if (ost->video_resample) {
1086 *out_picture = &ost->pict_tmp;
1087 if (resample_changed) {
1088 /* initialize a new scaler context */
1089 sws_freeContext(ost->img_resample_ctx);
1090 ost->img_resample_ctx = sws_getContext(
1091 ist->st->codec->width,
1092 ist->st->codec->height,
1093 ist->st->codec->pix_fmt,
1094 ost->st->codec->width,
1095 ost->st->codec->height,
1096 ost->st->codec->pix_fmt,
1097 ost->sws_flags, NULL, NULL, NULL);
1098 if (ost->img_resample_ctx == NULL) {
1099 fprintf(stderr, "Cannot get resampling context\n");
1103 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1104 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1107 if (resample_changed) {
1108 avfilter_graph_free(&ost->graph);
1109 if (configure_video_filters(ist, ost)) {
1110 fprintf(stderr, "Error reinitializing filters!\n");
1115 if (resample_changed) {
1116 ost->resample_width = dec->width;
1117 ost->resample_height = dec->height;
1118 ost->resample_pix_fmt = dec->pix_fmt;
1123 static void do_video_out(AVFormatContext *s,
1126 AVFrame *in_picture,
1127 int *frame_size, float quality)
1129 int nb_frames, i, ret, format_video_sync;
1130 AVFrame *final_picture;
1131 AVCodecContext *enc;
1134 enc = ost->st->codec;
1136 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1138 /* by default, we output a single frame */
1143 format_video_sync = video_sync_method;
1144 if (format_video_sync < 0)
1145 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1147 if (format_video_sync) {
1148 double vdelta = sync_ipts - ost->sync_opts;
1149 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1152 else if (format_video_sync == 2) {
1155 }else if(vdelta>0.6)
1156 ost->sync_opts= lrintf(sync_ipts);
1157 }else if (vdelta > 1.1)
1158 nb_frames = lrintf(vdelta);
1159 //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);
1160 if (nb_frames == 0){
1163 fprintf(stderr, "*** drop!\n");
1164 }else if (nb_frames > 1) {
1165 nb_frames_dup += nb_frames - 1;
1167 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1170 ost->sync_opts= lrintf(sync_ipts);
1172 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1176 do_video_resample(ost, ist, in_picture, &final_picture);
1178 /* duplicates frame if needed */
1179 for(i=0;i<nb_frames;i++) {
1181 av_init_packet(&pkt);
1182 pkt.stream_index= ost->index;
1184 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1185 /* raw pictures are written as AVPicture structure to
1186 avoid any copies. We support temporarily the older
1188 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1189 enc->coded_frame->top_field_first = in_picture->top_field_first;
1190 pkt.data= (uint8_t *)final_picture;
1191 pkt.size= sizeof(AVPicture);
1192 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1193 pkt.flags |= AV_PKT_FLAG_KEY;
1195 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1197 AVFrame big_picture;
1199 big_picture= *final_picture;
1200 /* better than nothing: use input picture interlaced
1202 big_picture.interlaced_frame = in_picture->interlaced_frame;
1203 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1204 if(top_field_first == -1)
1205 big_picture.top_field_first = in_picture->top_field_first;
1207 big_picture.top_field_first = top_field_first;
1210 /* handles same_quant here. This is not correct because it may
1211 not be a global option */
1212 big_picture.quality = quality;
1214 big_picture.pict_type = 0;
1215 // big_picture.pts = AV_NOPTS_VALUE;
1216 big_picture.pts= ost->sync_opts;
1217 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1218 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1219 if (ost->forced_kf_index < ost->forced_kf_count &&
1220 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1221 big_picture.pict_type = AV_PICTURE_TYPE_I;
1222 ost->forced_kf_index++;
1224 ret = avcodec_encode_video(enc,
1225 bit_buffer, bit_buffer_size,
1228 fprintf(stderr, "Video encoding failed\n");
1233 pkt.data= bit_buffer;
1235 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1236 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1237 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1238 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1239 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1241 if(enc->coded_frame->key_frame)
1242 pkt.flags |= AV_PKT_FLAG_KEY;
1243 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1246 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1247 // enc->frame_number-1, ret, enc->pict_type);
1248 /* if two pass, output log */
1249 if (ost->logfile && enc->stats_out) {
1250 fprintf(ost->logfile, "%s", enc->stats_out);
1255 ost->frame_number++;
1259 static double psnr(double d){
1260 return -10.0*log(d)/log(10.0);
1263 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1266 AVCodecContext *enc;
1268 double ti1, bitrate, avg_bitrate;
1270 /* this is executed just the first time do_video_stats is called */
1272 vstats_file = fopen(vstats_filename, "w");
1279 enc = ost->st->codec;
1280 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1281 frame_number = ost->frame_number;
1282 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1283 if (enc->flags&CODEC_FLAG_PSNR)
1284 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1286 fprintf(vstats_file,"f_size= %6d ", frame_size);
1287 /* compute pts value */
1288 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1292 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1293 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1294 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1295 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1296 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1300 static void print_report(OutputFile *output_files,
1301 OutputStream *ost_table, int nb_ostreams,
1302 int is_last_report, int64_t timer_start)
1306 AVFormatContext *oc;
1308 AVCodecContext *enc;
1309 int frame_number, vid, i;
1310 double bitrate, ti1, pts;
1311 static int64_t last_time = -1;
1312 static int qp_histogram[52];
1314 if (!is_last_report) {
1316 /* display the report every 0.5 seconds */
1317 cur_time = av_gettime();
1318 if (last_time == -1) {
1319 last_time = cur_time;
1322 if ((cur_time - last_time) < 500000)
1324 last_time = cur_time;
1328 oc = output_files[0].ctx;
1330 total_size = avio_size(oc->pb);
1331 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1332 total_size= avio_tell(oc->pb);
1337 for(i=0;i<nb_ostreams;i++) {
1339 ost = &ost_table[i];
1340 enc = ost->st->codec;
1341 if (!ost->st->stream_copy && enc->coded_frame)
1342 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1343 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1344 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1346 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1347 float t = (av_gettime()-timer_start) / 1000000.0;
1349 frame_number = ost->frame_number;
1350 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1351 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1357 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1360 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1362 if (enc->flags&CODEC_FLAG_PSNR){
1364 double error, error_sum=0;
1365 double scale, scale_sum=0;
1366 char type[3]= {'Y','U','V'};
1367 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1370 error= enc->error[j];
1371 scale= enc->width*enc->height*255.0*255.0*frame_number;
1373 error= enc->coded_frame->error[j];
1374 scale= enc->width*enc->height*255.0*255.0;
1379 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1381 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1385 /* compute min output value */
1386 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1387 if ((pts < ti1) && (pts > 0))
1393 if (verbose > 0 || is_last_report) {
1394 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1396 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1397 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1398 (double)total_size / 1024, ti1, bitrate);
1400 if (nb_frames_dup || nb_frames_drop)
1401 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1402 nb_frames_dup, nb_frames_drop);
1405 fprintf(stderr, "%s \r", buf);
1410 if (is_last_report && verbose >= 0){
1411 int64_t raw= audio_size + video_size + extra_size;
1412 fprintf(stderr, "\n");
1413 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1417 100.0*(total_size - raw)/raw
1422 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1424 int fill_char = 0x00;
1425 if (sample_fmt == AV_SAMPLE_FMT_U8)
1427 memset(buf, fill_char, size);
1430 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1434 for (i = 0; i < nb_ostreams; i++) {
1435 OutputStream *ost = &ost_table[i];
1436 AVCodecContext *enc = ost->st->codec;
1437 AVFormatContext *os = output_files[ost->file_index].ctx;
1439 if (!ost->encoding_needed)
1442 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1444 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1450 av_init_packet(&pkt);
1451 pkt.stream_index= ost->index;
1453 switch (ost->st->codec->codec_type) {
1454 case AVMEDIA_TYPE_AUDIO:
1455 fifo_bytes = av_fifo_size(ost->fifo);
1457 /* encode any samples remaining in fifo */
1458 if (fifo_bytes > 0) {
1459 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1460 int fs_tmp = enc->frame_size;
1462 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1463 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1464 enc->frame_size = fifo_bytes / (osize * enc->channels);
1466 int frame_bytes = enc->frame_size*osize*enc->channels;
1467 if (allocated_audio_buf_size < frame_bytes)
1469 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1472 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1473 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1474 ost->st->time_base.num, enc->sample_rate);
1475 enc->frame_size = fs_tmp;
1478 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1481 fprintf(stderr, "Audio encoding failed\n");
1485 pkt.flags |= AV_PKT_FLAG_KEY;
1487 case AVMEDIA_TYPE_VIDEO:
1488 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1490 fprintf(stderr, "Video encoding failed\n");
1494 if(enc->coded_frame && enc->coded_frame->key_frame)
1495 pkt.flags |= AV_PKT_FLAG_KEY;
1496 if (ost->logfile && enc->stats_out) {
1497 fprintf(ost->logfile, "%s", enc->stats_out);
1506 pkt.data = bit_buffer;
1508 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1509 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1510 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1515 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1516 static int output_packet(InputStream *ist, int ist_index,
1517 OutputStream *ost_table, int nb_ostreams,
1518 const AVPacket *pkt)
1520 AVFormatContext *os;
1525 void *buffer_to_free = NULL;
1526 static unsigned int samples_size= 0;
1527 AVSubtitle subtitle, *subtitle_to_free;
1528 int64_t pkt_pts = AV_NOPTS_VALUE;
1530 int frame_available;
1535 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1537 if(ist->next_pts == AV_NOPTS_VALUE)
1538 ist->next_pts= ist->pts;
1542 av_init_packet(&avpkt);
1550 if(pkt->dts != AV_NOPTS_VALUE)
1551 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1552 if(pkt->pts != AV_NOPTS_VALUE)
1553 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1555 //while we have more to decode or while the decoder did output something on EOF
1556 while (avpkt.size > 0 || (!pkt && got_output)) {
1557 uint8_t *data_buf, *decoded_data_buf;
1558 int data_size, decoded_data_size;
1560 ist->pts= ist->next_pts;
1562 if(avpkt.size && avpkt.size != pkt->size &&
1563 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1564 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1565 ist->showed_multi_packet_warning=1;
1568 /* decode the packet if needed */
1569 decoded_data_buf = NULL; /* fail safe */
1570 decoded_data_size= 0;
1571 data_buf = avpkt.data;
1572 data_size = avpkt.size;
1573 subtitle_to_free = NULL;
1574 if (ist->decoding_needed) {
1575 switch(ist->st->codec->codec_type) {
1576 case AVMEDIA_TYPE_AUDIO:{
1577 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1578 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1580 samples= av_malloc(samples_size);
1582 decoded_data_size= samples_size;
1583 /* XXX: could avoid copy if PCM 16 bits with same
1584 endianness as CPU */
1585 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1592 got_output = decoded_data_size > 0;
1593 /* Some bug in mpeg audio decoder gives */
1594 /* decoded_data_size < 0, it seems they are overflows */
1596 /* no audio frame */
1599 decoded_data_buf = (uint8_t *)samples;
1600 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1601 (ist->st->codec->sample_rate * ist->st->codec->channels);
1603 case AVMEDIA_TYPE_VIDEO:
1604 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1605 /* XXX: allocate picture correctly */
1606 avcodec_get_frame_defaults(&picture);
1607 avpkt.pts = pkt_pts;
1608 avpkt.dts = ist->pts;
1609 pkt_pts = AV_NOPTS_VALUE;
1611 ret = avcodec_decode_video2(ist->st->codec,
1612 &picture, &got_output, &avpkt);
1613 quality = same_quant ? picture.quality : 0;
1617 /* no picture yet */
1618 goto discard_packet;
1620 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1621 if (ist->st->codec->time_base.num != 0) {
1622 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1623 ist->next_pts += ((int64_t)AV_TIME_BASE *
1624 ist->st->codec->time_base.num * ticks) /
1625 ist->st->codec->time_base.den;
1628 buffer_to_free = NULL;
1629 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1631 case AVMEDIA_TYPE_SUBTITLE:
1632 ret = avcodec_decode_subtitle2(ist->st->codec,
1633 &subtitle, &got_output, &avpkt);
1637 goto discard_packet;
1639 subtitle_to_free = &subtitle;
1646 switch(ist->st->codec->codec_type) {
1647 case AVMEDIA_TYPE_AUDIO:
1648 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1649 ist->st->codec->sample_rate;
1651 case AVMEDIA_TYPE_VIDEO:
1652 if (ist->st->codec->time_base.num != 0) {
1653 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1654 ist->next_pts += ((int64_t)AV_TIME_BASE *
1655 ist->st->codec->time_base.num * ticks) /
1656 ist->st->codec->time_base.den;
1663 // preprocess audio (volume)
1664 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1665 if (audio_volume != 256) {
1668 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1669 int v = ((*volp) * audio_volume + 128) >> 8;
1670 *volp++ = av_clip_int16(v);
1675 /* frame rate emulation */
1676 if (input_files[ist->file_index].rate_emu) {
1677 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1678 int64_t now = av_gettime() - ist->start;
1682 /* if output time reached then transcode raw format,
1683 encode packets and output them */
1684 for (i = 0; i < nb_ostreams; i++) {
1685 OutputFile *of = &output_files[ost_table[i].file_index];
1688 ost = &ost_table[i];
1689 if (ost->source_index != ist_index)
1692 if (of->start_time && ist->pts < of->start_time)
1695 if (of->recording_time != INT64_MAX &&
1696 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1697 (AVRational){1, 1000000}) >= 0) {
1698 ost->is_past_recording_time = 1;
1703 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1704 ost->input_video_filter) {
1706 if (ist->st->sample_aspect_ratio.num)
1707 sar = ist->st->sample_aspect_ratio;
1709 sar = ist->st->codec->sample_aspect_ratio;
1710 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1712 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1713 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1714 while (frame_available) {
1715 AVRational ist_pts_tb;
1716 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1717 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1719 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1721 os = output_files[ost->file_index].ctx;
1723 /* set the input output pts pairs */
1724 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1726 if (ost->encoding_needed) {
1727 av_assert0(ist->decoding_needed);
1728 switch(ost->st->codec->codec_type) {
1729 case AVMEDIA_TYPE_AUDIO:
1730 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1732 case AVMEDIA_TYPE_VIDEO:
1734 if (ost->picref->video && !ost->frame_aspect_ratio)
1735 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1737 do_video_out(os, ost, ist, &picture, &frame_size,
1738 same_quant ? quality : ost->st->codec->global_quality);
1739 if (vstats_filename && frame_size)
1740 do_video_stats(os, ost, frame_size);
1742 case AVMEDIA_TYPE_SUBTITLE:
1743 do_subtitle_out(os, ost, ist, &subtitle,
1750 AVFrame avframe; //FIXME/XXX remove this
1752 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1754 av_init_packet(&opkt);
1756 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1757 #if !CONFIG_AVFILTER
1763 /* no reencoding needed : output the packet directly */
1764 /* force the input stream PTS */
1766 avcodec_get_frame_defaults(&avframe);
1767 ost->st->codec->coded_frame= &avframe;
1768 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1770 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1771 audio_size += data_size;
1772 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1773 video_size += data_size;
1777 opkt.stream_index= ost->index;
1778 if(pkt->pts != AV_NOPTS_VALUE)
1779 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1781 opkt.pts= AV_NOPTS_VALUE;
1783 if (pkt->dts == AV_NOPTS_VALUE)
1784 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1786 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1787 opkt.dts -= ost_tb_start_time;
1789 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1790 opkt.flags= pkt->flags;
1792 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1793 if( ost->st->codec->codec_id != CODEC_ID_H264
1794 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1795 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1797 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1798 opkt.destruct= av_destruct_packet;
1800 opkt.data = data_buf;
1801 opkt.size = data_size;
1804 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1805 ost->st->codec->frame_number++;
1806 ost->frame_number++;
1807 av_free_packet(&opkt);
1811 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1812 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1814 avfilter_unref_buffer(ost->picref);
1819 av_free(buffer_to_free);
1820 /* XXX: allocate the subtitles in the codec ? */
1821 if (subtitle_to_free) {
1822 avsubtitle_free(subtitle_to_free);
1823 subtitle_to_free = NULL;
1831 static void print_sdp(OutputFile *output_files, int n)
1835 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1839 for (i = 0; i < n; i++)
1840 avc[i] = output_files[i].ctx;
1842 av_sdp_create(avc, n, sdp, sizeof(sdp));
1843 printf("SDP:\n%s\n", sdp);
1848 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1849 char *error, int error_len)
1852 InputStream *ist = &input_streams[ist_index];
1853 if (ist->decoding_needed) {
1854 AVCodec *codec = ist->dec;
1856 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1857 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1858 return AVERROR(EINVAL);
1861 /* update requested sample format for the decoder based on the
1862 corresponding encoder sample format */
1863 for (i = 0; i < nb_output_streams; i++) {
1864 OutputStream *ost = &output_streams[i];
1865 if (ost->source_index == ist_index) {
1866 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1871 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1872 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1873 ist->file_index, ist->st->index);
1874 return AVERROR(EINVAL);
1876 assert_codec_experimental(ist->st->codec, 0);
1877 assert_avoptions(ist->opts);
1880 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;
1881 ist->next_pts = AV_NOPTS_VALUE;
1882 init_pts_correction(&ist->pts_ctx);
1888 static int transcode_init(OutputFile *output_files,
1889 int nb_output_files,
1890 InputFile *input_files,
1893 int ret = 0, i, j, k;
1894 AVFormatContext *os;
1895 AVCodecContext *codec, *icodec;
1901 /* init framerate emulation */
1902 for (i = 0; i < nb_input_files; i++) {
1903 InputFile *ifile = &input_files[i];
1904 if (ifile->rate_emu)
1905 for (j = 0; j < ifile->nb_streams; j++)
1906 input_streams[j + ifile->ist_index].start = av_gettime();
1909 /* output stream init */
1910 for(i=0;i<nb_output_files;i++) {
1911 os = output_files[i].ctx;
1912 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1913 av_dump_format(os, i, os->filename, 1);
1914 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1915 return AVERROR(EINVAL);
1919 /* for each output stream, we compute the right encoding parameters */
1920 for (i = 0; i < nb_output_streams; i++) {
1921 ost = &output_streams[i];
1922 os = output_files[ost->file_index].ctx;
1923 ist = &input_streams[ost->source_index];
1925 codec = ost->st->codec;
1926 icodec = ist->st->codec;
1928 ost->st->disposition = ist->st->disposition;
1929 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1930 codec->chroma_sample_location = icodec->chroma_sample_location;
1932 if (ost->st->stream_copy) {
1933 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1935 if (extra_size > INT_MAX) {
1936 return AVERROR(EINVAL);
1939 /* if stream_copy is selected, no need to decode or encode */
1940 codec->codec_id = icodec->codec_id;
1941 codec->codec_type = icodec->codec_type;
1943 if(!codec->codec_tag){
1944 if( !os->oformat->codec_tag
1945 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1946 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1947 codec->codec_tag = icodec->codec_tag;
1950 codec->bit_rate = icodec->bit_rate;
1951 codec->rc_max_rate = icodec->rc_max_rate;
1952 codec->rc_buffer_size = icodec->rc_buffer_size;
1953 codec->extradata= av_mallocz(extra_size);
1954 if (!codec->extradata) {
1955 return AVERROR(ENOMEM);
1957 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1958 codec->extradata_size= icodec->extradata_size;
1959 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){
1960 codec->time_base = icodec->time_base;
1961 codec->time_base.num *= icodec->ticks_per_frame;
1962 av_reduce(&codec->time_base.num, &codec->time_base.den,
1963 codec->time_base.num, codec->time_base.den, INT_MAX);
1965 codec->time_base = ist->st->time_base;
1966 switch(codec->codec_type) {
1967 case AVMEDIA_TYPE_AUDIO:
1968 if(audio_volume != 256) {
1969 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1972 codec->channel_layout = icodec->channel_layout;
1973 codec->sample_rate = icodec->sample_rate;
1974 codec->channels = icodec->channels;
1975 codec->frame_size = icodec->frame_size;
1976 codec->audio_service_type = icodec->audio_service_type;
1977 codec->block_align= icodec->block_align;
1978 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1979 codec->block_align= 0;
1980 if(codec->codec_id == CODEC_ID_AC3)
1981 codec->block_align= 0;
1983 case AVMEDIA_TYPE_VIDEO:
1984 codec->pix_fmt = icodec->pix_fmt;
1985 codec->width = icodec->width;
1986 codec->height = icodec->height;
1987 codec->has_b_frames = icodec->has_b_frames;
1988 if (!codec->sample_aspect_ratio.num) {
1989 codec->sample_aspect_ratio =
1990 ost->st->sample_aspect_ratio =
1991 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1992 ist->st->codec->sample_aspect_ratio.num ?
1993 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1996 case AVMEDIA_TYPE_SUBTITLE:
1997 codec->width = icodec->width;
1998 codec->height = icodec->height;
2000 case AVMEDIA_TYPE_DATA:
2007 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2008 switch(codec->codec_type) {
2009 case AVMEDIA_TYPE_AUDIO:
2010 ost->fifo= av_fifo_alloc(1024);
2012 return AVERROR(ENOMEM);
2014 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2015 if (!codec->sample_rate) {
2016 codec->sample_rate = icodec->sample_rate;
2018 codec->sample_rate >>= icodec->lowres;
2020 choose_sample_rate(ost->st, ost->enc);
2021 codec->time_base = (AVRational){1, codec->sample_rate};
2022 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2023 codec->sample_fmt = icodec->sample_fmt;
2024 choose_sample_fmt(ost->st, ost->enc);
2025 if (!codec->channels)
2026 codec->channels = icodec->channels;
2027 codec->channel_layout = icodec->channel_layout;
2028 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2029 codec->channel_layout = 0;
2030 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2031 icodec->request_channels = codec->channels;
2032 ist->decoding_needed = 1;
2033 ost->encoding_needed = 1;
2034 ost->resample_sample_fmt = icodec->sample_fmt;
2035 ost->resample_sample_rate = icodec->sample_rate;
2036 ost->resample_channels = icodec->channels;
2038 case AVMEDIA_TYPE_VIDEO:
2039 if (codec->pix_fmt == PIX_FMT_NONE)
2040 codec->pix_fmt = icodec->pix_fmt;
2041 choose_pixel_fmt(ost->st, ost->enc);
2043 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2044 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2048 if (!codec->width || !codec->height) {
2049 codec->width = icodec->width;
2050 codec->height = icodec->height;
2053 ost->video_resample = codec->width != icodec->width ||
2054 codec->height != icodec->height ||
2055 codec->pix_fmt != icodec->pix_fmt;
2056 if (ost->video_resample) {
2057 #if !CONFIG_AVFILTER
2058 avcodec_get_frame_defaults(&ost->pict_tmp);
2059 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2060 codec->width, codec->height)) {
2061 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2064 ost->img_resample_ctx = sws_getContext(
2071 ost->sws_flags, NULL, NULL, NULL);
2072 if (ost->img_resample_ctx == NULL) {
2073 fprintf(stderr, "Cannot get resampling context\n");
2077 codec->bits_per_raw_sample= 0;
2080 ost->resample_height = icodec->height;
2081 ost->resample_width = icodec->width;
2082 ost->resample_pix_fmt= icodec->pix_fmt;
2083 ost->encoding_needed = 1;
2084 ist->decoding_needed = 1;
2086 if (!ost->frame_rate.num)
2087 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2088 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2089 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2090 ost->frame_rate = ost->enc->supported_framerates[idx];
2092 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2095 if (configure_video_filters(ist, ost)) {
2096 fprintf(stderr, "Error opening filters!\n");
2101 case AVMEDIA_TYPE_SUBTITLE:
2102 ost->encoding_needed = 1;
2103 ist->decoding_needed = 1;
2110 if (ost->encoding_needed &&
2111 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2112 char logfilename[1024];
2115 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2116 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2118 if (codec->flags & CODEC_FLAG_PASS1) {
2119 f = fopen(logfilename, "wb");
2121 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2127 size_t logbuffer_size;
2128 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2129 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2132 codec->stats_in = logbuffer;
2136 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2137 int size= codec->width * codec->height;
2138 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2143 bit_buffer = av_malloc(bit_buffer_size);
2145 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2147 return AVERROR(ENOMEM);
2150 /* open each encoder */
2151 for (i = 0; i < nb_output_streams; i++) {
2152 ost = &output_streams[i];
2153 if (ost->encoding_needed) {
2154 AVCodec *codec = ost->enc;
2155 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2157 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2158 ost->st->codec->codec_id, ost->file_index, ost->index);
2159 ret = AVERROR(EINVAL);
2162 if (dec->subtitle_header) {
2163 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2164 if (!ost->st->codec->subtitle_header) {
2165 ret = AVERROR(ENOMEM);
2168 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2169 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2171 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2172 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2173 ost->file_index, ost->index);
2174 ret = AVERROR(EINVAL);
2177 assert_codec_experimental(ost->st->codec, 1);
2178 assert_avoptions(ost->opts);
2179 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2180 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2181 "It takes bits/s as argument, not kbits/s\n");
2182 extra_size += ost->st->codec->extradata_size;
2186 /* init input streams */
2187 for (i = 0; i < nb_input_streams; i++)
2188 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2191 /* discard unused programs */
2192 for (i = 0; i < nb_input_files; i++) {
2193 InputFile *ifile = &input_files[i];
2194 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2195 AVProgram *p = ifile->ctx->programs[j];
2196 int discard = AVDISCARD_ALL;
2198 for (k = 0; k < p->nb_stream_indexes; k++)
2199 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2200 discard = AVDISCARD_DEFAULT;
2203 p->discard = discard;
2207 /* open files and write file headers */
2208 for (i = 0; i < nb_output_files; i++) {
2209 os = output_files[i].ctx;
2210 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2211 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2212 ret = AVERROR(EINVAL);
2215 assert_avoptions(output_files[i].opts);
2216 if (strcmp(os->oformat->name, "rtp")) {
2222 /* dump the file output parameters - cannot be done before in case
2224 for(i=0;i<nb_output_files;i++) {
2225 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2228 /* dump the stream mapping */
2230 fprintf(stderr, "Stream mapping:\n");
2231 for (i = 0; i < nb_output_streams;i ++) {
2232 ost = &output_streams[i];
2233 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2234 input_streams[ost->source_index].file_index,
2235 input_streams[ost->source_index].st->index,
2238 if (ost->sync_ist != &input_streams[ost->source_index])
2239 fprintf(stderr, " [sync #%d.%d]",
2240 ost->sync_ist->file_index,
2241 ost->sync_ist->st->index);
2242 if (ost->st->stream_copy)
2243 fprintf(stderr, " (copy)");
2245 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2246 input_streams[ost->source_index].dec->name : "?",
2247 ost->enc ? ost->enc->name : "?");
2248 fprintf(stderr, "\n");
2253 fprintf(stderr, "%s\n", error);
2258 print_sdp(output_files, nb_output_files);
2265 * The following code is the main loop of the file converter
2267 static int transcode(OutputFile *output_files,
2268 int nb_output_files,
2269 InputFile *input_files,
2273 AVFormatContext *is, *os;
2277 int no_packet_count=0;
2278 int64_t timer_start;
2280 if (!(no_packet = av_mallocz(nb_input_files)))
2283 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2288 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2291 timer_start = av_gettime();
2293 for(; received_sigterm == 0;) {
2294 int file_index, ist_index;
2299 ipts_min = INT64_MAX;
2302 /* select the stream that we must read now by looking at the
2303 smallest output pts */
2305 for (i = 0; i < nb_output_streams; i++) {
2309 ost = &output_streams[i];
2310 of = &output_files[ost->file_index];
2311 os = output_files[ost->file_index].ctx;
2312 ist = &input_streams[ost->source_index];
2313 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2314 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2316 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2318 if (!input_files[ist->file_index].eof_reached){
2319 if(ipts < ipts_min) {
2321 if(input_sync ) file_index = ist->file_index;
2323 if(opts < opts_min) {
2325 if(!input_sync) file_index = ist->file_index;
2328 if (ost->frame_number >= ost->max_frames) {
2330 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2331 output_streams[j].is_past_recording_time = 1;
2335 /* if none, if is finished */
2336 if (file_index < 0) {
2337 if(no_packet_count){
2339 memset(no_packet, 0, nb_input_files);
2346 /* read a frame from it and output it in the fifo */
2347 is = input_files[file_index].ctx;
2348 ret= av_read_frame(is, &pkt);
2349 if(ret == AVERROR(EAGAIN)){
2350 no_packet[file_index]=1;
2355 input_files[file_index].eof_reached = 1;
2363 memset(no_packet, 0, nb_input_files);
2366 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2367 is->streams[pkt.stream_index]);
2369 /* the following test is needed in case new streams appear
2370 dynamically in stream : we ignore them */
2371 if (pkt.stream_index >= input_files[file_index].nb_streams)
2372 goto discard_packet;
2373 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2374 ist = &input_streams[ist_index];
2376 goto discard_packet;
2378 if (pkt.dts != AV_NOPTS_VALUE)
2379 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2380 if (pkt.pts != AV_NOPTS_VALUE)
2381 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2383 if(pkt.pts != AV_NOPTS_VALUE)
2384 pkt.pts *= ist->ts_scale;
2385 if(pkt.dts != AV_NOPTS_VALUE)
2386 pkt.dts *= ist->ts_scale;
2388 // 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);
2389 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2390 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2391 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2392 int64_t delta= pkt_dts - ist->next_pts;
2393 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2394 input_files[ist->file_index].ts_offset -= delta;
2396 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2397 delta, input_files[ist->file_index].ts_offset);
2398 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2399 if(pkt.pts != AV_NOPTS_VALUE)
2400 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2404 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2405 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2408 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2409 ist->file_index, ist->st->index);
2412 av_free_packet(&pkt);
2417 av_free_packet(&pkt);
2419 /* dump report by using the output first video and audio streams */
2420 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2423 /* at the end of stream, we must flush the decoder buffers */
2424 for (i = 0; i < nb_input_streams; i++) {
2425 ist = &input_streams[i];
2426 if (ist->decoding_needed) {
2427 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2430 flush_encoders(output_streams, nb_output_streams);
2434 /* write the trailer if needed and close file */
2435 for(i=0;i<nb_output_files;i++) {
2436 os = output_files[i].ctx;
2437 av_write_trailer(os);
2440 /* dump report by using the first video and audio streams */
2441 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2443 /* close each encoder */
2444 for (i = 0; i < nb_output_streams; i++) {
2445 ost = &output_streams[i];
2446 if (ost->encoding_needed) {
2447 av_freep(&ost->st->codec->stats_in);
2448 avcodec_close(ost->st->codec);
2451 avfilter_graph_free(&ost->graph);
2455 /* close each decoder */
2456 for (i = 0; i < nb_input_streams; i++) {
2457 ist = &input_streams[i];
2458 if (ist->decoding_needed) {
2459 avcodec_close(ist->st->codec);
2467 av_freep(&bit_buffer);
2468 av_freep(&no_packet);
2470 if (output_streams) {
2471 for (i = 0; i < nb_output_streams; i++) {
2472 ost = &output_streams[i];
2474 if (ost->st->stream_copy)
2475 av_freep(&ost->st->codec->extradata);
2477 fclose(ost->logfile);
2478 ost->logfile = NULL;
2480 av_fifo_free(ost->fifo); /* works even if fifo is not
2481 initialized but set to zero */
2482 av_freep(&ost->st->codec->subtitle_header);
2483 av_free(ost->pict_tmp.data[0]);
2484 av_free(ost->forced_kf_pts);
2485 if (ost->video_resample)
2486 sws_freeContext(ost->img_resample_ctx);
2488 audio_resample_close(ost->resample);
2489 if (ost->reformat_ctx)
2490 av_audio_convert_free(ost->reformat_ctx);
2491 av_dict_free(&ost->opts);
2498 static int opt_video_rc_override_string(const char *opt, const char *arg)
2500 video_rc_override_string = arg;
2504 static int opt_me_threshold(const char *opt, const char *arg)
2506 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2510 static int opt_verbose(const char *opt, const char *arg)
2512 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2516 static int opt_frame_rate(const char *opt, const char *arg)
2518 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2519 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2525 static int opt_frame_size(const char *opt, const char *arg)
2527 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2528 fprintf(stderr, "Incorrect frame size\n");
2529 return AVERROR(EINVAL);
2534 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2536 if (strcmp(arg, "list")) {
2537 frame_pix_fmt = av_get_pix_fmt(arg);
2538 if (frame_pix_fmt == PIX_FMT_NONE) {
2539 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2540 return AVERROR(EINVAL);
2549 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2556 p = strchr(arg, ':');
2558 x = strtol(arg, &end, 10);
2560 y = strtol(end+1, &end, 10);
2562 ar = (double)x / (double)y;
2564 ar = strtod(arg, NULL);
2567 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2568 return AVERROR(EINVAL);
2570 frame_aspect_ratio = ar;
2574 static int opt_top_field_first(const char *opt, const char *arg)
2576 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2580 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2582 return parse_option(o, "codec:a", arg, options);
2585 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2587 return parse_option(o, "codec:v", arg, options);
2590 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2592 return parse_option(o, "codec:s", arg, options);
2595 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2597 return parse_option(o, "codec:d", arg, options);
2600 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2602 StreamMap *m = NULL;
2603 int i, negative = 0, file_idx;
2604 int sync_file_idx = -1, sync_stream_idx;
2612 map = av_strdup(arg);
2614 /* parse sync stream first, just pick first matching stream */
2615 if (sync = strchr(map, ',')) {
2617 sync_file_idx = strtol(sync + 1, &sync, 0);
2618 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2619 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2624 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2625 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2626 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2627 sync_stream_idx = i;
2630 if (i == input_files[sync_file_idx].nb_streams) {
2631 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2632 "match any streams.\n", arg);
2638 file_idx = strtol(map, &p, 0);
2639 if (file_idx >= nb_input_files || file_idx < 0) {
2640 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2644 /* disable some already defined maps */
2645 for (i = 0; i < o->nb_stream_maps; i++) {
2646 m = &o->stream_maps[i];
2647 if (check_stream_specifier(input_files[m->file_index].ctx,
2648 input_files[m->file_index].ctx->streams[m->stream_index],
2649 *p == ':' ? p + 1 : p) > 0)
2653 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2654 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2655 *p == ':' ? p + 1 : p) <= 0)
2657 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2658 &o->nb_stream_maps, o->nb_stream_maps + 1);
2659 m = &o->stream_maps[o->nb_stream_maps - 1];
2661 m->file_index = file_idx;
2662 m->stream_index = i;
2664 if (sync_file_idx >= 0) {
2665 m->sync_file_index = sync_file_idx;
2666 m->sync_stream_index = sync_stream_idx;
2668 m->sync_file_index = file_idx;
2669 m->sync_stream_index = i;
2674 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2682 static void parse_meta_type(char *arg, char *type, int *index)
2692 if (*(++arg) == ':')
2693 *index = strtol(++arg, NULL, 0);
2696 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2703 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2705 MetadataMap *m, *m1;
2708 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2709 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2711 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2712 m->file = strtol(arg, &p, 0);
2713 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2715 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2716 if (p = strchr(opt, ':'))
2717 parse_meta_type(p + 1, &m1->type, &m1->index);
2721 if (m->type == 'g' || m1->type == 'g')
2722 o->metadata_global_manual = 1;
2723 if (m->type == 's' || m1->type == 's')
2724 o->metadata_streams_manual = 1;
2725 if (m->type == 'c' || m1->type == 'c')
2726 o->metadata_chapters_manual = 1;
2731 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2733 const char *codec_string = encoder ? "encoder" : "decoder";
2737 return CODEC_ID_NONE;
2739 avcodec_find_encoder_by_name(name) :
2740 avcodec_find_decoder_by_name(name);
2742 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2745 if(codec->type != type) {
2746 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2752 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2754 char *codec_name = NULL;
2756 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2760 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2761 return avcodec_find_encoder(st->codec->codec_id);
2763 } else if (!strcmp(codec_name, "copy"))
2764 st->stream_copy = 1;
2766 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2767 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2768 avcodec_find_decoder_by_name(codec_name);
2775 * Add all the streams from the given input file to the global
2776 * list of input streams.
2778 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2780 int i, rfps, rfps_base;
2782 for (i = 0; i < ic->nb_streams; i++) {
2783 AVStream *st = ic->streams[i];
2784 AVCodecContext *dec = st->codec;
2788 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2789 ist = &input_streams[nb_input_streams - 1];
2791 ist->file_index = nb_input_files;
2793 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2795 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2796 ist->ts_scale = scale;
2798 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2800 ist->dec = avcodec_find_decoder(dec->codec_id);
2802 switch (dec->codec_type) {
2803 case AVMEDIA_TYPE_AUDIO:
2804 if (o->audio_disable)
2805 st->discard= AVDISCARD_ALL;
2807 case AVMEDIA_TYPE_VIDEO:
2808 rfps = ic->streams[i]->r_frame_rate.num;
2809 rfps_base = ic->streams[i]->r_frame_rate.den;
2811 dec->flags |= CODEC_FLAG_EMU_EDGE;
2812 dec->height >>= dec->lowres;
2813 dec->width >>= dec->lowres;
2816 dec->debug |= FF_DEBUG_MV;
2818 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2821 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2822 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2824 (float)rfps / rfps_base, rfps, rfps_base);
2827 if (o->video_disable)
2828 st->discard= AVDISCARD_ALL;
2829 else if(video_discard)
2830 st->discard= video_discard;
2832 case AVMEDIA_TYPE_DATA:
2834 case AVMEDIA_TYPE_SUBTITLE:
2835 if (o->subtitle_disable)
2836 st->discard = AVDISCARD_ALL;
2838 case AVMEDIA_TYPE_ATTACHMENT:
2839 case AVMEDIA_TYPE_UNKNOWN:
2847 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2849 AVFormatContext *ic;
2850 AVInputFormat *file_iformat = NULL;
2854 AVDictionary **opts;
2855 int orig_nb_streams; // number of streams before avformat_find_stream_info
2858 if (!(file_iformat = av_find_input_format(o->format))) {
2859 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2864 if (!strcmp(filename, "-"))
2867 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2868 !strcmp(filename, "/dev/stdin");
2870 /* get default parameters from command line */
2871 ic = avformat_alloc_context();
2873 print_error(filename, AVERROR(ENOMEM));
2876 if (o->nb_audio_sample_rate) {
2877 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2878 av_dict_set(&format_opts, "sample_rate", buf, 0);
2880 if (o->nb_audio_channels) {
2881 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2882 av_dict_set(&format_opts, "channels", buf, 0);
2884 if (frame_rate.num) {
2885 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2886 av_dict_set(&format_opts, "framerate", buf, 0);
2888 if (frame_width && frame_height) {
2889 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2890 av_dict_set(&format_opts, "video_size", buf, 0);
2892 if (frame_pix_fmt != PIX_FMT_NONE)
2893 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2895 ic->flags |= AVFMT_FLAG_NONBLOCK;
2897 /* open the input file with generic libav function */
2898 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2900 print_error(filename, err);
2903 assert_avoptions(format_opts);
2905 /* apply forced codec ids */
2906 for (i = 0; i < ic->nb_streams; i++)
2907 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2909 /* Set AVCodecContext options for avformat_find_stream_info */
2910 opts = setup_find_stream_info_opts(ic, codec_opts);
2911 orig_nb_streams = ic->nb_streams;
2913 /* If not enough info to get the stream parameters, we decode the
2914 first frames to get it. (used in mpeg case for example) */
2915 ret = avformat_find_stream_info(ic, opts);
2916 if (ret < 0 && verbose >= 0) {
2917 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2918 av_close_input_file(ic);
2922 timestamp = o->start_time;
2923 /* add the stream start time */
2924 if (ic->start_time != AV_NOPTS_VALUE)
2925 timestamp += ic->start_time;
2927 /* if seeking requested, we execute it */
2928 if (o->start_time != 0) {
2929 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2931 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2932 filename, (double)timestamp / AV_TIME_BASE);
2936 /* update the current parameters so that they match the one of the input stream */
2937 add_input_streams(o, ic);
2939 /* dump the file content */
2941 av_dump_format(ic, nb_input_files, filename, 0);
2943 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2944 input_files[nb_input_files - 1].ctx = ic;
2945 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
2946 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
2947 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
2949 frame_rate = (AVRational){0, 0};
2950 frame_pix_fmt = PIX_FMT_NONE;
2954 for (i = 0; i < orig_nb_streams; i++)
2955 av_dict_free(&opts[i]);
2962 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2963 AVCodecContext *avctx)
2969 for (p = kf; *p; p++)
2972 ost->forced_kf_count = n;
2973 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2974 if (!ost->forced_kf_pts) {
2975 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2978 for (i = 0; i < n; i++) {
2979 p = i ? strchr(p, ',') + 1 : kf;
2980 t = parse_time_or_die("force_key_frames", p, 1);
2981 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2985 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
2988 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
2989 int idx = oc->nb_streams - 1;
2990 int64_t max_frames = INT64_MAX;
2991 char *bsf = NULL, *next, *codec_tag = NULL;
2992 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
2996 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3000 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3001 nb_output_streams + 1);
3002 ost = &output_streams[nb_output_streams - 1];
3003 ost->file_index = nb_output_files;
3006 st->codec->codec_type = type;
3007 ost->enc = choose_codec(o, oc, st, type);
3009 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3012 avcodec_get_context_defaults3(st->codec, ost->enc);
3013 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3015 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3016 ost->max_frames = max_frames;
3018 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3020 if (next = strchr(bsf, ','))
3022 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3023 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3027 bsfc_prev->next = bsfc;
3029 ost->bitstream_filters = bsfc;
3035 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3037 uint32_t tag = strtol(codec_tag, &next, 0);
3039 tag = AV_RL32(codec_tag);
3040 st->codec->codec_tag = tag;
3043 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3044 if (qscale >= 0 || same_quant) {
3045 st->codec->flags |= CODEC_FLAG_QSCALE;
3046 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3049 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3053 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3057 AVCodecContext *video_enc;
3059 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3061 if (!st->stream_copy) {
3062 ost->frame_aspect_ratio = frame_aspect_ratio;
3063 frame_aspect_ratio = 0;
3065 ost->avfilter= vfilters;
3070 video_enc = st->codec;
3072 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3073 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3076 if (st->stream_copy) {
3077 video_enc->sample_aspect_ratio =
3078 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3084 ost->frame_rate = frame_rate;
3086 video_enc->width = frame_width;
3087 video_enc->height = frame_height;
3088 video_enc->pix_fmt = frame_pix_fmt;
3089 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3092 video_enc->intra_matrix = intra_matrix;
3094 video_enc->inter_matrix = inter_matrix;
3096 p= video_rc_override_string;
3099 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3101 fprintf(stderr, "error parsing rc_override\n");
3104 video_enc->rc_override=
3105 av_realloc(video_enc->rc_override,
3106 sizeof(RcOverride)*(i+1));
3107 video_enc->rc_override[i].start_frame= start;
3108 video_enc->rc_override[i].end_frame = end;
3110 video_enc->rc_override[i].qscale= q;
3111 video_enc->rc_override[i].quality_factor= 1.0;
3114 video_enc->rc_override[i].qscale= 0;
3115 video_enc->rc_override[i].quality_factor= -q/100.0;
3120 video_enc->rc_override_count=i;
3121 if (!video_enc->rc_initial_buffer_occupancy)
3122 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3123 video_enc->me_threshold= me_threshold;
3124 video_enc->intra_dc_precision= intra_dc_precision - 8;
3127 video_enc->flags|= CODEC_FLAG_PSNR;
3132 video_enc->flags |= CODEC_FLAG_PASS1;
3134 video_enc->flags |= CODEC_FLAG_PASS2;
3138 if (forced_key_frames)
3139 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3142 /* reset some key parameters */
3143 av_freep(&forced_key_frames);
3144 frame_pix_fmt = PIX_FMT_NONE;
3148 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3152 AVCodecContext *audio_enc;
3154 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3157 audio_enc = st->codec;
3158 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3160 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3161 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3163 if (!st->stream_copy) {
3164 char *sample_fmt = NULL;
3166 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3168 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3170 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3171 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", sample_fmt);
3175 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3181 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3185 AVCodecContext *data_enc;
3187 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3189 data_enc = st->codec;
3190 if (!st->stream_copy) {
3191 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3195 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3196 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3202 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3206 AVCodecContext *subtitle_enc;
3208 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3210 subtitle_enc = st->codec;
3212 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3214 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3215 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3221 /* arg format is "output-stream-index:streamid-value". */
3222 static int opt_streamid(const char *opt, const char *arg)
3228 av_strlcpy(idx_str, arg, sizeof(idx_str));
3229 p = strchr(idx_str, ':');
3232 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3237 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3238 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3239 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3243 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3245 AVFormatContext *is = ifile->ctx;
3246 AVFormatContext *os = ofile->ctx;
3249 for (i = 0; i < is->nb_chapters; i++) {
3250 AVChapter *in_ch = is->chapters[i], *out_ch;
3251 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3252 AV_TIME_BASE_Q, in_ch->time_base);
3253 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3254 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3257 if (in_ch->end < ts_off)
3259 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3262 out_ch = av_mallocz(sizeof(AVChapter));
3264 return AVERROR(ENOMEM);
3266 out_ch->id = in_ch->id;
3267 out_ch->time_base = in_ch->time_base;
3268 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3269 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3272 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3275 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3277 return AVERROR(ENOMEM);
3278 os->chapters[os->nb_chapters - 1] = out_ch;
3283 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3286 AVFormatContext *ic = NULL;
3288 err = avformat_open_input(&ic, filename, NULL, NULL);
3291 /* copy stream format */
3292 for(i=0;i<ic->nb_streams;i++) {
3297 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3298 ost = new_output_stream(o, s, codec->type);
3301 // FIXME: a more elegant solution is needed
3302 memcpy(st, ic->streams[i], sizeof(AVStream));
3304 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3306 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3307 choose_sample_fmt(st, codec);
3308 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3309 choose_pixel_fmt(st, codec);
3312 av_close_input_file(ic);
3316 static void opt_output_file(void *optctx, const char *filename)
3318 OptionsContext *o = optctx;
3319 AVFormatContext *oc;
3321 AVOutputFormat *file_oformat;
3325 if (!strcmp(filename, "-"))
3328 oc = avformat_alloc_context();
3330 print_error(filename, AVERROR(ENOMEM));
3335 file_oformat = av_guess_format(o->format, NULL, NULL);
3336 if (!file_oformat) {
3337 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3341 file_oformat = av_guess_format(NULL, filename, NULL);
3342 if (!file_oformat) {
3343 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3349 oc->oformat = file_oformat;
3350 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3352 if (!strcmp(file_oformat->name, "ffm") &&
3353 av_strstart(filename, "http:", NULL)) {
3354 /* special case for files sent to avserver: we get the stream
3355 parameters from avserver */
3356 int err = read_avserver_streams(o, oc, filename);
3358 print_error(filename, err);
3361 } else if (!o->nb_stream_maps) {
3362 /* pick the "best" stream of each type */
3363 #define NEW_STREAM(type, index)\
3365 ost = new_ ## type ## _stream(o, oc);\
3366 ost->source_index = index;\
3367 ost->sync_ist = &input_streams[index];\
3368 input_streams[index].discard = 0;\
3371 /* video: highest resolution */
3372 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3373 int area = 0, idx = -1;
3374 for (i = 0; i < nb_input_streams; i++) {
3375 ist = &input_streams[i];
3376 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3377 ist->st->codec->width * ist->st->codec->height > area) {
3378 area = ist->st->codec->width * ist->st->codec->height;
3382 NEW_STREAM(video, idx);
3385 /* audio: most channels */
3386 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3387 int channels = 0, idx = -1;
3388 for (i = 0; i < nb_input_streams; i++) {
3389 ist = &input_streams[i];
3390 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3391 ist->st->codec->channels > channels) {
3392 channels = ist->st->codec->channels;
3396 NEW_STREAM(audio, idx);
3399 /* subtitles: pick first */
3400 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3401 for (i = 0; i < nb_input_streams; i++)
3402 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3403 NEW_STREAM(subtitle, i);
3407 /* do something with data? */
3409 for (i = 0; i < o->nb_stream_maps; i++) {
3410 StreamMap *map = &o->stream_maps[i];
3415 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3416 switch (ist->st->codec->codec_type) {
3417 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3418 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3419 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3420 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3422 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3423 map->file_index, map->stream_index);
3427 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3428 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3429 map->sync_stream_index];
3434 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3435 output_files[nb_output_files - 1].ctx = oc;
3436 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3437 output_files[nb_output_files - 1].recording_time = o->recording_time;
3438 output_files[nb_output_files - 1].start_time = o->start_time;
3439 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3440 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3442 /* check filename in case of an image number is expected */
3443 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3444 if (!av_filename_number_test(oc->filename)) {
3445 print_error(oc->filename, AVERROR(EINVAL));
3450 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3451 /* test if it already exists to avoid loosing precious files */
3452 if (!file_overwrite &&
3453 (strchr(filename, ':') == NULL ||
3454 filename[1] == ':' ||
3455 av_strstart(filename, "file:", NULL))) {
3456 if (avio_check(filename, 0) == 0) {
3458 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3460 if (!read_yesno()) {
3461 fprintf(stderr, "Not overwriting - exiting\n");
3466 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3473 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3474 print_error(filename, err);
3479 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3480 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3481 oc->flags |= AVFMT_FLAG_NONBLOCK;
3484 if (o->chapters_input_file >= nb_input_files) {
3485 if (o->chapters_input_file == INT_MAX) {
3486 /* copy chapters from the first input file that has them*/
3487 o->chapters_input_file = -1;
3488 for (i = 0; i < nb_input_files; i++)
3489 if (input_files[i].ctx->nb_chapters) {
3490 o->chapters_input_file = i;
3494 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3495 o->chapters_input_file);
3499 if (o->chapters_input_file >= 0)
3500 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3501 o->metadata_chapters_manual);
3504 for (i = 0; i < o->nb_meta_data_maps; i++) {
3505 AVFormatContext *files[2];
3506 AVDictionary **meta[2];
3509 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3510 if ((index) < 0 || (index) >= (nb_elems)) {\
3511 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3516 int in_file_index = o->meta_data_maps[i][1].file;
3517 if (in_file_index < 0)
3519 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3522 files[1] = input_files[in_file_index].ctx;
3524 for (j = 0; j < 2; j++) {
3525 MetadataMap *map = &o->meta_data_maps[i][j];
3527 switch (map->type) {
3529 meta[j] = &files[j]->metadata;
3532 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3533 meta[j] = &files[j]->streams[map->index]->metadata;
3536 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3537 meta[j] = &files[j]->chapters[map->index]->metadata;
3540 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3541 meta[j] = &files[j]->programs[map->index]->metadata;
3546 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3549 /* copy global metadata by default */
3550 if (!o->metadata_global_manual && nb_input_files)
3551 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3552 AV_DICT_DONT_OVERWRITE);
3553 if (!o->metadata_streams_manual)
3554 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3555 InputStream *ist = &input_streams[output_streams[i].source_index];
3556 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3559 /* process manually set metadata */
3560 for (i = 0; i < o->nb_metadata; i++) {
3565 val = strchr(o->metadata[i].u.str, '=');
3567 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3568 o->metadata[i].u.str);
3573 parse_meta_type(o->metadata[i].specifier, &type, &index);
3579 if (index < 0 || index >= oc->nb_streams) {
3580 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3583 m = &oc->streams[i]->metadata;
3586 if (index < 0 || index >= oc->nb_chapters) {
3587 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3590 m = &oc->chapters[i]->metadata;
3593 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3597 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3600 frame_rate = (AVRational){0, 0};
3604 av_freep(&streamid_map);
3605 nb_streamid_map = 0;
3607 av_freep(&forced_key_frames);
3611 /* same option as mencoder */
3612 static int opt_pass(const char *opt, const char *arg)
3614 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3618 static int64_t getutime(void)
3621 struct rusage rusage;
3623 getrusage(RUSAGE_SELF, &rusage);
3624 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3625 #elif HAVE_GETPROCESSTIMES
3627 FILETIME c, e, k, u;
3628 proc = GetCurrentProcess();
3629 GetProcessTimes(proc, &c, &e, &k, &u);
3630 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3632 return av_gettime();
3636 static int64_t getmaxrss(void)
3638 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3639 struct rusage rusage;
3640 getrusage(RUSAGE_SELF, &rusage);
3641 return (int64_t)rusage.ru_maxrss * 1024;
3642 #elif HAVE_GETPROCESSMEMORYINFO
3644 PROCESS_MEMORY_COUNTERS memcounters;
3645 proc = GetCurrentProcess();
3646 memcounters.cb = sizeof(memcounters);
3647 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3648 return memcounters.PeakPagefileUsage;
3654 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3657 const char *p = str;
3664 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3671 static void opt_inter_matrix(const char *arg)
3673 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3674 parse_matrix_coeffs(inter_matrix, arg);
3677 static void opt_intra_matrix(const char *arg)
3679 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3680 parse_matrix_coeffs(intra_matrix, arg);
3683 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3685 return parse_option(o, "q:a", arg, options);
3688 static void show_usage(void)
3690 printf("Hyper fast Audio and Video encoder\n");
3691 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3695 static void show_help(void)
3698 AVOutputFormat *oformat = NULL;
3699 AVInputFormat *iformat = NULL;
3700 const AVClass *class;
3702 av_log_set_callback(log_callback_help);
3704 show_help_options(options, "Main options:\n",
3705 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3706 show_help_options(options, "\nAdvanced options:\n",
3707 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3709 show_help_options(options, "\nVideo options:\n",
3710 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3712 show_help_options(options, "\nAdvanced Video options:\n",
3713 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3714 OPT_VIDEO | OPT_EXPERT);
3715 show_help_options(options, "\nAudio options:\n",
3716 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3718 show_help_options(options, "\nAdvanced Audio options:\n",
3719 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3720 OPT_AUDIO | OPT_EXPERT);
3721 show_help_options(options, "\nSubtitle options:\n",
3722 OPT_SUBTITLE | OPT_GRAB,
3724 show_help_options(options, "\nAudio/Video grab options:\n",
3728 class = avcodec_get_class();
3729 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3732 /* individual codec options */
3734 while ((c = av_codec_next(c))) {
3735 if (c->priv_class) {
3736 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3741 class = avformat_get_class();
3742 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3745 /* individual muxer options */
3746 while ((oformat = av_oformat_next(oformat))) {
3747 if (oformat->priv_class) {
3748 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3753 /* individual demuxer options */
3754 while ((iformat = av_iformat_next(iformat))) {
3755 if (iformat->priv_class) {
3756 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3761 class = sws_get_class();
3762 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3765 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3767 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3768 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3770 if(!strncmp(arg, "pal-", 4)) {
3773 } else if(!strncmp(arg, "ntsc-", 5)) {
3776 } else if(!strncmp(arg, "film-", 5)) {
3781 /* Calculate FR via float to avoid int overflow */
3782 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3785 } else if((fr == 29970) || (fr == 23976)) {
3788 /* Try to determine PAL/NTSC by peeking in the input files */
3789 if(nb_input_files) {
3791 for (j = 0; j < nb_input_files; j++) {
3792 for (i = 0; i < input_files[j].nb_streams; i++) {
3793 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3794 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3796 fr = c->time_base.den * 1000 / c->time_base.num;
3800 } else if((fr == 29970) || (fr == 23976)) {
3810 if(verbose > 0 && norm != UNKNOWN)
3811 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3814 if(norm == UNKNOWN) {
3815 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3816 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3817 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3821 if(!strcmp(arg, "vcd")) {
3822 opt_video_codec(o, "c:v", "mpeg1video");
3823 opt_audio_codec(o, "c:a", "mp2");
3824 parse_option(o, "f", "vcd", options);
3826 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3827 opt_frame_rate("r", frame_rates[norm]);
3828 opt_default("g", norm == PAL ? "15" : "18");
3830 opt_default("b", "1150000");
3831 opt_default("maxrate", "1150000");
3832 opt_default("minrate", "1150000");
3833 opt_default("bufsize", "327680"); // 40*1024*8;
3835 opt_default("b:a", "224000");
3836 parse_option(o, "ar", "44100", options);
3837 parse_option(o, "ac", "2", options);
3839 opt_default("packetsize", "2324");
3840 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3842 /* We have to offset the PTS, so that it is consistent with the SCR.
3843 SCR starts at 36000, but the first two packs contain only padding
3844 and the first pack from the other stream, respectively, may also have
3845 been written before.
3846 So the real data starts at SCR 36000+3*1200. */
3847 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3848 } else if(!strcmp(arg, "svcd")) {
3850 opt_video_codec(o, "c:v", "mpeg2video");
3851 opt_audio_codec(o, "c:a", "mp2");
3852 parse_option(o, "f", "svcd", options);
3854 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3855 opt_frame_rate("r", frame_rates[norm]);
3856 opt_default("g", norm == PAL ? "15" : "18");
3858 opt_default("b", "2040000");
3859 opt_default("maxrate", "2516000");
3860 opt_default("minrate", "0"); //1145000;
3861 opt_default("bufsize", "1835008"); //224*1024*8;
3862 opt_default("flags", "+scan_offset");
3865 opt_default("b:a", "224000");
3866 parse_option(o, "ar", "44100", options);
3868 opt_default("packetsize", "2324");
3870 } else if(!strcmp(arg, "dvd")) {
3872 opt_video_codec(o, "c:v", "mpeg2video");
3873 opt_audio_codec(o, "c:a", "ac3");
3874 parse_option(o, "f", "dvd", options);
3876 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3877 opt_frame_rate("r", frame_rates[norm]);
3878 opt_default("g", norm == PAL ? "15" : "18");
3880 opt_default("b", "6000000");
3881 opt_default("maxrate", "9000000");
3882 opt_default("minrate", "0"); //1500000;
3883 opt_default("bufsize", "1835008"); //224*1024*8;
3885 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3886 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3888 opt_default("b:a", "448000");
3889 parse_option(o, "ar", "48000", options);
3891 } else if(!strncmp(arg, "dv", 2)) {
3893 parse_option(o, "f", "dv", options);
3895 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3896 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3897 norm == PAL ? "yuv420p" : "yuv411p");
3898 opt_frame_rate("r", frame_rates[norm]);
3900 parse_option(o, "ar", "48000", options);
3901 parse_option(o, "ac", "2", options);
3904 fprintf(stderr, "Unknown target: %s\n", arg);
3905 return AVERROR(EINVAL);
3910 static int opt_vstats_file(const char *opt, const char *arg)
3912 av_free (vstats_filename);
3913 vstats_filename=av_strdup (arg);
3917 static int opt_vstats(const char *opt, const char *arg)
3920 time_t today2 = time(NULL);
3921 struct tm *today = localtime(&today2);
3923 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3925 return opt_vstats_file(opt, filename);
3928 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3930 return parse_option(o, "frames:v", arg, options);
3933 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3935 return parse_option(o, "frames:a", arg, options);
3938 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3940 return parse_option(o, "frames:d", arg, options);
3943 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
3945 return parse_option(o, "tag:v", arg, options);
3948 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
3950 return parse_option(o, "tag:a", arg, options);
3953 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
3955 return parse_option(o, "tag:s", arg, options);
3958 #define OFFSET(x) offsetof(OptionsContext, x)
3959 static const OptionDef options[] = {
3961 #include "cmdutils_common_opts.h"
3962 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
3963 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
3964 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3965 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3966 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3967 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
3968 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
3969 "outfile[,metadata]:infile[,metadata]" },
3970 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
3971 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3972 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
3973 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
3974 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
3975 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
3976 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
3977 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
3978 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
3979 "add timings for benchmarking" },
3980 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
3981 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
3982 "dump each input packet" },
3983 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
3984 "when dumping packets, also dump the payload" },
3985 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
3986 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
3987 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
3988 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
3989 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
3990 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
3991 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
3992 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
3993 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
3994 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
3995 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
3996 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
3997 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
3998 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
3999 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4000 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4003 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4004 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4005 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4006 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4007 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_frame_pix_fmt}, "set pixel format, 'list' as argument shows all the pixel formats supported", "format" },
4008 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4009 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4010 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4011 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4012 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4013 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4014 "use same quantizer as source (implies VBR)" },
4015 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4016 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4017 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4018 "deinterlace pictures" },
4019 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4020 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4021 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4023 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4025 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4026 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4027 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4028 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4029 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4030 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4031 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4032 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4033 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4036 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4037 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4038 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4039 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4040 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4041 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4042 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4043 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4044 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4046 /* subtitle options */
4047 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4048 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4049 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4052 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4055 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4056 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4058 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4060 /* data codec support */
4061 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4063 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4067 int main(int argc, char **argv)
4069 OptionsContext o = { 0 };
4074 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4076 avcodec_register_all();
4078 avdevice_register_all();
4081 avfilter_register_all();
4085 avio_set_interrupt_cb(decode_interrupt_cb);
4090 parse_options(&o, argc, argv, options, opt_output_file);
4092 if(nb_output_files <= 0 && nb_input_files == 0) {
4094 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4098 /* file converter / grab */
4099 if (nb_output_files <= 0) {
4100 fprintf(stderr, "At least one output file must be specified\n");
4104 if (nb_input_files == 0) {
4105 fprintf(stderr, "At least one input file must be specified\n");
4110 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4112 ti = getutime() - ti;
4114 int maxrss = getmaxrss() / 1024;
4115 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);