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 intra_only = 0;
147 static int audio_sample_rate = 0;
148 #define QSCALE_NONE -99999
149 static float audio_qscale = QSCALE_NONE;
150 static int audio_disable = 0;
151 static int audio_channels = 0;
152 static unsigned int audio_codec_tag = 0;
153 static char *audio_language = NULL;
155 static int subtitle_disable = 0;
156 static char *subtitle_language = NULL;
157 static unsigned int subtitle_codec_tag = 0;
159 static int data_disable = 0;
160 static unsigned int data_codec_tag = 0;
162 static float mux_preload= 0.5;
163 static float mux_max_delay= 0.7;
165 static int64_t recording_time = INT64_MAX;
166 static int64_t start_time = 0;
167 static int64_t input_ts_offset = 0;
168 static int file_overwrite = 0;
169 static AVDictionary *metadata;
170 static int do_benchmark = 0;
171 static int do_hex_dump = 0;
172 static int do_pkt_dump = 0;
173 static int do_psnr = 0;
174 static int do_pass = 0;
175 static char *pass_logfilename_prefix = NULL;
176 static int video_sync_method= -1;
177 static int audio_sync_method= 0;
178 static float audio_drift_threshold= 0.1;
179 static int copy_ts= 0;
181 static int opt_shortest = 0;
182 static char *vstats_filename;
183 static FILE *vstats_file;
184 static int opt_programid = 0;
185 static int copy_initial_nonkeyframes = 0;
187 static int rate_emu = 0;
189 static int audio_volume = 256;
191 static int exit_on_error = 0;
192 static int using_stdin = 0;
193 static int verbose = 1;
194 static int thread_count= 1;
195 static int64_t video_size = 0;
196 static int64_t audio_size = 0;
197 static int64_t extra_size = 0;
198 static int nb_frames_dup = 0;
199 static int nb_frames_drop = 0;
200 static int input_sync;
201 static uint64_t limit_filesize = 0;
202 static int force_fps = 0;
203 static char *forced_key_frames = NULL;
205 static float dts_delta_threshold = 10;
207 static int64_t timer_start;
209 static uint8_t *audio_buf;
210 static uint8_t *audio_out;
211 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
213 static short *samples;
215 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
216 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
217 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
219 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
221 typedef struct InputStream {
224 int discard; /* true if stream data should be discarded */
225 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
228 int64_t start; /* time when read started */
229 int64_t next_pts; /* synthetic pts for cases where pkt.pts
231 int64_t pts; /* current pts */
232 PtsCorrectionContext pts_ctx;
234 int is_start; /* is 1 at the start and after a discontinuity */
235 int showed_multi_packet_warning;
239 typedef struct InputFile {
240 AVFormatContext *ctx;
241 int eof_reached; /* true if eof reached */
242 int ist_index; /* index of first stream in ist_table */
243 int buffer_size; /* current total buffer size */
247 typedef struct OutputStream {
248 int file_index; /* file index */
249 int index; /* stream index in the output file */
250 int source_index; /* InputStream index */
251 AVStream *st; /* stream in the output file */
252 int encoding_needed; /* true if encoding needed for this stream */
254 /* input pts and corresponding output pts
256 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
257 struct InputStream *sync_ist; /* input stream to sync against */
258 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
259 AVBitStreamFilterContext *bitstream_filters;
264 AVFrame pict_tmp; /* temporary image for resampling */
265 struct SwsContext *img_resample_ctx; /* for image resampling */
268 int resample_pix_fmt;
269 AVRational frame_rate;
271 float frame_aspect_ratio;
273 /* forced key frames */
274 int64_t *forced_kf_pts;
280 ReSampleContext *resample; /* for audio resampling */
281 int resample_sample_fmt;
282 int resample_channels;
283 int resample_sample_rate;
285 AVAudioConvert *reformat_ctx;
286 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
290 AVFilterContext *output_video_filter;
291 AVFilterContext *input_video_filter;
292 AVFilterBufferRef *picref;
294 AVFilterGraph *graph;
299 int is_past_recording_time;
303 typedef struct OutputFile {
304 AVFormatContext *ctx;
306 int ost_index; /* index of the first stream in output_streams */
307 int64_t recording_time; /* desired length of the resulting file in microseconds */
308 int64_t start_time; /* start time in microseconds */
311 static InputStream *input_streams = NULL;
312 static int nb_input_streams = 0;
313 static InputFile *input_files = NULL;
314 static int nb_input_files = 0;
316 static OutputStream *output_streams = NULL;
317 static int nb_output_streams = 0;
318 static OutputFile *output_files = NULL;
319 static int nb_output_files = 0;
323 static int configure_video_filters(InputStream *ist, OutputStream *ost)
325 AVFilterContext *last_filter, *filter;
326 /** filter graph containing all filters including input & output */
327 AVCodecContext *codec = ost->st->codec;
328 AVCodecContext *icodec = ist->st->codec;
329 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
330 AVRational sample_aspect_ratio;
334 ost->graph = avfilter_graph_alloc();
336 if (ist->st->sample_aspect_ratio.num){
337 sample_aspect_ratio = ist->st->sample_aspect_ratio;
339 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
341 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
342 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
343 sample_aspect_ratio.num, sample_aspect_ratio.den);
345 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
346 "src", args, NULL, ost->graph);
349 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
350 "out", NULL, &ffsink_ctx, ost->graph);
353 last_filter = ost->input_video_filter;
355 if (codec->width != icodec->width || codec->height != icodec->height) {
356 snprintf(args, 255, "%d:%d:flags=0x%X",
360 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
361 NULL, args, NULL, ost->graph)) < 0)
363 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
365 last_filter = filter;
368 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
369 ost->graph->scale_sws_opts = av_strdup(args);
372 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
373 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
375 outputs->name = av_strdup("in");
376 outputs->filter_ctx = last_filter;
377 outputs->pad_idx = 0;
378 outputs->next = NULL;
380 inputs->name = av_strdup("out");
381 inputs->filter_ctx = ost->output_video_filter;
385 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
387 av_freep(&ost->avfilter);
389 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
393 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
396 codec->width = ost->output_video_filter->inputs[0]->w;
397 codec->height = ost->output_video_filter->inputs[0]->h;
398 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
399 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
400 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
401 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
405 #endif /* CONFIG_AVFILTER */
407 static void term_exit(void)
409 av_log(NULL, AV_LOG_QUIET, "");
412 static volatile int received_sigterm = 0;
413 static volatile int received_nb_signals = 0;
416 sigterm_handler(int sig)
418 received_sigterm = sig;
419 received_nb_signals++;
423 static void term_init(void)
425 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
426 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
428 signal(SIGXCPU, sigterm_handler);
432 static int decode_interrupt_cb(void)
434 return received_nb_signals > 1;
437 static int exit_program(int ret)
442 for(i=0;i<nb_output_files;i++) {
443 AVFormatContext *s = output_files[i].ctx;
444 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
446 avformat_free_context(s);
447 av_dict_free(&output_files[i].opts);
449 for(i=0;i<nb_input_files;i++) {
450 av_close_input_file(input_files[i].ctx);
452 for (i = 0; i < nb_input_streams; i++)
453 av_dict_free(&input_streams[i].opts);
455 av_free(intra_matrix);
456 av_free(inter_matrix);
460 av_free(vstats_filename);
462 av_free(streamid_map);
463 av_free(meta_data_maps);
465 av_freep(&input_streams);
466 av_freep(&input_files);
467 av_freep(&output_streams);
468 av_freep(&output_files);
473 allocated_audio_buf_size= allocated_audio_out_size= 0;
480 if (received_sigterm) {
482 "Received signal %d: terminating.\n",
483 (int) received_sigterm);
487 exit(ret); /* not all OS-es handle main() return value */
491 static void assert_avoptions(AVDictionary *m)
493 AVDictionaryEntry *t;
494 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
495 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
500 static void assert_codec_experimental(AVCodecContext *c, int encoder)
502 const char *codec_string = encoder ? "encoder" : "decoder";
504 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
505 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
506 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
507 "results.\nAdd '-strict experimental' if you want to use it.\n",
508 codec_string, c->codec->name);
509 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
510 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
511 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
512 codec_string, codec->name);
517 /* similar to ff_dynarray_add() and av_fast_realloc() */
518 static void *grow_array(void *array, int elem_size, int *size, int new_size)
520 if (new_size >= INT_MAX / elem_size) {
521 fprintf(stderr, "Array too big.\n");
524 if (*size < new_size) {
525 uint8_t *tmp = av_realloc(array, new_size*elem_size);
527 fprintf(stderr, "Could not alloc buffer.\n");
530 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
537 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
539 if(codec && codec->sample_fmts){
540 const enum AVSampleFormat *p= codec->sample_fmts;
542 if(*p == st->codec->sample_fmt)
546 av_log(NULL, AV_LOG_WARNING,
547 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
548 av_get_sample_fmt_name(st->codec->sample_fmt),
550 av_get_sample_fmt_name(codec->sample_fmts[0]));
551 st->codec->sample_fmt = codec->sample_fmts[0];
557 * Update the requested input sample format based on the output sample format.
558 * This is currently only used to request float output from decoders which
559 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
560 * Ideally this will be removed in the future when decoders do not do format
561 * conversion and only output in their native format.
563 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
566 /* if sample formats match or a decoder sample format has already been
567 requested, just return */
568 if (enc->sample_fmt == dec->sample_fmt ||
569 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
572 /* if decoder supports more than one output format */
573 if (dec_codec && dec_codec->sample_fmts &&
574 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
575 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
576 const enum AVSampleFormat *p;
577 int min_dec = -1, min_inc = -1;
579 /* find a matching sample format in the encoder */
580 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
581 if (*p == enc->sample_fmt) {
582 dec->request_sample_fmt = *p;
584 } else if (*p > enc->sample_fmt) {
585 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
587 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
590 /* if none match, provide the one that matches quality closest */
591 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
592 enc->sample_fmt - min_dec;
596 static void choose_sample_rate(AVStream *st, AVCodec *codec)
598 if(codec && codec->supported_samplerates){
599 const int *p= codec->supported_samplerates;
601 int best_dist=INT_MAX;
603 int dist= abs(st->codec->sample_rate - *p);
604 if(dist < best_dist){
610 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
612 st->codec->sample_rate= best;
616 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
618 if(codec && codec->pix_fmts){
619 const enum PixelFormat *p= codec->pix_fmts;
620 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
621 if(st->codec->codec_id==CODEC_ID_MJPEG){
622 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
623 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
624 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};
628 if(*p == st->codec->pix_fmt)
632 if(st->codec->pix_fmt != PIX_FMT_NONE)
633 av_log(NULL, AV_LOG_WARNING,
634 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
635 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
637 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
638 st->codec->pix_fmt = codec->pix_fmts[0];
644 get_sync_ipts(const OutputStream *ost)
646 const InputStream *ist = ost->sync_ist;
647 OutputFile *of = &output_files[ost->file_index];
648 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
651 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
655 AVPacket new_pkt= *pkt;
656 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
657 &new_pkt.data, &new_pkt.size,
658 pkt->data, pkt->size,
659 pkt->flags & AV_PKT_FLAG_KEY);
662 new_pkt.destruct= av_destruct_packet;
664 fprintf(stderr, "%s failed for stream %d, codec %s",
665 bsfc->filter->name, pkt->stream_index,
666 avctx->codec ? avctx->codec->name : "copy");
676 ret= av_interleaved_write_frame(s, pkt);
678 print_error("av_interleaved_write_frame()", ret);
683 static void do_audio_out(AVFormatContext *s,
686 unsigned char *buf, int size)
689 int64_t audio_out_size, audio_buf_size;
690 int64_t allocated_for_size= size;
692 int size_out, frame_bytes, ret, resample_changed;
693 AVCodecContext *enc= ost->st->codec;
694 AVCodecContext *dec= ist->st->codec;
695 int osize = av_get_bytes_per_sample(enc->sample_fmt);
696 int isize = av_get_bytes_per_sample(dec->sample_fmt);
697 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
700 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
701 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
702 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
703 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
704 audio_buf_size*= osize*enc->channels;
706 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
707 if(coded_bps > 8*osize)
708 audio_out_size= audio_out_size * coded_bps / (8*osize);
709 audio_out_size += FF_MIN_BUFFER_SIZE;
711 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
712 fprintf(stderr, "Buffer sizes too large\n");
716 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
717 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
718 if (!audio_buf || !audio_out){
719 fprintf(stderr, "Out of memory in do_audio_out\n");
723 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
724 ost->audio_resample = 1;
726 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
727 ost->resample_channels != dec->channels ||
728 ost->resample_sample_rate != dec->sample_rate;
730 if ((ost->audio_resample && !ost->resample) || resample_changed) {
731 if (resample_changed) {
732 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",
733 ist->file_index, ist->st->index,
734 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
735 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
736 ost->resample_sample_fmt = dec->sample_fmt;
737 ost->resample_channels = dec->channels;
738 ost->resample_sample_rate = dec->sample_rate;
740 audio_resample_close(ost->resample);
742 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
743 if (audio_sync_method <= 1 &&
744 ost->resample_sample_fmt == enc->sample_fmt &&
745 ost->resample_channels == enc->channels &&
746 ost->resample_sample_rate == enc->sample_rate) {
747 ost->resample = NULL;
748 ost->audio_resample = 0;
749 } else if (ost->audio_resample) {
750 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
751 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
752 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
753 enc->sample_rate, dec->sample_rate,
754 enc->sample_fmt, dec->sample_fmt,
756 if (!ost->resample) {
757 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
758 dec->channels, dec->sample_rate,
759 enc->channels, enc->sample_rate);
765 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
766 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
767 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
768 if (ost->reformat_ctx)
769 av_audio_convert_free(ost->reformat_ctx);
770 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
771 dec->sample_fmt, 1, NULL, 0);
772 if (!ost->reformat_ctx) {
773 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
774 av_get_sample_fmt_name(dec->sample_fmt),
775 av_get_sample_fmt_name(enc->sample_fmt));
778 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
781 if(audio_sync_method){
782 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
783 - av_fifo_size(ost->fifo)/(enc->channels * 2);
784 double idelta= delta*dec->sample_rate / enc->sample_rate;
785 int byte_delta= ((int)idelta)*2*dec->channels;
787 //FIXME resample delay
788 if(fabs(delta) > 50){
789 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
791 byte_delta= FFMAX(byte_delta, -size);
795 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
800 static uint8_t *input_tmp= NULL;
801 input_tmp= av_realloc(input_tmp, byte_delta + size);
803 if(byte_delta > allocated_for_size - size){
804 allocated_for_size= byte_delta + (int64_t)size;
809 memset(input_tmp, 0, byte_delta);
810 memcpy(input_tmp + byte_delta, buf, size);
814 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
816 }else if(audio_sync_method>1){
817 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
818 av_assert0(ost->audio_resample);
820 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
821 // 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));
822 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
826 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
827 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
829 if (ost->audio_resample) {
831 size_out = audio_resample(ost->resample,
832 (short *)buftmp, (short *)buf,
833 size / (dec->channels * isize));
834 size_out = size_out * enc->channels * osize;
840 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
841 const void *ibuf[6]= {buftmp};
842 void *obuf[6]= {audio_buf};
843 int istride[6]= {isize};
844 int ostride[6]= {osize};
845 int len= size_out/istride[0];
846 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
847 printf("av_audio_convert() failed\n");
853 size_out = len*osize;
856 /* now encode as many frames as possible */
857 if (enc->frame_size > 1) {
858 /* output resampled raw samples */
859 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
860 fprintf(stderr, "av_fifo_realloc2() failed\n");
863 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
865 frame_bytes = enc->frame_size * osize * enc->channels;
867 while (av_fifo_size(ost->fifo) >= frame_bytes) {
869 av_init_packet(&pkt);
871 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
873 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
875 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
878 fprintf(stderr, "Audio encoding failed\n");
882 pkt.stream_index= ost->index;
885 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
886 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
887 pkt.flags |= AV_PKT_FLAG_KEY;
888 write_frame(s, &pkt, enc, ost->bitstream_filters);
890 ost->sync_opts += enc->frame_size;
894 av_init_packet(&pkt);
896 ost->sync_opts += size_out / (osize * enc->channels);
898 /* output a pcm frame */
899 /* determine the size of the coded buffer */
902 size_out = size_out*coded_bps/8;
904 if(size_out > audio_out_size){
905 fprintf(stderr, "Internal error, buffer size too small\n");
909 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
910 ret = avcodec_encode_audio(enc, audio_out, size_out,
913 fprintf(stderr, "Audio encoding failed\n");
917 pkt.stream_index= ost->index;
920 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
921 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
922 pkt.flags |= AV_PKT_FLAG_KEY;
923 write_frame(s, &pkt, enc, ost->bitstream_filters);
927 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
931 AVPicture picture_tmp;
934 dec = ist->st->codec;
936 /* deinterlace : must be done before any resize */
937 if (do_deinterlace) {
940 /* create temporary picture */
941 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
942 buf = av_malloc(size);
946 picture2 = &picture_tmp;
947 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
949 if(avpicture_deinterlace(picture2, picture,
950 dec->pix_fmt, dec->width, dec->height) < 0) {
951 /* if error, do not deinterlace */
952 fprintf(stderr, "Deinterlacing failed\n");
961 if (picture != picture2)
962 *picture = *picture2;
966 static void do_subtitle_out(AVFormatContext *s,
972 static uint8_t *subtitle_out = NULL;
973 int subtitle_out_max_size = 1024 * 1024;
974 int subtitle_out_size, nb, i;
978 if (pts == AV_NOPTS_VALUE) {
979 fprintf(stderr, "Subtitle packets must have a pts\n");
985 enc = ost->st->codec;
988 subtitle_out = av_malloc(subtitle_out_max_size);
991 /* Note: DVB subtitle need one packet to draw them and one other
992 packet to clear them */
993 /* XXX: signal it in the codec context ? */
994 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
999 for(i = 0; i < nb; i++) {
1000 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1001 // start_display_time is required to be 0
1002 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1003 sub->end_display_time -= sub->start_display_time;
1004 sub->start_display_time = 0;
1005 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1006 subtitle_out_max_size, sub);
1007 if (subtitle_out_size < 0) {
1008 fprintf(stderr, "Subtitle encoding failed\n");
1012 av_init_packet(&pkt);
1013 pkt.stream_index = ost->index;
1014 pkt.data = subtitle_out;
1015 pkt.size = subtitle_out_size;
1016 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1017 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1018 /* XXX: the pts correction is handled here. Maybe handling
1019 it in the codec would be better */
1021 pkt.pts += 90 * sub->start_display_time;
1023 pkt.pts += 90 * sub->end_display_time;
1025 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1029 static int bit_buffer_size= 1024*256;
1030 static uint8_t *bit_buffer= NULL;
1032 static void do_video_resample(OutputStream *ost,
1034 AVFrame *in_picture,
1035 AVFrame **out_picture)
1037 int resample_changed = 0;
1038 AVCodecContext *dec = ist->st->codec;
1039 *out_picture = in_picture;
1041 resample_changed = ost->resample_width != dec->width ||
1042 ost->resample_height != dec->height ||
1043 ost->resample_pix_fmt != dec->pix_fmt;
1045 if (resample_changed) {
1046 av_log(NULL, AV_LOG_INFO,
1047 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1048 ist->file_index, ist->st->index,
1049 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1050 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1051 if(!ost->video_resample)
1052 ost->video_resample = 1;
1055 #if !CONFIG_AVFILTER
1056 if (ost->video_resample) {
1057 *out_picture = &ost->pict_tmp;
1058 if (resample_changed) {
1059 /* initialize a new scaler context */
1060 sws_freeContext(ost->img_resample_ctx);
1061 ost->img_resample_ctx = sws_getContext(
1062 ist->st->codec->width,
1063 ist->st->codec->height,
1064 ist->st->codec->pix_fmt,
1065 ost->st->codec->width,
1066 ost->st->codec->height,
1067 ost->st->codec->pix_fmt,
1068 ost->sws_flags, NULL, NULL, NULL);
1069 if (ost->img_resample_ctx == NULL) {
1070 fprintf(stderr, "Cannot get resampling context\n");
1074 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1075 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1078 if (resample_changed) {
1079 avfilter_graph_free(&ost->graph);
1080 if (configure_video_filters(ist, ost)) {
1081 fprintf(stderr, "Error reinitialising filters!\n");
1086 if (resample_changed) {
1087 ost->resample_width = dec->width;
1088 ost->resample_height = dec->height;
1089 ost->resample_pix_fmt = dec->pix_fmt;
1094 static void do_video_out(AVFormatContext *s,
1097 AVFrame *in_picture,
1098 int *frame_size, float quality)
1100 int nb_frames, i, ret, format_video_sync;
1101 AVFrame *final_picture;
1102 AVCodecContext *enc, *dec;
1105 enc = ost->st->codec;
1106 dec = ist->st->codec;
1108 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1110 /* by default, we output a single frame */
1115 format_video_sync = video_sync_method;
1116 if (format_video_sync < 0)
1117 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1119 if (format_video_sync) {
1120 double vdelta = sync_ipts - ost->sync_opts;
1121 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1124 else if (format_video_sync == 2) {
1127 }else if(vdelta>0.6)
1128 ost->sync_opts= lrintf(sync_ipts);
1129 }else if (vdelta > 1.1)
1130 nb_frames = lrintf(vdelta);
1131 //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);
1132 if (nb_frames == 0){
1135 fprintf(stderr, "*** drop!\n");
1136 }else if (nb_frames > 1) {
1137 nb_frames_dup += nb_frames - 1;
1139 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1142 ost->sync_opts= lrintf(sync_ipts);
1144 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1148 do_video_resample(ost, ist, in_picture, &final_picture);
1150 /* duplicates frame if needed */
1151 for(i=0;i<nb_frames;i++) {
1153 av_init_packet(&pkt);
1154 pkt.stream_index= ost->index;
1156 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1157 /* raw pictures are written as AVPicture structure to
1158 avoid any copies. We support temorarily the older
1160 AVFrame* old_frame = enc->coded_frame;
1161 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1162 pkt.data= (uint8_t *)final_picture;
1163 pkt.size= sizeof(AVPicture);
1164 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1165 pkt.flags |= AV_PKT_FLAG_KEY;
1167 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1168 enc->coded_frame = old_frame;
1170 AVFrame big_picture;
1172 big_picture= *final_picture;
1173 /* better than nothing: use input picture interlaced
1175 big_picture.interlaced_frame = in_picture->interlaced_frame;
1176 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1177 if(top_field_first == -1)
1178 big_picture.top_field_first = in_picture->top_field_first;
1180 big_picture.top_field_first = top_field_first;
1183 /* handles same_quant here. This is not correct because it may
1184 not be a global option */
1185 big_picture.quality = quality;
1187 big_picture.pict_type = 0;
1188 // big_picture.pts = AV_NOPTS_VALUE;
1189 big_picture.pts= ost->sync_opts;
1190 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1191 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1192 if (ost->forced_kf_index < ost->forced_kf_count &&
1193 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1194 big_picture.pict_type = AV_PICTURE_TYPE_I;
1195 ost->forced_kf_index++;
1197 ret = avcodec_encode_video(enc,
1198 bit_buffer, bit_buffer_size,
1201 fprintf(stderr, "Video encoding failed\n");
1206 pkt.data= bit_buffer;
1208 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1209 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1210 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1211 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1212 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1214 if(enc->coded_frame->key_frame)
1215 pkt.flags |= AV_PKT_FLAG_KEY;
1216 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1219 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1220 // enc->frame_number-1, ret, enc->pict_type);
1221 /* if two pass, output log */
1222 if (ost->logfile && enc->stats_out) {
1223 fprintf(ost->logfile, "%s", enc->stats_out);
1228 ost->frame_number++;
1232 static double psnr(double d){
1233 return -10.0*log(d)/log(10.0);
1236 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1239 AVCodecContext *enc;
1241 double ti1, bitrate, avg_bitrate;
1243 /* this is executed just the first time do_video_stats is called */
1245 vstats_file = fopen(vstats_filename, "w");
1252 enc = ost->st->codec;
1253 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1254 frame_number = ost->frame_number;
1255 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1256 if (enc->flags&CODEC_FLAG_PSNR)
1257 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1259 fprintf(vstats_file,"f_size= %6d ", frame_size);
1260 /* compute pts value */
1261 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1265 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1266 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1267 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1268 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1269 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1273 static void print_report(OutputFile *output_files,
1274 OutputStream *ost_table, int nb_ostreams,
1279 AVFormatContext *oc;
1281 AVCodecContext *enc;
1282 int frame_number, vid, i;
1283 double bitrate, ti1, pts;
1284 static int64_t last_time = -1;
1285 static int qp_histogram[52];
1287 if (!is_last_report) {
1289 /* display the report every 0.5 seconds */
1290 cur_time = av_gettime();
1291 if (last_time == -1) {
1292 last_time = cur_time;
1295 if ((cur_time - last_time) < 500000)
1297 last_time = cur_time;
1301 oc = output_files[0].ctx;
1303 total_size = avio_size(oc->pb);
1304 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1305 total_size= avio_tell(oc->pb);
1310 for(i=0;i<nb_ostreams;i++) {
1312 ost = &ost_table[i];
1313 enc = ost->st->codec;
1314 if (!ost->st->stream_copy && enc->coded_frame)
1315 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1316 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1317 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1319 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1320 float t = (av_gettime()-timer_start) / 1000000.0;
1322 frame_number = ost->frame_number;
1323 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1324 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1326 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1330 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1333 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1335 if (enc->flags&CODEC_FLAG_PSNR){
1337 double error, error_sum=0;
1338 double scale, scale_sum=0;
1339 char type[3]= {'Y','U','V'};
1340 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1343 error= enc->error[j];
1344 scale= enc->width*enc->height*255.0*255.0*frame_number;
1346 error= enc->coded_frame->error[j];
1347 scale= enc->width*enc->height*255.0*255.0;
1352 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1358 /* compute min output value */
1359 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1360 if ((pts < ti1) && (pts > 0))
1366 if (verbose > 0 || is_last_report) {
1367 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1370 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1371 (double)total_size / 1024, ti1, bitrate);
1373 if (nb_frames_dup || nb_frames_drop)
1374 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1375 nb_frames_dup, nb_frames_drop);
1378 fprintf(stderr, "%s \r", buf);
1383 if (is_last_report && verbose >= 0){
1384 int64_t raw= audio_size + video_size + extra_size;
1385 fprintf(stderr, "\n");
1386 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1390 100.0*(total_size - raw)/raw
1395 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1397 int fill_char = 0x00;
1398 if (sample_fmt == AV_SAMPLE_FMT_U8)
1400 memset(buf, fill_char, size);
1403 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1404 static int output_packet(InputStream *ist, int ist_index,
1405 OutputStream *ost_table, int nb_ostreams,
1406 const AVPacket *pkt)
1408 AVFormatContext *os;
1413 void *buffer_to_free = NULL;
1414 static unsigned int samples_size= 0;
1415 AVSubtitle subtitle, *subtitle_to_free;
1416 int64_t pkt_pts = AV_NOPTS_VALUE;
1418 int frame_available;
1423 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1425 if(ist->next_pts == AV_NOPTS_VALUE)
1426 ist->next_pts= ist->pts;
1430 av_init_packet(&avpkt);
1438 if(pkt->dts != AV_NOPTS_VALUE)
1439 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1440 if(pkt->pts != AV_NOPTS_VALUE)
1441 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1443 //while we have more to decode or while the decoder did output something on EOF
1444 while (avpkt.size > 0 || (!pkt && got_output)) {
1445 uint8_t *data_buf, *decoded_data_buf;
1446 int data_size, decoded_data_size;
1448 ist->pts= ist->next_pts;
1450 if(avpkt.size && avpkt.size != pkt->size &&
1451 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1452 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1453 ist->showed_multi_packet_warning=1;
1456 /* decode the packet if needed */
1457 decoded_data_buf = NULL; /* fail safe */
1458 decoded_data_size= 0;
1459 data_buf = avpkt.data;
1460 data_size = avpkt.size;
1461 subtitle_to_free = NULL;
1462 if (ist->decoding_needed) {
1463 switch(ist->st->codec->codec_type) {
1464 case AVMEDIA_TYPE_AUDIO:{
1465 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1466 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1468 samples= av_malloc(samples_size);
1470 decoded_data_size= samples_size;
1471 /* XXX: could avoid copy if PCM 16 bits with same
1472 endianness as CPU */
1473 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1480 got_output = decoded_data_size > 0;
1481 /* Some bug in mpeg audio decoder gives */
1482 /* decoded_data_size < 0, it seems they are overflows */
1484 /* no audio frame */
1487 decoded_data_buf = (uint8_t *)samples;
1488 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1489 (ist->st->codec->sample_rate * ist->st->codec->channels);
1491 case AVMEDIA_TYPE_VIDEO:
1492 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1493 /* XXX: allocate picture correctly */
1494 avcodec_get_frame_defaults(&picture);
1495 avpkt.pts = pkt_pts;
1496 avpkt.dts = ist->pts;
1497 pkt_pts = AV_NOPTS_VALUE;
1499 ret = avcodec_decode_video2(ist->st->codec,
1500 &picture, &got_output, &avpkt);
1501 quality = same_quant ? picture.quality : 0;
1505 /* no picture yet */
1506 goto discard_packet;
1508 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1509 if (ist->st->codec->time_base.num != 0) {
1510 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1511 ist->next_pts += ((int64_t)AV_TIME_BASE *
1512 ist->st->codec->time_base.num * ticks) /
1513 ist->st->codec->time_base.den;
1516 buffer_to_free = NULL;
1517 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1519 case AVMEDIA_TYPE_SUBTITLE:
1520 ret = avcodec_decode_subtitle2(ist->st->codec,
1521 &subtitle, &got_output, &avpkt);
1525 goto discard_packet;
1527 subtitle_to_free = &subtitle;
1534 switch(ist->st->codec->codec_type) {
1535 case AVMEDIA_TYPE_AUDIO:
1536 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1537 ist->st->codec->sample_rate;
1539 case AVMEDIA_TYPE_VIDEO:
1540 if (ist->st->codec->time_base.num != 0) {
1541 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1542 ist->next_pts += ((int64_t)AV_TIME_BASE *
1543 ist->st->codec->time_base.num * ticks) /
1544 ist->st->codec->time_base.den;
1552 // preprocess audio (volume)
1553 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1554 if (audio_volume != 256) {
1557 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1558 int v = ((*volp) * audio_volume + 128) >> 8;
1559 if (v < -32768) v = -32768;
1560 if (v > 32767) v = 32767;
1566 /* frame rate emulation */
1568 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1569 int64_t now = av_gettime() - ist->start;
1573 /* if output time reached then transcode raw format,
1574 encode packets and output them */
1575 for (i = 0; i < nb_ostreams; i++) {
1576 OutputFile *of = &output_files[ost_table[i].file_index];
1579 ost = &ost_table[i];
1580 if (ost->source_index != ist_index)
1583 if (of->start_time && ist->pts < of->start_time)
1586 if (of->recording_time != INT64_MAX &&
1587 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1588 (AVRational){1, 1000000}) >= 0) {
1589 ost->is_past_recording_time = 1;
1594 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1595 ost->input_video_filter) {
1597 if (ist->st->sample_aspect_ratio.num)
1598 sar = ist->st->sample_aspect_ratio;
1600 sar = ist->st->codec->sample_aspect_ratio;
1601 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1603 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1604 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1605 while (frame_available) {
1606 AVRational ist_pts_tb;
1607 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1608 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1610 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1612 os = output_files[ost->file_index].ctx;
1614 /* set the input output pts pairs */
1615 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1617 if (ost->encoding_needed) {
1618 av_assert0(ist->decoding_needed);
1619 switch(ost->st->codec->codec_type) {
1620 case AVMEDIA_TYPE_AUDIO:
1621 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1623 case AVMEDIA_TYPE_VIDEO:
1625 if (ost->picref->video && !ost->frame_aspect_ratio)
1626 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1628 do_video_out(os, ost, ist, &picture, &frame_size,
1629 same_quant ? quality : ost->st->codec->global_quality);
1630 if (vstats_filename && frame_size)
1631 do_video_stats(os, ost, frame_size);
1633 case AVMEDIA_TYPE_SUBTITLE:
1634 do_subtitle_out(os, ost, ist, &subtitle,
1641 AVFrame avframe; //FIXME/XXX remove this
1643 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1645 av_init_packet(&opkt);
1647 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1648 #if !CONFIG_AVFILTER
1654 /* no reencoding needed : output the packet directly */
1655 /* force the input stream PTS */
1657 avcodec_get_frame_defaults(&avframe);
1658 ost->st->codec->coded_frame= &avframe;
1659 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1661 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1662 audio_size += data_size;
1663 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1664 video_size += data_size;
1668 opkt.stream_index= ost->index;
1669 if(pkt->pts != AV_NOPTS_VALUE)
1670 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1672 opkt.pts= AV_NOPTS_VALUE;
1674 if (pkt->dts == AV_NOPTS_VALUE)
1675 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1677 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1678 opkt.dts -= ost_tb_start_time;
1680 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1681 opkt.flags= pkt->flags;
1683 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1684 if( ost->st->codec->codec_id != CODEC_ID_H264
1685 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1686 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1688 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1689 opkt.destruct= av_destruct_packet;
1691 opkt.data = data_buf;
1692 opkt.size = data_size;
1695 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1696 ost->st->codec->frame_number++;
1697 ost->frame_number++;
1698 av_free_packet(&opkt);
1702 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1703 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1705 avfilter_unref_buffer(ost->picref);
1710 av_free(buffer_to_free);
1711 /* XXX: allocate the subtitles in the codec ? */
1712 if (subtitle_to_free) {
1713 avsubtitle_free(subtitle_to_free);
1714 subtitle_to_free = NULL;
1721 for(i=0;i<nb_ostreams;i++) {
1722 ost = &ost_table[i];
1723 if (ost->source_index == ist_index) {
1724 AVCodecContext *enc= ost->st->codec;
1725 os = output_files[ost->file_index].ctx;
1727 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1729 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1732 if (ost->encoding_needed) {
1736 av_init_packet(&pkt);
1737 pkt.stream_index= ost->index;
1739 switch(ost->st->codec->codec_type) {
1740 case AVMEDIA_TYPE_AUDIO:
1741 fifo_bytes = av_fifo_size(ost->fifo);
1743 /* encode any samples remaining in fifo */
1744 if (fifo_bytes > 0) {
1745 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1746 int fs_tmp = enc->frame_size;
1748 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1749 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1750 enc->frame_size = fifo_bytes / (osize * enc->channels);
1752 int frame_bytes = enc->frame_size*osize*enc->channels;
1753 if (allocated_audio_buf_size < frame_bytes)
1755 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1758 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1759 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1760 ost->st->time_base.num, enc->sample_rate);
1761 enc->frame_size = fs_tmp;
1764 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1767 fprintf(stderr, "Audio encoding failed\n");
1771 pkt.flags |= AV_PKT_FLAG_KEY;
1773 case AVMEDIA_TYPE_VIDEO:
1774 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1776 fprintf(stderr, "Video encoding failed\n");
1780 if(enc->coded_frame && enc->coded_frame->key_frame)
1781 pkt.flags |= AV_PKT_FLAG_KEY;
1782 if (ost->logfile && enc->stats_out) {
1783 fprintf(ost->logfile, "%s", enc->stats_out);
1792 pkt.data= bit_buffer;
1794 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1795 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1796 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1806 static void print_sdp(OutputFile *output_files, int n)
1810 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1814 for (i = 0; i < n; i++)
1815 avc[i] = output_files[i].ctx;
1817 av_sdp_create(avc, n, sdp, sizeof(sdp));
1818 printf("SDP:\n%s\n", sdp);
1824 * The following code is the main loop of the file converter
1826 static int transcode(OutputFile *output_files,
1827 int nb_output_files,
1828 InputFile *input_files,
1832 AVFormatContext *is, *os;
1833 AVCodecContext *codec, *icodec;
1839 int no_packet_count=0;
1841 if (!(no_packet = av_mallocz(nb_input_files)))
1845 for (i = 0; i < nb_input_streams; i++)
1846 input_streams[i].start = av_gettime();
1848 /* output stream init */
1849 for(i=0;i<nb_output_files;i++) {
1850 os = output_files[i].ctx;
1851 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1852 av_dump_format(os, i, os->filename, 1);
1853 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1854 ret = AVERROR(EINVAL);
1859 /* for each output stream, we compute the right encoding parameters */
1860 for (i = 0; i < nb_output_streams; i++) {
1861 ost = &output_streams[i];
1862 os = output_files[ost->file_index].ctx;
1863 ist = &input_streams[ost->source_index];
1865 codec = ost->st->codec;
1866 icodec = ist->st->codec;
1868 ost->st->disposition = ist->st->disposition;
1869 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1870 codec->chroma_sample_location = icodec->chroma_sample_location;
1872 if (ost->st->stream_copy) {
1873 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1875 if (extra_size > INT_MAX)
1878 /* if stream_copy is selected, no need to decode or encode */
1879 codec->codec_id = icodec->codec_id;
1880 codec->codec_type = icodec->codec_type;
1882 if(!codec->codec_tag){
1883 if( !os->oformat->codec_tag
1884 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1885 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1886 codec->codec_tag = icodec->codec_tag;
1889 codec->bit_rate = icodec->bit_rate;
1890 codec->rc_max_rate = icodec->rc_max_rate;
1891 codec->rc_buffer_size = icodec->rc_buffer_size;
1892 codec->extradata= av_mallocz(extra_size);
1893 if (!codec->extradata)
1895 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1896 codec->extradata_size= icodec->extradata_size;
1897 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){
1898 codec->time_base = icodec->time_base;
1899 codec->time_base.num *= icodec->ticks_per_frame;
1900 av_reduce(&codec->time_base.num, &codec->time_base.den,
1901 codec->time_base.num, codec->time_base.den, INT_MAX);
1903 codec->time_base = ist->st->time_base;
1904 switch(codec->codec_type) {
1905 case AVMEDIA_TYPE_AUDIO:
1906 if(audio_volume != 256) {
1907 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1910 codec->channel_layout = icodec->channel_layout;
1911 codec->sample_rate = icodec->sample_rate;
1912 codec->channels = icodec->channels;
1913 codec->frame_size = icodec->frame_size;
1914 codec->audio_service_type = icodec->audio_service_type;
1915 codec->block_align= icodec->block_align;
1916 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1917 codec->block_align= 0;
1918 if(codec->codec_id == CODEC_ID_AC3)
1919 codec->block_align= 0;
1921 case AVMEDIA_TYPE_VIDEO:
1922 codec->pix_fmt = icodec->pix_fmt;
1923 codec->width = icodec->width;
1924 codec->height = icodec->height;
1925 codec->has_b_frames = icodec->has_b_frames;
1926 if (!codec->sample_aspect_ratio.num) {
1927 codec->sample_aspect_ratio =
1928 ost->st->sample_aspect_ratio =
1929 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1930 ist->st->codec->sample_aspect_ratio.num ?
1931 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1934 case AVMEDIA_TYPE_SUBTITLE:
1935 codec->width = icodec->width;
1936 codec->height = icodec->height;
1938 case AVMEDIA_TYPE_DATA:
1945 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1946 switch(codec->codec_type) {
1947 case AVMEDIA_TYPE_AUDIO:
1948 ost->fifo= av_fifo_alloc(1024);
1951 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
1952 if (!codec->sample_rate) {
1953 codec->sample_rate = icodec->sample_rate;
1955 codec->sample_rate >>= icodec->lowres;
1957 choose_sample_rate(ost->st, ost->enc);
1958 codec->time_base = (AVRational){1, codec->sample_rate};
1959 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
1960 codec->sample_fmt = icodec->sample_fmt;
1961 choose_sample_fmt(ost->st, ost->enc);
1962 if (!codec->channels)
1963 codec->channels = icodec->channels;
1964 codec->channel_layout = icodec->channel_layout;
1965 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
1966 codec->channel_layout = 0;
1967 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1968 icodec->request_channels = codec->channels;
1969 ist->decoding_needed = 1;
1970 ost->encoding_needed = 1;
1971 ost->resample_sample_fmt = icodec->sample_fmt;
1972 ost->resample_sample_rate = icodec->sample_rate;
1973 ost->resample_channels = icodec->channels;
1975 case AVMEDIA_TYPE_VIDEO:
1976 if (codec->pix_fmt == PIX_FMT_NONE)
1977 codec->pix_fmt = icodec->pix_fmt;
1978 choose_pixel_fmt(ost->st, ost->enc);
1980 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1981 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
1985 if (!codec->width || !codec->height) {
1986 codec->width = icodec->width;
1987 codec->height = icodec->height;
1990 ost->video_resample = codec->width != icodec->width ||
1991 codec->height != icodec->height ||
1992 codec->pix_fmt != icodec->pix_fmt;
1993 if (ost->video_resample) {
1994 #if !CONFIG_AVFILTER
1995 avcodec_get_frame_defaults(&ost->pict_tmp);
1996 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1997 codec->width, codec->height)) {
1998 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2001 ost->img_resample_ctx = sws_getContext(
2008 ost->sws_flags, NULL, NULL, NULL);
2009 if (ost->img_resample_ctx == NULL) {
2010 fprintf(stderr, "Cannot get resampling context\n");
2014 codec->bits_per_raw_sample= 0;
2017 ost->resample_height = icodec->height;
2018 ost->resample_width = icodec->width;
2019 ost->resample_pix_fmt= icodec->pix_fmt;
2020 ost->encoding_needed = 1;
2021 ist->decoding_needed = 1;
2023 if (!ost->frame_rate.num)
2024 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2025 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2026 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2027 ost->frame_rate = ost->enc->supported_framerates[idx];
2029 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2032 if (configure_video_filters(ist, ost)) {
2033 fprintf(stderr, "Error opening filters!\n");
2038 case AVMEDIA_TYPE_SUBTITLE:
2039 ost->encoding_needed = 1;
2040 ist->decoding_needed = 1;
2047 if (ost->encoding_needed &&
2048 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2049 char logfilename[1024];
2052 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2053 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2055 if (codec->flags & CODEC_FLAG_PASS1) {
2056 f = fopen(logfilename, "wb");
2058 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2064 size_t logbuffer_size;
2065 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2066 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2069 codec->stats_in = logbuffer;
2073 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2074 int size= codec->width * codec->height;
2075 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2080 bit_buffer = av_malloc(bit_buffer_size);
2082 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2084 ret = AVERROR(ENOMEM);
2088 /* open each encoder */
2089 for (i = 0; i < nb_output_streams; i++) {
2090 ost = &output_streams[i];
2091 if (ost->encoding_needed) {
2092 AVCodec *codec = ost->enc;
2093 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2095 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2096 ost->st->codec->codec_id, ost->file_index, ost->index);
2097 ret = AVERROR(EINVAL);
2100 if (dec->subtitle_header) {
2101 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2102 if (!ost->st->codec->subtitle_header) {
2103 ret = AVERROR(ENOMEM);
2106 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2107 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2109 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2110 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2111 ost->file_index, ost->index);
2112 ret = AVERROR(EINVAL);
2115 assert_codec_experimental(ost->st->codec, 1);
2116 assert_avoptions(ost->opts);
2117 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2118 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2119 "It takes bits/s as argument, not kbits/s\n");
2120 extra_size += ost->st->codec->extradata_size;
2124 /* open each decoder */
2125 for (i = 0; i < nb_input_streams; i++) {
2126 ist = &input_streams[i];
2127 if (ist->decoding_needed) {
2128 AVCodec *codec = ist->dec;
2130 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2132 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2133 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2134 ret = AVERROR(EINVAL);
2138 /* update requested sample format for the decoder based on the
2139 corresponding encoder sample format */
2140 for (j = 0; j < nb_output_streams; j++) {
2141 ost = &output_streams[j];
2142 if (ost->source_index == i) {
2143 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2148 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2149 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2150 ist->file_index, ist->st->index);
2151 ret = AVERROR(EINVAL);
2154 assert_codec_experimental(ist->st->codec, 0);
2155 assert_avoptions(ost->opts);
2160 for (i = 0; i < nb_input_streams; i++) {
2162 ist = &input_streams[i];
2164 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2165 ist->next_pts = AV_NOPTS_VALUE;
2166 init_pts_correction(&ist->pts_ctx);
2170 /* open files and write file headers */
2171 for (i = 0; i < nb_output_files; i++) {
2172 os = output_files[i].ctx;
2173 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2174 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2175 ret = AVERROR(EINVAL);
2178 assert_avoptions(output_files[i].opts);
2179 if (strcmp(os->oformat->name, "rtp")) {
2185 /* dump the file output parameters - cannot be done before in case
2187 for(i=0;i<nb_output_files;i++) {
2188 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2191 /* dump the stream mapping */
2193 fprintf(stderr, "Stream mapping:\n");
2194 for (i = 0; i < nb_output_streams;i ++) {
2195 ost = &output_streams[i];
2196 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2197 input_streams[ost->source_index].file_index,
2198 input_streams[ost->source_index].st->index,
2201 if (ost->sync_ist != &input_streams[ost->source_index])
2202 fprintf(stderr, " [sync #%d.%d]",
2203 ost->sync_ist->file_index,
2204 ost->sync_ist->st->index);
2205 if (ost->st->stream_copy)
2206 fprintf(stderr, " (copy)");
2207 fprintf(stderr, "\n");
2212 fprintf(stderr, "%s\n", error);
2217 print_sdp(output_files, nb_output_files);
2221 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2224 timer_start = av_gettime();
2226 for(; received_sigterm == 0;) {
2227 int file_index, ist_index;
2233 ipts_min = INT64_MAX;
2236 /* select the stream that we must read now by looking at the
2237 smallest output pts */
2239 for (i = 0; i < nb_output_streams; i++) {
2242 ost = &output_streams[i];
2243 os = output_files[ost->file_index].ctx;
2244 ist = &input_streams[ost->source_index];
2245 if(ost->is_past_recording_time || no_packet[ist->file_index])
2247 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2249 if (!input_files[ist->file_index].eof_reached){
2250 if(ipts < ipts_min) {
2252 if(input_sync ) file_index = ist->file_index;
2254 if(opts < opts_min) {
2256 if(!input_sync) file_index = ist->file_index;
2259 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2264 /* if none, if is finished */
2265 if (file_index < 0) {
2266 if(no_packet_count){
2268 memset(no_packet, 0, nb_input_files);
2275 /* finish if limit size exhausted */
2276 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2279 /* read a frame from it and output it in the fifo */
2280 is = input_files[file_index].ctx;
2281 ret= av_read_frame(is, &pkt);
2282 if(ret == AVERROR(EAGAIN)){
2283 no_packet[file_index]=1;
2288 input_files[file_index].eof_reached = 1;
2296 memset(no_packet, 0, nb_input_files);
2299 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2300 is->streams[pkt.stream_index]);
2302 /* the following test is needed in case new streams appear
2303 dynamically in stream : we ignore them */
2304 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2305 goto discard_packet;
2306 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2307 ist = &input_streams[ist_index];
2309 goto discard_packet;
2311 if (pkt.dts != AV_NOPTS_VALUE)
2312 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2313 if (pkt.pts != AV_NOPTS_VALUE)
2314 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2316 if (ist->ts_scale) {
2317 if(pkt.pts != AV_NOPTS_VALUE)
2318 pkt.pts *= ist->ts_scale;
2319 if(pkt.dts != AV_NOPTS_VALUE)
2320 pkt.dts *= ist->ts_scale;
2323 // 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);
2324 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2325 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2326 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2327 int64_t delta= pkt_dts - ist->next_pts;
2328 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2329 input_files[ist->file_index].ts_offset -= delta;
2331 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2332 delta, input_files[ist->file_index].ts_offset);
2333 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2334 if(pkt.pts != AV_NOPTS_VALUE)
2335 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2339 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2340 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2343 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2344 ist->file_index, ist->st->index);
2347 av_free_packet(&pkt);
2352 av_free_packet(&pkt);
2354 /* dump report by using the output first video and audio streams */
2355 print_report(output_files, output_streams, nb_output_streams, 0);
2358 /* at the end of stream, we must flush the decoder buffers */
2359 for (i = 0; i < nb_input_streams; i++) {
2360 ist = &input_streams[i];
2361 if (ist->decoding_needed) {
2362 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2368 /* write the trailer if needed and close file */
2369 for(i=0;i<nb_output_files;i++) {
2370 os = output_files[i].ctx;
2371 av_write_trailer(os);
2374 /* dump report by using the first video and audio streams */
2375 print_report(output_files, output_streams, nb_output_streams, 1);
2377 /* close each encoder */
2378 for (i = 0; i < nb_output_streams; i++) {
2379 ost = &output_streams[i];
2380 if (ost->encoding_needed) {
2381 av_freep(&ost->st->codec->stats_in);
2382 avcodec_close(ost->st->codec);
2385 avfilter_graph_free(&ost->graph);
2389 /* close each decoder */
2390 for (i = 0; i < nb_input_streams; i++) {
2391 ist = &input_streams[i];
2392 if (ist->decoding_needed) {
2393 avcodec_close(ist->st->codec);
2401 av_freep(&bit_buffer);
2402 av_freep(&no_packet);
2404 if (output_streams) {
2405 for (i = 0; i < nb_output_streams; i++) {
2406 ost = &output_streams[i];
2408 if (ost->st->stream_copy)
2409 av_freep(&ost->st->codec->extradata);
2411 fclose(ost->logfile);
2412 ost->logfile = NULL;
2414 av_fifo_free(ost->fifo); /* works even if fifo is not
2415 initialized but set to zero */
2416 av_freep(&ost->st->codec->subtitle_header);
2417 av_free(ost->pict_tmp.data[0]);
2418 av_free(ost->forced_kf_pts);
2419 if (ost->video_resample)
2420 sws_freeContext(ost->img_resample_ctx);
2422 audio_resample_close(ost->resample);
2423 if (ost->reformat_ctx)
2424 av_audio_convert_free(ost->reformat_ctx);
2425 av_dict_free(&ost->opts);
2432 static int opt_format(const char *opt, const char *arg)
2434 last_asked_format = arg;
2438 static int opt_video_rc_override_string(const char *opt, const char *arg)
2440 video_rc_override_string = arg;
2444 static int opt_me_threshold(const char *opt, const char *arg)
2446 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2450 static int opt_verbose(const char *opt, const char *arg)
2452 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2456 static int opt_frame_rate(const char *opt, const char *arg)
2458 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2459 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2465 static int opt_frame_crop(const char *opt, const char *arg)
2467 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2468 return AVERROR(EINVAL);
2471 static int opt_frame_size(const char *opt, const char *arg)
2473 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2474 fprintf(stderr, "Incorrect frame size\n");
2475 return AVERROR(EINVAL);
2480 static int opt_pad(const char *opt, const char *arg) {
2481 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2485 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2487 if (strcmp(arg, "list")) {
2488 frame_pix_fmt = av_get_pix_fmt(arg);
2489 if (frame_pix_fmt == PIX_FMT_NONE) {
2490 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2491 return AVERROR(EINVAL);
2500 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2507 p = strchr(arg, ':');
2509 x = strtol(arg, &end, 10);
2511 y = strtol(end+1, &end, 10);
2513 ar = (double)x / (double)y;
2515 ar = strtod(arg, NULL);
2518 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2519 return AVERROR(EINVAL);
2521 frame_aspect_ratio = ar;
2525 static int opt_metadata(const char *opt, const char *arg)
2527 char *mid= strchr(arg, '=');
2530 fprintf(stderr, "Missing =\n");
2535 av_dict_set(&metadata, arg, mid, 0);
2540 static int opt_qscale(const char *opt, const char *arg)
2542 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2543 if (video_qscale == 0) {
2544 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2545 return AVERROR(EINVAL);
2550 static int opt_top_field_first(const char *opt, const char *arg)
2552 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2556 static int opt_thread_count(const char *opt, const char *arg)
2558 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2561 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2566 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2568 if (strcmp(arg, "list")) {
2569 audio_sample_fmt = av_get_sample_fmt(arg);
2570 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2571 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2572 return AVERROR(EINVAL);
2577 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2578 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2584 static int opt_audio_rate(const char *opt, const char *arg)
2586 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2590 static int opt_audio_channels(const char *opt, const char *arg)
2592 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2596 static int opt_codec(const char *opt, const char *arg)
2598 return av_dict_set(&codec_names, opt, arg, 0);
2601 static int opt_audio_codec(const char *opt, const char *arg)
2603 return opt_codec("codec:a", arg);
2606 static int opt_video_codec(const char *opt, const char *arg)
2608 return opt_codec("codec:v", arg);
2611 static int opt_subtitle_codec(const char *opt, const char *arg)
2613 return opt_codec("codec:s", arg);
2616 static int opt_data_codec(const char *opt, const char *arg)
2618 return opt_codec("codec:d", arg);
2621 static int opt_codec_tag(const char *opt, const char *arg)
2624 uint32_t *codec_tag;
2626 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2627 !strcmp(opt, "vtag") ? &video_codec_tag :
2628 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2632 *codec_tag = strtol(arg, &tail, 0);
2634 *codec_tag = AV_RL32(arg);
2639 static int opt_map(const char *opt, const char *arg)
2641 StreamMap *m = NULL;
2642 int i, negative = 0, file_idx;
2643 int sync_file_idx = -1, sync_stream_idx;
2651 map = av_strdup(arg);
2653 /* parse sync stream first, just pick first matching stream */
2654 if (sync = strchr(map, ',')) {
2656 sync_file_idx = strtol(sync + 1, &sync, 0);
2657 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2658 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2663 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2664 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2665 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2666 sync_stream_idx = i;
2669 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2670 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2671 "match any streams.\n", arg);
2677 file_idx = strtol(map, &p, 0);
2678 if (file_idx >= nb_input_files || file_idx < 0) {
2679 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2683 /* disable some already defined maps */
2684 for (i = 0; i < nb_stream_maps; i++) {
2685 m = &stream_maps[i];
2686 if (check_stream_specifier(input_files[m->file_index].ctx,
2687 input_files[m->file_index].ctx->streams[m->stream_index],
2688 *p == ':' ? p + 1 : p) > 0)
2692 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2693 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2694 *p == ':' ? p + 1 : p) <= 0)
2696 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2697 m = &stream_maps[nb_stream_maps - 1];
2699 m->file_index = file_idx;
2700 m->stream_index = i;
2702 if (sync_file_idx >= 0) {
2703 m->sync_file_index = sync_file_idx;
2704 m->sync_stream_index = sync_stream_idx;
2706 m->sync_file_index = file_idx;
2707 m->sync_stream_index = i;
2712 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2720 static void parse_meta_type(char *arg, char *type, int *index)
2730 if (*(++arg) == ':')
2731 *index = strtol(++arg, NULL, 0);
2734 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2741 static int opt_map_metadata(const char *opt, const char *arg)
2743 MetadataMap *m, *m1;
2746 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2747 &nb_meta_data_maps, nb_meta_data_maps + 1);
2749 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2750 m->file = strtol(arg, &p, 0);
2751 parse_meta_type(p, &m->type, &m->index);
2753 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2754 if (p = strchr(opt, ':'))
2755 parse_meta_type(p, &m1->type, &m1->index);
2759 if (m->type == 'g' || m1->type == 'g')
2760 metadata_global_autocopy = 0;
2761 if (m->type == 's' || m1->type == 's')
2762 metadata_streams_autocopy = 0;
2763 if (m->type == 'c' || m1->type == 'c')
2764 metadata_chapters_autocopy = 0;
2769 static int opt_input_ts_scale(const char *opt, const char *arg)
2771 return av_dict_set(&ts_scale, opt, arg, 0);
2774 static int opt_recording_time(const char *opt, const char *arg)
2776 recording_time = parse_time_or_die(opt, arg, 1);
2780 static int opt_start_time(const char *opt, const char *arg)
2782 start_time = parse_time_or_die(opt, arg, 1);
2786 static int opt_input_ts_offset(const char *opt, const char *arg)
2788 input_ts_offset = parse_time_or_die(opt, arg, 1);
2792 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2794 const char *codec_string = encoder ? "encoder" : "decoder";
2798 return CODEC_ID_NONE;
2800 avcodec_find_encoder_by_name(name) :
2801 avcodec_find_decoder_by_name(name);
2803 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2806 if(codec->type != type) {
2807 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2813 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2815 AVDictionaryEntry *e = NULL;
2816 char *codec_name = NULL;
2819 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2820 char *p = strchr(e->key, ':');
2822 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2823 codec_name = e->value;
2830 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2831 return avcodec_find_encoder(st->codec->codec_id);
2833 } else if (!strcmp(codec_name, "copy"))
2834 st->stream_copy = 1;
2836 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2837 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2838 avcodec_find_decoder_by_name(codec_name);
2845 * Add all the streams from the given input file to the global
2846 * list of input streams.
2848 static void add_input_streams(AVFormatContext *ic)
2850 int i, rfps, rfps_base, ret;
2852 for (i = 0; i < ic->nb_streams; i++) {
2853 AVStream *st = ic->streams[i];
2854 AVCodecContext *dec = st->codec;
2855 AVDictionaryEntry *e = NULL;
2859 dec->thread_count = thread_count;
2861 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2862 ist = &input_streams[nb_input_streams - 1];
2864 ist->file_index = nb_input_files;
2866 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2868 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2869 char *p = strchr(e->key, ':');
2871 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2877 ist->ts_scale = strtod(scale, NULL);
2879 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
2881 switch (dec->codec_type) {
2882 case AVMEDIA_TYPE_AUDIO:
2884 st->discard= AVDISCARD_ALL;
2886 case AVMEDIA_TYPE_VIDEO:
2887 rfps = ic->streams[i]->r_frame_rate.num;
2888 rfps_base = ic->streams[i]->r_frame_rate.den;
2890 dec->flags |= CODEC_FLAG_EMU_EDGE;
2891 dec->height >>= dec->lowres;
2892 dec->width >>= dec->lowres;
2895 dec->debug |= FF_DEBUG_MV;
2897 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2900 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2901 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2903 (float)rfps / rfps_base, rfps, rfps_base);
2907 st->discard= AVDISCARD_ALL;
2908 else if(video_discard)
2909 st->discard= video_discard;
2911 case AVMEDIA_TYPE_DATA:
2913 case AVMEDIA_TYPE_SUBTITLE:
2914 if(subtitle_disable)
2915 st->discard = AVDISCARD_ALL;
2917 case AVMEDIA_TYPE_ATTACHMENT:
2918 case AVMEDIA_TYPE_UNKNOWN:
2926 static int opt_input_file(const char *opt, const char *filename)
2928 AVFormatContext *ic;
2929 AVInputFormat *file_iformat = NULL;
2933 AVDictionary **opts;
2934 int orig_nb_streams; // number of streams before avformat_find_stream_info
2936 if (last_asked_format) {
2937 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2938 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2941 last_asked_format = NULL;
2944 if (!strcmp(filename, "-"))
2947 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2948 !strcmp(filename, "/dev/stdin");
2950 /* get default parameters from command line */
2951 ic = avformat_alloc_context();
2953 print_error(filename, AVERROR(ENOMEM));
2956 if (audio_sample_rate) {
2957 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2958 av_dict_set(&format_opts, "sample_rate", buf, 0);
2960 if (audio_channels) {
2961 snprintf(buf, sizeof(buf), "%d", audio_channels);
2962 av_dict_set(&format_opts, "channels", buf, 0);
2964 if (frame_rate.num) {
2965 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2966 av_dict_set(&format_opts, "framerate", buf, 0);
2968 if (frame_width && frame_height) {
2969 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2970 av_dict_set(&format_opts, "video_size", buf, 0);
2972 if (frame_pix_fmt != PIX_FMT_NONE)
2973 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2975 ic->flags |= AVFMT_FLAG_NONBLOCK;
2977 /* open the input file with generic libav function */
2978 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2980 print_error(filename, err);
2983 assert_avoptions(format_opts);
2988 for(i=0; i<ic->nb_streams; i++){
2989 ic->streams[i]->discard= AVDISCARD_ALL;
2991 for(i=0; i<ic->nb_programs; i++){
2992 AVProgram *p= ic->programs[i];
2993 if(p->id != opt_programid){
2994 p->discard = AVDISCARD_ALL;
2997 for(j=0; j<p->nb_stream_indexes; j++){
2998 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3003 fprintf(stderr, "Specified program id not found\n");
3009 /* apply forced codec ids */
3010 for (i = 0; i < ic->nb_streams; i++)
3011 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3013 /* Set AVCodecContext options for avformat_find_stream_info */
3014 opts = setup_find_stream_info_opts(ic, codec_opts);
3015 orig_nb_streams = ic->nb_streams;
3017 /* If not enough info to get the stream parameters, we decode the
3018 first frames to get it. (used in mpeg case for example) */
3019 ret = avformat_find_stream_info(ic, opts);
3020 if (ret < 0 && verbose >= 0) {
3021 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3022 av_close_input_file(ic);
3026 timestamp = start_time;
3027 /* add the stream start time */
3028 if (ic->start_time != AV_NOPTS_VALUE)
3029 timestamp += ic->start_time;
3031 /* if seeking requested, we execute it */
3032 if (start_time != 0) {
3033 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3035 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3036 filename, (double)timestamp / AV_TIME_BASE);
3038 /* reset seek info */
3042 /* update the current parameters so that they match the one of the input stream */
3043 add_input_streams(ic);
3045 /* dump the file content */
3047 av_dump_format(ic, nb_input_files, filename, 0);
3049 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3050 input_files[nb_input_files - 1].ctx = ic;
3051 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3052 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3054 frame_rate = (AVRational){0, 0};
3055 frame_pix_fmt = PIX_FMT_NONE;
3058 audio_sample_rate = 0;
3060 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3061 av_dict_free(&ts_scale);
3063 for (i = 0; i < orig_nb_streams; i++)
3064 av_dict_free(&opts[i]);
3066 av_dict_free(&codec_names);
3072 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3073 AVCodecContext *avctx)
3079 for (p = kf; *p; p++)
3082 ost->forced_kf_count = n;
3083 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3084 if (!ost->forced_kf_pts) {
3085 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3088 for (i = 0; i < n; i++) {
3089 p = i ? strchr(p, ',') + 1 : kf;
3090 t = parse_time_or_die("force_key_frames", p, 1);
3091 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3095 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3098 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3099 int idx = oc->nb_streams - 1;
3102 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3106 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3107 nb_output_streams + 1);
3108 ost = &output_streams[nb_output_streams - 1];
3109 ost->file_index = nb_output_files;
3112 st->codec->codec_type = type;
3113 ost->enc = choose_codec(oc, st, type, codec_names);
3115 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3118 avcodec_get_context_defaults3(st->codec, ost->enc);
3119 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3121 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3125 static OutputStream *new_video_stream(AVFormatContext *oc)
3129 AVCodecContext *video_enc;
3131 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3133 if (!st->stream_copy) {
3134 ost->frame_aspect_ratio = frame_aspect_ratio;
3135 frame_aspect_ratio = 0;
3137 ost->avfilter= vfilters;
3142 ost->bitstream_filters = video_bitstream_filters;
3143 video_bitstream_filters= NULL;
3145 st->codec->thread_count= thread_count;
3147 video_enc = st->codec;
3150 video_enc->codec_tag= video_codec_tag;
3152 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3153 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3156 if (st->stream_copy) {
3157 video_enc->sample_aspect_ratio =
3158 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3164 ost->frame_rate = frame_rate;
3166 video_enc->width = frame_width;
3167 video_enc->height = frame_height;
3168 video_enc->pix_fmt = frame_pix_fmt;
3169 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3172 video_enc->gop_size = 0;
3173 if (video_qscale || same_quant) {
3174 video_enc->flags |= CODEC_FLAG_QSCALE;
3175 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3179 video_enc->intra_matrix = intra_matrix;
3181 video_enc->inter_matrix = inter_matrix;
3183 p= video_rc_override_string;
3186 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3188 fprintf(stderr, "error parsing rc_override\n");
3191 video_enc->rc_override=
3192 av_realloc(video_enc->rc_override,
3193 sizeof(RcOverride)*(i+1));
3194 video_enc->rc_override[i].start_frame= start;
3195 video_enc->rc_override[i].end_frame = end;
3197 video_enc->rc_override[i].qscale= q;
3198 video_enc->rc_override[i].quality_factor= 1.0;
3201 video_enc->rc_override[i].qscale= 0;
3202 video_enc->rc_override[i].quality_factor= -q/100.0;
3207 video_enc->rc_override_count=i;
3208 if (!video_enc->rc_initial_buffer_occupancy)
3209 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3210 video_enc->me_threshold= me_threshold;
3211 video_enc->intra_dc_precision= intra_dc_precision - 8;
3214 video_enc->flags|= CODEC_FLAG_PSNR;
3219 video_enc->flags |= CODEC_FLAG_PASS1;
3221 video_enc->flags |= CODEC_FLAG_PASS2;
3225 if (forced_key_frames)
3226 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3228 if (video_language) {
3229 av_dict_set(&st->metadata, "language", video_language, 0);
3230 av_freep(&video_language);
3233 /* reset some key parameters */
3235 av_freep(&forced_key_frames);
3236 frame_pix_fmt = PIX_FMT_NONE;
3240 static OutputStream *new_audio_stream(AVFormatContext *oc)
3244 AVCodecContext *audio_enc;
3246 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3249 ost->bitstream_filters = audio_bitstream_filters;
3250 audio_bitstream_filters= NULL;
3252 st->codec->thread_count= thread_count;
3254 audio_enc = st->codec;
3255 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3258 audio_enc->codec_tag= audio_codec_tag;
3260 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3261 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3263 if (!st->stream_copy) {
3264 if (audio_qscale > QSCALE_NONE) {
3265 audio_enc->flags |= CODEC_FLAG_QSCALE;
3266 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3269 audio_enc->channels = audio_channels;
3270 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3271 audio_enc->sample_fmt = audio_sample_fmt;
3272 if (audio_sample_rate)
3273 audio_enc->sample_rate = audio_sample_rate;
3275 if (audio_language) {
3276 av_dict_set(&st->metadata, "language", audio_language, 0);
3277 av_freep(&audio_language);
3280 /* reset some key parameters */
3286 static OutputStream *new_data_stream(AVFormatContext *oc)
3290 AVCodecContext *data_enc;
3292 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3294 data_enc = st->codec;
3295 if (!st->stream_copy) {
3296 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3301 data_enc->codec_tag= data_codec_tag;
3303 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3304 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3311 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3315 AVCodecContext *subtitle_enc;
3317 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3319 subtitle_enc = st->codec;
3321 ost->bitstream_filters = subtitle_bitstream_filters;
3322 subtitle_bitstream_filters= NULL;
3324 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3326 if(subtitle_codec_tag)
3327 subtitle_enc->codec_tag= subtitle_codec_tag;
3329 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3330 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3333 if (subtitle_language) {
3334 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3335 av_freep(&subtitle_language);
3338 subtitle_disable = 0;
3342 /* arg format is "output-stream-index:streamid-value". */
3343 static int opt_streamid(const char *opt, const char *arg)
3349 av_strlcpy(idx_str, arg, sizeof(idx_str));
3350 p = strchr(idx_str, ':');
3353 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3358 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3359 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3360 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3364 static int copy_chapters(int infile, int outfile)
3366 AVFormatContext *is = input_files[infile].ctx;
3367 AVFormatContext *os = output_files[outfile].ctx;
3370 for (i = 0; i < is->nb_chapters; i++) {
3371 AVChapter *in_ch = is->chapters[i], *out_ch;
3372 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3373 AV_TIME_BASE_Q, in_ch->time_base);
3374 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3375 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3378 if (in_ch->end < ts_off)
3380 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3383 out_ch = av_mallocz(sizeof(AVChapter));
3385 return AVERROR(ENOMEM);
3387 out_ch->id = in_ch->id;
3388 out_ch->time_base = in_ch->time_base;
3389 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3390 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3392 if (metadata_chapters_autocopy)
3393 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3396 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3398 return AVERROR(ENOMEM);
3399 os->chapters[os->nb_chapters - 1] = out_ch;
3404 static int read_avserver_streams(AVFormatContext *s, const char *filename)
3407 AVFormatContext *ic = NULL;
3409 err = avformat_open_input(&ic, filename, NULL, NULL);
3412 /* copy stream format */
3413 for(i=0;i<ic->nb_streams;i++) {
3418 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3419 ost = new_output_stream(s, codec->type);
3422 // FIXME: a more elegant solution is needed
3423 memcpy(st, ic->streams[i], sizeof(AVStream));
3425 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3427 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3428 choose_sample_fmt(st, codec);
3429 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3430 choose_pixel_fmt(st, codec);
3433 av_close_input_file(ic);
3437 static void opt_output_file(const char *filename)
3439 AVFormatContext *oc;
3441 AVOutputFormat *file_oformat;
3445 if (!strcmp(filename, "-"))
3448 oc = avformat_alloc_context();
3450 print_error(filename, AVERROR(ENOMEM));
3454 if (last_asked_format) {
3455 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3456 if (!file_oformat) {
3457 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3460 last_asked_format = NULL;
3462 file_oformat = av_guess_format(NULL, filename, NULL);
3463 if (!file_oformat) {
3464 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3470 oc->oformat = file_oformat;
3471 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3473 if (!strcmp(file_oformat->name, "ffm") &&
3474 av_strstart(filename, "http:", NULL)) {
3475 /* special case for files sent to avserver: we get the stream
3476 parameters from avserver */
3477 int err = read_avserver_streams(oc, filename);
3479 print_error(filename, err);
3482 } else if (!nb_stream_maps) {
3483 /* pick the "best" stream of each type */
3484 #define NEW_STREAM(type, index)\
3486 ost = new_ ## type ## _stream(oc);\
3487 ost->source_index = index;\
3488 ost->sync_ist = &input_streams[index];\
3489 input_streams[index].discard = 0;\
3492 /* video: highest resolution */
3493 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3494 int area = 0, idx = -1;
3495 for (i = 0; i < nb_input_streams; i++) {
3496 ist = &input_streams[i];
3497 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3498 ist->st->codec->width * ist->st->codec->height > area) {
3499 area = ist->st->codec->width * ist->st->codec->height;
3503 NEW_STREAM(video, idx);
3506 /* audio: most channels */
3507 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3508 int channels = 0, idx = -1;
3509 for (i = 0; i < nb_input_streams; i++) {
3510 ist = &input_streams[i];
3511 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3512 ist->st->codec->channels > channels) {
3513 channels = ist->st->codec->channels;
3517 NEW_STREAM(audio, idx);
3520 /* subtitles: pick first */
3521 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3522 for (i = 0; i < nb_input_streams; i++)
3523 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3524 NEW_STREAM(subtitle, i);
3528 /* do something with data? */
3530 for (i = 0; i < nb_stream_maps; i++) {
3531 StreamMap *map = &stream_maps[i];
3536 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3537 switch (ist->st->codec->codec_type) {
3538 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3539 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3540 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3541 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3543 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3544 map->file_index, map->stream_index);
3548 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3549 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3550 map->sync_stream_index];
3555 av_dict_copy(&oc->metadata, metadata, 0);
3556 av_dict_free(&metadata);
3559 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3560 output_files[nb_output_files - 1].ctx = oc;
3561 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3562 output_files[nb_output_files - 1].recording_time = recording_time;
3563 output_files[nb_output_files - 1].start_time = start_time;
3564 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3566 /* check filename in case of an image number is expected */
3567 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3568 if (!av_filename_number_test(oc->filename)) {
3569 print_error(oc->filename, AVERROR(EINVAL));
3574 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3575 /* test if it already exists to avoid loosing precious files */
3576 if (!file_overwrite &&
3577 (strchr(filename, ':') == NULL ||
3578 filename[1] == ':' ||
3579 av_strstart(filename, "file:", NULL))) {
3580 if (avio_check(filename, 0) == 0) {
3582 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3584 if (!read_yesno()) {
3585 fprintf(stderr, "Not overwriting - exiting\n");
3590 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3597 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3598 print_error(filename, err);
3603 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3604 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3605 oc->flags |= AVFMT_FLAG_NONBLOCK;
3608 if (chapters_input_file >= nb_input_files) {
3609 if (chapters_input_file == INT_MAX) {
3610 /* copy chapters from the first input file that has them*/
3611 chapters_input_file = -1;
3612 for (i = 0; i < nb_input_files; i++)
3613 if (input_files[i].ctx->nb_chapters) {
3614 chapters_input_file = i;
3618 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3619 chapters_input_file);
3623 if (chapters_input_file >= 0)
3624 copy_chapters(chapters_input_file, nb_output_files - 1);
3627 for (i = 0; i < nb_meta_data_maps; i++) {
3628 AVFormatContext *files[2];
3629 AVDictionary **meta[2];
3632 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3633 if ((index) < 0 || (index) >= (nb_elems)) {\
3634 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3639 int in_file_index = meta_data_maps[i][1].file;
3640 if (in_file_index < 0)
3642 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3645 files[1] = input_files[in_file_index].ctx;
3647 for (j = 0; j < 2; j++) {
3648 MetadataMap *map = &meta_data_maps[i][j];
3650 switch (map->type) {
3652 meta[j] = &files[j]->metadata;
3655 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3656 meta[j] = &files[j]->streams[map->index]->metadata;
3659 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3660 meta[j] = &files[j]->chapters[map->index]->metadata;
3663 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3664 meta[j] = &files[j]->programs[map->index]->metadata;
3669 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3672 /* copy global metadata by default */
3673 if (metadata_global_autocopy && nb_input_files)
3674 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3675 AV_DICT_DONT_OVERWRITE);
3676 if (metadata_streams_autocopy)
3677 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3678 InputStream *ist = &input_streams[output_streams[i].source_index];
3679 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3682 frame_rate = (AVRational){0, 0};
3685 audio_sample_rate = 0;
3687 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3688 chapters_input_file = INT_MAX;
3689 recording_time = INT64_MAX;
3692 av_freep(&meta_data_maps);
3693 nb_meta_data_maps = 0;
3694 metadata_global_autocopy = 1;
3695 metadata_streams_autocopy = 1;
3696 metadata_chapters_autocopy = 1;
3697 av_freep(&stream_maps);
3700 av_dict_free(&codec_names);
3702 av_freep(&forced_key_frames);
3707 /* same option as mencoder */
3708 static int opt_pass(const char *opt, const char *arg)
3710 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3714 static int64_t getutime(void)
3717 struct rusage rusage;
3719 getrusage(RUSAGE_SELF, &rusage);
3720 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3721 #elif HAVE_GETPROCESSTIMES
3723 FILETIME c, e, k, u;
3724 proc = GetCurrentProcess();
3725 GetProcessTimes(proc, &c, &e, &k, &u);
3726 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3728 return av_gettime();
3732 static int64_t getmaxrss(void)
3734 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3735 struct rusage rusage;
3736 getrusage(RUSAGE_SELF, &rusage);
3737 return (int64_t)rusage.ru_maxrss * 1024;
3738 #elif HAVE_GETPROCESSMEMORYINFO
3740 PROCESS_MEMORY_COUNTERS memcounters;
3741 proc = GetCurrentProcess();
3742 memcounters.cb = sizeof(memcounters);
3743 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3744 return memcounters.PeakPagefileUsage;
3750 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3753 const char *p = str;
3760 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3767 static void opt_inter_matrix(const char *arg)
3769 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3770 parse_matrix_coeffs(inter_matrix, arg);
3773 static void opt_intra_matrix(const char *arg)
3775 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3776 parse_matrix_coeffs(intra_matrix, arg);
3779 static void show_usage(void)
3781 printf("Hyper fast Audio and Video encoder\n");
3782 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3786 static void show_help(void)
3789 AVOutputFormat *oformat = NULL;
3790 AVInputFormat *iformat = NULL;
3792 av_log_set_callback(log_callback_help);
3794 show_help_options(options, "Main options:\n",
3795 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3796 show_help_options(options, "\nAdvanced options:\n",
3797 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3799 show_help_options(options, "\nVideo options:\n",
3800 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3802 show_help_options(options, "\nAdvanced Video options:\n",
3803 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3804 OPT_VIDEO | OPT_EXPERT);
3805 show_help_options(options, "\nAudio options:\n",
3806 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3808 show_help_options(options, "\nAdvanced Audio options:\n",
3809 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3810 OPT_AUDIO | OPT_EXPERT);
3811 show_help_options(options, "\nSubtitle options:\n",
3812 OPT_SUBTITLE | OPT_GRAB,
3814 show_help_options(options, "\nAudio/Video grab options:\n",
3818 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3821 /* individual codec options */
3823 while ((c = av_codec_next(c))) {
3824 if (c->priv_class) {
3825 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3830 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3833 /* individual muxer options */
3834 while ((oformat = av_oformat_next(oformat))) {
3835 if (oformat->priv_class) {
3836 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3841 /* individual demuxer options */
3842 while ((iformat = av_iformat_next(iformat))) {
3843 if (iformat->priv_class) {
3844 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3849 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3852 static int opt_target(const char *opt, const char *arg)
3854 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3855 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3857 if(!strncmp(arg, "pal-", 4)) {
3860 } else if(!strncmp(arg, "ntsc-", 5)) {
3863 } else if(!strncmp(arg, "film-", 5)) {
3868 /* Calculate FR via float to avoid int overflow */
3869 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3872 } else if((fr == 29970) || (fr == 23976)) {
3875 /* Try to determine PAL/NTSC by peeking in the input files */
3876 if(nb_input_files) {
3878 for (j = 0; j < nb_input_files; j++) {
3879 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
3880 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3881 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3883 fr = c->time_base.den * 1000 / c->time_base.num;
3887 } else if((fr == 29970) || (fr == 23976)) {
3897 if(verbose > 0 && norm != UNKNOWN)
3898 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3901 if(norm == UNKNOWN) {
3902 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3903 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3904 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3908 if(!strcmp(arg, "vcd")) {
3909 opt_codec("c:v", "mpeg1video");
3910 opt_codec("c:a", "mp2");
3911 opt_format("f", "vcd");
3913 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3914 opt_frame_rate("r", frame_rates[norm]);
3915 opt_default("g", norm == PAL ? "15" : "18");
3917 opt_default("b", "1150000");
3918 opt_default("maxrate", "1150000");
3919 opt_default("minrate", "1150000");
3920 opt_default("bufsize", "327680"); // 40*1024*8;
3922 opt_default("b:a", "224000");
3923 audio_sample_rate = 44100;
3926 opt_default("packetsize", "2324");
3927 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3929 /* We have to offset the PTS, so that it is consistent with the SCR.
3930 SCR starts at 36000, but the first two packs contain only padding
3931 and the first pack from the other stream, respectively, may also have
3932 been written before.
3933 So the real data starts at SCR 36000+3*1200. */
3934 mux_preload= (36000+3*1200) / 90000.0; //0.44
3935 } else if(!strcmp(arg, "svcd")) {
3937 opt_codec("c:v", "mpeg2video");
3938 opt_codec("c:a", "mp2");
3939 opt_format("f", "svcd");
3941 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3942 opt_frame_rate("r", frame_rates[norm]);
3943 opt_default("g", norm == PAL ? "15" : "18");
3945 opt_default("b", "2040000");
3946 opt_default("maxrate", "2516000");
3947 opt_default("minrate", "0"); //1145000;
3948 opt_default("bufsize", "1835008"); //224*1024*8;
3949 opt_default("flags", "+scan_offset");
3952 opt_default("b:a", "224000");
3953 audio_sample_rate = 44100;
3955 opt_default("packetsize", "2324");
3957 } else if(!strcmp(arg, "dvd")) {
3959 opt_codec("c:v", "mpeg2video");
3960 opt_codec("c:a", "ac3");
3961 opt_format("f", "dvd");
3963 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3964 opt_frame_rate("r", frame_rates[norm]);
3965 opt_default("g", norm == PAL ? "15" : "18");
3967 opt_default("b", "6000000");
3968 opt_default("maxrate", "9000000");
3969 opt_default("minrate", "0"); //1500000;
3970 opt_default("bufsize", "1835008"); //224*1024*8;
3972 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3973 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3975 opt_default("b:a", "448000");
3976 audio_sample_rate = 48000;
3978 } else if(!strncmp(arg, "dv", 2)) {
3980 opt_format("f", "dv");
3982 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3983 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3984 norm == PAL ? "yuv420p" : "yuv411p");
3985 opt_frame_rate("r", frame_rates[norm]);
3987 audio_sample_rate = 48000;
3991 fprintf(stderr, "Unknown target: %s\n", arg);
3992 return AVERROR(EINVAL);
3997 static int opt_vstats_file(const char *opt, const char *arg)
3999 av_free (vstats_filename);
4000 vstats_filename=av_strdup (arg);
4004 static int opt_vstats(const char *opt, const char *arg)
4007 time_t today2 = time(NULL);
4008 struct tm *today = localtime(&today2);
4010 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4012 return opt_vstats_file(opt, filename);
4015 static int opt_bsf(const char *opt, const char *arg)
4017 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4018 AVBitStreamFilterContext **bsfp;
4021 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4025 bsfp= *opt == 'v' ? &video_bitstream_filters :
4026 *opt == 'a' ? &audio_bitstream_filters :
4027 &subtitle_bitstream_filters;
4029 bsfp= &(*bsfp)->next;
4036 static const OptionDef options[] = {
4038 #include "cmdutils_common_opts.h"
4039 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4040 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4041 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4042 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4043 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4044 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4045 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4046 "outfile[,metadata]:infile[,metadata]" },
4047 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4048 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4049 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4050 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4051 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4052 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4053 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4054 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4055 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4056 "add timings for benchmarking" },
4057 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4058 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4059 "dump each input packet" },
4060 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4061 "when dumping packets, also dump the payload" },
4062 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4063 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4064 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4065 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4066 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4067 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4068 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4069 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4070 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4071 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4072 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4073 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4074 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4075 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4078 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4079 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4080 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4081 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4082 { "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" },
4083 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4084 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4085 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4086 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4087 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4088 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4089 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4090 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4091 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4092 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4093 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4094 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4095 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4096 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4097 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4098 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4099 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4100 "use same quantizer as source (implies VBR)" },
4101 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4102 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4103 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4104 "deinterlace pictures" },
4105 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4106 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4107 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4109 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4111 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4112 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4113 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4114 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4115 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4116 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4117 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4118 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4119 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4120 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4123 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4124 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4125 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4126 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4127 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4128 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4129 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4130 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4131 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4132 { "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" },
4134 /* subtitle options */
4135 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4136 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4137 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4138 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4141 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4144 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4145 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4147 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4148 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4149 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4151 /* data codec support */
4152 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4154 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4158 int main(int argc, char **argv)
4162 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4164 avcodec_register_all();
4166 avdevice_register_all();
4169 avfilter_register_all();
4173 avio_set_interrupt_cb(decode_interrupt_cb);
4180 parse_options(argc, argv, options, opt_output_file);
4182 if(nb_output_files <= 0 && nb_input_files == 0) {
4184 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4188 /* file converter / grab */
4189 if (nb_output_files <= 0) {
4190 fprintf(stderr, "At least one output file must be specified\n");
4194 if (nb_input_files == 0) {
4195 fprintf(stderr, "At least one input file must be specified\n");
4200 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4202 ti = getutime() - ti;
4204 int maxrss = getmaxrss() / 1024;
4205 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4208 return exit_program(0);