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 char *video_language = NULL;
117 static int same_quant = 0;
118 static int do_deinterlace = 0;
119 static int top_field_first = -1;
120 static int me_threshold = 0;
121 static int intra_dc_precision = 8;
122 static int qp_hist = 0;
124 static char *vfilters = NULL;
127 static int audio_sample_rate = 0;
128 #define QSCALE_NONE -99999
129 static float audio_qscale = QSCALE_NONE;
130 static int audio_disable = 0;
131 static int audio_channels = 0;
132 static char *audio_language = NULL;
134 static int subtitle_disable = 0;
135 static char *subtitle_language = NULL;
137 static int data_disable = 0;
139 static int file_overwrite = 0;
140 static int do_benchmark = 0;
141 static int do_hex_dump = 0;
142 static int do_pkt_dump = 0;
143 static int do_psnr = 0;
144 static int do_pass = 0;
145 static char *pass_logfilename_prefix = NULL;
146 static int video_sync_method= -1;
147 static int audio_sync_method= 0;
148 static float audio_drift_threshold= 0.1;
149 static int copy_ts= 0;
151 static int opt_shortest = 0;
152 static char *vstats_filename;
153 static FILE *vstats_file;
154 static int opt_programid = 0;
155 static int copy_initial_nonkeyframes = 0;
157 static int audio_volume = 256;
159 static int exit_on_error = 0;
160 static int using_stdin = 0;
161 static int verbose = 1;
162 static int64_t video_size = 0;
163 static int64_t audio_size = 0;
164 static int64_t extra_size = 0;
165 static int nb_frames_dup = 0;
166 static int nb_frames_drop = 0;
167 static int input_sync;
168 static int force_fps = 0;
169 static char *forced_key_frames = NULL;
171 static float dts_delta_threshold = 10;
173 static uint8_t *audio_buf;
174 static uint8_t *audio_out;
175 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
177 static short *samples;
179 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
181 typedef struct InputStream {
184 int discard; /* true if stream data should be discarded */
185 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
188 int64_t start; /* time when read started */
189 int64_t next_pts; /* synthetic pts for cases where pkt.pts
191 int64_t pts; /* current pts */
192 PtsCorrectionContext pts_ctx;
194 int is_start; /* is 1 at the start and after a discontinuity */
195 int showed_multi_packet_warning;
199 typedef struct InputFile {
200 AVFormatContext *ctx;
201 int eof_reached; /* true if eof reached */
202 int ist_index; /* index of first stream in ist_table */
203 int buffer_size; /* current total buffer size */
205 int nb_streams; /* number of stream that avconv is aware of; may be different
206 from ctx.nb_streams if new streams appear during av_read_frame() */
210 typedef struct OutputStream {
211 int file_index; /* file index */
212 int index; /* stream index in the output file */
213 int source_index; /* InputStream index */
214 AVStream *st; /* stream in the output file */
215 int encoding_needed; /* true if encoding needed for this stream */
217 /* input pts and corresponding output pts
219 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
220 struct InputStream *sync_ist; /* input stream to sync against */
221 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
222 AVBitStreamFilterContext *bitstream_filters;
228 AVFrame pict_tmp; /* temporary image for resampling */
229 struct SwsContext *img_resample_ctx; /* for image resampling */
232 int resample_pix_fmt;
233 AVRational frame_rate;
235 float frame_aspect_ratio;
237 /* forced key frames */
238 int64_t *forced_kf_pts;
244 ReSampleContext *resample; /* for audio resampling */
245 int resample_sample_fmt;
246 int resample_channels;
247 int resample_sample_rate;
249 AVAudioConvert *reformat_ctx;
250 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
254 AVFilterContext *output_video_filter;
255 AVFilterContext *input_video_filter;
256 AVFilterBufferRef *picref;
258 AVFilterGraph *graph;
263 int is_past_recording_time;
267 typedef struct OutputFile {
268 AVFormatContext *ctx;
270 int ost_index; /* index of the first stream in output_streams */
271 int64_t recording_time; /* desired length of the resulting file in microseconds */
272 int64_t start_time; /* start time in microseconds */
273 uint64_t limit_filesize;
276 static InputStream *input_streams = NULL;
277 static int nb_input_streams = 0;
278 static InputFile *input_files = NULL;
279 static int nb_input_files = 0;
281 static OutputStream *output_streams = NULL;
282 static int nb_output_streams = 0;
283 static OutputFile *output_files = NULL;
284 static int nb_output_files = 0;
286 typedef struct OptionsContext {
287 /* input/output options */
291 SpecifierOpt *codec_names;
295 int64_t input_ts_offset;
298 SpecifierOpt *ts_scale;
302 StreamMap *stream_maps;
304 /* first item specifies output metadata, second is input */
305 MetadataMap (*meta_data_maps)[2];
306 int nb_meta_data_maps;
307 int metadata_global_manual;
308 int metadata_streams_manual;
309 int metadata_chapters_manual;
311 int chapters_input_file;
313 int64_t recording_time;
314 uint64_t limit_filesize;
318 SpecifierOpt *metadata;
320 SpecifierOpt *max_frames;
322 SpecifierOpt *bitstream_filters;
323 int nb_bitstream_filters;
324 SpecifierOpt *codec_tags;
328 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
331 for (i = 0; i < o->nb_ ## name; i++) {\
332 char *spec = o->name[i].specifier;\
333 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
334 outvar = o->name[i].u.type;\
340 static void reset_options(OptionsContext *o)
342 const OptionDef *po = options;
344 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
346 void *dst = (uint8_t*)o + po->u.off;
348 if (po->flags & OPT_SPEC) {
349 SpecifierOpt **so = dst;
350 int i, *count = (int*)(so + 1);
351 for (i = 0; i < *count; i++) {
352 av_freep(&(*so)[i].specifier);
353 if (po->flags & OPT_STRING)
354 av_freep(&(*so)[i].u.str);
358 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
363 av_freep(&o->stream_maps);
364 av_freep(&o->meta_data_maps);
366 memset(o, 0, sizeof(*o));
368 o->mux_preload = 0.5;
369 o->mux_max_delay = 0.7;
370 o->recording_time = INT64_MAX;
371 o->limit_filesize = UINT64_MAX;
372 o->chapters_input_file = INT_MAX;
380 static int configure_video_filters(InputStream *ist, OutputStream *ost)
382 AVFilterContext *last_filter, *filter;
383 /** filter graph containing all filters including input & output */
384 AVCodecContext *codec = ost->st->codec;
385 AVCodecContext *icodec = ist->st->codec;
386 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
387 AVRational sample_aspect_ratio;
391 ost->graph = avfilter_graph_alloc();
393 if (ist->st->sample_aspect_ratio.num){
394 sample_aspect_ratio = ist->st->sample_aspect_ratio;
396 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
398 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
399 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
400 sample_aspect_ratio.num, sample_aspect_ratio.den);
402 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
403 "src", args, NULL, ost->graph);
406 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
407 "out", NULL, &ffsink_ctx, ost->graph);
410 last_filter = ost->input_video_filter;
412 if (codec->width != icodec->width || codec->height != icodec->height) {
413 snprintf(args, 255, "%d:%d:flags=0x%X",
417 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
418 NULL, args, NULL, ost->graph)) < 0)
420 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
422 last_filter = filter;
425 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
426 ost->graph->scale_sws_opts = av_strdup(args);
429 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
430 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
432 outputs->name = av_strdup("in");
433 outputs->filter_ctx = last_filter;
434 outputs->pad_idx = 0;
435 outputs->next = NULL;
437 inputs->name = av_strdup("out");
438 inputs->filter_ctx = ost->output_video_filter;
442 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
444 av_freep(&ost->avfilter);
446 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
450 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
453 codec->width = ost->output_video_filter->inputs[0]->w;
454 codec->height = ost->output_video_filter->inputs[0]->h;
455 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
456 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
457 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
458 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
462 #endif /* CONFIG_AVFILTER */
464 static void term_exit(void)
466 av_log(NULL, AV_LOG_QUIET, "");
469 static volatile int received_sigterm = 0;
470 static volatile int received_nb_signals = 0;
473 sigterm_handler(int sig)
475 received_sigterm = sig;
476 received_nb_signals++;
480 static void term_init(void)
482 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
483 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
485 signal(SIGXCPU, sigterm_handler);
489 static int decode_interrupt_cb(void)
491 return received_nb_signals > 1;
494 void exit_program(int ret)
499 for(i=0;i<nb_output_files;i++) {
500 AVFormatContext *s = output_files[i].ctx;
501 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
503 avformat_free_context(s);
504 av_dict_free(&output_files[i].opts);
506 for(i=0;i<nb_input_files;i++) {
507 av_close_input_file(input_files[i].ctx);
509 for (i = 0; i < nb_input_streams; i++)
510 av_dict_free(&input_streams[i].opts);
512 av_free(intra_matrix);
513 av_free(inter_matrix);
517 av_free(vstats_filename);
519 av_freep(&input_streams);
520 av_freep(&input_files);
521 av_freep(&output_streams);
522 av_freep(&output_files);
527 allocated_audio_buf_size= allocated_audio_out_size= 0;
534 if (received_sigterm) {
536 "Received signal %d: terminating.\n",
537 (int) received_sigterm);
541 exit(ret); /* not all OS-es handle main() return value */
544 static void assert_avoptions(AVDictionary *m)
546 AVDictionaryEntry *t;
547 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
548 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
553 static void assert_codec_experimental(AVCodecContext *c, int encoder)
555 const char *codec_string = encoder ? "encoder" : "decoder";
557 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
558 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
559 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
560 "results.\nAdd '-strict experimental' if you want to use it.\n",
561 codec_string, c->codec->name);
562 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
563 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
564 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
565 codec_string, codec->name);
570 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
572 if(codec && codec->sample_fmts){
573 const enum AVSampleFormat *p= codec->sample_fmts;
575 if(*p == st->codec->sample_fmt)
579 av_log(NULL, AV_LOG_WARNING,
580 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
581 av_get_sample_fmt_name(st->codec->sample_fmt),
583 av_get_sample_fmt_name(codec->sample_fmts[0]));
584 st->codec->sample_fmt = codec->sample_fmts[0];
590 * Update the requested input sample format based on the output sample format.
591 * This is currently only used to request float output from decoders which
592 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
593 * Ideally this will be removed in the future when decoders do not do format
594 * conversion and only output in their native format.
596 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
599 /* if sample formats match or a decoder sample format has already been
600 requested, just return */
601 if (enc->sample_fmt == dec->sample_fmt ||
602 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
605 /* if decoder supports more than one output format */
606 if (dec_codec && dec_codec->sample_fmts &&
607 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
608 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
609 const enum AVSampleFormat *p;
610 int min_dec = -1, min_inc = -1;
612 /* find a matching sample format in the encoder */
613 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
614 if (*p == enc->sample_fmt) {
615 dec->request_sample_fmt = *p;
617 } else if (*p > enc->sample_fmt) {
618 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
620 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
623 /* if none match, provide the one that matches quality closest */
624 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
625 enc->sample_fmt - min_dec;
629 static void choose_sample_rate(AVStream *st, AVCodec *codec)
631 if(codec && codec->supported_samplerates){
632 const int *p= codec->supported_samplerates;
634 int best_dist=INT_MAX;
636 int dist= abs(st->codec->sample_rate - *p);
637 if(dist < best_dist){
643 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
645 st->codec->sample_rate= best;
649 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
651 if(codec && codec->pix_fmts){
652 const enum PixelFormat *p= codec->pix_fmts;
653 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
654 if(st->codec->codec_id==CODEC_ID_MJPEG){
655 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
656 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
657 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};
661 if(*p == st->codec->pix_fmt)
665 if(st->codec->pix_fmt != PIX_FMT_NONE)
666 av_log(NULL, AV_LOG_WARNING,
667 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
668 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
670 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
671 st->codec->pix_fmt = codec->pix_fmts[0];
677 get_sync_ipts(const OutputStream *ost)
679 const InputStream *ist = ost->sync_ist;
680 OutputFile *of = &output_files[ost->file_index];
681 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
684 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
688 AVPacket new_pkt= *pkt;
689 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
690 &new_pkt.data, &new_pkt.size,
691 pkt->data, pkt->size,
692 pkt->flags & AV_PKT_FLAG_KEY);
695 new_pkt.destruct= av_destruct_packet;
697 fprintf(stderr, "%s failed for stream %d, codec %s",
698 bsfc->filter->name, pkt->stream_index,
699 avctx->codec ? avctx->codec->name : "copy");
709 ret= av_interleaved_write_frame(s, pkt);
711 print_error("av_interleaved_write_frame()", ret);
716 static void do_audio_out(AVFormatContext *s,
719 unsigned char *buf, int size)
722 int64_t audio_out_size, audio_buf_size;
723 int64_t allocated_for_size= size;
725 int size_out, frame_bytes, ret, resample_changed;
726 AVCodecContext *enc= ost->st->codec;
727 AVCodecContext *dec= ist->st->codec;
728 int osize = av_get_bytes_per_sample(enc->sample_fmt);
729 int isize = av_get_bytes_per_sample(dec->sample_fmt);
730 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
733 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
734 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
735 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
736 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
737 audio_buf_size*= osize*enc->channels;
739 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
740 if(coded_bps > 8*osize)
741 audio_out_size= audio_out_size * coded_bps / (8*osize);
742 audio_out_size += FF_MIN_BUFFER_SIZE;
744 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
745 fprintf(stderr, "Buffer sizes too large\n");
749 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
750 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
751 if (!audio_buf || !audio_out){
752 fprintf(stderr, "Out of memory in do_audio_out\n");
756 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
757 ost->audio_resample = 1;
759 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
760 ost->resample_channels != dec->channels ||
761 ost->resample_sample_rate != dec->sample_rate;
763 if ((ost->audio_resample && !ost->resample) || resample_changed) {
764 if (resample_changed) {
765 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",
766 ist->file_index, ist->st->index,
767 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
768 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
769 ost->resample_sample_fmt = dec->sample_fmt;
770 ost->resample_channels = dec->channels;
771 ost->resample_sample_rate = dec->sample_rate;
773 audio_resample_close(ost->resample);
775 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
776 if (audio_sync_method <= 1 &&
777 ost->resample_sample_fmt == enc->sample_fmt &&
778 ost->resample_channels == enc->channels &&
779 ost->resample_sample_rate == enc->sample_rate) {
780 ost->resample = NULL;
781 ost->audio_resample = 0;
782 } else if (ost->audio_resample) {
783 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
784 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
785 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
786 enc->sample_rate, dec->sample_rate,
787 enc->sample_fmt, dec->sample_fmt,
789 if (!ost->resample) {
790 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
791 dec->channels, dec->sample_rate,
792 enc->channels, enc->sample_rate);
798 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
799 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
800 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
801 if (ost->reformat_ctx)
802 av_audio_convert_free(ost->reformat_ctx);
803 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
804 dec->sample_fmt, 1, NULL, 0);
805 if (!ost->reformat_ctx) {
806 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
807 av_get_sample_fmt_name(dec->sample_fmt),
808 av_get_sample_fmt_name(enc->sample_fmt));
811 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
814 if(audio_sync_method){
815 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
816 - av_fifo_size(ost->fifo)/(enc->channels * 2);
817 double idelta= delta*dec->sample_rate / enc->sample_rate;
818 int byte_delta= ((int)idelta)*2*dec->channels;
820 //FIXME resample delay
821 if(fabs(delta) > 50){
822 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
824 byte_delta= FFMAX(byte_delta, -size);
828 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
833 static uint8_t *input_tmp= NULL;
834 input_tmp= av_realloc(input_tmp, byte_delta + size);
836 if(byte_delta > allocated_for_size - size){
837 allocated_for_size= byte_delta + (int64_t)size;
842 memset(input_tmp, 0, byte_delta);
843 memcpy(input_tmp + byte_delta, buf, size);
847 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
849 }else if(audio_sync_method>1){
850 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
851 av_assert0(ost->audio_resample);
853 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
854 // 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));
855 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
859 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
860 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
862 if (ost->audio_resample) {
864 size_out = audio_resample(ost->resample,
865 (short *)buftmp, (short *)buf,
866 size / (dec->channels * isize));
867 size_out = size_out * enc->channels * osize;
873 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
874 const void *ibuf[6]= {buftmp};
875 void *obuf[6]= {audio_buf};
876 int istride[6]= {isize};
877 int ostride[6]= {osize};
878 int len= size_out/istride[0];
879 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
880 printf("av_audio_convert() failed\n");
886 size_out = len*osize;
889 /* now encode as many frames as possible */
890 if (enc->frame_size > 1) {
891 /* output resampled raw samples */
892 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
893 fprintf(stderr, "av_fifo_realloc2() failed\n");
896 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
898 frame_bytes = enc->frame_size * osize * enc->channels;
900 while (av_fifo_size(ost->fifo) >= frame_bytes) {
902 av_init_packet(&pkt);
904 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
906 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
908 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
911 fprintf(stderr, "Audio encoding failed\n");
915 pkt.stream_index= ost->index;
918 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
919 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
920 pkt.flags |= AV_PKT_FLAG_KEY;
921 write_frame(s, &pkt, enc, ost->bitstream_filters);
923 ost->sync_opts += enc->frame_size;
927 av_init_packet(&pkt);
929 ost->sync_opts += size_out / (osize * enc->channels);
931 /* output a pcm frame */
932 /* determine the size of the coded buffer */
935 size_out = size_out*coded_bps/8;
937 if(size_out > audio_out_size){
938 fprintf(stderr, "Internal error, buffer size too small\n");
942 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
943 ret = avcodec_encode_audio(enc, audio_out, size_out,
946 fprintf(stderr, "Audio encoding failed\n");
950 pkt.stream_index= ost->index;
953 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
954 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
955 pkt.flags |= AV_PKT_FLAG_KEY;
956 write_frame(s, &pkt, enc, ost->bitstream_filters);
960 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
964 AVPicture picture_tmp;
967 dec = ist->st->codec;
969 /* deinterlace : must be done before any resize */
970 if (do_deinterlace) {
973 /* create temporary picture */
974 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
975 buf = av_malloc(size);
979 picture2 = &picture_tmp;
980 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
982 if(avpicture_deinterlace(picture2, picture,
983 dec->pix_fmt, dec->width, dec->height) < 0) {
984 /* if error, do not deinterlace */
985 fprintf(stderr, "Deinterlacing failed\n");
994 if (picture != picture2)
995 *picture = *picture2;
999 static void do_subtitle_out(AVFormatContext *s,
1005 static uint8_t *subtitle_out = NULL;
1006 int subtitle_out_max_size = 1024 * 1024;
1007 int subtitle_out_size, nb, i;
1008 AVCodecContext *enc;
1011 if (pts == AV_NOPTS_VALUE) {
1012 fprintf(stderr, "Subtitle packets must have a pts\n");
1018 enc = ost->st->codec;
1020 if (!subtitle_out) {
1021 subtitle_out = av_malloc(subtitle_out_max_size);
1024 /* Note: DVB subtitle need one packet to draw them and one other
1025 packet to clear them */
1026 /* XXX: signal it in the codec context ? */
1027 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1032 for(i = 0; i < nb; i++) {
1033 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1034 // start_display_time is required to be 0
1035 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1036 sub->end_display_time -= sub->start_display_time;
1037 sub->start_display_time = 0;
1038 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1039 subtitle_out_max_size, sub);
1040 if (subtitle_out_size < 0) {
1041 fprintf(stderr, "Subtitle encoding failed\n");
1045 av_init_packet(&pkt);
1046 pkt.stream_index = ost->index;
1047 pkt.data = subtitle_out;
1048 pkt.size = subtitle_out_size;
1049 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1050 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1051 /* XXX: the pts correction is handled here. Maybe handling
1052 it in the codec would be better */
1054 pkt.pts += 90 * sub->start_display_time;
1056 pkt.pts += 90 * sub->end_display_time;
1058 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1062 static int bit_buffer_size= 1024*256;
1063 static uint8_t *bit_buffer= NULL;
1065 static void do_video_resample(OutputStream *ost,
1067 AVFrame *in_picture,
1068 AVFrame **out_picture)
1070 int resample_changed = 0;
1071 AVCodecContext *dec = ist->st->codec;
1072 *out_picture = in_picture;
1074 resample_changed = ost->resample_width != dec->width ||
1075 ost->resample_height != dec->height ||
1076 ost->resample_pix_fmt != dec->pix_fmt;
1078 if (resample_changed) {
1079 av_log(NULL, AV_LOG_INFO,
1080 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1081 ist->file_index, ist->st->index,
1082 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1083 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1084 if(!ost->video_resample)
1085 ost->video_resample = 1;
1088 #if !CONFIG_AVFILTER
1089 if (ost->video_resample) {
1090 *out_picture = &ost->pict_tmp;
1091 if (resample_changed) {
1092 /* initialize a new scaler context */
1093 sws_freeContext(ost->img_resample_ctx);
1094 ost->img_resample_ctx = sws_getContext(
1095 ist->st->codec->width,
1096 ist->st->codec->height,
1097 ist->st->codec->pix_fmt,
1098 ost->st->codec->width,
1099 ost->st->codec->height,
1100 ost->st->codec->pix_fmt,
1101 ost->sws_flags, NULL, NULL, NULL);
1102 if (ost->img_resample_ctx == NULL) {
1103 fprintf(stderr, "Cannot get resampling context\n");
1107 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1108 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1111 if (resample_changed) {
1112 avfilter_graph_free(&ost->graph);
1113 if (configure_video_filters(ist, ost)) {
1114 fprintf(stderr, "Error reinitializing filters!\n");
1119 if (resample_changed) {
1120 ost->resample_width = dec->width;
1121 ost->resample_height = dec->height;
1122 ost->resample_pix_fmt = dec->pix_fmt;
1127 static void do_video_out(AVFormatContext *s,
1130 AVFrame *in_picture,
1131 int *frame_size, float quality)
1133 int nb_frames, i, ret, format_video_sync;
1134 AVFrame *final_picture;
1135 AVCodecContext *enc;
1138 enc = ost->st->codec;
1140 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1142 /* by default, we output a single frame */
1147 format_video_sync = video_sync_method;
1148 if (format_video_sync < 0)
1149 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1151 if (format_video_sync) {
1152 double vdelta = sync_ipts - ost->sync_opts;
1153 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1156 else if (format_video_sync == 2) {
1159 }else if(vdelta>0.6)
1160 ost->sync_opts= lrintf(sync_ipts);
1161 }else if (vdelta > 1.1)
1162 nb_frames = lrintf(vdelta);
1163 //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);
1164 if (nb_frames == 0){
1167 fprintf(stderr, "*** drop!\n");
1168 }else if (nb_frames > 1) {
1169 nb_frames_dup += nb_frames - 1;
1171 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1174 ost->sync_opts= lrintf(sync_ipts);
1176 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1180 do_video_resample(ost, ist, in_picture, &final_picture);
1182 /* duplicates frame if needed */
1183 for(i=0;i<nb_frames;i++) {
1185 av_init_packet(&pkt);
1186 pkt.stream_index= ost->index;
1188 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1189 /* raw pictures are written as AVPicture structure to
1190 avoid any copies. We support temporarily the older
1192 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1193 enc->coded_frame->top_field_first = in_picture->top_field_first;
1194 pkt.data= (uint8_t *)final_picture;
1195 pkt.size= sizeof(AVPicture);
1196 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1197 pkt.flags |= AV_PKT_FLAG_KEY;
1199 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1201 AVFrame big_picture;
1203 big_picture= *final_picture;
1204 /* better than nothing: use input picture interlaced
1206 big_picture.interlaced_frame = in_picture->interlaced_frame;
1207 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1208 if(top_field_first == -1)
1209 big_picture.top_field_first = in_picture->top_field_first;
1211 big_picture.top_field_first = top_field_first;
1214 /* handles same_quant here. This is not correct because it may
1215 not be a global option */
1216 big_picture.quality = quality;
1218 big_picture.pict_type = 0;
1219 // big_picture.pts = AV_NOPTS_VALUE;
1220 big_picture.pts= ost->sync_opts;
1221 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1222 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1223 if (ost->forced_kf_index < ost->forced_kf_count &&
1224 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1225 big_picture.pict_type = AV_PICTURE_TYPE_I;
1226 ost->forced_kf_index++;
1228 ret = avcodec_encode_video(enc,
1229 bit_buffer, bit_buffer_size,
1232 fprintf(stderr, "Video encoding failed\n");
1237 pkt.data= bit_buffer;
1239 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1240 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1241 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1242 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1243 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1245 if(enc->coded_frame->key_frame)
1246 pkt.flags |= AV_PKT_FLAG_KEY;
1247 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1250 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1251 // enc->frame_number-1, ret, enc->pict_type);
1252 /* if two pass, output log */
1253 if (ost->logfile && enc->stats_out) {
1254 fprintf(ost->logfile, "%s", enc->stats_out);
1259 ost->frame_number++;
1263 static double psnr(double d){
1264 return -10.0*log(d)/log(10.0);
1267 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1270 AVCodecContext *enc;
1272 double ti1, bitrate, avg_bitrate;
1274 /* this is executed just the first time do_video_stats is called */
1276 vstats_file = fopen(vstats_filename, "w");
1283 enc = ost->st->codec;
1284 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1285 frame_number = ost->frame_number;
1286 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1287 if (enc->flags&CODEC_FLAG_PSNR)
1288 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1290 fprintf(vstats_file,"f_size= %6d ", frame_size);
1291 /* compute pts value */
1292 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1296 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1297 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1298 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1299 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1300 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1304 static void print_report(OutputFile *output_files,
1305 OutputStream *ost_table, int nb_ostreams,
1306 int is_last_report, int64_t timer_start)
1310 AVFormatContext *oc;
1312 AVCodecContext *enc;
1313 int frame_number, vid, i;
1314 double bitrate, ti1, pts;
1315 static int64_t last_time = -1;
1316 static int qp_histogram[52];
1318 if (!is_last_report) {
1320 /* display the report every 0.5 seconds */
1321 cur_time = av_gettime();
1322 if (last_time == -1) {
1323 last_time = cur_time;
1326 if ((cur_time - last_time) < 500000)
1328 last_time = cur_time;
1332 oc = output_files[0].ctx;
1334 total_size = avio_size(oc->pb);
1335 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1336 total_size= avio_tell(oc->pb);
1341 for(i=0;i<nb_ostreams;i++) {
1343 ost = &ost_table[i];
1344 enc = ost->st->codec;
1345 if (!ost->st->stream_copy && enc->coded_frame)
1346 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1347 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1348 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1350 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1351 float t = (av_gettime()-timer_start) / 1000000.0;
1353 frame_number = ost->frame_number;
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1355 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1357 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1361 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1364 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1366 if (enc->flags&CODEC_FLAG_PSNR){
1368 double error, error_sum=0;
1369 double scale, scale_sum=0;
1370 char type[3]= {'Y','U','V'};
1371 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1374 error= enc->error[j];
1375 scale= enc->width*enc->height*255.0*255.0*frame_number;
1377 error= enc->coded_frame->error[j];
1378 scale= enc->width*enc->height*255.0*255.0;
1383 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1385 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1389 /* compute min output value */
1390 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1391 if ((pts < ti1) && (pts > 0))
1397 if (verbose > 0 || is_last_report) {
1398 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1400 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1401 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1402 (double)total_size / 1024, ti1, bitrate);
1404 if (nb_frames_dup || nb_frames_drop)
1405 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1406 nb_frames_dup, nb_frames_drop);
1409 fprintf(stderr, "%s \r", buf);
1414 if (is_last_report && verbose >= 0){
1415 int64_t raw= audio_size + video_size + extra_size;
1416 fprintf(stderr, "\n");
1417 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1421 100.0*(total_size - raw)/raw
1426 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1428 int fill_char = 0x00;
1429 if (sample_fmt == AV_SAMPLE_FMT_U8)
1431 memset(buf, fill_char, size);
1434 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1438 for (i = 0; i < nb_ostreams; i++) {
1439 OutputStream *ost = &ost_table[i];
1440 AVCodecContext *enc = ost->st->codec;
1441 AVFormatContext *os = output_files[ost->file_index].ctx;
1443 if (!ost->encoding_needed)
1446 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1448 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1454 av_init_packet(&pkt);
1455 pkt.stream_index= ost->index;
1457 switch (ost->st->codec->codec_type) {
1458 case AVMEDIA_TYPE_AUDIO:
1459 fifo_bytes = av_fifo_size(ost->fifo);
1461 /* encode any samples remaining in fifo */
1462 if (fifo_bytes > 0) {
1463 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1464 int fs_tmp = enc->frame_size;
1466 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1467 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1468 enc->frame_size = fifo_bytes / (osize * enc->channels);
1470 int frame_bytes = enc->frame_size*osize*enc->channels;
1471 if (allocated_audio_buf_size < frame_bytes)
1473 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1476 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1477 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1478 ost->st->time_base.num, enc->sample_rate);
1479 enc->frame_size = fs_tmp;
1482 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1485 fprintf(stderr, "Audio encoding failed\n");
1489 pkt.flags |= AV_PKT_FLAG_KEY;
1491 case AVMEDIA_TYPE_VIDEO:
1492 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1494 fprintf(stderr, "Video encoding failed\n");
1498 if(enc->coded_frame && enc->coded_frame->key_frame)
1499 pkt.flags |= AV_PKT_FLAG_KEY;
1500 if (ost->logfile && enc->stats_out) {
1501 fprintf(ost->logfile, "%s", enc->stats_out);
1510 pkt.data = bit_buffer;
1512 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1513 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1514 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1519 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1520 static int output_packet(InputStream *ist, int ist_index,
1521 OutputStream *ost_table, int nb_ostreams,
1522 const AVPacket *pkt)
1524 AVFormatContext *os;
1529 void *buffer_to_free = NULL;
1530 static unsigned int samples_size= 0;
1531 AVSubtitle subtitle, *subtitle_to_free;
1532 int64_t pkt_pts = AV_NOPTS_VALUE;
1534 int frame_available;
1539 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1541 if(ist->next_pts == AV_NOPTS_VALUE)
1542 ist->next_pts= ist->pts;
1546 av_init_packet(&avpkt);
1554 if(pkt->dts != AV_NOPTS_VALUE)
1555 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1556 if(pkt->pts != AV_NOPTS_VALUE)
1557 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1559 //while we have more to decode or while the decoder did output something on EOF
1560 while (avpkt.size > 0 || (!pkt && got_output)) {
1561 uint8_t *data_buf, *decoded_data_buf;
1562 int data_size, decoded_data_size;
1564 ist->pts= ist->next_pts;
1566 if(avpkt.size && avpkt.size != pkt->size &&
1567 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1568 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1569 ist->showed_multi_packet_warning=1;
1572 /* decode the packet if needed */
1573 decoded_data_buf = NULL; /* fail safe */
1574 decoded_data_size= 0;
1575 data_buf = avpkt.data;
1576 data_size = avpkt.size;
1577 subtitle_to_free = NULL;
1578 if (ist->decoding_needed) {
1579 switch(ist->st->codec->codec_type) {
1580 case AVMEDIA_TYPE_AUDIO:{
1581 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1582 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1584 samples= av_malloc(samples_size);
1586 decoded_data_size= samples_size;
1587 /* XXX: could avoid copy if PCM 16 bits with same
1588 endianness as CPU */
1589 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1596 got_output = decoded_data_size > 0;
1597 /* Some bug in mpeg audio decoder gives */
1598 /* decoded_data_size < 0, it seems they are overflows */
1600 /* no audio frame */
1603 decoded_data_buf = (uint8_t *)samples;
1604 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1605 (ist->st->codec->sample_rate * ist->st->codec->channels);
1607 case AVMEDIA_TYPE_VIDEO:
1608 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1609 /* XXX: allocate picture correctly */
1610 avcodec_get_frame_defaults(&picture);
1611 avpkt.pts = pkt_pts;
1612 avpkt.dts = ist->pts;
1613 pkt_pts = AV_NOPTS_VALUE;
1615 ret = avcodec_decode_video2(ist->st->codec,
1616 &picture, &got_output, &avpkt);
1617 quality = same_quant ? picture.quality : 0;
1621 /* no picture yet */
1622 goto discard_packet;
1624 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1625 if (ist->st->codec->time_base.num != 0) {
1626 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1627 ist->next_pts += ((int64_t)AV_TIME_BASE *
1628 ist->st->codec->time_base.num * ticks) /
1629 ist->st->codec->time_base.den;
1632 buffer_to_free = NULL;
1633 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1635 case AVMEDIA_TYPE_SUBTITLE:
1636 ret = avcodec_decode_subtitle2(ist->st->codec,
1637 &subtitle, &got_output, &avpkt);
1641 goto discard_packet;
1643 subtitle_to_free = &subtitle;
1650 switch(ist->st->codec->codec_type) {
1651 case AVMEDIA_TYPE_AUDIO:
1652 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1653 ist->st->codec->sample_rate;
1655 case AVMEDIA_TYPE_VIDEO:
1656 if (ist->st->codec->time_base.num != 0) {
1657 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1658 ist->next_pts += ((int64_t)AV_TIME_BASE *
1659 ist->st->codec->time_base.num * ticks) /
1660 ist->st->codec->time_base.den;
1667 // preprocess audio (volume)
1668 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1669 if (audio_volume != 256) {
1672 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1673 int v = ((*volp) * audio_volume + 128) >> 8;
1674 *volp++ = av_clip_int16(v);
1679 /* frame rate emulation */
1680 if (input_files[ist->file_index].rate_emu) {
1681 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1682 int64_t now = av_gettime() - ist->start;
1686 /* if output time reached then transcode raw format,
1687 encode packets and output them */
1688 for (i = 0; i < nb_ostreams; i++) {
1689 OutputFile *of = &output_files[ost_table[i].file_index];
1692 ost = &ost_table[i];
1693 if (ost->source_index != ist_index)
1696 if (of->start_time && ist->pts < of->start_time)
1699 if (of->recording_time != INT64_MAX &&
1700 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1701 (AVRational){1, 1000000}) >= 0) {
1702 ost->is_past_recording_time = 1;
1707 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1708 ost->input_video_filter) {
1710 if (ist->st->sample_aspect_ratio.num)
1711 sar = ist->st->sample_aspect_ratio;
1713 sar = ist->st->codec->sample_aspect_ratio;
1714 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1716 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1717 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1718 while (frame_available) {
1719 AVRational ist_pts_tb;
1720 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1721 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1723 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1725 os = output_files[ost->file_index].ctx;
1727 /* set the input output pts pairs */
1728 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1730 if (ost->encoding_needed) {
1731 av_assert0(ist->decoding_needed);
1732 switch(ost->st->codec->codec_type) {
1733 case AVMEDIA_TYPE_AUDIO:
1734 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1736 case AVMEDIA_TYPE_VIDEO:
1738 if (ost->picref->video && !ost->frame_aspect_ratio)
1739 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1741 do_video_out(os, ost, ist, &picture, &frame_size,
1742 same_quant ? quality : ost->st->codec->global_quality);
1743 if (vstats_filename && frame_size)
1744 do_video_stats(os, ost, frame_size);
1746 case AVMEDIA_TYPE_SUBTITLE:
1747 do_subtitle_out(os, ost, ist, &subtitle,
1754 AVFrame avframe; //FIXME/XXX remove this
1756 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1758 av_init_packet(&opkt);
1760 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1761 #if !CONFIG_AVFILTER
1767 /* no reencoding needed : output the packet directly */
1768 /* force the input stream PTS */
1770 avcodec_get_frame_defaults(&avframe);
1771 ost->st->codec->coded_frame= &avframe;
1772 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1774 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1775 audio_size += data_size;
1776 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1777 video_size += data_size;
1781 opkt.stream_index= ost->index;
1782 if(pkt->pts != AV_NOPTS_VALUE)
1783 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1785 opkt.pts= AV_NOPTS_VALUE;
1787 if (pkt->dts == AV_NOPTS_VALUE)
1788 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1790 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1791 opkt.dts -= ost_tb_start_time;
1793 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1794 opkt.flags= pkt->flags;
1796 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1797 if( ost->st->codec->codec_id != CODEC_ID_H264
1798 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1799 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1801 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1802 opkt.destruct= av_destruct_packet;
1804 opkt.data = data_buf;
1805 opkt.size = data_size;
1808 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1809 ost->st->codec->frame_number++;
1810 ost->frame_number++;
1811 av_free_packet(&opkt);
1815 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1816 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1818 avfilter_unref_buffer(ost->picref);
1823 av_free(buffer_to_free);
1824 /* XXX: allocate the subtitles in the codec ? */
1825 if (subtitle_to_free) {
1826 avsubtitle_free(subtitle_to_free);
1827 subtitle_to_free = NULL;
1835 static void print_sdp(OutputFile *output_files, int n)
1839 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1843 for (i = 0; i < n; i++)
1844 avc[i] = output_files[i].ctx;
1846 av_sdp_create(avc, n, sdp, sizeof(sdp));
1847 printf("SDP:\n%s\n", sdp);
1852 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1853 char *error, int error_len)
1856 InputStream *ist = &input_streams[ist_index];
1857 if (ist->decoding_needed) {
1858 AVCodec *codec = ist->dec;
1860 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1861 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1862 return AVERROR(EINVAL);
1865 /* update requested sample format for the decoder based on the
1866 corresponding encoder sample format */
1867 for (i = 0; i < nb_output_streams; i++) {
1868 OutputStream *ost = &output_streams[i];
1869 if (ost->source_index == ist_index) {
1870 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1875 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1876 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1877 ist->file_index, ist->st->index);
1878 return AVERROR(EINVAL);
1880 assert_codec_experimental(ist->st->codec, 0);
1881 assert_avoptions(ist->opts);
1884 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;
1885 ist->next_pts = AV_NOPTS_VALUE;
1886 init_pts_correction(&ist->pts_ctx);
1892 static int transcode_init(OutputFile *output_files,
1893 int nb_output_files,
1894 InputFile *input_files,
1898 AVFormatContext *os;
1899 AVCodecContext *codec, *icodec;
1905 /* init framerate emulation */
1906 for (i = 0; i < nb_input_files; i++) {
1907 InputFile *ifile = &input_files[i];
1908 if (ifile->rate_emu)
1909 for (j = 0; j < ifile->nb_streams; j++)
1910 input_streams[j + ifile->ist_index].start = av_gettime();
1913 /* output stream init */
1914 for(i=0;i<nb_output_files;i++) {
1915 os = output_files[i].ctx;
1916 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1917 av_dump_format(os, i, os->filename, 1);
1918 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1919 return AVERROR(EINVAL);
1923 /* for each output stream, we compute the right encoding parameters */
1924 for (i = 0; i < nb_output_streams; i++) {
1925 ost = &output_streams[i];
1926 os = output_files[ost->file_index].ctx;
1927 ist = &input_streams[ost->source_index];
1929 codec = ost->st->codec;
1930 icodec = ist->st->codec;
1932 ost->st->disposition = ist->st->disposition;
1933 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1934 codec->chroma_sample_location = icodec->chroma_sample_location;
1936 if (ost->st->stream_copy) {
1937 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1939 if (extra_size > INT_MAX) {
1940 return AVERROR(EINVAL);
1943 /* if stream_copy is selected, no need to decode or encode */
1944 codec->codec_id = icodec->codec_id;
1945 codec->codec_type = icodec->codec_type;
1947 if(!codec->codec_tag){
1948 if( !os->oformat->codec_tag
1949 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1950 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1951 codec->codec_tag = icodec->codec_tag;
1954 codec->bit_rate = icodec->bit_rate;
1955 codec->rc_max_rate = icodec->rc_max_rate;
1956 codec->rc_buffer_size = icodec->rc_buffer_size;
1957 codec->extradata= av_mallocz(extra_size);
1958 if (!codec->extradata) {
1959 return AVERROR(ENOMEM);
1961 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1962 codec->extradata_size= icodec->extradata_size;
1963 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){
1964 codec->time_base = icodec->time_base;
1965 codec->time_base.num *= icodec->ticks_per_frame;
1966 av_reduce(&codec->time_base.num, &codec->time_base.den,
1967 codec->time_base.num, codec->time_base.den, INT_MAX);
1969 codec->time_base = ist->st->time_base;
1970 switch(codec->codec_type) {
1971 case AVMEDIA_TYPE_AUDIO:
1972 if(audio_volume != 256) {
1973 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1976 codec->channel_layout = icodec->channel_layout;
1977 codec->sample_rate = icodec->sample_rate;
1978 codec->channels = icodec->channels;
1979 codec->frame_size = icodec->frame_size;
1980 codec->audio_service_type = icodec->audio_service_type;
1981 codec->block_align= icodec->block_align;
1982 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1983 codec->block_align= 0;
1984 if(codec->codec_id == CODEC_ID_AC3)
1985 codec->block_align= 0;
1987 case AVMEDIA_TYPE_VIDEO:
1988 codec->pix_fmt = icodec->pix_fmt;
1989 codec->width = icodec->width;
1990 codec->height = icodec->height;
1991 codec->has_b_frames = icodec->has_b_frames;
1992 if (!codec->sample_aspect_ratio.num) {
1993 codec->sample_aspect_ratio =
1994 ost->st->sample_aspect_ratio =
1995 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1996 ist->st->codec->sample_aspect_ratio.num ?
1997 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2000 case AVMEDIA_TYPE_SUBTITLE:
2001 codec->width = icodec->width;
2002 codec->height = icodec->height;
2004 case AVMEDIA_TYPE_DATA:
2011 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2012 switch(codec->codec_type) {
2013 case AVMEDIA_TYPE_AUDIO:
2014 ost->fifo= av_fifo_alloc(1024);
2016 return AVERROR(ENOMEM);
2018 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2019 if (!codec->sample_rate) {
2020 codec->sample_rate = icodec->sample_rate;
2022 codec->sample_rate >>= icodec->lowres;
2024 choose_sample_rate(ost->st, ost->enc);
2025 codec->time_base = (AVRational){1, codec->sample_rate};
2026 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2027 codec->sample_fmt = icodec->sample_fmt;
2028 choose_sample_fmt(ost->st, ost->enc);
2029 if (!codec->channels)
2030 codec->channels = icodec->channels;
2031 codec->channel_layout = icodec->channel_layout;
2032 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2033 codec->channel_layout = 0;
2034 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2035 icodec->request_channels = codec->channels;
2036 ist->decoding_needed = 1;
2037 ost->encoding_needed = 1;
2038 ost->resample_sample_fmt = icodec->sample_fmt;
2039 ost->resample_sample_rate = icodec->sample_rate;
2040 ost->resample_channels = icodec->channels;
2042 case AVMEDIA_TYPE_VIDEO:
2043 if (codec->pix_fmt == PIX_FMT_NONE)
2044 codec->pix_fmt = icodec->pix_fmt;
2045 choose_pixel_fmt(ost->st, ost->enc);
2047 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2048 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2052 if (!codec->width || !codec->height) {
2053 codec->width = icodec->width;
2054 codec->height = icodec->height;
2057 ost->video_resample = codec->width != icodec->width ||
2058 codec->height != icodec->height ||
2059 codec->pix_fmt != icodec->pix_fmt;
2060 if (ost->video_resample) {
2061 #if !CONFIG_AVFILTER
2062 avcodec_get_frame_defaults(&ost->pict_tmp);
2063 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2064 codec->width, codec->height)) {
2065 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2068 ost->img_resample_ctx = sws_getContext(
2075 ost->sws_flags, NULL, NULL, NULL);
2076 if (ost->img_resample_ctx == NULL) {
2077 fprintf(stderr, "Cannot get resampling context\n");
2081 codec->bits_per_raw_sample= 0;
2084 ost->resample_height = icodec->height;
2085 ost->resample_width = icodec->width;
2086 ost->resample_pix_fmt= icodec->pix_fmt;
2087 ost->encoding_needed = 1;
2088 ist->decoding_needed = 1;
2090 if (!ost->frame_rate.num)
2091 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2092 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2093 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2094 ost->frame_rate = ost->enc->supported_framerates[idx];
2096 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2099 if (configure_video_filters(ist, ost)) {
2100 fprintf(stderr, "Error opening filters!\n");
2105 case AVMEDIA_TYPE_SUBTITLE:
2106 ost->encoding_needed = 1;
2107 ist->decoding_needed = 1;
2114 if (ost->encoding_needed &&
2115 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2116 char logfilename[1024];
2119 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2120 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2122 if (codec->flags & CODEC_FLAG_PASS1) {
2123 f = fopen(logfilename, "wb");
2125 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2131 size_t logbuffer_size;
2132 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2133 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2136 codec->stats_in = logbuffer;
2140 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2141 int size= codec->width * codec->height;
2142 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2147 bit_buffer = av_malloc(bit_buffer_size);
2149 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2151 return AVERROR(ENOMEM);
2154 /* open each encoder */
2155 for (i = 0; i < nb_output_streams; i++) {
2156 ost = &output_streams[i];
2157 if (ost->encoding_needed) {
2158 AVCodec *codec = ost->enc;
2159 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2161 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2162 ost->st->codec->codec_id, ost->file_index, ost->index);
2163 ret = AVERROR(EINVAL);
2166 if (dec->subtitle_header) {
2167 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2168 if (!ost->st->codec->subtitle_header) {
2169 ret = AVERROR(ENOMEM);
2172 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2173 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2175 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2176 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2177 ost->file_index, ost->index);
2178 ret = AVERROR(EINVAL);
2181 assert_codec_experimental(ost->st->codec, 1);
2182 assert_avoptions(ost->opts);
2183 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2184 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2185 "It takes bits/s as argument, not kbits/s\n");
2186 extra_size += ost->st->codec->extradata_size;
2190 /* init input streams */
2191 for (i = 0; i < nb_input_streams; i++)
2192 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2195 /* open files and write file headers */
2196 for (i = 0; i < nb_output_files; i++) {
2197 os = output_files[i].ctx;
2198 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2199 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2200 ret = AVERROR(EINVAL);
2203 assert_avoptions(output_files[i].opts);
2204 if (strcmp(os->oformat->name, "rtp")) {
2210 /* dump the file output parameters - cannot be done before in case
2212 for(i=0;i<nb_output_files;i++) {
2213 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2216 /* dump the stream mapping */
2218 fprintf(stderr, "Stream mapping:\n");
2219 for (i = 0; i < nb_output_streams;i ++) {
2220 ost = &output_streams[i];
2221 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2222 input_streams[ost->source_index].file_index,
2223 input_streams[ost->source_index].st->index,
2226 if (ost->sync_ist != &input_streams[ost->source_index])
2227 fprintf(stderr, " [sync #%d.%d]",
2228 ost->sync_ist->file_index,
2229 ost->sync_ist->st->index);
2230 if (ost->st->stream_copy)
2231 fprintf(stderr, " (copy)");
2233 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2234 input_streams[ost->source_index].dec->name : "?",
2235 ost->enc ? ost->enc->name : "?");
2236 fprintf(stderr, "\n");
2241 fprintf(stderr, "%s\n", error);
2246 print_sdp(output_files, nb_output_files);
2253 * The following code is the main loop of the file converter
2255 static int transcode(OutputFile *output_files,
2256 int nb_output_files,
2257 InputFile *input_files,
2261 AVFormatContext *is, *os;
2265 int no_packet_count=0;
2266 int64_t timer_start;
2268 if (!(no_packet = av_mallocz(nb_input_files)))
2271 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2276 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2279 timer_start = av_gettime();
2281 for(; received_sigterm == 0;) {
2282 int file_index, ist_index;
2287 ipts_min = INT64_MAX;
2290 /* select the stream that we must read now by looking at the
2291 smallest output pts */
2293 for (i = 0; i < nb_output_streams; i++) {
2297 ost = &output_streams[i];
2298 of = &output_files[ost->file_index];
2299 os = output_files[ost->file_index].ctx;
2300 ist = &input_streams[ost->source_index];
2301 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2302 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2304 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2306 if (!input_files[ist->file_index].eof_reached){
2307 if(ipts < ipts_min) {
2309 if(input_sync ) file_index = ist->file_index;
2311 if(opts < opts_min) {
2313 if(!input_sync) file_index = ist->file_index;
2316 if (ost->frame_number >= ost->max_frames) {
2318 for (j = of->ost_index; j < of->ctx->nb_streams; j++)
2319 output_streams[j].is_past_recording_time = 1;
2323 /* if none, if is finished */
2324 if (file_index < 0) {
2325 if(no_packet_count){
2327 memset(no_packet, 0, nb_input_files);
2334 /* read a frame from it and output it in the fifo */
2335 is = input_files[file_index].ctx;
2336 ret= av_read_frame(is, &pkt);
2337 if(ret == AVERROR(EAGAIN)){
2338 no_packet[file_index]=1;
2343 input_files[file_index].eof_reached = 1;
2351 memset(no_packet, 0, nb_input_files);
2354 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2355 is->streams[pkt.stream_index]);
2357 /* the following test is needed in case new streams appear
2358 dynamically in stream : we ignore them */
2359 if (pkt.stream_index >= input_files[file_index].nb_streams)
2360 goto discard_packet;
2361 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2362 ist = &input_streams[ist_index];
2364 goto discard_packet;
2366 if (pkt.dts != AV_NOPTS_VALUE)
2367 pkt.dts += 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 += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2371 if(pkt.pts != AV_NOPTS_VALUE)
2372 pkt.pts *= ist->ts_scale;
2373 if(pkt.dts != AV_NOPTS_VALUE)
2374 pkt.dts *= ist->ts_scale;
2376 // 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);
2377 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2378 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2379 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2380 int64_t delta= pkt_dts - ist->next_pts;
2381 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2382 input_files[ist->file_index].ts_offset -= delta;
2384 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2385 delta, input_files[ist->file_index].ts_offset);
2386 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2387 if(pkt.pts != AV_NOPTS_VALUE)
2388 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2392 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2393 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2396 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2397 ist->file_index, ist->st->index);
2400 av_free_packet(&pkt);
2405 av_free_packet(&pkt);
2407 /* dump report by using the output first video and audio streams */
2408 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2411 /* at the end of stream, we must flush the decoder buffers */
2412 for (i = 0; i < nb_input_streams; i++) {
2413 ist = &input_streams[i];
2414 if (ist->decoding_needed) {
2415 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2418 flush_encoders(output_streams, nb_output_streams);
2422 /* write the trailer if needed and close file */
2423 for(i=0;i<nb_output_files;i++) {
2424 os = output_files[i].ctx;
2425 av_write_trailer(os);
2428 /* dump report by using the first video and audio streams */
2429 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2431 /* close each encoder */
2432 for (i = 0; i < nb_output_streams; i++) {
2433 ost = &output_streams[i];
2434 if (ost->encoding_needed) {
2435 av_freep(&ost->st->codec->stats_in);
2436 avcodec_close(ost->st->codec);
2439 avfilter_graph_free(&ost->graph);
2443 /* close each decoder */
2444 for (i = 0; i < nb_input_streams; i++) {
2445 ist = &input_streams[i];
2446 if (ist->decoding_needed) {
2447 avcodec_close(ist->st->codec);
2455 av_freep(&bit_buffer);
2456 av_freep(&no_packet);
2458 if (output_streams) {
2459 for (i = 0; i < nb_output_streams; i++) {
2460 ost = &output_streams[i];
2462 if (ost->st->stream_copy)
2463 av_freep(&ost->st->codec->extradata);
2465 fclose(ost->logfile);
2466 ost->logfile = NULL;
2468 av_fifo_free(ost->fifo); /* works even if fifo is not
2469 initialized but set to zero */
2470 av_freep(&ost->st->codec->subtitle_header);
2471 av_free(ost->pict_tmp.data[0]);
2472 av_free(ost->forced_kf_pts);
2473 if (ost->video_resample)
2474 sws_freeContext(ost->img_resample_ctx);
2476 audio_resample_close(ost->resample);
2477 if (ost->reformat_ctx)
2478 av_audio_convert_free(ost->reformat_ctx);
2479 av_dict_free(&ost->opts);
2486 static int opt_video_rc_override_string(const char *opt, const char *arg)
2488 video_rc_override_string = arg;
2492 static int opt_me_threshold(const char *opt, const char *arg)
2494 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2498 static int opt_verbose(const char *opt, const char *arg)
2500 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2504 static int opt_frame_rate(const char *opt, const char *arg)
2506 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2507 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2513 static int opt_frame_size(const char *opt, const char *arg)
2515 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2516 fprintf(stderr, "Incorrect frame size\n");
2517 return AVERROR(EINVAL);
2522 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2524 if (strcmp(arg, "list")) {
2525 frame_pix_fmt = av_get_pix_fmt(arg);
2526 if (frame_pix_fmt == PIX_FMT_NONE) {
2527 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2528 return AVERROR(EINVAL);
2537 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2544 p = strchr(arg, ':');
2546 x = strtol(arg, &end, 10);
2548 y = strtol(end+1, &end, 10);
2550 ar = (double)x / (double)y;
2552 ar = strtod(arg, NULL);
2555 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2556 return AVERROR(EINVAL);
2558 frame_aspect_ratio = ar;
2562 static int opt_qscale(const char *opt, const char *arg)
2564 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2565 if (video_qscale == 0) {
2566 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2567 return AVERROR(EINVAL);
2572 static int opt_top_field_first(const char *opt, const char *arg)
2574 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2578 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2580 if (strcmp(arg, "list")) {
2581 audio_sample_fmt = av_get_sample_fmt(arg);
2582 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2583 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2584 return AVERROR(EINVAL);
2589 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2590 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2596 static int opt_audio_rate(const char *opt, const char *arg)
2598 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2602 static int opt_audio_channels(const char *opt, const char *arg)
2604 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2608 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2610 return parse_option(o, "codec:a", arg, options);
2613 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2615 return parse_option(o, "codec:v", arg, options);
2618 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2620 return parse_option(o, "codec:s", arg, options);
2623 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2625 return parse_option(o, "codec:d", arg, options);
2628 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2630 StreamMap *m = NULL;
2631 int i, negative = 0, file_idx;
2632 int sync_file_idx = -1, sync_stream_idx;
2640 map = av_strdup(arg);
2642 /* parse sync stream first, just pick first matching stream */
2643 if (sync = strchr(map, ',')) {
2645 sync_file_idx = strtol(sync + 1, &sync, 0);
2646 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2647 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2652 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2653 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2654 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2655 sync_stream_idx = i;
2658 if (i == input_files[sync_file_idx].nb_streams) {
2659 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2660 "match any streams.\n", arg);
2666 file_idx = strtol(map, &p, 0);
2667 if (file_idx >= nb_input_files || file_idx < 0) {
2668 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2672 /* disable some already defined maps */
2673 for (i = 0; i < o->nb_stream_maps; i++) {
2674 m = &o->stream_maps[i];
2675 if (check_stream_specifier(input_files[m->file_index].ctx,
2676 input_files[m->file_index].ctx->streams[m->stream_index],
2677 *p == ':' ? p + 1 : p) > 0)
2681 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2682 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2683 *p == ':' ? p + 1 : p) <= 0)
2685 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2686 &o->nb_stream_maps, o->nb_stream_maps + 1);
2687 m = &o->stream_maps[o->nb_stream_maps - 1];
2689 m->file_index = file_idx;
2690 m->stream_index = i;
2692 if (sync_file_idx >= 0) {
2693 m->sync_file_index = sync_file_idx;
2694 m->sync_stream_index = sync_stream_idx;
2696 m->sync_file_index = file_idx;
2697 m->sync_stream_index = i;
2702 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2710 static void parse_meta_type(char *arg, char *type, int *index)
2720 if (*(++arg) == ':')
2721 *index = strtol(++arg, NULL, 0);
2724 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2731 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2733 MetadataMap *m, *m1;
2736 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2737 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2739 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2740 m->file = strtol(arg, &p, 0);
2741 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2743 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2744 if (p = strchr(opt, ':'))
2745 parse_meta_type(p + 1, &m1->type, &m1->index);
2749 if (m->type == 'g' || m1->type == 'g')
2750 o->metadata_global_manual = 1;
2751 if (m->type == 's' || m1->type == 's')
2752 o->metadata_streams_manual = 1;
2753 if (m->type == 'c' || m1->type == 'c')
2754 o->metadata_chapters_manual = 1;
2759 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2761 const char *codec_string = encoder ? "encoder" : "decoder";
2765 return CODEC_ID_NONE;
2767 avcodec_find_encoder_by_name(name) :
2768 avcodec_find_decoder_by_name(name);
2770 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2773 if(codec->type != type) {
2774 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2780 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2782 char *codec_name = NULL;
2784 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2788 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2789 return avcodec_find_encoder(st->codec->codec_id);
2791 } else if (!strcmp(codec_name, "copy"))
2792 st->stream_copy = 1;
2794 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2795 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2796 avcodec_find_decoder_by_name(codec_name);
2803 * Add all the streams from the given input file to the global
2804 * list of input streams.
2806 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2808 int i, rfps, rfps_base;
2810 for (i = 0; i < ic->nb_streams; i++) {
2811 AVStream *st = ic->streams[i];
2812 AVCodecContext *dec = st->codec;
2816 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2817 ist = &input_streams[nb_input_streams - 1];
2819 ist->file_index = nb_input_files;
2821 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2823 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2824 ist->ts_scale = scale;
2826 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2828 ist->dec = avcodec_find_decoder(dec->codec_id);
2830 switch (dec->codec_type) {
2831 case AVMEDIA_TYPE_AUDIO:
2833 st->discard= AVDISCARD_ALL;
2835 case AVMEDIA_TYPE_VIDEO:
2836 rfps = ic->streams[i]->r_frame_rate.num;
2837 rfps_base = ic->streams[i]->r_frame_rate.den;
2839 dec->flags |= CODEC_FLAG_EMU_EDGE;
2840 dec->height >>= dec->lowres;
2841 dec->width >>= dec->lowres;
2844 dec->debug |= FF_DEBUG_MV;
2846 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2849 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2850 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2852 (float)rfps / rfps_base, rfps, rfps_base);
2856 st->discard= AVDISCARD_ALL;
2857 else if(video_discard)
2858 st->discard= video_discard;
2860 case AVMEDIA_TYPE_DATA:
2862 case AVMEDIA_TYPE_SUBTITLE:
2863 if(subtitle_disable)
2864 st->discard = AVDISCARD_ALL;
2866 case AVMEDIA_TYPE_ATTACHMENT:
2867 case AVMEDIA_TYPE_UNKNOWN:
2875 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2877 AVFormatContext *ic;
2878 AVInputFormat *file_iformat = NULL;
2882 AVDictionary **opts;
2883 int orig_nb_streams; // number of streams before avformat_find_stream_info
2886 if (!(file_iformat = av_find_input_format(o->format))) {
2887 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2892 if (!strcmp(filename, "-"))
2895 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2896 !strcmp(filename, "/dev/stdin");
2898 /* get default parameters from command line */
2899 ic = avformat_alloc_context();
2901 print_error(filename, AVERROR(ENOMEM));
2904 if (audio_sample_rate) {
2905 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2906 av_dict_set(&format_opts, "sample_rate", buf, 0);
2908 if (audio_channels) {
2909 snprintf(buf, sizeof(buf), "%d", audio_channels);
2910 av_dict_set(&format_opts, "channels", buf, 0);
2912 if (frame_rate.num) {
2913 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2914 av_dict_set(&format_opts, "framerate", buf, 0);
2916 if (frame_width && frame_height) {
2917 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2918 av_dict_set(&format_opts, "video_size", buf, 0);
2920 if (frame_pix_fmt != PIX_FMT_NONE)
2921 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2923 ic->flags |= AVFMT_FLAG_NONBLOCK;
2925 /* open the input file with generic libav function */
2926 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2928 print_error(filename, err);
2931 assert_avoptions(format_opts);
2936 for(i=0; i<ic->nb_streams; i++){
2937 ic->streams[i]->discard= AVDISCARD_ALL;
2939 for(i=0; i<ic->nb_programs; i++){
2940 AVProgram *p= ic->programs[i];
2941 if(p->id != opt_programid){
2942 p->discard = AVDISCARD_ALL;
2945 for(j=0; j<p->nb_stream_indexes; j++){
2946 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2951 fprintf(stderr, "Specified program id not found\n");
2957 /* apply forced codec ids */
2958 for (i = 0; i < ic->nb_streams; i++)
2959 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
2961 /* Set AVCodecContext options for avformat_find_stream_info */
2962 opts = setup_find_stream_info_opts(ic, codec_opts);
2963 orig_nb_streams = ic->nb_streams;
2965 /* If not enough info to get the stream parameters, we decode the
2966 first frames to get it. (used in mpeg case for example) */
2967 ret = avformat_find_stream_info(ic, opts);
2968 if (ret < 0 && verbose >= 0) {
2969 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2970 av_close_input_file(ic);
2974 timestamp = o->start_time;
2975 /* add the stream start time */
2976 if (ic->start_time != AV_NOPTS_VALUE)
2977 timestamp += ic->start_time;
2979 /* if seeking requested, we execute it */
2980 if (o->start_time != 0) {
2981 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2983 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2984 filename, (double)timestamp / AV_TIME_BASE);
2988 /* update the current parameters so that they match the one of the input stream */
2989 add_input_streams(o, ic);
2991 /* dump the file content */
2993 av_dump_format(ic, nb_input_files, filename, 0);
2995 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2996 input_files[nb_input_files - 1].ctx = ic;
2997 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
2998 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
2999 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3001 frame_rate = (AVRational){0, 0};
3002 frame_pix_fmt = PIX_FMT_NONE;
3005 audio_sample_rate = 0;
3007 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3009 for (i = 0; i < orig_nb_streams; i++)
3010 av_dict_free(&opts[i]);
3017 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3018 AVCodecContext *avctx)
3024 for (p = kf; *p; p++)
3027 ost->forced_kf_count = n;
3028 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3029 if (!ost->forced_kf_pts) {
3030 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3033 for (i = 0; i < n; i++) {
3034 p = i ? strchr(p, ',') + 1 : kf;
3035 t = parse_time_or_die("force_key_frames", p, 1);
3036 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3040 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3043 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3044 int idx = oc->nb_streams - 1;
3045 int64_t max_frames = INT64_MAX;
3046 char *bsf = NULL, *next, *codec_tag = NULL;
3047 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3050 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3054 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3055 nb_output_streams + 1);
3056 ost = &output_streams[nb_output_streams - 1];
3057 ost->file_index = nb_output_files;
3060 st->codec->codec_type = type;
3061 ost->enc = choose_codec(o, oc, st, type);
3063 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3066 avcodec_get_context_defaults3(st->codec, ost->enc);
3067 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3069 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3070 ost->max_frames = max_frames;
3072 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3074 if (next = strchr(bsf, ','))
3076 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3077 av_log(NULL, AV_LOG_ERROR, "Unknown bitstream filter %s\n", bsf);
3081 bsfc_prev->next = bsfc;
3083 ost->bitstream_filters = bsfc;
3089 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3091 uint32_t tag = strtol(codec_tag, &next, 0);
3093 tag = AV_RL32(codec_tag);
3094 st->codec->codec_tag = tag;
3097 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3101 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3105 AVCodecContext *video_enc;
3107 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3109 if (!st->stream_copy) {
3110 ost->frame_aspect_ratio = frame_aspect_ratio;
3111 frame_aspect_ratio = 0;
3113 ost->avfilter= vfilters;
3118 video_enc = st->codec;
3120 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3121 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3124 if (st->stream_copy) {
3125 video_enc->sample_aspect_ratio =
3126 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3132 ost->frame_rate = frame_rate;
3134 video_enc->width = frame_width;
3135 video_enc->height = frame_height;
3136 video_enc->pix_fmt = frame_pix_fmt;
3137 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3139 if (video_qscale || same_quant) {
3140 video_enc->flags |= CODEC_FLAG_QSCALE;
3141 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3145 video_enc->intra_matrix = intra_matrix;
3147 video_enc->inter_matrix = inter_matrix;
3149 p= video_rc_override_string;
3152 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3154 fprintf(stderr, "error parsing rc_override\n");
3157 video_enc->rc_override=
3158 av_realloc(video_enc->rc_override,
3159 sizeof(RcOverride)*(i+1));
3160 video_enc->rc_override[i].start_frame= start;
3161 video_enc->rc_override[i].end_frame = end;
3163 video_enc->rc_override[i].qscale= q;
3164 video_enc->rc_override[i].quality_factor= 1.0;
3167 video_enc->rc_override[i].qscale= 0;
3168 video_enc->rc_override[i].quality_factor= -q/100.0;
3173 video_enc->rc_override_count=i;
3174 if (!video_enc->rc_initial_buffer_occupancy)
3175 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3176 video_enc->me_threshold= me_threshold;
3177 video_enc->intra_dc_precision= intra_dc_precision - 8;
3180 video_enc->flags|= CODEC_FLAG_PSNR;
3185 video_enc->flags |= CODEC_FLAG_PASS1;
3187 video_enc->flags |= CODEC_FLAG_PASS2;
3191 if (forced_key_frames)
3192 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3194 if (video_language) {
3195 av_dict_set(&st->metadata, "language", video_language, 0);
3196 av_freep(&video_language);
3199 /* reset some key parameters */
3201 av_freep(&forced_key_frames);
3202 frame_pix_fmt = PIX_FMT_NONE;
3206 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3210 AVCodecContext *audio_enc;
3212 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3215 audio_enc = st->codec;
3216 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3218 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3219 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3221 if (!st->stream_copy) {
3222 if (audio_qscale > QSCALE_NONE) {
3223 audio_enc->flags |= CODEC_FLAG_QSCALE;
3224 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3227 audio_enc->channels = audio_channels;
3228 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3229 audio_enc->sample_fmt = audio_sample_fmt;
3230 if (audio_sample_rate)
3231 audio_enc->sample_rate = audio_sample_rate;
3233 if (audio_language) {
3234 av_dict_set(&st->metadata, "language", audio_language, 0);
3235 av_freep(&audio_language);
3238 /* reset some key parameters */
3244 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3248 AVCodecContext *data_enc;
3250 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3252 data_enc = st->codec;
3253 if (!st->stream_copy) {
3254 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3258 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3259 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3266 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3270 AVCodecContext *subtitle_enc;
3272 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3274 subtitle_enc = st->codec;
3276 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3278 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3279 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3282 if (subtitle_language) {
3283 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3284 av_freep(&subtitle_language);
3287 subtitle_disable = 0;
3291 /* arg format is "output-stream-index:streamid-value". */
3292 static int opt_streamid(const char *opt, const char *arg)
3298 av_strlcpy(idx_str, arg, sizeof(idx_str));
3299 p = strchr(idx_str, ':');
3302 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3307 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3308 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3309 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3313 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3315 AVFormatContext *is = ifile->ctx;
3316 AVFormatContext *os = ofile->ctx;
3319 for (i = 0; i < is->nb_chapters; i++) {
3320 AVChapter *in_ch = is->chapters[i], *out_ch;
3321 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3322 AV_TIME_BASE_Q, in_ch->time_base);
3323 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3324 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3327 if (in_ch->end < ts_off)
3329 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3332 out_ch = av_mallocz(sizeof(AVChapter));
3334 return AVERROR(ENOMEM);
3336 out_ch->id = in_ch->id;
3337 out_ch->time_base = in_ch->time_base;
3338 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3339 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3342 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3345 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3347 return AVERROR(ENOMEM);
3348 os->chapters[os->nb_chapters - 1] = out_ch;
3353 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3356 AVFormatContext *ic = NULL;
3358 err = avformat_open_input(&ic, filename, NULL, NULL);
3361 /* copy stream format */
3362 for(i=0;i<ic->nb_streams;i++) {
3367 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3368 ost = new_output_stream(o, s, codec->type);
3371 // FIXME: a more elegant solution is needed
3372 memcpy(st, ic->streams[i], sizeof(AVStream));
3374 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3376 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3377 choose_sample_fmt(st, codec);
3378 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3379 choose_pixel_fmt(st, codec);
3382 av_close_input_file(ic);
3386 static void opt_output_file(void *optctx, const char *filename)
3388 OptionsContext *o = optctx;
3389 AVFormatContext *oc;
3391 AVOutputFormat *file_oformat;
3395 if (!strcmp(filename, "-"))
3398 oc = avformat_alloc_context();
3400 print_error(filename, AVERROR(ENOMEM));
3405 file_oformat = av_guess_format(o->format, NULL, NULL);
3406 if (!file_oformat) {
3407 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3411 file_oformat = av_guess_format(NULL, filename, NULL);
3412 if (!file_oformat) {
3413 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3419 oc->oformat = file_oformat;
3420 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3422 if (!strcmp(file_oformat->name, "ffm") &&
3423 av_strstart(filename, "http:", NULL)) {
3424 /* special case for files sent to avserver: we get the stream
3425 parameters from avserver */
3426 int err = read_avserver_streams(o, oc, filename);
3428 print_error(filename, err);
3431 } else if (!o->nb_stream_maps) {
3432 /* pick the "best" stream of each type */
3433 #define NEW_STREAM(type, index)\
3435 ost = new_ ## type ## _stream(o, oc);\
3436 ost->source_index = index;\
3437 ost->sync_ist = &input_streams[index];\
3438 input_streams[index].discard = 0;\
3441 /* video: highest resolution */
3442 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3443 int area = 0, idx = -1;
3444 for (i = 0; i < nb_input_streams; i++) {
3445 ist = &input_streams[i];
3446 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3447 ist->st->codec->width * ist->st->codec->height > area) {
3448 area = ist->st->codec->width * ist->st->codec->height;
3452 NEW_STREAM(video, idx);
3455 /* audio: most channels */
3456 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3457 int channels = 0, idx = -1;
3458 for (i = 0; i < nb_input_streams; i++) {
3459 ist = &input_streams[i];
3460 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3461 ist->st->codec->channels > channels) {
3462 channels = ist->st->codec->channels;
3466 NEW_STREAM(audio, idx);
3469 /* subtitles: pick first */
3470 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3471 for (i = 0; i < nb_input_streams; i++)
3472 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3473 NEW_STREAM(subtitle, i);
3477 /* do something with data? */
3479 for (i = 0; i < o->nb_stream_maps; i++) {
3480 StreamMap *map = &o->stream_maps[i];
3485 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3486 switch (ist->st->codec->codec_type) {
3487 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3488 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3489 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3490 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3492 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3493 map->file_index, map->stream_index);
3497 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3498 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3499 map->sync_stream_index];
3504 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3505 output_files[nb_output_files - 1].ctx = oc;
3506 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3507 output_files[nb_output_files - 1].recording_time = o->recording_time;
3508 output_files[nb_output_files - 1].start_time = o->start_time;
3509 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3510 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3512 /* check filename in case of an image number is expected */
3513 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3514 if (!av_filename_number_test(oc->filename)) {
3515 print_error(oc->filename, AVERROR(EINVAL));
3520 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3521 /* test if it already exists to avoid loosing precious files */
3522 if (!file_overwrite &&
3523 (strchr(filename, ':') == NULL ||
3524 filename[1] == ':' ||
3525 av_strstart(filename, "file:", NULL))) {
3526 if (avio_check(filename, 0) == 0) {
3528 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3530 if (!read_yesno()) {
3531 fprintf(stderr, "Not overwriting - exiting\n");
3536 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3543 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3544 print_error(filename, err);
3549 oc->preload = (int)(o->mux_preload * AV_TIME_BASE);
3550 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3551 oc->flags |= AVFMT_FLAG_NONBLOCK;
3554 if (o->chapters_input_file >= nb_input_files) {
3555 if (o->chapters_input_file == INT_MAX) {
3556 /* copy chapters from the first input file that has them*/
3557 o->chapters_input_file = -1;
3558 for (i = 0; i < nb_input_files; i++)
3559 if (input_files[i].ctx->nb_chapters) {
3560 o->chapters_input_file = i;
3564 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3565 o->chapters_input_file);
3569 if (o->chapters_input_file >= 0)
3570 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3571 o->metadata_chapters_manual);
3574 for (i = 0; i < o->nb_meta_data_maps; i++) {
3575 AVFormatContext *files[2];
3576 AVDictionary **meta[2];
3579 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3580 if ((index) < 0 || (index) >= (nb_elems)) {\
3581 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3586 int in_file_index = o->meta_data_maps[i][1].file;
3587 if (in_file_index < 0)
3589 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3592 files[1] = input_files[in_file_index].ctx;
3594 for (j = 0; j < 2; j++) {
3595 MetadataMap *map = &o->meta_data_maps[i][j];
3597 switch (map->type) {
3599 meta[j] = &files[j]->metadata;
3602 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3603 meta[j] = &files[j]->streams[map->index]->metadata;
3606 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3607 meta[j] = &files[j]->chapters[map->index]->metadata;
3610 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3611 meta[j] = &files[j]->programs[map->index]->metadata;
3616 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3619 /* copy global metadata by default */
3620 if (!o->metadata_global_manual && nb_input_files)
3621 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3622 AV_DICT_DONT_OVERWRITE);
3623 if (!o->metadata_streams_manual)
3624 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3625 InputStream *ist = &input_streams[output_streams[i].source_index];
3626 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3629 /* process manually set metadata */
3630 for (i = 0; i < o->nb_metadata; i++) {
3635 val = strchr(o->metadata[i].u.str, '=');
3637 av_log(NULL, AV_LOG_ERROR, "No '=' character in metadata string %s.\n",
3638 o->metadata[i].u.str);
3643 parse_meta_type(o->metadata[i].specifier, &type, &index);
3649 if (index < 0 || index >= oc->nb_streams) {
3650 av_log(NULL, AV_LOG_ERROR, "Invalid stream index %d in metadata specifier.\n", index);
3653 m = &oc->streams[i]->metadata;
3656 if (index < 0 || index >= oc->nb_chapters) {
3657 av_log(NULL, AV_LOG_ERROR, "Invalid chapter index %d in metadata specifier.\n", index);
3660 m = &oc->chapters[i]->metadata;
3663 av_log(NULL, AV_LOG_ERROR, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3667 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3670 frame_rate = (AVRational){0, 0};
3673 audio_sample_rate = 0;
3675 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3677 av_freep(&streamid_map);
3678 nb_streamid_map = 0;
3680 av_freep(&forced_key_frames);
3684 /* same option as mencoder */
3685 static int opt_pass(const char *opt, const char *arg)
3687 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3691 static int64_t getutime(void)
3694 struct rusage rusage;
3696 getrusage(RUSAGE_SELF, &rusage);
3697 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3698 #elif HAVE_GETPROCESSTIMES
3700 FILETIME c, e, k, u;
3701 proc = GetCurrentProcess();
3702 GetProcessTimes(proc, &c, &e, &k, &u);
3703 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3705 return av_gettime();
3709 static int64_t getmaxrss(void)
3711 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3712 struct rusage rusage;
3713 getrusage(RUSAGE_SELF, &rusage);
3714 return (int64_t)rusage.ru_maxrss * 1024;
3715 #elif HAVE_GETPROCESSMEMORYINFO
3717 PROCESS_MEMORY_COUNTERS memcounters;
3718 proc = GetCurrentProcess();
3719 memcounters.cb = sizeof(memcounters);
3720 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3721 return memcounters.PeakPagefileUsage;
3727 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3730 const char *p = str;
3737 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3744 static void opt_inter_matrix(const char *arg)
3746 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3747 parse_matrix_coeffs(inter_matrix, arg);
3750 static void opt_intra_matrix(const char *arg)
3752 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3753 parse_matrix_coeffs(intra_matrix, arg);
3756 static void show_usage(void)
3758 printf("Hyper fast Audio and Video encoder\n");
3759 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3763 static void show_help(void)
3766 AVOutputFormat *oformat = NULL;
3767 AVInputFormat *iformat = NULL;
3768 const AVClass *class;
3770 av_log_set_callback(log_callback_help);
3772 show_help_options(options, "Main options:\n",
3773 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3774 show_help_options(options, "\nAdvanced options:\n",
3775 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3777 show_help_options(options, "\nVideo options:\n",
3778 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3780 show_help_options(options, "\nAdvanced Video options:\n",
3781 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3782 OPT_VIDEO | OPT_EXPERT);
3783 show_help_options(options, "\nAudio options:\n",
3784 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3786 show_help_options(options, "\nAdvanced Audio options:\n",
3787 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3788 OPT_AUDIO | OPT_EXPERT);
3789 show_help_options(options, "\nSubtitle options:\n",
3790 OPT_SUBTITLE | OPT_GRAB,
3792 show_help_options(options, "\nAudio/Video grab options:\n",
3796 class = avcodec_get_class();
3797 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3800 /* individual codec options */
3802 while ((c = av_codec_next(c))) {
3803 if (c->priv_class) {
3804 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3809 class = avformat_get_class();
3810 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3813 /* individual muxer options */
3814 while ((oformat = av_oformat_next(oformat))) {
3815 if (oformat->priv_class) {
3816 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3821 /* individual demuxer options */
3822 while ((iformat = av_iformat_next(iformat))) {
3823 if (iformat->priv_class) {
3824 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3829 class = sws_get_class();
3830 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3833 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3835 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3836 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3838 if(!strncmp(arg, "pal-", 4)) {
3841 } else if(!strncmp(arg, "ntsc-", 5)) {
3844 } else if(!strncmp(arg, "film-", 5)) {
3849 /* Calculate FR via float to avoid int overflow */
3850 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3853 } else if((fr == 29970) || (fr == 23976)) {
3856 /* Try to determine PAL/NTSC by peeking in the input files */
3857 if(nb_input_files) {
3859 for (j = 0; j < nb_input_files; j++) {
3860 for (i = 0; i < input_files[j].nb_streams; i++) {
3861 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3862 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3864 fr = c->time_base.den * 1000 / c->time_base.num;
3868 } else if((fr == 29970) || (fr == 23976)) {
3878 if(verbose > 0 && norm != UNKNOWN)
3879 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3882 if(norm == UNKNOWN) {
3883 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3884 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3885 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3889 if(!strcmp(arg, "vcd")) {
3890 opt_video_codec(o, "c:v", "mpeg1video");
3891 opt_audio_codec(o, "c:a", "mp2");
3892 parse_option(o, "f", "vcd", options);
3894 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3895 opt_frame_rate("r", frame_rates[norm]);
3896 opt_default("g", norm == PAL ? "15" : "18");
3898 opt_default("b", "1150000");
3899 opt_default("maxrate", "1150000");
3900 opt_default("minrate", "1150000");
3901 opt_default("bufsize", "327680"); // 40*1024*8;
3903 opt_default("b:a", "224000");
3904 audio_sample_rate = 44100;
3907 opt_default("packetsize", "2324");
3908 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3910 /* We have to offset the PTS, so that it is consistent with the SCR.
3911 SCR starts at 36000, but the first two packs contain only padding
3912 and the first pack from the other stream, respectively, may also have
3913 been written before.
3914 So the real data starts at SCR 36000+3*1200. */
3915 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3916 } else if(!strcmp(arg, "svcd")) {
3918 opt_video_codec(o, "c:v", "mpeg2video");
3919 opt_audio_codec(o, "c:a", "mp2");
3920 parse_option(o, "f", "svcd", options);
3922 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3923 opt_frame_rate("r", frame_rates[norm]);
3924 opt_default("g", norm == PAL ? "15" : "18");
3926 opt_default("b", "2040000");
3927 opt_default("maxrate", "2516000");
3928 opt_default("minrate", "0"); //1145000;
3929 opt_default("bufsize", "1835008"); //224*1024*8;
3930 opt_default("flags", "+scan_offset");
3933 opt_default("b:a", "224000");
3934 audio_sample_rate = 44100;
3936 opt_default("packetsize", "2324");
3938 } else if(!strcmp(arg, "dvd")) {
3940 opt_video_codec(o, "c:v", "mpeg2video");
3941 opt_audio_codec(o, "c:a", "ac3");
3942 parse_option(o, "f", "dvd", options);
3944 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3945 opt_frame_rate("r", frame_rates[norm]);
3946 opt_default("g", norm == PAL ? "15" : "18");
3948 opt_default("b", "6000000");
3949 opt_default("maxrate", "9000000");
3950 opt_default("minrate", "0"); //1500000;
3951 opt_default("bufsize", "1835008"); //224*1024*8;
3953 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3954 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3956 opt_default("b:a", "448000");
3957 audio_sample_rate = 48000;
3959 } else if(!strncmp(arg, "dv", 2)) {
3961 parse_option(o, "f", "dv", options);
3963 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3964 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3965 norm == PAL ? "yuv420p" : "yuv411p");
3966 opt_frame_rate("r", frame_rates[norm]);
3968 audio_sample_rate = 48000;
3972 fprintf(stderr, "Unknown target: %s\n", arg);
3973 return AVERROR(EINVAL);
3978 static int opt_vstats_file(const char *opt, const char *arg)
3980 av_free (vstats_filename);
3981 vstats_filename=av_strdup (arg);
3985 static int opt_vstats(const char *opt, const char *arg)
3988 time_t today2 = time(NULL);
3989 struct tm *today = localtime(&today2);
3991 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3993 return opt_vstats_file(opt, filename);
3996 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3998 return parse_option(o, "frames:v", arg, options);
4001 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4003 return parse_option(o, "frames:a", arg, options);
4006 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4008 return parse_option(o, "frames:d", arg, options);
4011 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4013 return parse_option(o, "tag:v", arg, options);
4016 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4018 return parse_option(o, "tag:a", arg, options);
4021 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4023 return parse_option(o, "tag:s", arg, options);
4026 #define OFFSET(x) offsetof(OptionsContext, x)
4027 static const OptionDef options[] = {
4029 #include "cmdutils_common_opts.h"
4030 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4031 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4032 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4033 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4034 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4035 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4036 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4037 "outfile[,metadata]:infile[,metadata]" },
4038 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4039 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4040 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4041 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4042 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4043 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4044 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4045 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4046 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4047 "add timings for benchmarking" },
4048 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4049 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4050 "dump each input packet" },
4051 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4052 "when dumping packets, also dump the payload" },
4053 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4054 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4055 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4056 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4057 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4058 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4059 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4060 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4061 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4062 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4063 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4064 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4065 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4066 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4067 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4070 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4071 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4072 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4073 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4074 { "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" },
4075 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4076 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4077 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4078 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4079 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4080 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4081 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4082 "use same quantizer as source (implies VBR)" },
4083 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4084 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4085 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4086 "deinterlace pictures" },
4087 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4088 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4089 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4091 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4093 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4094 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4095 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4096 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4097 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4098 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4099 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4100 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4101 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4102 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4105 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4106 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4107 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4108 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4109 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4110 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4111 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4112 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4113 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4114 { "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" },
4116 /* subtitle options */
4117 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4118 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4119 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4120 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4123 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4126 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4127 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4129 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4131 /* data codec support */
4132 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4134 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4138 int main(int argc, char **argv)
4140 OptionsContext o = { 0 };
4145 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4147 avcodec_register_all();
4149 avdevice_register_all();
4152 avfilter_register_all();
4156 avio_set_interrupt_cb(decode_interrupt_cb);
4161 parse_options(&o, argc, argv, options, opt_output_file);
4163 if(nb_output_files <= 0 && nb_input_files == 0) {
4165 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4169 /* file converter / grab */
4170 if (nb_output_files <= 0) {
4171 fprintf(stderr, "At least one output file must be specified\n");
4175 if (nb_input_files == 0) {
4176 fprintf(stderr, "At least one input file must be specified\n");
4181 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4183 ti = getutime() - ti;
4185 int maxrss = getmaxrss() / 1024;
4186 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);