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 enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
109 static AVRational frame_rate;
110 static float video_qscale = 0;
111 static uint16_t *intra_matrix = NULL;
112 static uint16_t *inter_matrix = NULL;
113 static const char *video_rc_override_string=NULL;
114 static int video_disable = 0;
115 static int video_discard = 0;
116 static int same_quant = 0;
117 static int do_deinterlace = 0;
118 static int top_field_first = -1;
119 static int me_threshold = 0;
120 static int intra_dc_precision = 8;
121 static int qp_hist = 0;
123 static char *vfilters = NULL;
126 static int audio_sample_rate = 0;
127 #define QSCALE_NONE -99999
128 static float audio_qscale = QSCALE_NONE;
129 static int audio_disable = 0;
130 static int audio_channels = 0;
132 static int subtitle_disable = 0;
134 static int data_disable = 0;
136 static int file_overwrite = 0;
137 static int do_benchmark = 0;
138 static int do_hex_dump = 0;
139 static int do_pkt_dump = 0;
140 static int do_psnr = 0;
141 static int do_pass = 0;
142 static char *pass_logfilename_prefix = NULL;
143 static int video_sync_method= -1;
144 static int audio_sync_method= 0;
145 static float audio_drift_threshold= 0.1;
146 static int copy_ts= 0;
148 static int opt_shortest = 0;
149 static char *vstats_filename;
150 static FILE *vstats_file;
151 static int opt_programid = 0;
152 static int copy_initial_nonkeyframes = 0;
154 static int audio_volume = 256;
156 static int exit_on_error = 0;
157 static int using_stdin = 0;
158 static int verbose = 1;
159 static int64_t video_size = 0;
160 static int64_t audio_size = 0;
161 static int64_t extra_size = 0;
162 static int nb_frames_dup = 0;
163 static int nb_frames_drop = 0;
164 static int input_sync;
165 static int force_fps = 0;
166 static char *forced_key_frames = NULL;
168 static float dts_delta_threshold = 10;
170 static uint8_t *audio_buf;
171 static uint8_t *audio_out;
172 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
174 static short *samples;
176 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
178 typedef struct InputStream {
181 int discard; /* true if stream data should be discarded */
182 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
185 int64_t start; /* time when read started */
186 int64_t next_pts; /* synthetic pts for cases where pkt.pts
188 int64_t pts; /* current pts */
189 PtsCorrectionContext pts_ctx;
191 int is_start; /* is 1 at the start and after a discontinuity */
192 int showed_multi_packet_warning;
196 typedef struct InputFile {
197 AVFormatContext *ctx;
198 int eof_reached; /* true if eof reached */
199 int ist_index; /* index of first stream in ist_table */
200 int buffer_size; /* current total buffer size */
202 int nb_streams; /* number of stream that avconv is aware of; may be different
203 from ctx.nb_streams if new streams appear during av_read_frame() */
207 typedef struct OutputStream {
208 int file_index; /* file index */
209 int index; /* stream index in the output file */
210 int source_index; /* InputStream index */
211 AVStream *st; /* stream in the output file */
212 int encoding_needed; /* true if encoding needed for this stream */
214 /* input pts and corresponding output pts
216 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
217 struct InputStream *sync_ist; /* input stream to sync against */
218 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
219 AVBitStreamFilterContext *bitstream_filters;
225 AVFrame pict_tmp; /* temporary image for resampling */
226 struct SwsContext *img_resample_ctx; /* for image resampling */
229 int resample_pix_fmt;
230 AVRational frame_rate;
232 float frame_aspect_ratio;
234 /* forced key frames */
235 int64_t *forced_kf_pts;
241 ReSampleContext *resample; /* for audio resampling */
242 int resample_sample_fmt;
243 int resample_channels;
244 int resample_sample_rate;
246 AVAudioConvert *reformat_ctx;
247 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
251 AVFilterContext *output_video_filter;
252 AVFilterContext *input_video_filter;
253 AVFilterBufferRef *picref;
255 AVFilterGraph *graph;
260 int is_past_recording_time;
264 typedef struct OutputFile {
265 AVFormatContext *ctx;
267 int ost_index; /* index of the first stream in output_streams */
268 int64_t recording_time; /* desired length of the resulting file in microseconds */
269 int64_t start_time; /* start time in microseconds */
270 uint64_t limit_filesize;
273 static InputStream *input_streams = NULL;
274 static int nb_input_streams = 0;
275 static InputFile *input_files = NULL;
276 static int nb_input_files = 0;
278 static OutputStream *output_streams = NULL;
279 static int nb_output_streams = 0;
280 static OutputFile *output_files = NULL;
281 static int nb_output_files = 0;
283 typedef struct OptionsContext {
284 /* input/output options */
288 SpecifierOpt *codec_names;
292 int64_t input_ts_offset;
295 SpecifierOpt *ts_scale;
299 StreamMap *stream_maps;
301 /* first item specifies output metadata, second is input */
302 MetadataMap (*meta_data_maps)[2];
303 int nb_meta_data_maps;
304 int metadata_global_manual;
305 int metadata_streams_manual;
306 int metadata_chapters_manual;
308 int chapters_input_file;
310 int64_t recording_time;
311 uint64_t limit_filesize;
315 SpecifierOpt *metadata;
317 SpecifierOpt *max_frames;
319 SpecifierOpt *bitstream_filters;
320 int nb_bitstream_filters;
321 SpecifierOpt *codec_tags;
325 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
328 for (i = 0; i < o->nb_ ## name; i++) {\
329 char *spec = o->name[i].specifier;\
330 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
331 outvar = o->name[i].u.type;\
337 static void reset_options(OptionsContext *o)
339 const OptionDef *po = options;
341 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
343 void *dst = (uint8_t*)o + po->u.off;
345 if (po->flags & OPT_SPEC) {
346 SpecifierOpt **so = dst;
347 int i, *count = (int*)(so + 1);
348 for (i = 0; i < *count; i++) {
349 av_freep(&(*so)[i].specifier);
350 if (po->flags & OPT_STRING)
351 av_freep(&(*so)[i].u.str);
355 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
360 av_freep(&o->stream_maps);
361 av_freep(&o->meta_data_maps);
363 memset(o, 0, sizeof(*o));
365 o->mux_preload = 0.5;
366 o->mux_max_delay = 0.7;
367 o->recording_time = INT64_MAX;
368 o->limit_filesize = UINT64_MAX;
369 o->chapters_input_file = INT_MAX;
377 static int configure_video_filters(InputStream *ist, OutputStream *ost)
379 AVFilterContext *last_filter, *filter;
380 /** filter graph containing all filters including input & output */
381 AVCodecContext *codec = ost->st->codec;
382 AVCodecContext *icodec = ist->st->codec;
383 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
384 AVRational sample_aspect_ratio;
388 ost->graph = avfilter_graph_alloc();
390 if (ist->st->sample_aspect_ratio.num){
391 sample_aspect_ratio = ist->st->sample_aspect_ratio;
393 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
395 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
396 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
397 sample_aspect_ratio.num, sample_aspect_ratio.den);
399 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
400 "src", args, NULL, ost->graph);
403 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
404 "out", NULL, &ffsink_ctx, ost->graph);
407 last_filter = ost->input_video_filter;
409 if (codec->width != icodec->width || codec->height != icodec->height) {
410 snprintf(args, 255, "%d:%d:flags=0x%X",
414 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
415 NULL, args, NULL, ost->graph)) < 0)
417 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
419 last_filter = filter;
422 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
423 ost->graph->scale_sws_opts = av_strdup(args);
426 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
427 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
429 outputs->name = av_strdup("in");
430 outputs->filter_ctx = last_filter;
431 outputs->pad_idx = 0;
432 outputs->next = NULL;
434 inputs->name = av_strdup("out");
435 inputs->filter_ctx = ost->output_video_filter;
439 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
441 av_freep(&ost->avfilter);
443 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
447 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
450 codec->width = ost->output_video_filter->inputs[0]->w;
451 codec->height = ost->output_video_filter->inputs[0]->h;
452 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
453 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
454 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
455 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
459 #endif /* CONFIG_AVFILTER */
461 static void term_exit(void)
463 av_log(NULL, AV_LOG_QUIET, "");
466 static volatile int received_sigterm = 0;
467 static volatile int received_nb_signals = 0;
470 sigterm_handler(int sig)
472 received_sigterm = sig;
473 received_nb_signals++;
477 static void term_init(void)
479 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
480 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
482 signal(SIGXCPU, sigterm_handler);
486 static int decode_interrupt_cb(void)
488 return received_nb_signals > 1;
491 void exit_program(int ret)
496 for(i=0;i<nb_output_files;i++) {
497 AVFormatContext *s = output_files[i].ctx;
498 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
500 avformat_free_context(s);
501 av_dict_free(&output_files[i].opts);
503 for(i=0;i<nb_input_files;i++) {
504 av_close_input_file(input_files[i].ctx);
506 for (i = 0; i < nb_input_streams; i++)
507 av_dict_free(&input_streams[i].opts);
509 av_free(intra_matrix);
510 av_free(inter_matrix);
514 av_free(vstats_filename);
516 av_freep(&input_streams);
517 av_freep(&input_files);
518 av_freep(&output_streams);
519 av_freep(&output_files);
524 allocated_audio_buf_size= allocated_audio_out_size= 0;
531 if (received_sigterm) {
533 "Received signal %d: terminating.\n",
534 (int) received_sigterm);
538 exit(ret); /* not all OS-es handle main() return value */
541 static void assert_avoptions(AVDictionary *m)
543 AVDictionaryEntry *t;
544 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
545 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
550 static void assert_codec_experimental(AVCodecContext *c, int encoder)
552 const char *codec_string = encoder ? "encoder" : "decoder";
554 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
555 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
556 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
557 "results.\nAdd '-strict experimental' if you want to use it.\n",
558 codec_string, c->codec->name);
559 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
560 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
561 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
562 codec_string, codec->name);
567 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
569 if(codec && codec->sample_fmts){
570 const enum AVSampleFormat *p= codec->sample_fmts;
572 if(*p == st->codec->sample_fmt)
576 av_log(NULL, AV_LOG_WARNING,
577 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
578 av_get_sample_fmt_name(st->codec->sample_fmt),
580 av_get_sample_fmt_name(codec->sample_fmts[0]));
581 st->codec->sample_fmt = codec->sample_fmts[0];
587 * Update the requested input sample format based on the output sample format.
588 * This is currently only used to request float output from decoders which
589 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
590 * Ideally this will be removed in the future when decoders do not do format
591 * conversion and only output in their native format.
593 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
596 /* if sample formats match or a decoder sample format has already been
597 requested, just return */
598 if (enc->sample_fmt == dec->sample_fmt ||
599 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
602 /* if decoder supports more than one output format */
603 if (dec_codec && dec_codec->sample_fmts &&
604 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
605 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
606 const enum AVSampleFormat *p;
607 int min_dec = -1, min_inc = -1;
609 /* find a matching sample format in the encoder */
610 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
611 if (*p == enc->sample_fmt) {
612 dec->request_sample_fmt = *p;
614 } else if (*p > enc->sample_fmt) {
615 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
617 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
620 /* if none match, provide the one that matches quality closest */
621 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
622 enc->sample_fmt - min_dec;
626 static void choose_sample_rate(AVStream *st, AVCodec *codec)
628 if(codec && codec->supported_samplerates){
629 const int *p= codec->supported_samplerates;
631 int best_dist=INT_MAX;
633 int dist= abs(st->codec->sample_rate - *p);
634 if(dist < best_dist){
640 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
642 st->codec->sample_rate= best;
646 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
648 if(codec && codec->pix_fmts){
649 const enum PixelFormat *p= codec->pix_fmts;
650 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
651 if(st->codec->codec_id==CODEC_ID_MJPEG){
652 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
653 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
654 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};
658 if(*p == st->codec->pix_fmt)
662 if(st->codec->pix_fmt != PIX_FMT_NONE)
663 av_log(NULL, AV_LOG_WARNING,
664 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
665 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
667 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
668 st->codec->pix_fmt = codec->pix_fmts[0];
674 get_sync_ipts(const OutputStream *ost)
676 const InputStream *ist = ost->sync_ist;
677 OutputFile *of = &output_files[ost->file_index];
678 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
681 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
685 AVPacket new_pkt= *pkt;
686 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
687 &new_pkt.data, &new_pkt.size,
688 pkt->data, pkt->size,
689 pkt->flags & AV_PKT_FLAG_KEY);
692 new_pkt.destruct= av_destruct_packet;
694 fprintf(stderr, "%s failed for stream %d, codec %s",
695 bsfc->filter->name, pkt->stream_index,
696 avctx->codec ? avctx->codec->name : "copy");
706 ret= av_interleaved_write_frame(s, pkt);
708 print_error("av_interleaved_write_frame()", ret);
713 static void do_audio_out(AVFormatContext *s,
716 unsigned char *buf, int size)
719 int64_t audio_out_size, audio_buf_size;
720 int64_t allocated_for_size= size;
722 int size_out, frame_bytes, ret, resample_changed;
723 AVCodecContext *enc= ost->st->codec;
724 AVCodecContext *dec= ist->st->codec;
725 int osize = av_get_bytes_per_sample(enc->sample_fmt);
726 int isize = av_get_bytes_per_sample(dec->sample_fmt);
727 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
730 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
731 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
732 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
733 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
734 audio_buf_size*= osize*enc->channels;
736 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
737 if(coded_bps > 8*osize)
738 audio_out_size= audio_out_size * coded_bps / (8*osize);
739 audio_out_size += FF_MIN_BUFFER_SIZE;
741 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
742 fprintf(stderr, "Buffer sizes too large\n");
746 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
747 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
748 if (!audio_buf || !audio_out){
749 fprintf(stderr, "Out of memory in do_audio_out\n");
753 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
754 ost->audio_resample = 1;
756 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
757 ost->resample_channels != dec->channels ||
758 ost->resample_sample_rate != dec->sample_rate;
760 if ((ost->audio_resample && !ost->resample) || resample_changed) {
761 if (resample_changed) {
762 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",
763 ist->file_index, ist->st->index,
764 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
765 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
766 ost->resample_sample_fmt = dec->sample_fmt;
767 ost->resample_channels = dec->channels;
768 ost->resample_sample_rate = dec->sample_rate;
770 audio_resample_close(ost->resample);
772 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
773 if (audio_sync_method <= 1 &&
774 ost->resample_sample_fmt == enc->sample_fmt &&
775 ost->resample_channels == enc->channels &&
776 ost->resample_sample_rate == enc->sample_rate) {
777 ost->resample = NULL;
778 ost->audio_resample = 0;
779 } else if (ost->audio_resample) {
780 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
781 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
782 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
783 enc->sample_rate, dec->sample_rate,
784 enc->sample_fmt, dec->sample_fmt,
786 if (!ost->resample) {
787 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
788 dec->channels, dec->sample_rate,
789 enc->channels, enc->sample_rate);
795 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
796 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
797 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
798 if (ost->reformat_ctx)
799 av_audio_convert_free(ost->reformat_ctx);
800 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
801 dec->sample_fmt, 1, NULL, 0);
802 if (!ost->reformat_ctx) {
803 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
804 av_get_sample_fmt_name(dec->sample_fmt),
805 av_get_sample_fmt_name(enc->sample_fmt));
808 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
811 if(audio_sync_method){
812 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
813 - av_fifo_size(ost->fifo)/(enc->channels * 2);
814 double idelta= delta*dec->sample_rate / enc->sample_rate;
815 int byte_delta= ((int)idelta)*2*dec->channels;
817 //FIXME resample delay
818 if(fabs(delta) > 50){
819 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
821 byte_delta= FFMAX(byte_delta, -size);
825 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
830 static uint8_t *input_tmp= NULL;
831 input_tmp= av_realloc(input_tmp, byte_delta + size);
833 if(byte_delta > allocated_for_size - size){
834 allocated_for_size= byte_delta + (int64_t)size;
839 memset(input_tmp, 0, byte_delta);
840 memcpy(input_tmp + byte_delta, buf, size);
844 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
846 }else if(audio_sync_method>1){
847 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
848 av_assert0(ost->audio_resample);
850 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
851 // 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));
852 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
856 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
857 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
859 if (ost->audio_resample) {
861 size_out = audio_resample(ost->resample,
862 (short *)buftmp, (short *)buf,
863 size / (dec->channels * isize));
864 size_out = size_out * enc->channels * osize;
870 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
871 const void *ibuf[6]= {buftmp};
872 void *obuf[6]= {audio_buf};
873 int istride[6]= {isize};
874 int ostride[6]= {osize};
875 int len= size_out/istride[0];
876 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
877 printf("av_audio_convert() failed\n");
883 size_out = len*osize;
886 /* now encode as many frames as possible */
887 if (enc->frame_size > 1) {
888 /* output resampled raw samples */
889 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
890 fprintf(stderr, "av_fifo_realloc2() failed\n");
893 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
895 frame_bytes = enc->frame_size * osize * enc->channels;
897 while (av_fifo_size(ost->fifo) >= frame_bytes) {
899 av_init_packet(&pkt);
901 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
903 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
905 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
908 fprintf(stderr, "Audio encoding failed\n");
912 pkt.stream_index= ost->index;
915 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
916 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
917 pkt.flags |= AV_PKT_FLAG_KEY;
918 write_frame(s, &pkt, enc, ost->bitstream_filters);
920 ost->sync_opts += enc->frame_size;
924 av_init_packet(&pkt);
926 ost->sync_opts += size_out / (osize * enc->channels);
928 /* output a pcm frame */
929 /* determine the size of the coded buffer */
932 size_out = size_out*coded_bps/8;
934 if(size_out > audio_out_size){
935 fprintf(stderr, "Internal error, buffer size too small\n");
939 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
940 ret = avcodec_encode_audio(enc, audio_out, size_out,
943 fprintf(stderr, "Audio encoding failed\n");
947 pkt.stream_index= ost->index;
950 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
951 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
952 pkt.flags |= AV_PKT_FLAG_KEY;
953 write_frame(s, &pkt, enc, ost->bitstream_filters);
957 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
961 AVPicture picture_tmp;
964 dec = ist->st->codec;
966 /* deinterlace : must be done before any resize */
967 if (do_deinterlace) {
970 /* create temporary picture */
971 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
972 buf = av_malloc(size);
976 picture2 = &picture_tmp;
977 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
979 if(avpicture_deinterlace(picture2, picture,
980 dec->pix_fmt, dec->width, dec->height) < 0) {
981 /* if error, do not deinterlace */
982 fprintf(stderr, "Deinterlacing failed\n");
991 if (picture != picture2)
992 *picture = *picture2;
996 static void do_subtitle_out(AVFormatContext *s,
1002 static uint8_t *subtitle_out = NULL;
1003 int subtitle_out_max_size = 1024 * 1024;
1004 int subtitle_out_size, nb, i;
1005 AVCodecContext *enc;
1008 if (pts == AV_NOPTS_VALUE) {
1009 fprintf(stderr, "Subtitle packets must have a pts\n");
1015 enc = ost->st->codec;
1017 if (!subtitle_out) {
1018 subtitle_out = av_malloc(subtitle_out_max_size);
1021 /* Note: DVB subtitle need one packet to draw them and one other
1022 packet to clear them */
1023 /* XXX: signal it in the codec context ? */
1024 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1029 for(i = 0; i < nb; i++) {
1030 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1031 // start_display_time is required to be 0
1032 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1033 sub->end_display_time -= sub->start_display_time;
1034 sub->start_display_time = 0;
1035 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1036 subtitle_out_max_size, sub);
1037 if (subtitle_out_size < 0) {
1038 fprintf(stderr, "Subtitle encoding failed\n");
1042 av_init_packet(&pkt);
1043 pkt.stream_index = ost->index;
1044 pkt.data = subtitle_out;
1045 pkt.size = subtitle_out_size;
1046 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1047 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1048 /* XXX: the pts correction is handled here. Maybe handling
1049 it in the codec would be better */
1051 pkt.pts += 90 * sub->start_display_time;
1053 pkt.pts += 90 * sub->end_display_time;
1055 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1059 static int bit_buffer_size= 1024*256;
1060 static uint8_t *bit_buffer= NULL;
1062 static void do_video_resample(OutputStream *ost,
1064 AVFrame *in_picture,
1065 AVFrame **out_picture)
1067 int resample_changed = 0;
1068 AVCodecContext *dec = ist->st->codec;
1069 *out_picture = in_picture;
1071 resample_changed = ost->resample_width != dec->width ||
1072 ost->resample_height != dec->height ||
1073 ost->resample_pix_fmt != dec->pix_fmt;
1075 if (resample_changed) {
1076 av_log(NULL, AV_LOG_INFO,
1077 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1078 ist->file_index, ist->st->index,
1079 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1080 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1081 if(!ost->video_resample)
1082 ost->video_resample = 1;
1085 #if !CONFIG_AVFILTER
1086 if (ost->video_resample) {
1087 *out_picture = &ost->pict_tmp;
1088 if (resample_changed) {
1089 /* initialize a new scaler context */
1090 sws_freeContext(ost->img_resample_ctx);
1091 ost->img_resample_ctx = sws_getContext(
1092 ist->st->codec->width,
1093 ist->st->codec->height,
1094 ist->st->codec->pix_fmt,
1095 ost->st->codec->width,
1096 ost->st->codec->height,
1097 ost->st->codec->pix_fmt,
1098 ost->sws_flags, NULL, NULL, NULL);
1099 if (ost->img_resample_ctx == NULL) {
1100 fprintf(stderr, "Cannot get resampling context\n");
1104 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1105 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1108 if (resample_changed) {
1109 avfilter_graph_free(&ost->graph);
1110 if (configure_video_filters(ist, ost)) {
1111 fprintf(stderr, "Error reinitializing filters!\n");
1116 if (resample_changed) {
1117 ost->resample_width = dec->width;
1118 ost->resample_height = dec->height;
1119 ost->resample_pix_fmt = dec->pix_fmt;
1124 static void do_video_out(AVFormatContext *s,
1127 AVFrame *in_picture,
1128 int *frame_size, float quality)
1130 int nb_frames, i, ret, format_video_sync;
1131 AVFrame *final_picture;
1132 AVCodecContext *enc;
1135 enc = ost->st->codec;
1137 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1139 /* by default, we output a single frame */
1144 format_video_sync = video_sync_method;
1145 if (format_video_sync < 0)
1146 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1148 if (format_video_sync) {
1149 double vdelta = sync_ipts - ost->sync_opts;
1150 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1153 else if (format_video_sync == 2) {
1156 }else if(vdelta>0.6)
1157 ost->sync_opts= lrintf(sync_ipts);
1158 }else if (vdelta > 1.1)
1159 nb_frames = lrintf(vdelta);
1160 //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);
1161 if (nb_frames == 0){
1164 fprintf(stderr, "*** drop!\n");
1165 }else if (nb_frames > 1) {
1166 nb_frames_dup += nb_frames - 1;
1168 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1171 ost->sync_opts= lrintf(sync_ipts);
1173 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1177 do_video_resample(ost, ist, in_picture, &final_picture);
1179 /* duplicates frame if needed */
1180 for(i=0;i<nb_frames;i++) {
1182 av_init_packet(&pkt);
1183 pkt.stream_index= ost->index;
1185 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1186 /* raw pictures are written as AVPicture structure to
1187 avoid any copies. We support temporarily the older
1189 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1190 enc->coded_frame->top_field_first = in_picture->top_field_first;
1191 pkt.data= (uint8_t *)final_picture;
1192 pkt.size= sizeof(AVPicture);
1193 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1194 pkt.flags |= AV_PKT_FLAG_KEY;
1196 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1198 AVFrame big_picture;
1200 big_picture= *final_picture;
1201 /* better than nothing: use input picture interlaced
1203 big_picture.interlaced_frame = in_picture->interlaced_frame;
1204 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1205 if(top_field_first == -1)
1206 big_picture.top_field_first = in_picture->top_field_first;
1208 big_picture.top_field_first = top_field_first;
1211 /* handles same_quant here. This is not correct because it may
1212 not be a global option */
1213 big_picture.quality = quality;
1215 big_picture.pict_type = 0;
1216 // big_picture.pts = AV_NOPTS_VALUE;
1217 big_picture.pts= ost->sync_opts;
1218 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1219 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1220 if (ost->forced_kf_index < ost->forced_kf_count &&
1221 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1222 big_picture.pict_type = AV_PICTURE_TYPE_I;
1223 ost->forced_kf_index++;
1225 ret = avcodec_encode_video(enc,
1226 bit_buffer, bit_buffer_size,
1229 fprintf(stderr, "Video encoding failed\n");
1234 pkt.data= bit_buffer;
1236 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1237 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1238 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1239 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1240 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1242 if(enc->coded_frame->key_frame)
1243 pkt.flags |= AV_PKT_FLAG_KEY;
1244 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1247 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1248 // enc->frame_number-1, ret, enc->pict_type);
1249 /* if two pass, output log */
1250 if (ost->logfile && enc->stats_out) {
1251 fprintf(ost->logfile, "%s", enc->stats_out);
1256 ost->frame_number++;
1260 static double psnr(double d){
1261 return -10.0*log(d)/log(10.0);
1264 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1267 AVCodecContext *enc;
1269 double ti1, bitrate, avg_bitrate;
1271 /* this is executed just the first time do_video_stats is called */
1273 vstats_file = fopen(vstats_filename, "w");
1280 enc = ost->st->codec;
1281 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1282 frame_number = ost->frame_number;
1283 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1284 if (enc->flags&CODEC_FLAG_PSNR)
1285 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1287 fprintf(vstats_file,"f_size= %6d ", frame_size);
1288 /* compute pts value */
1289 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1293 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1294 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1295 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1296 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1297 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1301 static void print_report(OutputFile *output_files,
1302 OutputStream *ost_table, int nb_ostreams,
1303 int is_last_report, int64_t timer_start)
1307 AVFormatContext *oc;
1309 AVCodecContext *enc;
1310 int frame_number, vid, i;
1311 double bitrate, ti1, pts;
1312 static int64_t last_time = -1;
1313 static int qp_histogram[52];
1315 if (!is_last_report) {
1317 /* display the report every 0.5 seconds */
1318 cur_time = av_gettime();
1319 if (last_time == -1) {
1320 last_time = cur_time;
1323 if ((cur_time - last_time) < 500000)
1325 last_time = cur_time;
1329 oc = output_files[0].ctx;
1331 total_size = avio_size(oc->pb);
1332 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1333 total_size= avio_tell(oc->pb);
1338 for(i=0;i<nb_ostreams;i++) {
1340 ost = &ost_table[i];
1341 enc = ost->st->codec;
1342 if (!ost->st->stream_copy && enc->coded_frame)
1343 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1344 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1345 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1347 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1348 float t = (av_gettime()-timer_start) / 1000000.0;
1350 frame_number = ost->frame_number;
1351 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1352 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1358 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1363 if (enc->flags&CODEC_FLAG_PSNR){
1365 double error, error_sum=0;
1366 double scale, scale_sum=0;
1367 char type[3]= {'Y','U','V'};
1368 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1371 error= enc->error[j];
1372 scale= enc->width*enc->height*255.0*255.0*frame_number;
1374 error= enc->coded_frame->error[j];
1375 scale= enc->width*enc->height*255.0*255.0;
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1386 /* compute min output value */
1387 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1388 if ((pts < ti1) && (pts > 0))
1394 if (verbose > 0 || is_last_report) {
1395 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1398 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1399 (double)total_size / 1024, ti1, bitrate);
1401 if (nb_frames_dup || nb_frames_drop)
1402 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1403 nb_frames_dup, nb_frames_drop);
1406 fprintf(stderr, "%s \r", buf);
1411 if (is_last_report && verbose >= 0){
1412 int64_t raw= audio_size + video_size + extra_size;
1413 fprintf(stderr, "\n");
1414 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1418 100.0*(total_size - raw)/raw
1423 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1425 int fill_char = 0x00;
1426 if (sample_fmt == AV_SAMPLE_FMT_U8)
1428 memset(buf, fill_char, size);
1431 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1435 for (i = 0; i < nb_ostreams; i++) {
1436 OutputStream *ost = &ost_table[i];
1437 AVCodecContext *enc = ost->st->codec;
1438 AVFormatContext *os = output_files[ost->file_index].ctx;
1440 if (!ost->encoding_needed)
1443 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1445 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1451 av_init_packet(&pkt);
1452 pkt.stream_index= ost->index;
1454 switch (ost->st->codec->codec_type) {
1455 case AVMEDIA_TYPE_AUDIO:
1456 fifo_bytes = av_fifo_size(ost->fifo);
1458 /* encode any samples remaining in fifo */
1459 if (fifo_bytes > 0) {
1460 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1461 int fs_tmp = enc->frame_size;
1463 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1464 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1465 enc->frame_size = fifo_bytes / (osize * enc->channels);
1467 int frame_bytes = enc->frame_size*osize*enc->channels;
1468 if (allocated_audio_buf_size < frame_bytes)
1470 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1473 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1474 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1475 ost->st->time_base.num, enc->sample_rate);
1476 enc->frame_size = fs_tmp;
1479 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1482 fprintf(stderr, "Audio encoding failed\n");
1486 pkt.flags |= AV_PKT_FLAG_KEY;
1488 case AVMEDIA_TYPE_VIDEO:
1489 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1491 fprintf(stderr, "Video encoding failed\n");
1495 if(enc->coded_frame && enc->coded_frame->key_frame)
1496 pkt.flags |= AV_PKT_FLAG_KEY;
1497 if (ost->logfile && enc->stats_out) {
1498 fprintf(ost->logfile, "%s", enc->stats_out);
1507 pkt.data = bit_buffer;
1509 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1510 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1511 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1516 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1517 static int output_packet(InputStream *ist, int ist_index,
1518 OutputStream *ost_table, int nb_ostreams,
1519 const AVPacket *pkt)
1521 AVFormatContext *os;
1526 void *buffer_to_free = NULL;
1527 static unsigned int samples_size= 0;
1528 AVSubtitle subtitle, *subtitle_to_free;
1529 int64_t pkt_pts = AV_NOPTS_VALUE;
1531 int frame_available;
1536 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1538 if(ist->next_pts == AV_NOPTS_VALUE)
1539 ist->next_pts= ist->pts;
1543 av_init_packet(&avpkt);
1551 if(pkt->dts != AV_NOPTS_VALUE)
1552 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1553 if(pkt->pts != AV_NOPTS_VALUE)
1554 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1556 //while we have more to decode or while the decoder did output something on EOF
1557 while (avpkt.size > 0 || (!pkt && got_output)) {
1558 uint8_t *data_buf, *decoded_data_buf;
1559 int data_size, decoded_data_size;
1561 ist->pts= ist->next_pts;
1563 if(avpkt.size && avpkt.size != pkt->size &&
1564 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1565 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1566 ist->showed_multi_packet_warning=1;
1569 /* decode the packet if needed */
1570 decoded_data_buf = NULL; /* fail safe */
1571 decoded_data_size= 0;
1572 data_buf = avpkt.data;
1573 data_size = avpkt.size;
1574 subtitle_to_free = NULL;
1575 if (ist->decoding_needed) {
1576 switch(ist->st->codec->codec_type) {
1577 case AVMEDIA_TYPE_AUDIO:{
1578 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1579 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1581 samples= av_malloc(samples_size);
1583 decoded_data_size= samples_size;
1584 /* XXX: could avoid copy if PCM 16 bits with same
1585 endianness as CPU */
1586 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1593 got_output = decoded_data_size > 0;
1594 /* Some bug in mpeg audio decoder gives */
1595 /* decoded_data_size < 0, it seems they are overflows */
1597 /* no audio frame */
1600 decoded_data_buf = (uint8_t *)samples;
1601 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1602 (ist->st->codec->sample_rate * ist->st->codec->channels);
1604 case AVMEDIA_TYPE_VIDEO:
1605 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1606 /* XXX: allocate picture correctly */
1607 avcodec_get_frame_defaults(&picture);
1608 avpkt.pts = pkt_pts;
1609 avpkt.dts = ist->pts;
1610 pkt_pts = AV_NOPTS_VALUE;
1612 ret = avcodec_decode_video2(ist->st->codec,
1613 &picture, &got_output, &avpkt);
1614 quality = same_quant ? picture.quality : 0;
1618 /* no picture yet */
1619 goto discard_packet;
1621 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1622 if (ist->st->codec->time_base.num != 0) {
1623 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1624 ist->next_pts += ((int64_t)AV_TIME_BASE *
1625 ist->st->codec->time_base.num * ticks) /
1626 ist->st->codec->time_base.den;
1629 buffer_to_free = NULL;
1630 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1632 case AVMEDIA_TYPE_SUBTITLE:
1633 ret = avcodec_decode_subtitle2(ist->st->codec,
1634 &subtitle, &got_output, &avpkt);
1638 goto discard_packet;
1640 subtitle_to_free = &subtitle;
1647 switch(ist->st->codec->codec_type) {
1648 case AVMEDIA_TYPE_AUDIO:
1649 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1650 ist->st->codec->sample_rate;
1652 case AVMEDIA_TYPE_VIDEO:
1653 if (ist->st->codec->time_base.num != 0) {
1654 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1655 ist->next_pts += ((int64_t)AV_TIME_BASE *
1656 ist->st->codec->time_base.num * ticks) /
1657 ist->st->codec->time_base.den;
1664 // preprocess audio (volume)
1665 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1666 if (audio_volume != 256) {
1669 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1670 int v = ((*volp) * audio_volume + 128) >> 8;
1671 *volp++ = av_clip_int16(v);
1676 /* frame rate emulation */
1677 if (input_files[ist->file_index].rate_emu) {
1678 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1679 int64_t now = av_gettime() - ist->start;
1683 /* if output time reached then transcode raw format,
1684 encode packets and output them */
1685 for (i = 0; i < nb_ostreams; i++) {
1686 OutputFile *of = &output_files[ost_table[i].file_index];
1689 ost = &ost_table[i];
1690 if (ost->source_index != ist_index)
1693 if (of->start_time && ist->pts < of->start_time)
1696 if (of->recording_time != INT64_MAX &&
1697 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1698 (AVRational){1, 1000000}) >= 0) {
1699 ost->is_past_recording_time = 1;
1704 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1705 ost->input_video_filter) {
1707 if (ist->st->sample_aspect_ratio.num)
1708 sar = ist->st->sample_aspect_ratio;
1710 sar = ist->st->codec->sample_aspect_ratio;
1711 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1713 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1714 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1715 while (frame_available) {
1716 AVRational ist_pts_tb;
1717 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1718 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1720 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1722 os = output_files[ost->file_index].ctx;
1724 /* set the input output pts pairs */
1725 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1727 if (ost->encoding_needed) {
1728 av_assert0(ist->decoding_needed);
1729 switch(ost->st->codec->codec_type) {
1730 case AVMEDIA_TYPE_AUDIO:
1731 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1733 case AVMEDIA_TYPE_VIDEO:
1735 if (ost->picref->video && !ost->frame_aspect_ratio)
1736 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1738 do_video_out(os, ost, ist, &picture, &frame_size,
1739 same_quant ? quality : ost->st->codec->global_quality);
1740 if (vstats_filename && frame_size)
1741 do_video_stats(os, ost, frame_size);
1743 case AVMEDIA_TYPE_SUBTITLE:
1744 do_subtitle_out(os, ost, ist, &subtitle,
1751 AVFrame avframe; //FIXME/XXX remove this
1753 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1755 av_init_packet(&opkt);
1757 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1758 #if !CONFIG_AVFILTER
1764 /* no reencoding needed : output the packet directly */
1765 /* force the input stream PTS */
1767 avcodec_get_frame_defaults(&avframe);
1768 ost->st->codec->coded_frame= &avframe;
1769 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1771 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1772 audio_size += data_size;
1773 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1774 video_size += data_size;
1778 opkt.stream_index= ost->index;
1779 if(pkt->pts != AV_NOPTS_VALUE)
1780 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1782 opkt.pts= AV_NOPTS_VALUE;
1784 if (pkt->dts == AV_NOPTS_VALUE)
1785 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1787 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1788 opkt.dts -= ost_tb_start_time;
1790 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1791 opkt.flags= pkt->flags;
1793 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1794 if( ost->st->codec->codec_id != CODEC_ID_H264
1795 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1796 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1798 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1799 opkt.destruct= av_destruct_packet;
1801 opkt.data = data_buf;
1802 opkt.size = data_size;
1805 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1806 ost->st->codec->frame_number++;
1807 ost->frame_number++;
1808 av_free_packet(&opkt);
1812 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1813 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1815 avfilter_unref_buffer(ost->picref);
1820 av_free(buffer_to_free);
1821 /* XXX: allocate the subtitles in the codec ? */
1822 if (subtitle_to_free) {
1823 avsubtitle_free(subtitle_to_free);
1824 subtitle_to_free = NULL;
1832 static void print_sdp(OutputFile *output_files, int n)
1836 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1840 for (i = 0; i < n; i++)
1841 avc[i] = output_files[i].ctx;
1843 av_sdp_create(avc, n, sdp, sizeof(sdp));
1844 printf("SDP:\n%s\n", sdp);
1849 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1850 char *error, int error_len)
1853 InputStream *ist = &input_streams[ist_index];
1854 if (ist->decoding_needed) {
1855 AVCodec *codec = ist->dec;
1857 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1858 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1859 return AVERROR(EINVAL);
1862 /* update requested sample format for the decoder based on the
1863 corresponding encoder sample format */
1864 for (i = 0; i < nb_output_streams; i++) {
1865 OutputStream *ost = &output_streams[i];
1866 if (ost->source_index == ist_index) {
1867 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1872 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1873 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1874 ist->file_index, ist->st->index);
1875 return AVERROR(EINVAL);
1877 assert_codec_experimental(ist->st->codec, 0);
1878 assert_avoptions(ist->opts);
1881 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;
1882 ist->next_pts = AV_NOPTS_VALUE;
1883 init_pts_correction(&ist->pts_ctx);
1889 static int transcode_init(OutputFile *output_files,
1890 int nb_output_files,
1891 InputFile *input_files,
1895 AVFormatContext *os;
1896 AVCodecContext *codec, *icodec;
1902 /* init framerate emulation */
1903 for (i = 0; i < nb_input_files; i++) {
1904 InputFile *ifile = &input_files[i];
1905 if (ifile->rate_emu)
1906 for (j = 0; j < ifile->nb_streams; j++)
1907 input_streams[j + ifile->ist_index].start = av_gettime();
1910 /* output stream init */
1911 for(i=0;i<nb_output_files;i++) {
1912 os = output_files[i].ctx;
1913 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1914 av_dump_format(os, i, os->filename, 1);
1915 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1916 return AVERROR(EINVAL);
1920 /* for each output stream, we compute the right encoding parameters */
1921 for (i = 0; i < nb_output_streams; i++) {
1922 ost = &output_streams[i];
1923 os = output_files[ost->file_index].ctx;
1924 ist = &input_streams[ost->source_index];
1926 codec = ost->st->codec;
1927 icodec = ist->st->codec;
1929 ost->st->disposition = ist->st->disposition;
1930 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1931 codec->chroma_sample_location = icodec->chroma_sample_location;
1933 if (ost->st->stream_copy) {
1934 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1936 if (extra_size > INT_MAX) {
1937 return AVERROR(EINVAL);
1940 /* if stream_copy is selected, no need to decode or encode */
1941 codec->codec_id = icodec->codec_id;
1942 codec->codec_type = icodec->codec_type;
1944 if(!codec->codec_tag){
1945 if( !os->oformat->codec_tag
1946 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1947 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1948 codec->codec_tag = icodec->codec_tag;
1951 codec->bit_rate = icodec->bit_rate;
1952 codec->rc_max_rate = icodec->rc_max_rate;
1953 codec->rc_buffer_size = icodec->rc_buffer_size;
1954 codec->extradata= av_mallocz(extra_size);
1955 if (!codec->extradata) {
1956 return AVERROR(ENOMEM);
1958 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1959 codec->extradata_size= icodec->extradata_size;
1960 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){
1961 codec->time_base = icodec->time_base;
1962 codec->time_base.num *= icodec->ticks_per_frame;
1963 av_reduce(&codec->time_base.num, &codec->time_base.den,
1964 codec->time_base.num, codec->time_base.den, INT_MAX);
1966 codec->time_base = ist->st->time_base;
1967 switch(codec->codec_type) {
1968 case AVMEDIA_TYPE_AUDIO:
1969 if(audio_volume != 256) {
1970 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1973 codec->channel_layout = icodec->channel_layout;
1974 codec->sample_rate = icodec->sample_rate;
1975 codec->channels = icodec->channels;
1976 codec->frame_size = icodec->frame_size;
1977 codec->audio_service_type = icodec->audio_service_type;
1978 codec->block_align= icodec->block_align;
1979 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1980 codec->block_align= 0;
1981 if(codec->codec_id == CODEC_ID_AC3)
1982 codec->block_align= 0;
1984 case AVMEDIA_TYPE_VIDEO:
1985 codec->pix_fmt = icodec->pix_fmt;
1986 codec->width = icodec->width;
1987 codec->height = icodec->height;
1988 codec->has_b_frames = icodec->has_b_frames;
1989 if (!codec->sample_aspect_ratio.num) {
1990 codec->sample_aspect_ratio =
1991 ost->st->sample_aspect_ratio =
1992 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1993 ist->st->codec->sample_aspect_ratio.num ?
1994 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1997 case AVMEDIA_TYPE_SUBTITLE:
1998 codec->width = icodec->width;
1999 codec->height = icodec->height;
2001 case AVMEDIA_TYPE_DATA:
2008 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2009 switch(codec->codec_type) {
2010 case AVMEDIA_TYPE_AUDIO:
2011 ost->fifo= av_fifo_alloc(1024);
2013 return AVERROR(ENOMEM);
2015 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2016 if (!codec->sample_rate) {
2017 codec->sample_rate = icodec->sample_rate;
2019 codec->sample_rate >>= icodec->lowres;
2021 choose_sample_rate(ost->st, ost->enc);
2022 codec->time_base = (AVRational){1, codec->sample_rate};
2023 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2024 codec->sample_fmt = icodec->sample_fmt;
2025 choose_sample_fmt(ost->st, ost->enc);
2026 if (!codec->channels)
2027 codec->channels = icodec->channels;
2028 codec->channel_layout = icodec->channel_layout;
2029 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2030 codec->channel_layout = 0;
2031 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2032 icodec->request_channels = codec->channels;
2033 ist->decoding_needed = 1;
2034 ost->encoding_needed = 1;
2035 ost->resample_sample_fmt = icodec->sample_fmt;
2036 ost->resample_sample_rate = icodec->sample_rate;
2037 ost->resample_channels = icodec->channels;
2039 case AVMEDIA_TYPE_VIDEO:
2040 if (codec->pix_fmt == PIX_FMT_NONE)
2041 codec->pix_fmt = icodec->pix_fmt;
2042 choose_pixel_fmt(ost->st, ost->enc);
2044 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2045 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2049 if (!codec->width || !codec->height) {
2050 codec->width = icodec->width;
2051 codec->height = icodec->height;
2054 ost->video_resample = codec->width != icodec->width ||
2055 codec->height != icodec->height ||
2056 codec->pix_fmt != icodec->pix_fmt;
2057 if (ost->video_resample) {
2058 #if !CONFIG_AVFILTER
2059 avcodec_get_frame_defaults(&ost->pict_tmp);
2060 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2061 codec->width, codec->height)) {
2062 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2065 ost->img_resample_ctx = sws_getContext(
2072 ost->sws_flags, NULL, NULL, NULL);
2073 if (ost->img_resample_ctx == NULL) {
2074 fprintf(stderr, "Cannot get resampling context\n");
2078 codec->bits_per_raw_sample= 0;
2081 ost->resample_height = icodec->height;
2082 ost->resample_width = icodec->width;
2083 ost->resample_pix_fmt= icodec->pix_fmt;
2084 ost->encoding_needed = 1;
2085 ist->decoding_needed = 1;
2087 if (!ost->frame_rate.num)
2088 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2089 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2090 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2091 ost->frame_rate = ost->enc->supported_framerates[idx];
2093 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2096 if (configure_video_filters(ist, ost)) {
2097 fprintf(stderr, "Error opening filters!\n");
2102 case AVMEDIA_TYPE_SUBTITLE:
2103 ost->encoding_needed = 1;
2104 ist->decoding_needed = 1;
2111 if (ost->encoding_needed &&
2112 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2113 char logfilename[1024];
2116 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2117 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2119 if (codec->flags & CODEC_FLAG_PASS1) {
2120 f = fopen(logfilename, "wb");
2122 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2128 size_t logbuffer_size;
2129 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2130 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2133 codec->stats_in = logbuffer;
2137 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2138 int size= codec->width * codec->height;
2139 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2144 bit_buffer = av_malloc(bit_buffer_size);
2146 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2148 return AVERROR(ENOMEM);
2151 /* open each encoder */
2152 for (i = 0; i < nb_output_streams; i++) {
2153 ost = &output_streams[i];
2154 if (ost->encoding_needed) {
2155 AVCodec *codec = ost->enc;
2156 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2158 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2159 ost->st->codec->codec_id, ost->file_index, ost->index);
2160 ret = AVERROR(EINVAL);
2163 if (dec->subtitle_header) {
2164 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2165 if (!ost->st->codec->subtitle_header) {
2166 ret = AVERROR(ENOMEM);
2169 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2170 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2172 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2173 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2174 ost->file_index, ost->index);
2175 ret = AVERROR(EINVAL);
2178 assert_codec_experimental(ost->st->codec, 1);
2179 assert_avoptions(ost->opts);
2180 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2181 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2182 "It takes bits/s as argument, not kbits/s\n");
2183 extra_size += ost->st->codec->extradata_size;
2187 /* init input streams */
2188 for (i = 0; i < nb_input_streams; i++)
2189 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2192 /* open files and write file headers */
2193 for (i = 0; i < nb_output_files; i++) {
2194 os = output_files[i].ctx;
2195 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2196 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2197 ret = AVERROR(EINVAL);
2200 assert_avoptions(output_files[i].opts);
2201 if (strcmp(os->oformat->name, "rtp")) {
2207 /* dump the file output parameters - cannot be done before in case
2209 for(i=0;i<nb_output_files;i++) {
2210 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2213 /* dump the stream mapping */
2215 fprintf(stderr, "Stream mapping:\n");
2216 for (i = 0; i < nb_output_streams;i ++) {
2217 ost = &output_streams[i];
2218 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2219 input_streams[ost->source_index].file_index,
2220 input_streams[ost->source_index].st->index,
2223 if (ost->sync_ist != &input_streams[ost->source_index])
2224 fprintf(stderr, " [sync #%d.%d]",
2225 ost->sync_ist->file_index,
2226 ost->sync_ist->st->index);
2227 if (ost->st->stream_copy)
2228 fprintf(stderr, " (copy)");
2230 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2231 input_streams[ost->source_index].dec->name : "?",
2232 ost->enc ? ost->enc->name : "?");
2233 fprintf(stderr, "\n");
2238 fprintf(stderr, "%s\n", error);
2243 print_sdp(output_files, nb_output_files);
2250 * The following code is the main loop of the file converter
2252 static int transcode(OutputFile *output_files,
2253 int nb_output_files,
2254 InputFile *input_files,
2258 AVFormatContext *is, *os;
2262 int no_packet_count=0;
2263 int64_t timer_start;
2265 if (!(no_packet = av_mallocz(nb_input_files)))
2268 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2273 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2276 timer_start = av_gettime();
2278 for(; received_sigterm == 0;) {
2279 int file_index, ist_index;
2284 ipts_min = INT64_MAX;
2287 /* select the stream that we must read now by looking at the
2288 smallest output pts */
2290 for (i = 0; i < nb_output_streams; i++) {
2294 ost = &output_streams[i];
2295 of = &output_files[ost->file_index];
2296 os = output_files[ost->file_index].ctx;
2297 ist = &input_streams[ost->source_index];
2298 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2299 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2301 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2303 if (!input_files[ist->file_index].eof_reached){
2304 if(ipts < ipts_min) {
2306 if(input_sync ) file_index = ist->file_index;
2308 if(opts < opts_min) {
2310 if(!input_sync) file_index = ist->file_index;
2313 if (ost->frame_number >= ost->max_frames) {
2315 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2316 output_streams[j].is_past_recording_time = 1;
2320 /* if none, if is finished */
2321 if (file_index < 0) {
2322 if(no_packet_count){
2324 memset(no_packet, 0, nb_input_files);
2331 /* read a frame from it and output it in the fifo */
2332 is = input_files[file_index].ctx;
2333 ret= av_read_frame(is, &pkt);
2334 if(ret == AVERROR(EAGAIN)){
2335 no_packet[file_index]=1;
2340 input_files[file_index].eof_reached = 1;
2348 memset(no_packet, 0, nb_input_files);
2351 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2352 is->streams[pkt.stream_index]);
2354 /* the following test is needed in case new streams appear
2355 dynamically in stream : we ignore them */
2356 if (pkt.stream_index >= input_files[file_index].nb_streams)
2357 goto discard_packet;
2358 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2359 ist = &input_streams[ist_index];
2361 goto discard_packet;
2363 if (pkt.dts != AV_NOPTS_VALUE)
2364 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2365 if (pkt.pts != AV_NOPTS_VALUE)
2366 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2368 if(pkt.pts != AV_NOPTS_VALUE)
2369 pkt.pts *= ist->ts_scale;
2370 if(pkt.dts != AV_NOPTS_VALUE)
2371 pkt.dts *= ist->ts_scale;
2373 // 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);
2374 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2375 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2376 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2377 int64_t delta= pkt_dts - ist->next_pts;
2378 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2379 input_files[ist->file_index].ts_offset -= delta;
2381 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2382 delta, input_files[ist->file_index].ts_offset);
2383 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2384 if(pkt.pts != AV_NOPTS_VALUE)
2385 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2389 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2390 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2393 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2394 ist->file_index, ist->st->index);
2397 av_free_packet(&pkt);
2402 av_free_packet(&pkt);
2404 /* dump report by using the output first video and audio streams */
2405 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2408 /* at the end of stream, we must flush the decoder buffers */
2409 for (i = 0; i < nb_input_streams; i++) {
2410 ist = &input_streams[i];
2411 if (ist->decoding_needed) {
2412 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2415 flush_encoders(output_streams, nb_output_streams);
2419 /* write the trailer if needed and close file */
2420 for(i=0;i<nb_output_files;i++) {
2421 os = output_files[i].ctx;
2422 av_write_trailer(os);
2425 /* dump report by using the first video and audio streams */
2426 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2428 /* close each encoder */
2429 for (i = 0; i < nb_output_streams; i++) {
2430 ost = &output_streams[i];
2431 if (ost->encoding_needed) {
2432 av_freep(&ost->st->codec->stats_in);
2433 avcodec_close(ost->st->codec);
2436 avfilter_graph_free(&ost->graph);
2440 /* close each decoder */
2441 for (i = 0; i < nb_input_streams; i++) {
2442 ist = &input_streams[i];
2443 if (ist->decoding_needed) {
2444 avcodec_close(ist->st->codec);
2452 av_freep(&bit_buffer);
2453 av_freep(&no_packet);
2455 if (output_streams) {
2456 for (i = 0; i < nb_output_streams; i++) {
2457 ost = &output_streams[i];
2459 if (ost->st->stream_copy)
2460 av_freep(&ost->st->codec->extradata);
2462 fclose(ost->logfile);
2463 ost->logfile = NULL;
2465 av_fifo_free(ost->fifo); /* works even if fifo is not
2466 initialized but set to zero */
2467 av_freep(&ost->st->codec->subtitle_header);
2468 av_free(ost->pict_tmp.data[0]);
2469 av_free(ost->forced_kf_pts);
2470 if (ost->video_resample)
2471 sws_freeContext(ost->img_resample_ctx);
2473 audio_resample_close(ost->resample);
2474 if (ost->reformat_ctx)
2475 av_audio_convert_free(ost->reformat_ctx);
2476 av_dict_free(&ost->opts);
2483 static int opt_video_rc_override_string(const char *opt, const char *arg)
2485 video_rc_override_string = arg;
2489 static int opt_me_threshold(const char *opt, const char *arg)
2491 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2495 static int opt_verbose(const char *opt, const char *arg)
2497 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2501 static int opt_frame_rate(const char *opt, const char *arg)
2503 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2504 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2510 static int opt_frame_size(const char *opt, const char *arg)
2512 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2513 fprintf(stderr, "Incorrect frame size\n");
2514 return AVERROR(EINVAL);
2519 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2521 if (strcmp(arg, "list")) {
2522 frame_pix_fmt = av_get_pix_fmt(arg);
2523 if (frame_pix_fmt == PIX_FMT_NONE) {
2524 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2525 return AVERROR(EINVAL);
2534 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2541 p = strchr(arg, ':');
2543 x = strtol(arg, &end, 10);
2545 y = strtol(end+1, &end, 10);
2547 ar = (double)x / (double)y;
2549 ar = strtod(arg, NULL);
2552 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2553 return AVERROR(EINVAL);
2555 frame_aspect_ratio = ar;
2559 static int opt_qscale(const char *opt, const char *arg)
2561 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2562 if (video_qscale == 0) {
2563 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2564 return AVERROR(EINVAL);
2569 static int opt_top_field_first(const char *opt, const char *arg)
2571 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2575 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2577 if (strcmp(arg, "list")) {
2578 audio_sample_fmt = av_get_sample_fmt(arg);
2579 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2580 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2581 return AVERROR(EINVAL);
2586 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2587 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2593 static int opt_audio_rate(const char *opt, const char *arg)
2595 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2599 static int opt_audio_channels(const char *opt, const char *arg)
2601 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2605 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2607 return parse_option(o, "codec:a", arg, options);
2610 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2612 return parse_option(o, "codec:v", arg, options);
2615 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2617 return parse_option(o, "codec:s", arg, options);
2620 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2622 return parse_option(o, "codec:d", arg, options);
2625 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2627 StreamMap *m = NULL;
2628 int i, negative = 0, file_idx;
2629 int sync_file_idx = -1, sync_stream_idx;
2637 map = av_strdup(arg);
2639 /* parse sync stream first, just pick first matching stream */
2640 if (sync = strchr(map, ',')) {
2642 sync_file_idx = strtol(sync + 1, &sync, 0);
2643 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2644 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2649 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2650 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2651 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2652 sync_stream_idx = i;
2655 if (i == input_files[sync_file_idx].nb_streams) {
2656 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2657 "match any streams.\n", arg);
2663 file_idx = strtol(map, &p, 0);
2664 if (file_idx >= nb_input_files || file_idx < 0) {
2665 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2669 /* disable some already defined maps */
2670 for (i = 0; i < o->nb_stream_maps; i++) {
2671 m = &o->stream_maps[i];
2672 if (check_stream_specifier(input_files[m->file_index].ctx,
2673 input_files[m->file_index].ctx->streams[m->stream_index],
2674 *p == ':' ? p + 1 : p) > 0)
2678 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2679 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2680 *p == ':' ? p + 1 : p) <= 0)
2682 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2683 &o->nb_stream_maps, o->nb_stream_maps + 1);
2684 m = &o->stream_maps[o->nb_stream_maps - 1];
2686 m->file_index = file_idx;
2687 m->stream_index = i;
2689 if (sync_file_idx >= 0) {
2690 m->sync_file_index = sync_file_idx;
2691 m->sync_stream_index = sync_stream_idx;
2693 m->sync_file_index = file_idx;
2694 m->sync_stream_index = i;
2699 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2707 static void parse_meta_type(char *arg, char *type, int *index)
2717 if (*(++arg) == ':')
2718 *index = strtol(++arg, NULL, 0);
2721 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2728 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2730 MetadataMap *m, *m1;
2733 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2734 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2736 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2737 m->file = strtol(arg, &p, 0);
2738 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2740 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2741 if (p = strchr(opt, ':'))
2742 parse_meta_type(p + 1, &m1->type, &m1->index);
2746 if (m->type == 'g' || m1->type == 'g')
2747 o->metadata_global_manual = 1;
2748 if (m->type == 's' || m1->type == 's')
2749 o->metadata_streams_manual = 1;
2750 if (m->type == 'c' || m1->type == 'c')
2751 o->metadata_chapters_manual = 1;
2756 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2758 const char *codec_string = encoder ? "encoder" : "decoder";
2762 return CODEC_ID_NONE;
2764 avcodec_find_encoder_by_name(name) :
2765 avcodec_find_decoder_by_name(name);
2767 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2770 if(codec->type != type) {
2771 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2777 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2779 char *codec_name = NULL;
2781 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2785 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2786 return avcodec_find_encoder(st->codec->codec_id);
2788 } else if (!strcmp(codec_name, "copy"))
2789 st->stream_copy = 1;
2791 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2792 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2793 avcodec_find_decoder_by_name(codec_name);
2800 * Add all the streams from the given input file to the global
2801 * list of input streams.
2803 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2805 int i, rfps, rfps_base;
2807 for (i = 0; i < ic->nb_streams; i++) {
2808 AVStream *st = ic->streams[i];
2809 AVCodecContext *dec = st->codec;
2813 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2814 ist = &input_streams[nb_input_streams - 1];
2816 ist->file_index = nb_input_files;
2818 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2820 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2821 ist->ts_scale = scale;
2823 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2825 ist->dec = avcodec_find_decoder(dec->codec_id);
2827 switch (dec->codec_type) {
2828 case AVMEDIA_TYPE_AUDIO:
2830 st->discard= AVDISCARD_ALL;
2832 case AVMEDIA_TYPE_VIDEO:
2833 rfps = ic->streams[i]->r_frame_rate.num;
2834 rfps_base = ic->streams[i]->r_frame_rate.den;
2836 dec->flags |= CODEC_FLAG_EMU_EDGE;
2837 dec->height >>= dec->lowres;
2838 dec->width >>= dec->lowres;
2841 dec->debug |= FF_DEBUG_MV;
2843 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2846 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2847 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2849 (float)rfps / rfps_base, rfps, rfps_base);
2853 st->discard= AVDISCARD_ALL;
2854 else if(video_discard)
2855 st->discard= video_discard;
2857 case AVMEDIA_TYPE_DATA:
2859 case AVMEDIA_TYPE_SUBTITLE:
2860 if(subtitle_disable)
2861 st->discard = AVDISCARD_ALL;
2863 case AVMEDIA_TYPE_ATTACHMENT:
2864 case AVMEDIA_TYPE_UNKNOWN:
2872 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2874 AVFormatContext *ic;
2875 AVInputFormat *file_iformat = NULL;
2879 AVDictionary **opts;
2880 int orig_nb_streams; // number of streams before avformat_find_stream_info
2883 if (!(file_iformat = av_find_input_format(o->format))) {
2884 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2889 if (!strcmp(filename, "-"))
2892 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2893 !strcmp(filename, "/dev/stdin");
2895 /* get default parameters from command line */
2896 ic = avformat_alloc_context();
2898 print_error(filename, AVERROR(ENOMEM));
2901 if (audio_sample_rate) {
2902 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2903 av_dict_set(&format_opts, "sample_rate", buf, 0);
2905 if (audio_channels) {
2906 snprintf(buf, sizeof(buf), "%d", audio_channels);
2907 av_dict_set(&format_opts, "channels", buf, 0);
2909 if (frame_rate.num) {
2910 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2911 av_dict_set(&format_opts, "framerate", buf, 0);
2913 if (frame_width && frame_height) {
2914 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2915 av_dict_set(&format_opts, "video_size", buf, 0);
2917 if (frame_pix_fmt != PIX_FMT_NONE)
2918 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2920 ic->flags |= AVFMT_FLAG_NONBLOCK;
2922 /* open the input file with generic libav function */
2923 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2925 print_error(filename, err);
2928 assert_avoptions(format_opts);
2933 for(i=0; i<ic->nb_streams; i++){
2934 ic->streams[i]->discard= AVDISCARD_ALL;
2936 for(i=0; i<ic->nb_programs; i++){
2937 AVProgram *p= ic->programs[i];
2938 if(p->id != opt_programid){
2939 p->discard = AVDISCARD_ALL;
2942 for(j=0; j<p->nb_stream_indexes; j++){
2943 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2948 fprintf(stderr, "Specified program id not found\n");
2954 /* apply forced codec ids */
2955 for (i = 0; i < ic->nb_streams; i++)
2956 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2958 /* Set AVCodecContext options for avformat_find_stream_info */
2959 opts = setup_find_stream_info_opts(ic, codec_opts);
2960 orig_nb_streams = ic->nb_streams;
2962 /* If not enough info to get the stream parameters, we decode the
2963 first frames to get it. (used in mpeg case for example) */
2964 ret = avformat_find_stream_info(ic, opts);
2965 if (ret < 0 && verbose >= 0) {
2966 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2967 av_close_input_file(ic);
2971 timestamp = o->start_time;
2972 /* add the stream start time */
2973 if (ic->start_time != AV_NOPTS_VALUE)
2974 timestamp += ic->start_time;
2976 /* if seeking requested, we execute it */
2977 if (o->start_time != 0) {
2978 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2980 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2981 filename, (double)timestamp / AV_TIME_BASE);
2985 /* update the current parameters so that they match the one of the input stream */
2986 add_input_streams(o, ic);
2988 /* dump the file content */
2990 av_dump_format(ic, nb_input_files, filename, 0);
2992 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2993 input_files[nb_input_files - 1].ctx = ic;
2994 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
2995 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
2996 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
2998 frame_rate = (AVRational){0, 0};
2999 frame_pix_fmt = PIX_FMT_NONE;
3002 audio_sample_rate = 0;
3004 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3006 for (i = 0; i < orig_nb_streams; i++)
3007 av_dict_free(&opts[i]);
3014 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3015 AVCodecContext *avctx)
3021 for (p = kf; *p; p++)
3024 ost->forced_kf_count = n;
3025 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3026 if (!ost->forced_kf_pts) {
3027 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3030 for (i = 0; i < n; i++) {
3031 p = i ? strchr(p, ',') + 1 : kf;
3032 t = parse_time_or_die("force_key_frames", p, 1);
3033 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3037 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3040 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3041 int idx = oc->nb_streams - 1;
3042 int64_t max_frames = INT64_MAX;
3043 char *bsf = NULL, *next, *codec_tag = NULL;
3044 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3047 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3051 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3052 nb_output_streams + 1);
3053 ost = &output_streams[nb_output_streams - 1];
3054 ost->file_index = nb_output_files;
3057 st->codec->codec_type = type;
3058 ost->enc = choose_codec(o, oc, st, type);
3060 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3063 avcodec_get_context_defaults3(st->codec, ost->enc);
3064 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3066 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3067 ost->max_frames = max_frames;
3069 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3071 if (next = strchr(bsf, ','))
3073 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3074 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3078 bsfc_prev->next = bsfc;
3080 ost->bitstream_filters = bsfc;
3086 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3088 uint32_t tag = strtol(codec_tag, &next, 0);
3090 tag = AV_RL32(codec_tag);
3091 st->codec->codec_tag = tag;
3094 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3098 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3102 AVCodecContext *video_enc;
3104 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3106 if (!st->stream_copy) {
3107 ost->frame_aspect_ratio = frame_aspect_ratio;
3108 frame_aspect_ratio = 0;
3110 ost->avfilter= vfilters;
3115 video_enc = st->codec;
3117 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3118 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3121 if (st->stream_copy) {
3122 video_enc->sample_aspect_ratio =
3123 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3129 ost->frame_rate = frame_rate;
3131 video_enc->width = frame_width;
3132 video_enc->height = frame_height;
3133 video_enc->pix_fmt = frame_pix_fmt;
3134 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3136 if (video_qscale || same_quant) {
3137 video_enc->flags |= CODEC_FLAG_QSCALE;
3138 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3142 video_enc->intra_matrix = intra_matrix;
3144 video_enc->inter_matrix = inter_matrix;
3146 p= video_rc_override_string;
3149 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3151 fprintf(stderr, "error parsing rc_override\n");
3154 video_enc->rc_override=
3155 av_realloc(video_enc->rc_override,
3156 sizeof(RcOverride)*(i+1));
3157 video_enc->rc_override[i].start_frame= start;
3158 video_enc->rc_override[i].end_frame = end;
3160 video_enc->rc_override[i].qscale= q;
3161 video_enc->rc_override[i].quality_factor= 1.0;
3164 video_enc->rc_override[i].qscale= 0;
3165 video_enc->rc_override[i].quality_factor= -q/100.0;
3170 video_enc->rc_override_count=i;
3171 if (!video_enc->rc_initial_buffer_occupancy)
3172 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3173 video_enc->me_threshold= me_threshold;
3174 video_enc->intra_dc_precision= intra_dc_precision - 8;
3177 video_enc->flags|= CODEC_FLAG_PSNR;
3182 video_enc->flags |= CODEC_FLAG_PASS1;
3184 video_enc->flags |= CODEC_FLAG_PASS2;
3188 if (forced_key_frames)
3189 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3192 /* reset some key parameters */
3194 av_freep(&forced_key_frames);
3195 frame_pix_fmt = PIX_FMT_NONE;
3199 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3203 AVCodecContext *audio_enc;
3205 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3208 audio_enc = st->codec;
3209 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3211 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3212 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3214 if (!st->stream_copy) {
3215 if (audio_qscale > QSCALE_NONE) {
3216 audio_enc->flags |= CODEC_FLAG_QSCALE;
3217 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3220 audio_enc->channels = audio_channels;
3221 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3222 audio_enc->sample_fmt = audio_sample_fmt;
3223 if (audio_sample_rate)
3224 audio_enc->sample_rate = audio_sample_rate;
3227 /* reset some key parameters */
3233 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3237 AVCodecContext *data_enc;
3239 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3241 data_enc = st->codec;
3242 if (!st->stream_copy) {
3243 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3247 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3248 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3255 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3259 AVCodecContext *subtitle_enc;
3261 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3263 subtitle_enc = st->codec;
3265 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3267 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3268 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3271 subtitle_disable = 0;
3275 /* arg format is "output-stream-index:streamid-value". */
3276 static int opt_streamid(const char *opt, const char *arg)
3282 av_strlcpy(idx_str, arg, sizeof(idx_str));
3283 p = strchr(idx_str, ':');
3286 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3291 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3292 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3293 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3297 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3299 AVFormatContext *is = ifile->ctx;
3300 AVFormatContext *os = ofile->ctx;
3303 for (i = 0; i < is->nb_chapters; i++) {
3304 AVChapter *in_ch = is->chapters[i], *out_ch;
3305 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3306 AV_TIME_BASE_Q, in_ch->time_base);
3307 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3308 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3311 if (in_ch->end < ts_off)
3313 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3316 out_ch = av_mallocz(sizeof(AVChapter));
3318 return AVERROR(ENOMEM);
3320 out_ch->id = in_ch->id;
3321 out_ch->time_base = in_ch->time_base;
3322 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3323 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3326 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3329 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3331 return AVERROR(ENOMEM);
3332 os->chapters[os->nb_chapters - 1] = out_ch;
3337 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3340 AVFormatContext *ic = NULL;
3342 err = avformat_open_input(&ic, filename, NULL, NULL);
3345 /* copy stream format */
3346 for(i=0;i<ic->nb_streams;i++) {
3351 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3352 ost = new_output_stream(o, s, codec->type);
3355 // FIXME: a more elegant solution is needed
3356 memcpy(st, ic->streams[i], sizeof(AVStream));
3358 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3360 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3361 choose_sample_fmt(st, codec);
3362 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3363 choose_pixel_fmt(st, codec);
3366 av_close_input_file(ic);
3370 static void opt_output_file(void *optctx, const char *filename)
3372 OptionsContext *o = optctx;
3373 AVFormatContext *oc;
3375 AVOutputFormat *file_oformat;
3379 if (!strcmp(filename, "-"))
3382 oc = avformat_alloc_context();
3384 print_error(filename, AVERROR(ENOMEM));
3389 file_oformat = av_guess_format(o->format, NULL, NULL);
3390 if (!file_oformat) {
3391 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3395 file_oformat = av_guess_format(NULL, filename, NULL);
3396 if (!file_oformat) {
3397 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3403 oc->oformat = file_oformat;
3404 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3406 if (!strcmp(file_oformat->name, "ffm") &&
3407 av_strstart(filename, "http:", NULL)) {
3408 /* special case for files sent to avserver: we get the stream
3409 parameters from avserver */
3410 int err = read_avserver_streams(o, oc, filename);
3412 print_error(filename, err);
3415 } else if (!o->nb_stream_maps) {
3416 /* pick the "best" stream of each type */
3417 #define NEW_STREAM(type, index)\
3419 ost = new_ ## type ## _stream(o, oc);\
3420 ost->source_index = index;\
3421 ost->sync_ist = &input_streams[index];\
3422 input_streams[index].discard = 0;\
3425 /* video: highest resolution */
3426 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3427 int area = 0, idx = -1;
3428 for (i = 0; i < nb_input_streams; i++) {
3429 ist = &input_streams[i];
3430 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3431 ist->st->codec->width * ist->st->codec->height > area) {
3432 area = ist->st->codec->width * ist->st->codec->height;
3436 NEW_STREAM(video, idx);
3439 /* audio: most channels */
3440 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3441 int channels = 0, idx = -1;
3442 for (i = 0; i < nb_input_streams; i++) {
3443 ist = &input_streams[i];
3444 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3445 ist->st->codec->channels > channels) {
3446 channels = ist->st->codec->channels;
3450 NEW_STREAM(audio, idx);
3453 /* subtitles: pick first */
3454 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3455 for (i = 0; i < nb_input_streams; i++)
3456 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3457 NEW_STREAM(subtitle, i);
3461 /* do something with data? */
3463 for (i = 0; i < o->nb_stream_maps; i++) {
3464 StreamMap *map = &o->stream_maps[i];
3469 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3470 switch (ist->st->codec->codec_type) {
3471 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3472 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3473 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3474 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3476 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3477 map->file_index, map->stream_index);
3481 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3482 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3483 map->sync_stream_index];
3488 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3489 output_files[nb_output_files - 1].ctx = oc;
3490 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3491 output_files[nb_output_files - 1].recording_time = o->recording_time;
3492 output_files[nb_output_files - 1].start_time = o->start_time;
3493 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3494 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3496 /* check filename in case of an image number is expected */
3497 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3498 if (!av_filename_number_test(oc->filename)) {
3499 print_error(oc->filename, AVERROR(EINVAL));
3504 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3505 /* test if it already exists to avoid loosing precious files */
3506 if (!file_overwrite &&
3507 (strchr(filename, ':') == NULL ||
3508 filename[1] == ':' ||
3509 av_strstart(filename, "file:", NULL))) {
3510 if (avio_check(filename, 0) == 0) {
3512 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3514 if (!read_yesno()) {
3515 fprintf(stderr, "Not overwriting - exiting\n");
3520 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3527 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3528 print_error(filename, err);
3533 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3534 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3535 oc->flags |= AVFMT_FLAG_NONBLOCK;
3538 if (o->chapters_input_file >= nb_input_files) {
3539 if (o->chapters_input_file == INT_MAX) {
3540 /* copy chapters from the first input file that has them*/
3541 o->chapters_input_file = -1;
3542 for (i = 0; i < nb_input_files; i++)
3543 if (input_files[i].ctx->nb_chapters) {
3544 o->chapters_input_file = i;
3548 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3549 o->chapters_input_file);
3553 if (o->chapters_input_file >= 0)
3554 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3555 o->metadata_chapters_manual);
3558 for (i = 0; i < o->nb_meta_data_maps; i++) {
3559 AVFormatContext *files[2];
3560 AVDictionary **meta[2];
3563 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3564 if ((index) < 0 || (index) >= (nb_elems)) {\
3565 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3570 int in_file_index = o->meta_data_maps[i][1].file;
3571 if (in_file_index < 0)
3573 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3576 files[1] = input_files[in_file_index].ctx;
3578 for (j = 0; j < 2; j++) {
3579 MetadataMap *map = &o->meta_data_maps[i][j];
3581 switch (map->type) {
3583 meta[j] = &files[j]->metadata;
3586 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3587 meta[j] = &files[j]->streams[map->index]->metadata;
3590 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3591 meta[j] = &files[j]->chapters[map->index]->metadata;
3594 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3595 meta[j] = &files[j]->programs[map->index]->metadata;
3600 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3603 /* copy global metadata by default */
3604 if (!o->metadata_global_manual && nb_input_files)
3605 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3606 AV_DICT_DONT_OVERWRITE);
3607 if (!o->metadata_streams_manual)
3608 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3609 InputStream *ist = &input_streams[output_streams[i].source_index];
3610 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3613 /* process manually set metadata */
3614 for (i = 0; i < o->nb_metadata; i++) {
3619 val = strchr(o->metadata[i].u.str, '=');
3621 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3622 o->metadata[i].u.str);
3627 parse_meta_type(o->metadata[i].specifier, &type, &index);
3633 if (index < 0 || index >= oc->nb_streams) {
3634 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3637 m = &oc->streams[i]->metadata;
3640 if (index < 0 || index >= oc->nb_chapters) {
3641 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3644 m = &oc->chapters[i]->metadata;
3647 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3651 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3654 frame_rate = (AVRational){0, 0};
3657 audio_sample_rate = 0;
3659 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3661 av_freep(&streamid_map);
3662 nb_streamid_map = 0;
3664 av_freep(&forced_key_frames);
3668 /* same option as mencoder */
3669 static int opt_pass(const char *opt, const char *arg)
3671 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3675 static int64_t getutime(void)
3678 struct rusage rusage;
3680 getrusage(RUSAGE_SELF, &rusage);
3681 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3682 #elif HAVE_GETPROCESSTIMES
3684 FILETIME c, e, k, u;
3685 proc = GetCurrentProcess();
3686 GetProcessTimes(proc, &c, &e, &k, &u);
3687 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3689 return av_gettime();
3693 static int64_t getmaxrss(void)
3695 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3696 struct rusage rusage;
3697 getrusage(RUSAGE_SELF, &rusage);
3698 return (int64_t)rusage.ru_maxrss * 1024;
3699 #elif HAVE_GETPROCESSMEMORYINFO
3701 PROCESS_MEMORY_COUNTERS memcounters;
3702 proc = GetCurrentProcess();
3703 memcounters.cb = sizeof(memcounters);
3704 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3705 return memcounters.PeakPagefileUsage;
3711 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3714 const char *p = str;
3721 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3728 static void opt_inter_matrix(const char *arg)
3730 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3731 parse_matrix_coeffs(inter_matrix, arg);
3734 static void opt_intra_matrix(const char *arg)
3736 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3737 parse_matrix_coeffs(intra_matrix, arg);
3740 static void show_usage(void)
3742 printf("Hyper fast Audio and Video encoder\n");
3743 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3747 static void show_help(void)
3750 AVOutputFormat *oformat = NULL;
3751 AVInputFormat *iformat = NULL;
3752 const AVClass *class;
3754 av_log_set_callback(log_callback_help);
3756 show_help_options(options, "Main options:\n",
3757 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3758 show_help_options(options, "\nAdvanced options:\n",
3759 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3761 show_help_options(options, "\nVideo options:\n",
3762 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3764 show_help_options(options, "\nAdvanced Video options:\n",
3765 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3766 OPT_VIDEO | OPT_EXPERT);
3767 show_help_options(options, "\nAudio options:\n",
3768 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3770 show_help_options(options, "\nAdvanced Audio options:\n",
3771 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3772 OPT_AUDIO | OPT_EXPERT);
3773 show_help_options(options, "\nSubtitle options:\n",
3774 OPT_SUBTITLE | OPT_GRAB,
3776 show_help_options(options, "\nAudio/Video grab options:\n",
3780 class = avcodec_get_class();
3781 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3784 /* individual codec options */
3786 while ((c = av_codec_next(c))) {
3787 if (c->priv_class) {
3788 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3793 class = avformat_get_class();
3794 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3797 /* individual muxer options */
3798 while ((oformat = av_oformat_next(oformat))) {
3799 if (oformat->priv_class) {
3800 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3805 /* individual demuxer options */
3806 while ((iformat = av_iformat_next(iformat))) {
3807 if (iformat->priv_class) {
3808 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3813 class = sws_get_class();
3814 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3817 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3819 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3820 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3822 if(!strncmp(arg, "pal-", 4)) {
3825 } else if(!strncmp(arg, "ntsc-", 5)) {
3828 } else if(!strncmp(arg, "film-", 5)) {
3833 /* Calculate FR via float to avoid int overflow */
3834 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3837 } else if((fr == 29970) || (fr == 23976)) {
3840 /* Try to determine PAL/NTSC by peeking in the input files */
3841 if(nb_input_files) {
3843 for (j = 0; j < nb_input_files; j++) {
3844 for (i = 0; i < input_files[j].nb_streams; i++) {
3845 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3846 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3848 fr = c->time_base.den * 1000 / c->time_base.num;
3852 } else if((fr == 29970) || (fr == 23976)) {
3862 if(verbose > 0 && norm != UNKNOWN)
3863 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3866 if(norm == UNKNOWN) {
3867 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3868 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3869 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3873 if(!strcmp(arg, "vcd")) {
3874 opt_video_codec(o, "c:v", "mpeg1video");
3875 opt_audio_codec(o, "c:a", "mp2");
3876 parse_option(o, "f", "vcd", options);
3878 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3879 opt_frame_rate("r", frame_rates[norm]);
3880 opt_default("g", norm == PAL ? "15" : "18");
3882 opt_default("b", "1150000");
3883 opt_default("maxrate", "1150000");
3884 opt_default("minrate", "1150000");
3885 opt_default("bufsize", "327680"); // 40*1024*8;
3887 opt_default("b:a", "224000");
3888 audio_sample_rate = 44100;
3891 opt_default("packetsize", "2324");
3892 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3894 /* We have to offset the PTS, so that it is consistent with the SCR.
3895 SCR starts at 36000, but the first two packs contain only padding
3896 and the first pack from the other stream, respectively, may also have
3897 been written before.
3898 So the real data starts at SCR 36000+3*1200. */
3899 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3900 } else if(!strcmp(arg, "svcd")) {
3902 opt_video_codec(o, "c:v", "mpeg2video");
3903 opt_audio_codec(o, "c:a", "mp2");
3904 parse_option(o, "f", "svcd", options);
3906 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3907 opt_frame_rate("r", frame_rates[norm]);
3908 opt_default("g", norm == PAL ? "15" : "18");
3910 opt_default("b", "2040000");
3911 opt_default("maxrate", "2516000");
3912 opt_default("minrate", "0"); //1145000;
3913 opt_default("bufsize", "1835008"); //224*1024*8;
3914 opt_default("flags", "+scan_offset");
3917 opt_default("b:a", "224000");
3918 audio_sample_rate = 44100;
3920 opt_default("packetsize", "2324");
3922 } else if(!strcmp(arg, "dvd")) {
3924 opt_video_codec(o, "c:v", "mpeg2video");
3925 opt_audio_codec(o, "c:a", "ac3");
3926 parse_option(o, "f", "dvd", options);
3928 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3929 opt_frame_rate("r", frame_rates[norm]);
3930 opt_default("g", norm == PAL ? "15" : "18");
3932 opt_default("b", "6000000");
3933 opt_default("maxrate", "9000000");
3934 opt_default("minrate", "0"); //1500000;
3935 opt_default("bufsize", "1835008"); //224*1024*8;
3937 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3938 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3940 opt_default("b:a", "448000");
3941 audio_sample_rate = 48000;
3943 } else if(!strncmp(arg, "dv", 2)) {
3945 parse_option(o, "f", "dv", options);
3947 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3948 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3949 norm == PAL ? "yuv420p" : "yuv411p");
3950 opt_frame_rate("r", frame_rates[norm]);
3952 audio_sample_rate = 48000;
3956 fprintf(stderr, "Unknown target: %s\n", arg);
3957 return AVERROR(EINVAL);
3962 static int opt_vstats_file(const char *opt, const char *arg)
3964 av_free (vstats_filename);
3965 vstats_filename=av_strdup (arg);
3969 static int opt_vstats(const char *opt, const char *arg)
3972 time_t today2 = time(NULL);
3973 struct tm *today = localtime(&today2);
3975 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3977 return opt_vstats_file(opt, filename);
3980 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3982 return parse_option(o, "frames:v", arg, options);
3985 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3987 return parse_option(o, "frames:a", arg, options);
3990 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3992 return parse_option(o, "frames:d", arg, options);
3995 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
3997 return parse_option(o, "tag:v", arg, options);
4000 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4002 return parse_option(o, "tag:a", arg, options);
4005 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4007 return parse_option(o, "tag:s", arg, options);
4010 #define OFFSET(x) offsetof(OptionsContext, x)
4011 static const OptionDef options[] = {
4013 #include "cmdutils_common_opts.h"
4014 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4015 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4016 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4017 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4018 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4019 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4020 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4021 "outfile[,metadata]:infile[,metadata]" },
4022 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4023 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4024 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4025 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4026 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4027 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4028 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4029 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4030 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4031 "add timings for benchmarking" },
4032 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4033 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4034 "dump each input packet" },
4035 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4036 "when dumping packets, also dump the payload" },
4037 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4038 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4039 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4040 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4041 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4042 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4043 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4044 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4045 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4046 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4047 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4048 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4049 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4050 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4051 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4054 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4055 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4056 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4057 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4058 { "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" },
4059 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4060 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4061 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4062 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4063 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4064 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4065 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4066 "use same quantizer as source (implies VBR)" },
4067 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4068 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4069 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4070 "deinterlace pictures" },
4071 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4072 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4073 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4075 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4077 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4078 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4079 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4080 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4081 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4082 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4083 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4084 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4085 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4088 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4089 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4090 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4091 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4092 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4093 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4094 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4095 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4096 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_audio_sample_fmt}, "set sample format, 'list' as argument shows all the sample formats supported", "format" },
4098 /* subtitle options */
4099 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4100 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4101 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4104 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4107 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4108 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4110 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4112 /* data codec support */
4113 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4115 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4119 int main(int argc, char **argv)
4121 OptionsContext o = { 0 };
4126 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4128 avcodec_register_all();
4130 avdevice_register_all();
4133 avfilter_register_all();
4137 avio_set_interrupt_cb(decode_interrupt_cb);
4142 parse_options(&o, argc, argv, options, opt_output_file);
4144 if(nb_output_files <= 0 && nb_input_files == 0) {
4146 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4150 /* file converter / grab */
4151 if (nb_output_files <= 0) {
4152 fprintf(stderr, "At least one output file must be specified\n");
4156 if (nb_input_files == 0) {
4157 fprintf(stderr, "At least one input file must be specified\n");
4162 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4164 ti = getutime() - ti;
4166 int maxrss = getmaxrss() / 1024;
4167 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);