3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "avconv";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
82 int disabled; /** 1 is this mapping is disabled by a negative map */
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct MetadataMap {
93 int file; //< file index
94 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; //< stream/chapter/program number
98 static const OptionDef options[];
100 static const char *last_asked_format = NULL;
101 static AVDictionary *ts_scale;
103 static StreamMap *stream_maps = NULL;
104 static int nb_stream_maps;
106 static AVDictionary *codec_names;
108 /* first item specifies output metadata, second is input */
109 static MetadataMap (*meta_data_maps)[2] = NULL;
110 static int nb_meta_data_maps;
111 static int metadata_global_autocopy = 1;
112 static int metadata_streams_autocopy = 1;
113 static int metadata_chapters_autocopy = 1;
115 static int chapters_input_file = INT_MAX;
117 /* indexed by output file stream index */
118 static int *streamid_map = NULL;
119 static int nb_streamid_map = 0;
121 static int frame_width = 0;
122 static int frame_height = 0;
123 static float frame_aspect_ratio = 0;
124 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
125 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
126 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
127 static AVRational frame_rate;
128 static float video_qscale = 0;
129 static uint16_t *intra_matrix = NULL;
130 static uint16_t *inter_matrix = NULL;
131 static const char *video_rc_override_string=NULL;
132 static int video_disable = 0;
133 static int video_discard = 0;
134 static unsigned int video_codec_tag = 0;
135 static char *video_language = NULL;
136 static int same_quant = 0;
137 static int do_deinterlace = 0;
138 static int top_field_first = -1;
139 static int me_threshold = 0;
140 static int intra_dc_precision = 8;
141 static int qp_hist = 0;
143 static char *vfilters = NULL;
146 static int audio_sample_rate = 0;
147 #define QSCALE_NONE -99999
148 static float audio_qscale = QSCALE_NONE;
149 static int audio_disable = 0;
150 static int audio_channels = 0;
151 static unsigned int audio_codec_tag = 0;
152 static char *audio_language = NULL;
154 static int subtitle_disable = 0;
155 static char *subtitle_language = NULL;
156 static unsigned int subtitle_codec_tag = 0;
158 static int data_disable = 0;
159 static unsigned int data_codec_tag = 0;
161 static float mux_preload= 0.5;
162 static float mux_max_delay= 0.7;
164 static int64_t recording_time = INT64_MAX;
165 static int64_t start_time = 0;
166 static int64_t input_ts_offset = 0;
167 static int file_overwrite = 0;
168 static AVDictionary *metadata;
169 static int do_benchmark = 0;
170 static int do_hex_dump = 0;
171 static int do_pkt_dump = 0;
172 static int do_psnr = 0;
173 static int do_pass = 0;
174 static char *pass_logfilename_prefix = NULL;
175 static int video_sync_method= -1;
176 static int audio_sync_method= 0;
177 static float audio_drift_threshold= 0.1;
178 static int copy_ts= 0;
180 static int opt_shortest = 0;
181 static char *vstats_filename;
182 static FILE *vstats_file;
183 static int opt_programid = 0;
184 static int copy_initial_nonkeyframes = 0;
186 static int rate_emu = 0;
188 static int audio_volume = 256;
190 static int exit_on_error = 0;
191 static int using_stdin = 0;
192 static int verbose = 1;
193 static int thread_count= 1;
194 static int64_t video_size = 0;
195 static int64_t audio_size = 0;
196 static int64_t extra_size = 0;
197 static int nb_frames_dup = 0;
198 static int nb_frames_drop = 0;
199 static int input_sync;
200 static uint64_t limit_filesize = 0;
201 static int force_fps = 0;
202 static char *forced_key_frames = NULL;
204 static float dts_delta_threshold = 10;
206 static uint8_t *audio_buf;
207 static uint8_t *audio_out;
208 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
210 static short *samples;
212 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
213 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
214 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
216 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
218 typedef struct InputStream {
221 int discard; /* true if stream data should be discarded */
222 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
225 int64_t start; /* time when read started */
226 int64_t next_pts; /* synthetic pts for cases where pkt.pts
228 int64_t pts; /* current pts */
229 PtsCorrectionContext pts_ctx;
231 int is_start; /* is 1 at the start and after a discontinuity */
232 int showed_multi_packet_warning;
236 typedef struct InputFile {
237 AVFormatContext *ctx;
238 int eof_reached; /* true if eof reached */
239 int ist_index; /* index of first stream in ist_table */
240 int buffer_size; /* current total buffer size */
244 typedef struct OutputStream {
245 int file_index; /* file index */
246 int index; /* stream index in the output file */
247 int source_index; /* InputStream index */
248 AVStream *st; /* stream in the output file */
249 int encoding_needed; /* true if encoding needed for this stream */
251 /* input pts and corresponding output pts
253 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
254 struct InputStream *sync_ist; /* input stream to sync against */
255 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
256 AVBitStreamFilterContext *bitstream_filters;
261 AVFrame pict_tmp; /* temporary image for resampling */
262 struct SwsContext *img_resample_ctx; /* for image resampling */
265 int resample_pix_fmt;
266 AVRational frame_rate;
268 float frame_aspect_ratio;
270 /* forced key frames */
271 int64_t *forced_kf_pts;
277 ReSampleContext *resample; /* for audio resampling */
278 int resample_sample_fmt;
279 int resample_channels;
280 int resample_sample_rate;
282 AVAudioConvert *reformat_ctx;
283 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
287 AVFilterContext *output_video_filter;
288 AVFilterContext *input_video_filter;
289 AVFilterBufferRef *picref;
291 AVFilterGraph *graph;
296 int is_past_recording_time;
300 typedef struct OutputFile {
301 AVFormatContext *ctx;
303 int ost_index; /* index of the first stream in output_streams */
304 int64_t recording_time; /* desired length of the resulting file in microseconds */
305 int64_t start_time; /* start time in microseconds */
308 static InputStream *input_streams = NULL;
309 static int nb_input_streams = 0;
310 static InputFile *input_files = NULL;
311 static int nb_input_files = 0;
313 static OutputStream *output_streams = NULL;
314 static int nb_output_streams = 0;
315 static OutputFile *output_files = NULL;
316 static int nb_output_files = 0;
320 static int configure_video_filters(InputStream *ist, OutputStream *ost)
322 AVFilterContext *last_filter, *filter;
323 /** filter graph containing all filters including input & output */
324 AVCodecContext *codec = ost->st->codec;
325 AVCodecContext *icodec = ist->st->codec;
326 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
327 AVRational sample_aspect_ratio;
331 ost->graph = avfilter_graph_alloc();
333 if (ist->st->sample_aspect_ratio.num){
334 sample_aspect_ratio = ist->st->sample_aspect_ratio;
336 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
338 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
339 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
340 sample_aspect_ratio.num, sample_aspect_ratio.den);
342 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
343 "src", args, NULL, ost->graph);
346 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
347 "out", NULL, &ffsink_ctx, ost->graph);
350 last_filter = ost->input_video_filter;
352 if (codec->width != icodec->width || codec->height != icodec->height) {
353 snprintf(args, 255, "%d:%d:flags=0x%X",
357 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
358 NULL, args, NULL, ost->graph)) < 0)
360 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
362 last_filter = filter;
365 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
366 ost->graph->scale_sws_opts = av_strdup(args);
369 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
370 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
372 outputs->name = av_strdup("in");
373 outputs->filter_ctx = last_filter;
374 outputs->pad_idx = 0;
375 outputs->next = NULL;
377 inputs->name = av_strdup("out");
378 inputs->filter_ctx = ost->output_video_filter;
382 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
384 av_freep(&ost->avfilter);
386 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
390 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
393 codec->width = ost->output_video_filter->inputs[0]->w;
394 codec->height = ost->output_video_filter->inputs[0]->h;
395 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
396 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
397 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
398 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
402 #endif /* CONFIG_AVFILTER */
404 static void term_exit(void)
406 av_log(NULL, AV_LOG_QUIET, "");
409 static volatile int received_sigterm = 0;
410 static volatile int received_nb_signals = 0;
413 sigterm_handler(int sig)
415 received_sigterm = sig;
416 received_nb_signals++;
420 static void term_init(void)
422 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
423 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
425 signal(SIGXCPU, sigterm_handler);
429 static int decode_interrupt_cb(void)
431 return received_nb_signals > 1;
434 static int exit_program(int ret)
439 for(i=0;i<nb_output_files;i++) {
440 AVFormatContext *s = output_files[i].ctx;
441 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
443 avformat_free_context(s);
444 av_dict_free(&output_files[i].opts);
446 for(i=0;i<nb_input_files;i++) {
447 av_close_input_file(input_files[i].ctx);
449 for (i = 0; i < nb_input_streams; i++)
450 av_dict_free(&input_streams[i].opts);
452 av_free(intra_matrix);
453 av_free(inter_matrix);
457 av_free(vstats_filename);
459 av_free(meta_data_maps);
461 av_freep(&input_streams);
462 av_freep(&input_files);
463 av_freep(&output_streams);
464 av_freep(&output_files);
469 allocated_audio_buf_size= allocated_audio_out_size= 0;
476 if (received_sigterm) {
478 "Received signal %d: terminating.\n",
479 (int) received_sigterm);
483 exit(ret); /* not all OS-es handle main() return value */
487 static void assert_avoptions(AVDictionary *m)
489 AVDictionaryEntry *t;
490 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
491 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
496 static void assert_codec_experimental(AVCodecContext *c, int encoder)
498 const char *codec_string = encoder ? "encoder" : "decoder";
500 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
501 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
502 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
503 "results.\nAdd '-strict experimental' if you want to use it.\n",
504 codec_string, c->codec->name);
505 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
506 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
507 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
508 codec_string, codec->name);
513 /* similar to ff_dynarray_add() and av_fast_realloc() */
514 static void *grow_array(void *array, int elem_size, int *size, int new_size)
516 if (new_size >= INT_MAX / elem_size) {
517 fprintf(stderr, "Array too big.\n");
520 if (*size < new_size) {
521 uint8_t *tmp = av_realloc(array, new_size*elem_size);
523 fprintf(stderr, "Could not alloc buffer.\n");
526 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
533 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
535 if(codec && codec->sample_fmts){
536 const enum AVSampleFormat *p= codec->sample_fmts;
538 if(*p == st->codec->sample_fmt)
542 av_log(NULL, AV_LOG_WARNING,
543 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
544 av_get_sample_fmt_name(st->codec->sample_fmt),
546 av_get_sample_fmt_name(codec->sample_fmts[0]));
547 st->codec->sample_fmt = codec->sample_fmts[0];
553 * Update the requested input sample format based on the output sample format.
554 * This is currently only used to request float output from decoders which
555 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
556 * Ideally this will be removed in the future when decoders do not do format
557 * conversion and only output in their native format.
559 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
562 /* if sample formats match or a decoder sample format has already been
563 requested, just return */
564 if (enc->sample_fmt == dec->sample_fmt ||
565 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
568 /* if decoder supports more than one output format */
569 if (dec_codec && dec_codec->sample_fmts &&
570 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
571 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
572 const enum AVSampleFormat *p;
573 int min_dec = -1, min_inc = -1;
575 /* find a matching sample format in the encoder */
576 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
577 if (*p == enc->sample_fmt) {
578 dec->request_sample_fmt = *p;
580 } else if (*p > enc->sample_fmt) {
581 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
583 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
586 /* if none match, provide the one that matches quality closest */
587 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
588 enc->sample_fmt - min_dec;
592 static void choose_sample_rate(AVStream *st, AVCodec *codec)
594 if(codec && codec->supported_samplerates){
595 const int *p= codec->supported_samplerates;
597 int best_dist=INT_MAX;
599 int dist= abs(st->codec->sample_rate - *p);
600 if(dist < best_dist){
606 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
608 st->codec->sample_rate= best;
612 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
614 if(codec && codec->pix_fmts){
615 const enum PixelFormat *p= codec->pix_fmts;
616 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
617 if(st->codec->codec_id==CODEC_ID_MJPEG){
618 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
619 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
620 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};
624 if(*p == st->codec->pix_fmt)
628 if(st->codec->pix_fmt != PIX_FMT_NONE)
629 av_log(NULL, AV_LOG_WARNING,
630 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
631 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
633 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
634 st->codec->pix_fmt = codec->pix_fmts[0];
640 get_sync_ipts(const OutputStream *ost)
642 const InputStream *ist = ost->sync_ist;
643 OutputFile *of = &output_files[ost->file_index];
644 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
647 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
651 AVPacket new_pkt= *pkt;
652 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
653 &new_pkt.data, &new_pkt.size,
654 pkt->data, pkt->size,
655 pkt->flags & AV_PKT_FLAG_KEY);
658 new_pkt.destruct= av_destruct_packet;
660 fprintf(stderr, "%s failed for stream %d, codec %s",
661 bsfc->filter->name, pkt->stream_index,
662 avctx->codec ? avctx->codec->name : "copy");
672 ret= av_interleaved_write_frame(s, pkt);
674 print_error("av_interleaved_write_frame()", ret);
679 static void do_audio_out(AVFormatContext *s,
682 unsigned char *buf, int size)
685 int64_t audio_out_size, audio_buf_size;
686 int64_t allocated_for_size= size;
688 int size_out, frame_bytes, ret, resample_changed;
689 AVCodecContext *enc= ost->st->codec;
690 AVCodecContext *dec= ist->st->codec;
691 int osize = av_get_bytes_per_sample(enc->sample_fmt);
692 int isize = av_get_bytes_per_sample(dec->sample_fmt);
693 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
696 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
697 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
698 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
699 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
700 audio_buf_size*= osize*enc->channels;
702 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
703 if(coded_bps > 8*osize)
704 audio_out_size= audio_out_size * coded_bps / (8*osize);
705 audio_out_size += FF_MIN_BUFFER_SIZE;
707 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
708 fprintf(stderr, "Buffer sizes too large\n");
712 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
713 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
714 if (!audio_buf || !audio_out){
715 fprintf(stderr, "Out of memory in do_audio_out\n");
719 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
720 ost->audio_resample = 1;
722 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
723 ost->resample_channels != dec->channels ||
724 ost->resample_sample_rate != dec->sample_rate;
726 if ((ost->audio_resample && !ost->resample) || resample_changed) {
727 if (resample_changed) {
728 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",
729 ist->file_index, ist->st->index,
730 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
731 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
732 ost->resample_sample_fmt = dec->sample_fmt;
733 ost->resample_channels = dec->channels;
734 ost->resample_sample_rate = dec->sample_rate;
736 audio_resample_close(ost->resample);
738 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
739 if (audio_sync_method <= 1 &&
740 ost->resample_sample_fmt == enc->sample_fmt &&
741 ost->resample_channels == enc->channels &&
742 ost->resample_sample_rate == enc->sample_rate) {
743 ost->resample = NULL;
744 ost->audio_resample = 0;
745 } else if (ost->audio_resample) {
746 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
747 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
748 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
749 enc->sample_rate, dec->sample_rate,
750 enc->sample_fmt, dec->sample_fmt,
752 if (!ost->resample) {
753 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
754 dec->channels, dec->sample_rate,
755 enc->channels, enc->sample_rate);
761 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
762 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
763 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
764 if (ost->reformat_ctx)
765 av_audio_convert_free(ost->reformat_ctx);
766 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
767 dec->sample_fmt, 1, NULL, 0);
768 if (!ost->reformat_ctx) {
769 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
770 av_get_sample_fmt_name(dec->sample_fmt),
771 av_get_sample_fmt_name(enc->sample_fmt));
774 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
777 if(audio_sync_method){
778 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
779 - av_fifo_size(ost->fifo)/(enc->channels * 2);
780 double idelta= delta*dec->sample_rate / enc->sample_rate;
781 int byte_delta= ((int)idelta)*2*dec->channels;
783 //FIXME resample delay
784 if(fabs(delta) > 50){
785 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
787 byte_delta= FFMAX(byte_delta, -size);
791 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
796 static uint8_t *input_tmp= NULL;
797 input_tmp= av_realloc(input_tmp, byte_delta + size);
799 if(byte_delta > allocated_for_size - size){
800 allocated_for_size= byte_delta + (int64_t)size;
805 memset(input_tmp, 0, byte_delta);
806 memcpy(input_tmp + byte_delta, buf, size);
810 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
812 }else if(audio_sync_method>1){
813 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
814 av_assert0(ost->audio_resample);
816 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
817 // 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));
818 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
822 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
823 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
825 if (ost->audio_resample) {
827 size_out = audio_resample(ost->resample,
828 (short *)buftmp, (short *)buf,
829 size / (dec->channels * isize));
830 size_out = size_out * enc->channels * osize;
836 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
837 const void *ibuf[6]= {buftmp};
838 void *obuf[6]= {audio_buf};
839 int istride[6]= {isize};
840 int ostride[6]= {osize};
841 int len= size_out/istride[0];
842 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
843 printf("av_audio_convert() failed\n");
849 size_out = len*osize;
852 /* now encode as many frames as possible */
853 if (enc->frame_size > 1) {
854 /* output resampled raw samples */
855 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
856 fprintf(stderr, "av_fifo_realloc2() failed\n");
859 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
861 frame_bytes = enc->frame_size * osize * enc->channels;
863 while (av_fifo_size(ost->fifo) >= frame_bytes) {
865 av_init_packet(&pkt);
867 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
869 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
871 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
874 fprintf(stderr, "Audio encoding failed\n");
878 pkt.stream_index= ost->index;
881 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
882 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
883 pkt.flags |= AV_PKT_FLAG_KEY;
884 write_frame(s, &pkt, enc, ost->bitstream_filters);
886 ost->sync_opts += enc->frame_size;
890 av_init_packet(&pkt);
892 ost->sync_opts += size_out / (osize * enc->channels);
894 /* output a pcm frame */
895 /* determine the size of the coded buffer */
898 size_out = size_out*coded_bps/8;
900 if(size_out > audio_out_size){
901 fprintf(stderr, "Internal error, buffer size too small\n");
905 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
906 ret = avcodec_encode_audio(enc, audio_out, size_out,
909 fprintf(stderr, "Audio encoding failed\n");
913 pkt.stream_index= ost->index;
916 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
917 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
918 pkt.flags |= AV_PKT_FLAG_KEY;
919 write_frame(s, &pkt, enc, ost->bitstream_filters);
923 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
927 AVPicture picture_tmp;
930 dec = ist->st->codec;
932 /* deinterlace : must be done before any resize */
933 if (do_deinterlace) {
936 /* create temporary picture */
937 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
938 buf = av_malloc(size);
942 picture2 = &picture_tmp;
943 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
945 if(avpicture_deinterlace(picture2, picture,
946 dec->pix_fmt, dec->width, dec->height) < 0) {
947 /* if error, do not deinterlace */
948 fprintf(stderr, "Deinterlacing failed\n");
957 if (picture != picture2)
958 *picture = *picture2;
962 static void do_subtitle_out(AVFormatContext *s,
968 static uint8_t *subtitle_out = NULL;
969 int subtitle_out_max_size = 1024 * 1024;
970 int subtitle_out_size, nb, i;
974 if (pts == AV_NOPTS_VALUE) {
975 fprintf(stderr, "Subtitle packets must have a pts\n");
981 enc = ost->st->codec;
984 subtitle_out = av_malloc(subtitle_out_max_size);
987 /* Note: DVB subtitle need one packet to draw them and one other
988 packet to clear them */
989 /* XXX: signal it in the codec context ? */
990 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
995 for(i = 0; i < nb; i++) {
996 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
997 // start_display_time is required to be 0
998 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
999 sub->end_display_time -= sub->start_display_time;
1000 sub->start_display_time = 0;
1001 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1002 subtitle_out_max_size, sub);
1003 if (subtitle_out_size < 0) {
1004 fprintf(stderr, "Subtitle encoding failed\n");
1008 av_init_packet(&pkt);
1009 pkt.stream_index = ost->index;
1010 pkt.data = subtitle_out;
1011 pkt.size = subtitle_out_size;
1012 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1013 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1014 /* XXX: the pts correction is handled here. Maybe handling
1015 it in the codec would be better */
1017 pkt.pts += 90 * sub->start_display_time;
1019 pkt.pts += 90 * sub->end_display_time;
1021 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1025 static int bit_buffer_size= 1024*256;
1026 static uint8_t *bit_buffer= NULL;
1028 static void do_video_resample(OutputStream *ost,
1030 AVFrame *in_picture,
1031 AVFrame **out_picture)
1033 int resample_changed = 0;
1034 AVCodecContext *dec = ist->st->codec;
1035 *out_picture = in_picture;
1037 resample_changed = ost->resample_width != dec->width ||
1038 ost->resample_height != dec->height ||
1039 ost->resample_pix_fmt != dec->pix_fmt;
1041 if (resample_changed) {
1042 av_log(NULL, AV_LOG_INFO,
1043 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1044 ist->file_index, ist->st->index,
1045 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1046 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1047 if(!ost->video_resample)
1048 ost->video_resample = 1;
1051 #if !CONFIG_AVFILTER
1052 if (ost->video_resample) {
1053 *out_picture = &ost->pict_tmp;
1054 if (resample_changed) {
1055 /* initialize a new scaler context */
1056 sws_freeContext(ost->img_resample_ctx);
1057 ost->img_resample_ctx = sws_getContext(
1058 ist->st->codec->width,
1059 ist->st->codec->height,
1060 ist->st->codec->pix_fmt,
1061 ost->st->codec->width,
1062 ost->st->codec->height,
1063 ost->st->codec->pix_fmt,
1064 ost->sws_flags, NULL, NULL, NULL);
1065 if (ost->img_resample_ctx == NULL) {
1066 fprintf(stderr, "Cannot get resampling context\n");
1070 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1071 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1074 if (resample_changed) {
1075 avfilter_graph_free(&ost->graph);
1076 if (configure_video_filters(ist, ost)) {
1077 fprintf(stderr, "Error reinitialising filters!\n");
1082 if (resample_changed) {
1083 ost->resample_width = dec->width;
1084 ost->resample_height = dec->height;
1085 ost->resample_pix_fmt = dec->pix_fmt;
1090 static void do_video_out(AVFormatContext *s,
1093 AVFrame *in_picture,
1094 int *frame_size, float quality)
1096 int nb_frames, i, ret, format_video_sync;
1097 AVFrame *final_picture;
1098 AVCodecContext *enc, *dec;
1101 enc = ost->st->codec;
1102 dec = ist->st->codec;
1104 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1106 /* by default, we output a single frame */
1111 format_video_sync = video_sync_method;
1112 if (format_video_sync < 0)
1113 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1115 if (format_video_sync) {
1116 double vdelta = sync_ipts - ost->sync_opts;
1117 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1120 else if (format_video_sync == 2) {
1123 }else if(vdelta>0.6)
1124 ost->sync_opts= lrintf(sync_ipts);
1125 }else if (vdelta > 1.1)
1126 nb_frames = lrintf(vdelta);
1127 //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);
1128 if (nb_frames == 0){
1131 fprintf(stderr, "*** drop!\n");
1132 }else if (nb_frames > 1) {
1133 nb_frames_dup += nb_frames - 1;
1135 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1138 ost->sync_opts= lrintf(sync_ipts);
1140 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1144 do_video_resample(ost, ist, in_picture, &final_picture);
1146 /* duplicates frame if needed */
1147 for(i=0;i<nb_frames;i++) {
1149 av_init_packet(&pkt);
1150 pkt.stream_index= ost->index;
1152 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1153 /* raw pictures are written as AVPicture structure to
1154 avoid any copies. We support temorarily the older
1156 AVFrame* old_frame = enc->coded_frame;
1157 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1158 pkt.data= (uint8_t *)final_picture;
1159 pkt.size= sizeof(AVPicture);
1160 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1161 pkt.flags |= AV_PKT_FLAG_KEY;
1163 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1164 enc->coded_frame = old_frame;
1166 AVFrame big_picture;
1168 big_picture= *final_picture;
1169 /* better than nothing: use input picture interlaced
1171 big_picture.interlaced_frame = in_picture->interlaced_frame;
1172 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1173 if(top_field_first == -1)
1174 big_picture.top_field_first = in_picture->top_field_first;
1176 big_picture.top_field_first = top_field_first;
1179 /* handles same_quant here. This is not correct because it may
1180 not be a global option */
1181 big_picture.quality = quality;
1183 big_picture.pict_type = 0;
1184 // big_picture.pts = AV_NOPTS_VALUE;
1185 big_picture.pts= ost->sync_opts;
1186 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1187 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1188 if (ost->forced_kf_index < ost->forced_kf_count &&
1189 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1190 big_picture.pict_type = AV_PICTURE_TYPE_I;
1191 ost->forced_kf_index++;
1193 ret = avcodec_encode_video(enc,
1194 bit_buffer, bit_buffer_size,
1197 fprintf(stderr, "Video encoding failed\n");
1202 pkt.data= bit_buffer;
1204 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1205 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1206 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1207 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1208 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1210 if(enc->coded_frame->key_frame)
1211 pkt.flags |= AV_PKT_FLAG_KEY;
1212 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1215 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1216 // enc->frame_number-1, ret, enc->pict_type);
1217 /* if two pass, output log */
1218 if (ost->logfile && enc->stats_out) {
1219 fprintf(ost->logfile, "%s", enc->stats_out);
1224 ost->frame_number++;
1228 static double psnr(double d){
1229 return -10.0*log(d)/log(10.0);
1232 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1235 AVCodecContext *enc;
1237 double ti1, bitrate, avg_bitrate;
1239 /* this is executed just the first time do_video_stats is called */
1241 vstats_file = fopen(vstats_filename, "w");
1248 enc = ost->st->codec;
1249 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1250 frame_number = ost->frame_number;
1251 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1252 if (enc->flags&CODEC_FLAG_PSNR)
1253 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1255 fprintf(vstats_file,"f_size= %6d ", frame_size);
1256 /* compute pts value */
1257 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1261 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1262 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1263 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1264 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1265 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1269 static void print_report(OutputFile *output_files,
1270 OutputStream *ost_table, int nb_ostreams,
1271 int is_last_report, int64_t timer_start)
1275 AVFormatContext *oc;
1277 AVCodecContext *enc;
1278 int frame_number, vid, i;
1279 double bitrate, ti1, pts;
1280 static int64_t last_time = -1;
1281 static int qp_histogram[52];
1283 if (!is_last_report) {
1285 /* display the report every 0.5 seconds */
1286 cur_time = av_gettime();
1287 if (last_time == -1) {
1288 last_time = cur_time;
1291 if ((cur_time - last_time) < 500000)
1293 last_time = cur_time;
1297 oc = output_files[0].ctx;
1299 total_size = avio_size(oc->pb);
1300 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1301 total_size= avio_tell(oc->pb);
1306 for(i=0;i<nb_ostreams;i++) {
1308 ost = &ost_table[i];
1309 enc = ost->st->codec;
1310 if (!ost->st->stream_copy && enc->coded_frame)
1311 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1312 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1313 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1315 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1316 float t = (av_gettime()-timer_start) / 1000000.0;
1318 frame_number = ost->frame_number;
1319 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1320 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1322 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1326 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1329 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1331 if (enc->flags&CODEC_FLAG_PSNR){
1333 double error, error_sum=0;
1334 double scale, scale_sum=0;
1335 char type[3]= {'Y','U','V'};
1336 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1339 error= enc->error[j];
1340 scale= enc->width*enc->height*255.0*255.0*frame_number;
1342 error= enc->coded_frame->error[j];
1343 scale= enc->width*enc->height*255.0*255.0;
1348 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1350 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1354 /* compute min output value */
1355 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1356 if ((pts < ti1) && (pts > 0))
1362 if (verbose > 0 || is_last_report) {
1363 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1365 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1366 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1367 (double)total_size / 1024, ti1, bitrate);
1369 if (nb_frames_dup || nb_frames_drop)
1370 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1371 nb_frames_dup, nb_frames_drop);
1374 fprintf(stderr, "%s \r", buf);
1379 if (is_last_report && verbose >= 0){
1380 int64_t raw= audio_size + video_size + extra_size;
1381 fprintf(stderr, "\n");
1382 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1386 100.0*(total_size - raw)/raw
1391 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1393 int fill_char = 0x00;
1394 if (sample_fmt == AV_SAMPLE_FMT_U8)
1396 memset(buf, fill_char, size);
1399 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1400 static int output_packet(InputStream *ist, int ist_index,
1401 OutputStream *ost_table, int nb_ostreams,
1402 const AVPacket *pkt)
1404 AVFormatContext *os;
1409 void *buffer_to_free = NULL;
1410 static unsigned int samples_size= 0;
1411 AVSubtitle subtitle, *subtitle_to_free;
1412 int64_t pkt_pts = AV_NOPTS_VALUE;
1414 int frame_available;
1419 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1421 if(ist->next_pts == AV_NOPTS_VALUE)
1422 ist->next_pts= ist->pts;
1426 av_init_packet(&avpkt);
1434 if(pkt->dts != AV_NOPTS_VALUE)
1435 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1436 if(pkt->pts != AV_NOPTS_VALUE)
1437 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1439 //while we have more to decode or while the decoder did output something on EOF
1440 while (avpkt.size > 0 || (!pkt && got_output)) {
1441 uint8_t *data_buf, *decoded_data_buf;
1442 int data_size, decoded_data_size;
1444 ist->pts= ist->next_pts;
1446 if(avpkt.size && avpkt.size != pkt->size &&
1447 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1448 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1449 ist->showed_multi_packet_warning=1;
1452 /* decode the packet if needed */
1453 decoded_data_buf = NULL; /* fail safe */
1454 decoded_data_size= 0;
1455 data_buf = avpkt.data;
1456 data_size = avpkt.size;
1457 subtitle_to_free = NULL;
1458 if (ist->decoding_needed) {
1459 switch(ist->st->codec->codec_type) {
1460 case AVMEDIA_TYPE_AUDIO:{
1461 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1462 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1464 samples= av_malloc(samples_size);
1466 decoded_data_size= samples_size;
1467 /* XXX: could avoid copy if PCM 16 bits with same
1468 endianness as CPU */
1469 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1476 got_output = decoded_data_size > 0;
1477 /* Some bug in mpeg audio decoder gives */
1478 /* decoded_data_size < 0, it seems they are overflows */
1480 /* no audio frame */
1483 decoded_data_buf = (uint8_t *)samples;
1484 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1485 (ist->st->codec->sample_rate * ist->st->codec->channels);
1487 case AVMEDIA_TYPE_VIDEO:
1488 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1489 /* XXX: allocate picture correctly */
1490 avcodec_get_frame_defaults(&picture);
1491 avpkt.pts = pkt_pts;
1492 avpkt.dts = ist->pts;
1493 pkt_pts = AV_NOPTS_VALUE;
1495 ret = avcodec_decode_video2(ist->st->codec,
1496 &picture, &got_output, &avpkt);
1497 quality = same_quant ? picture.quality : 0;
1501 /* no picture yet */
1502 goto discard_packet;
1504 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1505 if (ist->st->codec->time_base.num != 0) {
1506 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1507 ist->next_pts += ((int64_t)AV_TIME_BASE *
1508 ist->st->codec->time_base.num * ticks) /
1509 ist->st->codec->time_base.den;
1512 buffer_to_free = NULL;
1513 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1515 case AVMEDIA_TYPE_SUBTITLE:
1516 ret = avcodec_decode_subtitle2(ist->st->codec,
1517 &subtitle, &got_output, &avpkt);
1521 goto discard_packet;
1523 subtitle_to_free = &subtitle;
1530 switch(ist->st->codec->codec_type) {
1531 case AVMEDIA_TYPE_AUDIO:
1532 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1533 ist->st->codec->sample_rate;
1535 case AVMEDIA_TYPE_VIDEO:
1536 if (ist->st->codec->time_base.num != 0) {
1537 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1538 ist->next_pts += ((int64_t)AV_TIME_BASE *
1539 ist->st->codec->time_base.num * ticks) /
1540 ist->st->codec->time_base.den;
1548 // preprocess audio (volume)
1549 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1550 if (audio_volume != 256) {
1553 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1554 int v = ((*volp) * audio_volume + 128) >> 8;
1555 if (v < -32768) v = -32768;
1556 if (v > 32767) v = 32767;
1562 /* frame rate emulation */
1564 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1565 int64_t now = av_gettime() - ist->start;
1569 /* if output time reached then transcode raw format,
1570 encode packets and output them */
1571 for (i = 0; i < nb_ostreams; i++) {
1572 OutputFile *of = &output_files[ost_table[i].file_index];
1575 ost = &ost_table[i];
1576 if (ost->source_index != ist_index)
1579 if (of->start_time && ist->pts < of->start_time)
1582 if (of->recording_time != INT64_MAX &&
1583 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1584 (AVRational){1, 1000000}) >= 0) {
1585 ost->is_past_recording_time = 1;
1590 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1591 ost->input_video_filter) {
1593 if (ist->st->sample_aspect_ratio.num)
1594 sar = ist->st->sample_aspect_ratio;
1596 sar = ist->st->codec->sample_aspect_ratio;
1597 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1599 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1600 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1601 while (frame_available) {
1602 AVRational ist_pts_tb;
1603 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1604 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1606 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1608 os = output_files[ost->file_index].ctx;
1610 /* set the input output pts pairs */
1611 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1613 if (ost->encoding_needed) {
1614 av_assert0(ist->decoding_needed);
1615 switch(ost->st->codec->codec_type) {
1616 case AVMEDIA_TYPE_AUDIO:
1617 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1619 case AVMEDIA_TYPE_VIDEO:
1621 if (ost->picref->video && !ost->frame_aspect_ratio)
1622 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1624 do_video_out(os, ost, ist, &picture, &frame_size,
1625 same_quant ? quality : ost->st->codec->global_quality);
1626 if (vstats_filename && frame_size)
1627 do_video_stats(os, ost, frame_size);
1629 case AVMEDIA_TYPE_SUBTITLE:
1630 do_subtitle_out(os, ost, ist, &subtitle,
1637 AVFrame avframe; //FIXME/XXX remove this
1639 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1641 av_init_packet(&opkt);
1643 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1644 #if !CONFIG_AVFILTER
1650 /* no reencoding needed : output the packet directly */
1651 /* force the input stream PTS */
1653 avcodec_get_frame_defaults(&avframe);
1654 ost->st->codec->coded_frame= &avframe;
1655 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1657 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1658 audio_size += data_size;
1659 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1660 video_size += data_size;
1664 opkt.stream_index= ost->index;
1665 if(pkt->pts != AV_NOPTS_VALUE)
1666 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1668 opkt.pts= AV_NOPTS_VALUE;
1670 if (pkt->dts == AV_NOPTS_VALUE)
1671 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1673 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1674 opkt.dts -= ost_tb_start_time;
1676 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1677 opkt.flags= pkt->flags;
1679 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1680 if( ost->st->codec->codec_id != CODEC_ID_H264
1681 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1682 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1684 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1685 opkt.destruct= av_destruct_packet;
1687 opkt.data = data_buf;
1688 opkt.size = data_size;
1691 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1692 ost->st->codec->frame_number++;
1693 ost->frame_number++;
1694 av_free_packet(&opkt);
1698 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1699 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1701 avfilter_unref_buffer(ost->picref);
1706 av_free(buffer_to_free);
1707 /* XXX: allocate the subtitles in the codec ? */
1708 if (subtitle_to_free) {
1709 avsubtitle_free(subtitle_to_free);
1710 subtitle_to_free = NULL;
1717 for(i=0;i<nb_ostreams;i++) {
1718 ost = &ost_table[i];
1719 if (ost->source_index == ist_index) {
1720 AVCodecContext *enc= ost->st->codec;
1721 os = output_files[ost->file_index].ctx;
1723 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1725 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1728 if (ost->encoding_needed) {
1732 av_init_packet(&pkt);
1733 pkt.stream_index= ost->index;
1735 switch(ost->st->codec->codec_type) {
1736 case AVMEDIA_TYPE_AUDIO:
1737 fifo_bytes = av_fifo_size(ost->fifo);
1739 /* encode any samples remaining in fifo */
1740 if (fifo_bytes > 0) {
1741 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1742 int fs_tmp = enc->frame_size;
1744 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1745 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1746 enc->frame_size = fifo_bytes / (osize * enc->channels);
1748 int frame_bytes = enc->frame_size*osize*enc->channels;
1749 if (allocated_audio_buf_size < frame_bytes)
1751 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1754 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1755 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1756 ost->st->time_base.num, enc->sample_rate);
1757 enc->frame_size = fs_tmp;
1760 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1763 fprintf(stderr, "Audio encoding failed\n");
1767 pkt.flags |= AV_PKT_FLAG_KEY;
1769 case AVMEDIA_TYPE_VIDEO:
1770 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1772 fprintf(stderr, "Video encoding failed\n");
1776 if(enc->coded_frame && enc->coded_frame->key_frame)
1777 pkt.flags |= AV_PKT_FLAG_KEY;
1778 if (ost->logfile && enc->stats_out) {
1779 fprintf(ost->logfile, "%s", enc->stats_out);
1788 pkt.data= bit_buffer;
1790 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1791 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1792 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1802 static void print_sdp(OutputFile *output_files, int n)
1806 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1810 for (i = 0; i < n; i++)
1811 avc[i] = output_files[i].ctx;
1813 av_sdp_create(avc, n, sdp, sizeof(sdp));
1814 printf("SDP:\n%s\n", sdp);
1820 * The following code is the main loop of the file converter
1822 static int transcode(OutputFile *output_files,
1823 int nb_output_files,
1824 InputFile *input_files,
1828 AVFormatContext *is, *os;
1829 AVCodecContext *codec, *icodec;
1835 int no_packet_count=0;
1836 int64_t timer_start;
1838 if (!(no_packet = av_mallocz(nb_input_files)))
1842 for (i = 0; i < nb_input_streams; i++)
1843 input_streams[i].start = av_gettime();
1845 /* output stream init */
1846 for(i=0;i<nb_output_files;i++) {
1847 os = output_files[i].ctx;
1848 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1849 av_dump_format(os, i, os->filename, 1);
1850 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1851 ret = AVERROR(EINVAL);
1856 /* for each output stream, we compute the right encoding parameters */
1857 for (i = 0; i < nb_output_streams; i++) {
1858 ost = &output_streams[i];
1859 os = output_files[ost->file_index].ctx;
1860 ist = &input_streams[ost->source_index];
1862 codec = ost->st->codec;
1863 icodec = ist->st->codec;
1865 ost->st->disposition = ist->st->disposition;
1866 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1867 codec->chroma_sample_location = icodec->chroma_sample_location;
1869 if (ost->st->stream_copy) {
1870 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1872 if (extra_size > INT_MAX)
1875 /* if stream_copy is selected, no need to decode or encode */
1876 codec->codec_id = icodec->codec_id;
1877 codec->codec_type = icodec->codec_type;
1879 if(!codec->codec_tag){
1880 if( !os->oformat->codec_tag
1881 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1882 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1883 codec->codec_tag = icodec->codec_tag;
1886 codec->bit_rate = icodec->bit_rate;
1887 codec->rc_max_rate = icodec->rc_max_rate;
1888 codec->rc_buffer_size = icodec->rc_buffer_size;
1889 codec->extradata= av_mallocz(extra_size);
1890 if (!codec->extradata)
1892 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1893 codec->extradata_size= icodec->extradata_size;
1894 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){
1895 codec->time_base = icodec->time_base;
1896 codec->time_base.num *= icodec->ticks_per_frame;
1897 av_reduce(&codec->time_base.num, &codec->time_base.den,
1898 codec->time_base.num, codec->time_base.den, INT_MAX);
1900 codec->time_base = ist->st->time_base;
1901 switch(codec->codec_type) {
1902 case AVMEDIA_TYPE_AUDIO:
1903 if(audio_volume != 256) {
1904 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1907 codec->channel_layout = icodec->channel_layout;
1908 codec->sample_rate = icodec->sample_rate;
1909 codec->channels = icodec->channels;
1910 codec->frame_size = icodec->frame_size;
1911 codec->audio_service_type = icodec->audio_service_type;
1912 codec->block_align= icodec->block_align;
1913 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1914 codec->block_align= 0;
1915 if(codec->codec_id == CODEC_ID_AC3)
1916 codec->block_align= 0;
1918 case AVMEDIA_TYPE_VIDEO:
1919 codec->pix_fmt = icodec->pix_fmt;
1920 codec->width = icodec->width;
1921 codec->height = icodec->height;
1922 codec->has_b_frames = icodec->has_b_frames;
1923 if (!codec->sample_aspect_ratio.num) {
1924 codec->sample_aspect_ratio =
1925 ost->st->sample_aspect_ratio =
1926 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1927 ist->st->codec->sample_aspect_ratio.num ?
1928 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1931 case AVMEDIA_TYPE_SUBTITLE:
1932 codec->width = icodec->width;
1933 codec->height = icodec->height;
1935 case AVMEDIA_TYPE_DATA:
1942 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1943 switch(codec->codec_type) {
1944 case AVMEDIA_TYPE_AUDIO:
1945 ost->fifo= av_fifo_alloc(1024);
1948 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
1949 if (!codec->sample_rate) {
1950 codec->sample_rate = icodec->sample_rate;
1952 codec->sample_rate >>= icodec->lowres;
1954 choose_sample_rate(ost->st, ost->enc);
1955 codec->time_base = (AVRational){1, codec->sample_rate};
1956 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
1957 codec->sample_fmt = icodec->sample_fmt;
1958 choose_sample_fmt(ost->st, ost->enc);
1959 if (!codec->channels)
1960 codec->channels = icodec->channels;
1961 codec->channel_layout = icodec->channel_layout;
1962 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
1963 codec->channel_layout = 0;
1964 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1965 icodec->request_channels = codec->channels;
1966 ist->decoding_needed = 1;
1967 ost->encoding_needed = 1;
1968 ost->resample_sample_fmt = icodec->sample_fmt;
1969 ost->resample_sample_rate = icodec->sample_rate;
1970 ost->resample_channels = icodec->channels;
1972 case AVMEDIA_TYPE_VIDEO:
1973 if (codec->pix_fmt == PIX_FMT_NONE)
1974 codec->pix_fmt = icodec->pix_fmt;
1975 choose_pixel_fmt(ost->st, ost->enc);
1977 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1978 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
1982 if (!codec->width || !codec->height) {
1983 codec->width = icodec->width;
1984 codec->height = icodec->height;
1987 ost->video_resample = codec->width != icodec->width ||
1988 codec->height != icodec->height ||
1989 codec->pix_fmt != icodec->pix_fmt;
1990 if (ost->video_resample) {
1991 #if !CONFIG_AVFILTER
1992 avcodec_get_frame_defaults(&ost->pict_tmp);
1993 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1994 codec->width, codec->height)) {
1995 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1998 ost->img_resample_ctx = sws_getContext(
2005 ost->sws_flags, NULL, NULL, NULL);
2006 if (ost->img_resample_ctx == NULL) {
2007 fprintf(stderr, "Cannot get resampling context\n");
2011 codec->bits_per_raw_sample= 0;
2014 ost->resample_height = icodec->height;
2015 ost->resample_width = icodec->width;
2016 ost->resample_pix_fmt= icodec->pix_fmt;
2017 ost->encoding_needed = 1;
2018 ist->decoding_needed = 1;
2020 if (!ost->frame_rate.num)
2021 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2022 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2023 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2024 ost->frame_rate = ost->enc->supported_framerates[idx];
2026 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2029 if (configure_video_filters(ist, ost)) {
2030 fprintf(stderr, "Error opening filters!\n");
2035 case AVMEDIA_TYPE_SUBTITLE:
2036 ost->encoding_needed = 1;
2037 ist->decoding_needed = 1;
2044 if (ost->encoding_needed &&
2045 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2046 char logfilename[1024];
2049 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2050 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2052 if (codec->flags & CODEC_FLAG_PASS1) {
2053 f = fopen(logfilename, "wb");
2055 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2061 size_t logbuffer_size;
2062 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2063 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2066 codec->stats_in = logbuffer;
2070 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2071 int size= codec->width * codec->height;
2072 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2077 bit_buffer = av_malloc(bit_buffer_size);
2079 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2081 ret = AVERROR(ENOMEM);
2085 /* open each encoder */
2086 for (i = 0; i < nb_output_streams; i++) {
2087 ost = &output_streams[i];
2088 if (ost->encoding_needed) {
2089 AVCodec *codec = ost->enc;
2090 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2092 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2093 ost->st->codec->codec_id, ost->file_index, ost->index);
2094 ret = AVERROR(EINVAL);
2097 if (dec->subtitle_header) {
2098 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2099 if (!ost->st->codec->subtitle_header) {
2100 ret = AVERROR(ENOMEM);
2103 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2104 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2106 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2107 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2108 ost->file_index, ost->index);
2109 ret = AVERROR(EINVAL);
2112 assert_codec_experimental(ost->st->codec, 1);
2113 assert_avoptions(ost->opts);
2114 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2115 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2116 "It takes bits/s as argument, not kbits/s\n");
2117 extra_size += ost->st->codec->extradata_size;
2121 /* open each decoder */
2122 for (i = 0; i < nb_input_streams; i++) {
2123 ist = &input_streams[i];
2124 if (ist->decoding_needed) {
2125 AVCodec *codec = ist->dec;
2127 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2129 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2130 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2131 ret = AVERROR(EINVAL);
2135 /* update requested sample format for the decoder based on the
2136 corresponding encoder sample format */
2137 for (j = 0; j < nb_output_streams; j++) {
2138 ost = &output_streams[j];
2139 if (ost->source_index == i) {
2140 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2145 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2146 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2147 ist->file_index, ist->st->index);
2148 ret = AVERROR(EINVAL);
2151 assert_codec_experimental(ist->st->codec, 0);
2152 assert_avoptions(ost->opts);
2157 for (i = 0; i < nb_input_streams; i++) {
2159 ist = &input_streams[i];
2161 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2162 ist->next_pts = AV_NOPTS_VALUE;
2163 init_pts_correction(&ist->pts_ctx);
2167 /* open files and write file headers */
2168 for (i = 0; i < nb_output_files; i++) {
2169 os = output_files[i].ctx;
2170 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2171 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2172 ret = AVERROR(EINVAL);
2175 assert_avoptions(output_files[i].opts);
2176 if (strcmp(os->oformat->name, "rtp")) {
2182 /* dump the file output parameters - cannot be done before in case
2184 for(i=0;i<nb_output_files;i++) {
2185 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2188 /* dump the stream mapping */
2190 fprintf(stderr, "Stream mapping:\n");
2191 for (i = 0; i < nb_output_streams;i ++) {
2192 ost = &output_streams[i];
2193 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2194 input_streams[ost->source_index].file_index,
2195 input_streams[ost->source_index].st->index,
2198 if (ost->sync_ist != &input_streams[ost->source_index])
2199 fprintf(stderr, " [sync #%d.%d]",
2200 ost->sync_ist->file_index,
2201 ost->sync_ist->st->index);
2202 if (ost->st->stream_copy)
2203 fprintf(stderr, " (copy)");
2204 fprintf(stderr, "\n");
2209 fprintf(stderr, "%s\n", error);
2214 print_sdp(output_files, nb_output_files);
2218 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2221 timer_start = av_gettime();
2223 for(; received_sigterm == 0;) {
2224 int file_index, ist_index;
2230 ipts_min = INT64_MAX;
2233 /* select the stream that we must read now by looking at the
2234 smallest output pts */
2236 for (i = 0; i < nb_output_streams; i++) {
2239 ost = &output_streams[i];
2240 os = output_files[ost->file_index].ctx;
2241 ist = &input_streams[ost->source_index];
2242 if(ost->is_past_recording_time || no_packet[ist->file_index])
2244 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2246 if (!input_files[ist->file_index].eof_reached){
2247 if(ipts < ipts_min) {
2249 if(input_sync ) file_index = ist->file_index;
2251 if(opts < opts_min) {
2253 if(!input_sync) file_index = ist->file_index;
2256 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2261 /* if none, if is finished */
2262 if (file_index < 0) {
2263 if(no_packet_count){
2265 memset(no_packet, 0, nb_input_files);
2272 /* finish if limit size exhausted */
2273 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2276 /* read a frame from it and output it in the fifo */
2277 is = input_files[file_index].ctx;
2278 ret= av_read_frame(is, &pkt);
2279 if(ret == AVERROR(EAGAIN)){
2280 no_packet[file_index]=1;
2285 input_files[file_index].eof_reached = 1;
2293 memset(no_packet, 0, nb_input_files);
2296 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2297 is->streams[pkt.stream_index]);
2299 /* the following test is needed in case new streams appear
2300 dynamically in stream : we ignore them */
2301 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2302 goto discard_packet;
2303 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2304 ist = &input_streams[ist_index];
2306 goto discard_packet;
2308 if (pkt.dts != AV_NOPTS_VALUE)
2309 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2310 if (pkt.pts != AV_NOPTS_VALUE)
2311 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2313 if (ist->ts_scale) {
2314 if(pkt.pts != AV_NOPTS_VALUE)
2315 pkt.pts *= ist->ts_scale;
2316 if(pkt.dts != AV_NOPTS_VALUE)
2317 pkt.dts *= ist->ts_scale;
2320 // 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);
2321 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2322 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2323 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2324 int64_t delta= pkt_dts - ist->next_pts;
2325 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2326 input_files[ist->file_index].ts_offset -= delta;
2328 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2329 delta, input_files[ist->file_index].ts_offset);
2330 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2331 if(pkt.pts != AV_NOPTS_VALUE)
2332 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2336 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2337 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2340 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2341 ist->file_index, ist->st->index);
2344 av_free_packet(&pkt);
2349 av_free_packet(&pkt);
2351 /* dump report by using the output first video and audio streams */
2352 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2355 /* at the end of stream, we must flush the decoder buffers */
2356 for (i = 0; i < nb_input_streams; i++) {
2357 ist = &input_streams[i];
2358 if (ist->decoding_needed) {
2359 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2365 /* write the trailer if needed and close file */
2366 for(i=0;i<nb_output_files;i++) {
2367 os = output_files[i].ctx;
2368 av_write_trailer(os);
2371 /* dump report by using the first video and audio streams */
2372 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2374 /* close each encoder */
2375 for (i = 0; i < nb_output_streams; i++) {
2376 ost = &output_streams[i];
2377 if (ost->encoding_needed) {
2378 av_freep(&ost->st->codec->stats_in);
2379 avcodec_close(ost->st->codec);
2382 avfilter_graph_free(&ost->graph);
2386 /* close each decoder */
2387 for (i = 0; i < nb_input_streams; i++) {
2388 ist = &input_streams[i];
2389 if (ist->decoding_needed) {
2390 avcodec_close(ist->st->codec);
2398 av_freep(&bit_buffer);
2399 av_freep(&no_packet);
2401 if (output_streams) {
2402 for (i = 0; i < nb_output_streams; i++) {
2403 ost = &output_streams[i];
2405 if (ost->st->stream_copy)
2406 av_freep(&ost->st->codec->extradata);
2408 fclose(ost->logfile);
2409 ost->logfile = NULL;
2411 av_fifo_free(ost->fifo); /* works even if fifo is not
2412 initialized but set to zero */
2413 av_freep(&ost->st->codec->subtitle_header);
2414 av_free(ost->pict_tmp.data[0]);
2415 av_free(ost->forced_kf_pts);
2416 if (ost->video_resample)
2417 sws_freeContext(ost->img_resample_ctx);
2419 audio_resample_close(ost->resample);
2420 if (ost->reformat_ctx)
2421 av_audio_convert_free(ost->reformat_ctx);
2422 av_dict_free(&ost->opts);
2429 static int opt_format(const char *opt, const char *arg)
2431 last_asked_format = arg;
2435 static int opt_video_rc_override_string(const char *opt, const char *arg)
2437 video_rc_override_string = arg;
2441 static int opt_me_threshold(const char *opt, const char *arg)
2443 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2447 static int opt_verbose(const char *opt, const char *arg)
2449 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2453 static int opt_frame_rate(const char *opt, const char *arg)
2455 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2456 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2462 static int opt_frame_crop(const char *opt, const char *arg)
2464 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2465 return AVERROR(EINVAL);
2468 static int opt_frame_size(const char *opt, const char *arg)
2470 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2471 fprintf(stderr, "Incorrect frame size\n");
2472 return AVERROR(EINVAL);
2477 static int opt_pad(const char *opt, const char *arg) {
2478 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2482 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2484 if (strcmp(arg, "list")) {
2485 frame_pix_fmt = av_get_pix_fmt(arg);
2486 if (frame_pix_fmt == PIX_FMT_NONE) {
2487 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2488 return AVERROR(EINVAL);
2497 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2504 p = strchr(arg, ':');
2506 x = strtol(arg, &end, 10);
2508 y = strtol(end+1, &end, 10);
2510 ar = (double)x / (double)y;
2512 ar = strtod(arg, NULL);
2515 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2516 return AVERROR(EINVAL);
2518 frame_aspect_ratio = ar;
2522 static int opt_metadata(const char *opt, const char *arg)
2524 char *mid= strchr(arg, '=');
2527 fprintf(stderr, "Missing =\n");
2532 av_dict_set(&metadata, arg, mid, 0);
2537 static int opt_qscale(const char *opt, const char *arg)
2539 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2540 if (video_qscale == 0) {
2541 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2542 return AVERROR(EINVAL);
2547 static int opt_top_field_first(const char *opt, const char *arg)
2549 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2553 static int opt_thread_count(const char *opt, const char *arg)
2555 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2558 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2563 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2565 if (strcmp(arg, "list")) {
2566 audio_sample_fmt = av_get_sample_fmt(arg);
2567 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2568 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2569 return AVERROR(EINVAL);
2574 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2575 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2581 static int opt_audio_rate(const char *opt, const char *arg)
2583 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2587 static int opt_audio_channels(const char *opt, const char *arg)
2589 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2593 static int opt_codec(const char *opt, const char *arg)
2595 return av_dict_set(&codec_names, opt, arg, 0);
2598 static int opt_audio_codec(const char *opt, const char *arg)
2600 return opt_codec("codec:a", arg);
2603 static int opt_video_codec(const char *opt, const char *arg)
2605 return opt_codec("codec:v", arg);
2608 static int opt_subtitle_codec(const char *opt, const char *arg)
2610 return opt_codec("codec:s", arg);
2613 static int opt_data_codec(const char *opt, const char *arg)
2615 return opt_codec("codec:d", arg);
2618 static int opt_codec_tag(const char *opt, const char *arg)
2621 uint32_t *codec_tag;
2623 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2624 !strcmp(opt, "vtag") ? &video_codec_tag :
2625 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2629 *codec_tag = strtol(arg, &tail, 0);
2631 *codec_tag = AV_RL32(arg);
2636 static int opt_map(const char *opt, const char *arg)
2638 StreamMap *m = NULL;
2639 int i, negative = 0, file_idx;
2640 int sync_file_idx = -1, sync_stream_idx;
2648 map = av_strdup(arg);
2650 /* parse sync stream first, just pick first matching stream */
2651 if (sync = strchr(map, ',')) {
2653 sync_file_idx = strtol(sync + 1, &sync, 0);
2654 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2655 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2660 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2661 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2662 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2663 sync_stream_idx = i;
2666 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2667 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2668 "match any streams.\n", arg);
2674 file_idx = strtol(map, &p, 0);
2675 if (file_idx >= nb_input_files || file_idx < 0) {
2676 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2680 /* disable some already defined maps */
2681 for (i = 0; i < nb_stream_maps; i++) {
2682 m = &stream_maps[i];
2683 if (check_stream_specifier(input_files[m->file_index].ctx,
2684 input_files[m->file_index].ctx->streams[m->stream_index],
2685 *p == ':' ? p + 1 : p) > 0)
2689 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2690 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2691 *p == ':' ? p + 1 : p) <= 0)
2693 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2694 m = &stream_maps[nb_stream_maps - 1];
2696 m->file_index = file_idx;
2697 m->stream_index = i;
2699 if (sync_file_idx >= 0) {
2700 m->sync_file_index = sync_file_idx;
2701 m->sync_stream_index = sync_stream_idx;
2703 m->sync_file_index = file_idx;
2704 m->sync_stream_index = i;
2709 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2717 static void parse_meta_type(char *arg, char *type, int *index)
2727 if (*(++arg) == ':')
2728 *index = strtol(++arg, NULL, 0);
2731 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2738 static int opt_map_metadata(const char *opt, const char *arg)
2740 MetadataMap *m, *m1;
2743 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2744 &nb_meta_data_maps, nb_meta_data_maps + 1);
2746 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2747 m->file = strtol(arg, &p, 0);
2748 parse_meta_type(p, &m->type, &m->index);
2750 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2751 if (p = strchr(opt, ':'))
2752 parse_meta_type(p, &m1->type, &m1->index);
2756 if (m->type == 'g' || m1->type == 'g')
2757 metadata_global_autocopy = 0;
2758 if (m->type == 's' || m1->type == 's')
2759 metadata_streams_autocopy = 0;
2760 if (m->type == 'c' || m1->type == 'c')
2761 metadata_chapters_autocopy = 0;
2766 static int opt_input_ts_scale(const char *opt, const char *arg)
2768 return av_dict_set(&ts_scale, opt, arg, 0);
2771 static int opt_recording_time(const char *opt, const char *arg)
2773 recording_time = parse_time_or_die(opt, arg, 1);
2777 static int opt_start_time(const char *opt, const char *arg)
2779 start_time = parse_time_or_die(opt, arg, 1);
2783 static int opt_input_ts_offset(const char *opt, const char *arg)
2785 input_ts_offset = parse_time_or_die(opt, arg, 1);
2789 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2791 const char *codec_string = encoder ? "encoder" : "decoder";
2795 return CODEC_ID_NONE;
2797 avcodec_find_encoder_by_name(name) :
2798 avcodec_find_decoder_by_name(name);
2800 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2803 if(codec->type != type) {
2804 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2810 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2812 AVDictionaryEntry *e = NULL;
2813 char *codec_name = NULL;
2816 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2817 char *p = strchr(e->key, ':');
2819 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2820 codec_name = e->value;
2827 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2828 return avcodec_find_encoder(st->codec->codec_id);
2830 } else if (!strcmp(codec_name, "copy"))
2831 st->stream_copy = 1;
2833 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2834 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2835 avcodec_find_decoder_by_name(codec_name);
2842 * Add all the streams from the given input file to the global
2843 * list of input streams.
2845 static void add_input_streams(AVFormatContext *ic)
2847 int i, rfps, rfps_base, ret;
2849 for (i = 0; i < ic->nb_streams; i++) {
2850 AVStream *st = ic->streams[i];
2851 AVCodecContext *dec = st->codec;
2852 AVDictionaryEntry *e = NULL;
2856 dec->thread_count = thread_count;
2858 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2859 ist = &input_streams[nb_input_streams - 1];
2861 ist->file_index = nb_input_files;
2863 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2865 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2866 char *p = strchr(e->key, ':');
2868 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2874 ist->ts_scale = strtod(scale, NULL);
2876 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
2878 switch (dec->codec_type) {
2879 case AVMEDIA_TYPE_AUDIO:
2881 st->discard= AVDISCARD_ALL;
2883 case AVMEDIA_TYPE_VIDEO:
2884 rfps = ic->streams[i]->r_frame_rate.num;
2885 rfps_base = ic->streams[i]->r_frame_rate.den;
2887 dec->flags |= CODEC_FLAG_EMU_EDGE;
2888 dec->height >>= dec->lowres;
2889 dec->width >>= dec->lowres;
2892 dec->debug |= FF_DEBUG_MV;
2894 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2897 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2898 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2900 (float)rfps / rfps_base, rfps, rfps_base);
2904 st->discard= AVDISCARD_ALL;
2905 else if(video_discard)
2906 st->discard= video_discard;
2908 case AVMEDIA_TYPE_DATA:
2910 case AVMEDIA_TYPE_SUBTITLE:
2911 if(subtitle_disable)
2912 st->discard = AVDISCARD_ALL;
2914 case AVMEDIA_TYPE_ATTACHMENT:
2915 case AVMEDIA_TYPE_UNKNOWN:
2923 static int opt_input_file(const char *opt, const char *filename)
2925 AVFormatContext *ic;
2926 AVInputFormat *file_iformat = NULL;
2930 AVDictionary **opts;
2931 int orig_nb_streams; // number of streams before avformat_find_stream_info
2933 if (last_asked_format) {
2934 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2935 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2938 last_asked_format = NULL;
2941 if (!strcmp(filename, "-"))
2944 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2945 !strcmp(filename, "/dev/stdin");
2947 /* get default parameters from command line */
2948 ic = avformat_alloc_context();
2950 print_error(filename, AVERROR(ENOMEM));
2953 if (audio_sample_rate) {
2954 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2955 av_dict_set(&format_opts, "sample_rate", buf, 0);
2957 if (audio_channels) {
2958 snprintf(buf, sizeof(buf), "%d", audio_channels);
2959 av_dict_set(&format_opts, "channels", buf, 0);
2961 if (frame_rate.num) {
2962 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2963 av_dict_set(&format_opts, "framerate", buf, 0);
2965 if (frame_width && frame_height) {
2966 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2967 av_dict_set(&format_opts, "video_size", buf, 0);
2969 if (frame_pix_fmt != PIX_FMT_NONE)
2970 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2972 ic->flags |= AVFMT_FLAG_NONBLOCK;
2974 /* open the input file with generic libav function */
2975 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2977 print_error(filename, err);
2980 assert_avoptions(format_opts);
2985 for(i=0; i<ic->nb_streams; i++){
2986 ic->streams[i]->discard= AVDISCARD_ALL;
2988 for(i=0; i<ic->nb_programs; i++){
2989 AVProgram *p= ic->programs[i];
2990 if(p->id != opt_programid){
2991 p->discard = AVDISCARD_ALL;
2994 for(j=0; j<p->nb_stream_indexes; j++){
2995 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3000 fprintf(stderr, "Specified program id not found\n");
3006 /* apply forced codec ids */
3007 for (i = 0; i < ic->nb_streams; i++)
3008 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3010 /* Set AVCodecContext options for avformat_find_stream_info */
3011 opts = setup_find_stream_info_opts(ic, codec_opts);
3012 orig_nb_streams = ic->nb_streams;
3014 /* If not enough info to get the stream parameters, we decode the
3015 first frames to get it. (used in mpeg case for example) */
3016 ret = avformat_find_stream_info(ic, opts);
3017 if (ret < 0 && verbose >= 0) {
3018 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3019 av_close_input_file(ic);
3023 timestamp = start_time;
3024 /* add the stream start time */
3025 if (ic->start_time != AV_NOPTS_VALUE)
3026 timestamp += ic->start_time;
3028 /* if seeking requested, we execute it */
3029 if (start_time != 0) {
3030 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3032 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3033 filename, (double)timestamp / AV_TIME_BASE);
3035 /* reset seek info */
3039 /* update the current parameters so that they match the one of the input stream */
3040 add_input_streams(ic);
3042 /* dump the file content */
3044 av_dump_format(ic, nb_input_files, filename, 0);
3046 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3047 input_files[nb_input_files - 1].ctx = ic;
3048 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3049 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3051 frame_rate = (AVRational){0, 0};
3052 frame_pix_fmt = PIX_FMT_NONE;
3055 audio_sample_rate = 0;
3057 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3058 av_dict_free(&ts_scale);
3060 for (i = 0; i < orig_nb_streams; i++)
3061 av_dict_free(&opts[i]);
3063 av_dict_free(&codec_names);
3069 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3070 AVCodecContext *avctx)
3076 for (p = kf; *p; p++)
3079 ost->forced_kf_count = n;
3080 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3081 if (!ost->forced_kf_pts) {
3082 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3085 for (i = 0; i < n; i++) {
3086 p = i ? strchr(p, ',') + 1 : kf;
3087 t = parse_time_or_die("force_key_frames", p, 1);
3088 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3092 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3095 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3096 int idx = oc->nb_streams - 1;
3099 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3103 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3104 nb_output_streams + 1);
3105 ost = &output_streams[nb_output_streams - 1];
3106 ost->file_index = nb_output_files;
3109 st->codec->codec_type = type;
3110 ost->enc = choose_codec(oc, st, type, codec_names);
3112 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3115 avcodec_get_context_defaults3(st->codec, ost->enc);
3116 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3118 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3122 static OutputStream *new_video_stream(AVFormatContext *oc)
3126 AVCodecContext *video_enc;
3128 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3130 if (!st->stream_copy) {
3131 ost->frame_aspect_ratio = frame_aspect_ratio;
3132 frame_aspect_ratio = 0;
3134 ost->avfilter= vfilters;
3139 ost->bitstream_filters = video_bitstream_filters;
3140 video_bitstream_filters= NULL;
3142 st->codec->thread_count= thread_count;
3144 video_enc = st->codec;
3147 video_enc->codec_tag= video_codec_tag;
3149 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3150 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3153 if (st->stream_copy) {
3154 video_enc->sample_aspect_ratio =
3155 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3161 ost->frame_rate = frame_rate;
3163 video_enc->width = frame_width;
3164 video_enc->height = frame_height;
3165 video_enc->pix_fmt = frame_pix_fmt;
3166 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3168 if (video_qscale || same_quant) {
3169 video_enc->flags |= CODEC_FLAG_QSCALE;
3170 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3174 video_enc->intra_matrix = intra_matrix;
3176 video_enc->inter_matrix = inter_matrix;
3178 p= video_rc_override_string;
3181 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3183 fprintf(stderr, "error parsing rc_override\n");
3186 video_enc->rc_override=
3187 av_realloc(video_enc->rc_override,
3188 sizeof(RcOverride)*(i+1));
3189 video_enc->rc_override[i].start_frame= start;
3190 video_enc->rc_override[i].end_frame = end;
3192 video_enc->rc_override[i].qscale= q;
3193 video_enc->rc_override[i].quality_factor= 1.0;
3196 video_enc->rc_override[i].qscale= 0;
3197 video_enc->rc_override[i].quality_factor= -q/100.0;
3202 video_enc->rc_override_count=i;
3203 if (!video_enc->rc_initial_buffer_occupancy)
3204 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3205 video_enc->me_threshold= me_threshold;
3206 video_enc->intra_dc_precision= intra_dc_precision - 8;
3209 video_enc->flags|= CODEC_FLAG_PSNR;
3214 video_enc->flags |= CODEC_FLAG_PASS1;
3216 video_enc->flags |= CODEC_FLAG_PASS2;
3220 if (forced_key_frames)
3221 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3223 if (video_language) {
3224 av_dict_set(&st->metadata, "language", video_language, 0);
3225 av_freep(&video_language);
3228 /* reset some key parameters */
3230 av_freep(&forced_key_frames);
3231 frame_pix_fmt = PIX_FMT_NONE;
3235 static OutputStream *new_audio_stream(AVFormatContext *oc)
3239 AVCodecContext *audio_enc;
3241 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3244 ost->bitstream_filters = audio_bitstream_filters;
3245 audio_bitstream_filters= NULL;
3247 st->codec->thread_count= thread_count;
3249 audio_enc = st->codec;
3250 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3253 audio_enc->codec_tag= audio_codec_tag;
3255 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3256 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3258 if (!st->stream_copy) {
3259 if (audio_qscale > QSCALE_NONE) {
3260 audio_enc->flags |= CODEC_FLAG_QSCALE;
3261 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3264 audio_enc->channels = audio_channels;
3265 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3266 audio_enc->sample_fmt = audio_sample_fmt;
3267 if (audio_sample_rate)
3268 audio_enc->sample_rate = audio_sample_rate;
3270 if (audio_language) {
3271 av_dict_set(&st->metadata, "language", audio_language, 0);
3272 av_freep(&audio_language);
3275 /* reset some key parameters */
3281 static OutputStream *new_data_stream(AVFormatContext *oc)
3285 AVCodecContext *data_enc;
3287 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3289 data_enc = st->codec;
3290 if (!st->stream_copy) {
3291 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3296 data_enc->codec_tag= data_codec_tag;
3298 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3299 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3306 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3310 AVCodecContext *subtitle_enc;
3312 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3314 subtitle_enc = st->codec;
3316 ost->bitstream_filters = subtitle_bitstream_filters;
3317 subtitle_bitstream_filters= NULL;
3319 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3321 if(subtitle_codec_tag)
3322 subtitle_enc->codec_tag= subtitle_codec_tag;
3324 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3325 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3328 if (subtitle_language) {
3329 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3330 av_freep(&subtitle_language);
3333 subtitle_disable = 0;
3337 /* arg format is "output-stream-index:streamid-value". */
3338 static int opt_streamid(const char *opt, const char *arg)
3344 av_strlcpy(idx_str, arg, sizeof(idx_str));
3345 p = strchr(idx_str, ':');
3348 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3353 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3354 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3355 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3359 static int copy_chapters(int infile, int outfile)
3361 AVFormatContext *is = input_files[infile].ctx;
3362 AVFormatContext *os = output_files[outfile].ctx;
3365 for (i = 0; i < is->nb_chapters; i++) {
3366 AVChapter *in_ch = is->chapters[i], *out_ch;
3367 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3368 AV_TIME_BASE_Q, in_ch->time_base);
3369 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3370 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3373 if (in_ch->end < ts_off)
3375 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3378 out_ch = av_mallocz(sizeof(AVChapter));
3380 return AVERROR(ENOMEM);
3382 out_ch->id = in_ch->id;
3383 out_ch->time_base = in_ch->time_base;
3384 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3385 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3387 if (metadata_chapters_autocopy)
3388 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3391 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3393 return AVERROR(ENOMEM);
3394 os->chapters[os->nb_chapters - 1] = out_ch;
3399 static int read_avserver_streams(AVFormatContext *s, const char *filename)
3402 AVFormatContext *ic = NULL;
3404 err = avformat_open_input(&ic, filename, NULL, NULL);
3407 /* copy stream format */
3408 for(i=0;i<ic->nb_streams;i++) {
3413 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3414 ost = new_output_stream(s, codec->type);
3417 // FIXME: a more elegant solution is needed
3418 memcpy(st, ic->streams[i], sizeof(AVStream));
3420 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3422 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3423 choose_sample_fmt(st, codec);
3424 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3425 choose_pixel_fmt(st, codec);
3428 av_close_input_file(ic);
3432 static void opt_output_file(const char *filename)
3434 AVFormatContext *oc;
3436 AVOutputFormat *file_oformat;
3440 if (!strcmp(filename, "-"))
3443 oc = avformat_alloc_context();
3445 print_error(filename, AVERROR(ENOMEM));
3449 if (last_asked_format) {
3450 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3451 if (!file_oformat) {
3452 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3455 last_asked_format = NULL;
3457 file_oformat = av_guess_format(NULL, filename, NULL);
3458 if (!file_oformat) {
3459 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3465 oc->oformat = file_oformat;
3466 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3468 if (!strcmp(file_oformat->name, "ffm") &&
3469 av_strstart(filename, "http:", NULL)) {
3470 /* special case for files sent to avserver: we get the stream
3471 parameters from avserver */
3472 int err = read_avserver_streams(oc, filename);
3474 print_error(filename, err);
3477 } else if (!nb_stream_maps) {
3478 /* pick the "best" stream of each type */
3479 #define NEW_STREAM(type, index)\
3481 ost = new_ ## type ## _stream(oc);\
3482 ost->source_index = index;\
3483 ost->sync_ist = &input_streams[index];\
3484 input_streams[index].discard = 0;\
3487 /* video: highest resolution */
3488 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3489 int area = 0, idx = -1;
3490 for (i = 0; i < nb_input_streams; i++) {
3491 ist = &input_streams[i];
3492 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3493 ist->st->codec->width * ist->st->codec->height > area) {
3494 area = ist->st->codec->width * ist->st->codec->height;
3498 NEW_STREAM(video, idx);
3501 /* audio: most channels */
3502 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3503 int channels = 0, idx = -1;
3504 for (i = 0; i < nb_input_streams; i++) {
3505 ist = &input_streams[i];
3506 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3507 ist->st->codec->channels > channels) {
3508 channels = ist->st->codec->channels;
3512 NEW_STREAM(audio, idx);
3515 /* subtitles: pick first */
3516 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3517 for (i = 0; i < nb_input_streams; i++)
3518 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3519 NEW_STREAM(subtitle, i);
3523 /* do something with data? */
3525 for (i = 0; i < nb_stream_maps; i++) {
3526 StreamMap *map = &stream_maps[i];
3531 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3532 switch (ist->st->codec->codec_type) {
3533 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3534 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3535 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3536 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3538 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3539 map->file_index, map->stream_index);
3543 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3544 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3545 map->sync_stream_index];
3550 av_dict_copy(&oc->metadata, metadata, 0);
3551 av_dict_free(&metadata);
3554 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3555 output_files[nb_output_files - 1].ctx = oc;
3556 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3557 output_files[nb_output_files - 1].recording_time = recording_time;
3558 output_files[nb_output_files - 1].start_time = start_time;
3559 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3561 /* check filename in case of an image number is expected */
3562 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3563 if (!av_filename_number_test(oc->filename)) {
3564 print_error(oc->filename, AVERROR(EINVAL));
3569 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3570 /* test if it already exists to avoid loosing precious files */
3571 if (!file_overwrite &&
3572 (strchr(filename, ':') == NULL ||
3573 filename[1] == ':' ||
3574 av_strstart(filename, "file:", NULL))) {
3575 if (avio_check(filename, 0) == 0) {
3577 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3579 if (!read_yesno()) {
3580 fprintf(stderr, "Not overwriting - exiting\n");
3585 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3592 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3593 print_error(filename, err);
3598 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3599 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3600 oc->flags |= AVFMT_FLAG_NONBLOCK;
3603 if (chapters_input_file >= nb_input_files) {
3604 if (chapters_input_file == INT_MAX) {
3605 /* copy chapters from the first input file that has them*/
3606 chapters_input_file = -1;
3607 for (i = 0; i < nb_input_files; i++)
3608 if (input_files[i].ctx->nb_chapters) {
3609 chapters_input_file = i;
3613 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3614 chapters_input_file);
3618 if (chapters_input_file >= 0)
3619 copy_chapters(chapters_input_file, nb_output_files - 1);
3622 for (i = 0; i < nb_meta_data_maps; i++) {
3623 AVFormatContext *files[2];
3624 AVDictionary **meta[2];
3627 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3628 if ((index) < 0 || (index) >= (nb_elems)) {\
3629 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3634 int in_file_index = meta_data_maps[i][1].file;
3635 if (in_file_index < 0)
3637 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3640 files[1] = input_files[in_file_index].ctx;
3642 for (j = 0; j < 2; j++) {
3643 MetadataMap *map = &meta_data_maps[i][j];
3645 switch (map->type) {
3647 meta[j] = &files[j]->metadata;
3650 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3651 meta[j] = &files[j]->streams[map->index]->metadata;
3654 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3655 meta[j] = &files[j]->chapters[map->index]->metadata;
3658 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3659 meta[j] = &files[j]->programs[map->index]->metadata;
3664 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3667 /* copy global metadata by default */
3668 if (metadata_global_autocopy && nb_input_files)
3669 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3670 AV_DICT_DONT_OVERWRITE);
3671 if (metadata_streams_autocopy)
3672 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3673 InputStream *ist = &input_streams[output_streams[i].source_index];
3674 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3677 frame_rate = (AVRational){0, 0};
3680 audio_sample_rate = 0;
3682 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3683 chapters_input_file = INT_MAX;
3684 recording_time = INT64_MAX;
3687 av_freep(&meta_data_maps);
3688 nb_meta_data_maps = 0;
3689 metadata_global_autocopy = 1;
3690 metadata_streams_autocopy = 1;
3691 metadata_chapters_autocopy = 1;
3692 av_freep(&stream_maps);
3694 av_freep(&streamid_map);
3695 nb_streamid_map = 0;
3697 av_dict_free(&codec_names);
3699 av_freep(&forced_key_frames);
3704 /* same option as mencoder */
3705 static int opt_pass(const char *opt, const char *arg)
3707 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3711 static int64_t getutime(void)
3714 struct rusage rusage;
3716 getrusage(RUSAGE_SELF, &rusage);
3717 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3718 #elif HAVE_GETPROCESSTIMES
3720 FILETIME c, e, k, u;
3721 proc = GetCurrentProcess();
3722 GetProcessTimes(proc, &c, &e, &k, &u);
3723 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3725 return av_gettime();
3729 static int64_t getmaxrss(void)
3731 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3732 struct rusage rusage;
3733 getrusage(RUSAGE_SELF, &rusage);
3734 return (int64_t)rusage.ru_maxrss * 1024;
3735 #elif HAVE_GETPROCESSMEMORYINFO
3737 PROCESS_MEMORY_COUNTERS memcounters;
3738 proc = GetCurrentProcess();
3739 memcounters.cb = sizeof(memcounters);
3740 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3741 return memcounters.PeakPagefileUsage;
3747 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3750 const char *p = str;
3757 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3764 static void opt_inter_matrix(const char *arg)
3766 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3767 parse_matrix_coeffs(inter_matrix, arg);
3770 static void opt_intra_matrix(const char *arg)
3772 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3773 parse_matrix_coeffs(intra_matrix, arg);
3776 static void show_usage(void)
3778 printf("Hyper fast Audio and Video encoder\n");
3779 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3783 static void show_help(void)
3786 AVOutputFormat *oformat = NULL;
3787 AVInputFormat *iformat = NULL;
3789 av_log_set_callback(log_callback_help);
3791 show_help_options(options, "Main options:\n",
3792 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3793 show_help_options(options, "\nAdvanced options:\n",
3794 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3796 show_help_options(options, "\nVideo options:\n",
3797 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3799 show_help_options(options, "\nAdvanced Video options:\n",
3800 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3801 OPT_VIDEO | OPT_EXPERT);
3802 show_help_options(options, "\nAudio options:\n",
3803 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3805 show_help_options(options, "\nAdvanced Audio options:\n",
3806 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3807 OPT_AUDIO | OPT_EXPERT);
3808 show_help_options(options, "\nSubtitle options:\n",
3809 OPT_SUBTITLE | OPT_GRAB,
3811 show_help_options(options, "\nAudio/Video grab options:\n",
3815 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3818 /* individual codec options */
3820 while ((c = av_codec_next(c))) {
3821 if (c->priv_class) {
3822 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3827 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3830 /* individual muxer options */
3831 while ((oformat = av_oformat_next(oformat))) {
3832 if (oformat->priv_class) {
3833 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3838 /* individual demuxer options */
3839 while ((iformat = av_iformat_next(iformat))) {
3840 if (iformat->priv_class) {
3841 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3846 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3849 static int opt_target(const char *opt, const char *arg)
3851 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3852 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3854 if(!strncmp(arg, "pal-", 4)) {
3857 } else if(!strncmp(arg, "ntsc-", 5)) {
3860 } else if(!strncmp(arg, "film-", 5)) {
3865 /* Calculate FR via float to avoid int overflow */
3866 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3869 } else if((fr == 29970) || (fr == 23976)) {
3872 /* Try to determine PAL/NTSC by peeking in the input files */
3873 if(nb_input_files) {
3875 for (j = 0; j < nb_input_files; j++) {
3876 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
3877 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3878 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3880 fr = c->time_base.den * 1000 / c->time_base.num;
3884 } else if((fr == 29970) || (fr == 23976)) {
3894 if(verbose > 0 && norm != UNKNOWN)
3895 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3898 if(norm == UNKNOWN) {
3899 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3900 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3901 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3905 if(!strcmp(arg, "vcd")) {
3906 opt_codec("c:v", "mpeg1video");
3907 opt_codec("c:a", "mp2");
3908 opt_format("f", "vcd");
3910 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3911 opt_frame_rate("r", frame_rates[norm]);
3912 opt_default("g", norm == PAL ? "15" : "18");
3914 opt_default("b", "1150000");
3915 opt_default("maxrate", "1150000");
3916 opt_default("minrate", "1150000");
3917 opt_default("bufsize", "327680"); // 40*1024*8;
3919 opt_default("b:a", "224000");
3920 audio_sample_rate = 44100;
3923 opt_default("packetsize", "2324");
3924 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3926 /* We have to offset the PTS, so that it is consistent with the SCR.
3927 SCR starts at 36000, but the first two packs contain only padding
3928 and the first pack from the other stream, respectively, may also have
3929 been written before.
3930 So the real data starts at SCR 36000+3*1200. */
3931 mux_preload= (36000+3*1200) / 90000.0; //0.44
3932 } else if(!strcmp(arg, "svcd")) {
3934 opt_codec("c:v", "mpeg2video");
3935 opt_codec("c:a", "mp2");
3936 opt_format("f", "svcd");
3938 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3939 opt_frame_rate("r", frame_rates[norm]);
3940 opt_default("g", norm == PAL ? "15" : "18");
3942 opt_default("b", "2040000");
3943 opt_default("maxrate", "2516000");
3944 opt_default("minrate", "0"); //1145000;
3945 opt_default("bufsize", "1835008"); //224*1024*8;
3946 opt_default("flags", "+scan_offset");
3949 opt_default("b:a", "224000");
3950 audio_sample_rate = 44100;
3952 opt_default("packetsize", "2324");
3954 } else if(!strcmp(arg, "dvd")) {
3956 opt_codec("c:v", "mpeg2video");
3957 opt_codec("c:a", "ac3");
3958 opt_format("f", "dvd");
3960 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3961 opt_frame_rate("r", frame_rates[norm]);
3962 opt_default("g", norm == PAL ? "15" : "18");
3964 opt_default("b", "6000000");
3965 opt_default("maxrate", "9000000");
3966 opt_default("minrate", "0"); //1500000;
3967 opt_default("bufsize", "1835008"); //224*1024*8;
3969 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3970 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3972 opt_default("b:a", "448000");
3973 audio_sample_rate = 48000;
3975 } else if(!strncmp(arg, "dv", 2)) {
3977 opt_format("f", "dv");
3979 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3980 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3981 norm == PAL ? "yuv420p" : "yuv411p");
3982 opt_frame_rate("r", frame_rates[norm]);
3984 audio_sample_rate = 48000;
3988 fprintf(stderr, "Unknown target: %s\n", arg);
3989 return AVERROR(EINVAL);
3994 static int opt_vstats_file(const char *opt, const char *arg)
3996 av_free (vstats_filename);
3997 vstats_filename=av_strdup (arg);
4001 static int opt_vstats(const char *opt, const char *arg)
4004 time_t today2 = time(NULL);
4005 struct tm *today = localtime(&today2);
4007 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4009 return opt_vstats_file(opt, filename);
4012 static int opt_bsf(const char *opt, const char *arg)
4014 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4015 AVBitStreamFilterContext **bsfp;
4018 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4022 bsfp= *opt == 'v' ? &video_bitstream_filters :
4023 *opt == 'a' ? &audio_bitstream_filters :
4024 &subtitle_bitstream_filters;
4026 bsfp= &(*bsfp)->next;
4033 static const OptionDef options[] = {
4035 #include "cmdutils_common_opts.h"
4036 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4037 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4038 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4039 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4040 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4041 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4042 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4043 "outfile[,metadata]:infile[,metadata]" },
4044 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4045 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4046 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4047 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4048 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4049 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4050 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4051 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4052 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4053 "add timings for benchmarking" },
4054 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4055 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4056 "dump each input packet" },
4057 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4058 "when dumping packets, also dump the payload" },
4059 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4060 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4061 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4062 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4063 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4064 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4065 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4066 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4067 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4068 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4069 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4070 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4071 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4072 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4075 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4076 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4077 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4078 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4079 { "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" },
4080 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4081 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4082 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4083 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4084 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4085 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4086 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4087 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4088 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4089 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4090 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4091 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4092 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4093 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4094 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4095 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4096 "use same quantizer as source (implies VBR)" },
4097 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4098 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4099 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4100 "deinterlace pictures" },
4101 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4102 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4103 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4105 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4107 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4108 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4109 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4110 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4111 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4112 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4113 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4114 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4115 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4116 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4119 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4120 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4121 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4122 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4123 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4124 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4125 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4126 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4127 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4128 { "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" },
4130 /* subtitle options */
4131 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4132 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4133 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4134 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4137 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4140 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4141 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4143 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4144 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4145 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4147 /* data codec support */
4148 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4150 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4154 int main(int argc, char **argv)
4158 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4160 avcodec_register_all();
4162 avdevice_register_all();
4165 avfilter_register_all();
4169 avio_set_interrupt_cb(decode_interrupt_cb);
4176 parse_options(argc, argv, options, opt_output_file);
4178 if(nb_output_files <= 0 && nb_input_files == 0) {
4180 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4184 /* file converter / grab */
4185 if (nb_output_files <= 0) {
4186 fprintf(stderr, "At least one output file must be specified\n");
4190 if (nb_input_files == 0) {
4191 fprintf(stderr, "At least one input file must be specified\n");
4196 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4198 ti = getutime() - ti;
4200 int maxrss = getmaxrss() / 1024;
4201 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4204 return exit_program(0);