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 #define MAX_FILES 100
102 static const char *last_asked_format = NULL;
103 static double *ts_scale;
104 static int nb_ts_scale;
106 static AVFormatContext *output_files[MAX_FILES];
107 static AVDictionary *output_opts[MAX_FILES];
108 static int nb_output_files = 0;
110 static StreamMap *stream_maps = NULL;
111 static int nb_stream_maps;
113 static AVDictionary *codec_names;
115 /* first item specifies output metadata, second is input */
116 static MetadataMap (*meta_data_maps)[2] = NULL;
117 static int nb_meta_data_maps;
118 static int metadata_global_autocopy = 1;
119 static int metadata_streams_autocopy = 1;
120 static int metadata_chapters_autocopy = 1;
122 static int chapters_input_file = INT_MAX;
124 /* indexed by output file stream index */
125 static int *streamid_map = NULL;
126 static int nb_streamid_map = 0;
128 static int frame_width = 0;
129 static int frame_height = 0;
130 static float frame_aspect_ratio = 0;
131 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
132 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
133 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
134 static AVRational frame_rate;
135 static float video_qscale = 0;
136 static uint16_t *intra_matrix = NULL;
137 static uint16_t *inter_matrix = NULL;
138 static const char *video_rc_override_string=NULL;
139 static int video_disable = 0;
140 static int video_discard = 0;
141 static unsigned int video_codec_tag = 0;
142 static char *video_language = NULL;
143 static int same_quant = 0;
144 static int do_deinterlace = 0;
145 static int top_field_first = -1;
146 static int me_threshold = 0;
147 static int intra_dc_precision = 8;
148 static int qp_hist = 0;
150 static char *vfilters = NULL;
153 static int intra_only = 0;
154 static int audio_sample_rate = 0;
155 #define QSCALE_NONE -99999
156 static float audio_qscale = QSCALE_NONE;
157 static int audio_disable = 0;
158 static int audio_channels = 0;
159 static unsigned int audio_codec_tag = 0;
160 static char *audio_language = NULL;
162 static int subtitle_disable = 0;
163 static char *subtitle_language = NULL;
164 static unsigned int subtitle_codec_tag = 0;
166 static int data_disable = 0;
167 static unsigned int data_codec_tag = 0;
169 static float mux_preload= 0.5;
170 static float mux_max_delay= 0.7;
172 static int64_t recording_time = INT64_MAX;
173 static int64_t start_time = 0;
174 static int64_t input_ts_offset = 0;
175 static int file_overwrite = 0;
176 static AVDictionary *metadata;
177 static int do_benchmark = 0;
178 static int do_hex_dump = 0;
179 static int do_pkt_dump = 0;
180 static int do_psnr = 0;
181 static int do_pass = 0;
182 static char *pass_logfilename_prefix = NULL;
183 static int video_sync_method= -1;
184 static int audio_sync_method= 0;
185 static float audio_drift_threshold= 0.1;
186 static int copy_ts= 0;
188 static int opt_shortest = 0;
189 static char *vstats_filename;
190 static FILE *vstats_file;
191 static int opt_programid = 0;
192 static int copy_initial_nonkeyframes = 0;
194 static int rate_emu = 0;
196 static int audio_volume = 256;
198 static int exit_on_error = 0;
199 static int using_stdin = 0;
200 static int verbose = 1;
201 static int thread_count= 1;
202 static int64_t video_size = 0;
203 static int64_t audio_size = 0;
204 static int64_t extra_size = 0;
205 static int nb_frames_dup = 0;
206 static int nb_frames_drop = 0;
207 static int input_sync;
208 static uint64_t limit_filesize = 0;
209 static int force_fps = 0;
210 static char *forced_key_frames = NULL;
212 static float dts_delta_threshold = 10;
214 static int64_t timer_start;
216 static uint8_t *audio_buf;
217 static uint8_t *audio_out;
218 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
220 static short *samples;
222 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
223 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
224 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
226 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
230 typedef struct OutputStream {
231 int file_index; /* file index */
232 int index; /* stream index in the output file */
233 int source_index; /* InputStream index */
234 AVStream *st; /* stream in the output file */
235 int encoding_needed; /* true if encoding needed for this stream */
237 /* input pts and corresponding output pts
239 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
240 struct InputStream *sync_ist; /* input stream to sync against */
241 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
242 AVBitStreamFilterContext *bitstream_filters;
247 AVFrame pict_tmp; /* temporary image for resampling */
248 struct SwsContext *img_resample_ctx; /* for image resampling */
251 int resample_pix_fmt;
252 AVRational frame_rate;
254 float frame_aspect_ratio;
256 /* forced key frames */
257 int64_t *forced_kf_pts;
263 ReSampleContext *resample; /* for audio resampling */
264 int resample_sample_fmt;
265 int resample_channels;
266 int resample_sample_rate;
268 AVAudioConvert *reformat_ctx;
269 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
273 AVFilterContext *output_video_filter;
274 AVFilterContext *input_video_filter;
275 AVFilterBufferRef *picref;
277 AVFilterGraph *graph;
284 static OutputStream **output_streams_for_file[MAX_FILES] = { NULL };
285 static int nb_output_streams_for_file[MAX_FILES] = { 0 };
287 typedef struct InputStream {
290 int discard; /* true if stream data should be discarded */
291 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
294 int64_t start; /* time when read started */
295 int64_t next_pts; /* synthetic pts for cases where pkt.pts
297 int64_t pts; /* current pts */
298 PtsCorrectionContext pts_ctx;
300 int is_start; /* is 1 at the start and after a discontinuity */
301 int showed_multi_packet_warning;
302 int is_past_recording_time;
306 typedef struct InputFile {
307 AVFormatContext *ctx;
308 int eof_reached; /* true if eof reached */
309 int ist_index; /* index of first stream in ist_table */
310 int buffer_size; /* current total buffer size */
314 static InputStream *input_streams = NULL;
315 static int nb_input_streams = 0;
316 static InputFile *input_files = NULL;
317 static int nb_input_files = 0;
321 static int configure_video_filters(InputStream *ist, OutputStream *ost)
323 AVFilterContext *last_filter, *filter;
324 /** filter graph containing all filters including input & output */
325 AVCodecContext *codec = ost->st->codec;
326 AVCodecContext *icodec = ist->st->codec;
327 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
328 AVRational sample_aspect_ratio;
332 ost->graph = avfilter_graph_alloc();
334 if (ist->st->sample_aspect_ratio.num){
335 sample_aspect_ratio = ist->st->sample_aspect_ratio;
337 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
339 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
340 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
341 sample_aspect_ratio.num, sample_aspect_ratio.den);
343 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
344 "src", args, NULL, ost->graph);
347 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
348 "out", NULL, &ffsink_ctx, ost->graph);
351 last_filter = ost->input_video_filter;
353 if (codec->width != icodec->width || codec->height != icodec->height) {
354 snprintf(args, 255, "%d:%d:flags=0x%X",
358 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
359 NULL, args, NULL, ost->graph)) < 0)
361 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
363 last_filter = filter;
366 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
367 ost->graph->scale_sws_opts = av_strdup(args);
370 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
371 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
373 outputs->name = av_strdup("in");
374 outputs->filter_ctx = last_filter;
375 outputs->pad_idx = 0;
376 outputs->next = NULL;
378 inputs->name = av_strdup("out");
379 inputs->filter_ctx = ost->output_video_filter;
383 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
385 av_freep(&ost->avfilter);
387 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
391 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
394 codec->width = ost->output_video_filter->inputs[0]->w;
395 codec->height = ost->output_video_filter->inputs[0]->h;
396 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
397 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
398 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
399 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
403 #endif /* CONFIG_AVFILTER */
405 static void term_exit(void)
407 av_log(NULL, AV_LOG_QUIET, "");
410 static volatile int received_sigterm = 0;
411 static volatile int received_nb_signals = 0;
414 sigterm_handler(int sig)
416 received_sigterm = sig;
417 received_nb_signals++;
421 static void term_init(void)
423 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
424 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
426 signal(SIGXCPU, sigterm_handler);
430 static int decode_interrupt_cb(void)
432 return received_nb_signals > 1;
435 static int exit_program(int ret)
440 for(i=0;i<nb_output_files;i++) {
441 AVFormatContext *s = output_files[i];
442 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
444 avformat_free_context(s);
445 av_free(output_streams_for_file[i]);
446 av_dict_free(&output_opts[i]);
448 for(i=0;i<nb_input_files;i++) {
449 av_close_input_file(input_files[i].ctx);
451 for (i = 0; i < nb_input_streams; i++)
452 av_dict_free(&input_streams[i].opts);
454 av_free(intra_matrix);
455 av_free(inter_matrix);
459 av_free(vstats_filename);
461 av_free(streamid_map);
462 av_free(meta_data_maps);
464 av_freep(&input_streams);
465 av_freep(&input_files);
470 allocated_audio_buf_size= allocated_audio_out_size= 0;
477 if (received_sigterm) {
479 "Received signal %d: terminating.\n",
480 (int) received_sigterm);
484 exit(ret); /* not all OS-es handle main() return value */
488 static void assert_avoptions(AVDictionary *m)
490 AVDictionaryEntry *t;
491 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
492 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
497 static void assert_codec_experimental(AVCodecContext *c, int encoder)
499 const char *codec_string = encoder ? "encoder" : "decoder";
501 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
502 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
503 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
504 "results.\nAdd '-strict experimental' if you want to use it.\n",
505 codec_string, c->codec->name);
506 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
507 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
508 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
509 codec_string, codec->name);
514 /* similar to ff_dynarray_add() and av_fast_realloc() */
515 static void *grow_array(void *array, int elem_size, int *size, int new_size)
517 if (new_size >= INT_MAX / elem_size) {
518 fprintf(stderr, "Array too big.\n");
521 if (*size < new_size) {
522 uint8_t *tmp = av_realloc(array, new_size*elem_size);
524 fprintf(stderr, "Could not alloc buffer.\n");
527 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
534 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
536 if(codec && codec->sample_fmts){
537 const enum AVSampleFormat *p= codec->sample_fmts;
539 if(*p == st->codec->sample_fmt)
543 av_log(NULL, AV_LOG_WARNING,
544 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
545 av_get_sample_fmt_name(st->codec->sample_fmt),
547 av_get_sample_fmt_name(codec->sample_fmts[0]));
548 st->codec->sample_fmt = codec->sample_fmts[0];
554 * Update the requested input sample format based on the output sample format.
555 * This is currently only used to request float output from decoders which
556 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
557 * Ideally this will be removed in the future when decoders do not do format
558 * conversion and only output in their native format.
560 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
563 /* if sample formats match or a decoder sample format has already been
564 requested, just return */
565 if (enc->sample_fmt == dec->sample_fmt ||
566 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
569 /* if decoder supports more than one output format */
570 if (dec_codec && dec_codec->sample_fmts &&
571 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
572 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
573 const enum AVSampleFormat *p;
574 int min_dec = -1, min_inc = -1;
576 /* find a matching sample format in the encoder */
577 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
578 if (*p == enc->sample_fmt) {
579 dec->request_sample_fmt = *p;
581 } else if (*p > enc->sample_fmt) {
582 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
584 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
587 /* if none match, provide the one that matches quality closest */
588 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
589 enc->sample_fmt - min_dec;
593 static void choose_sample_rate(AVStream *st, AVCodec *codec)
595 if(codec && codec->supported_samplerates){
596 const int *p= codec->supported_samplerates;
598 int best_dist=INT_MAX;
600 int dist= abs(st->codec->sample_rate - *p);
601 if(dist < best_dist){
607 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
609 st->codec->sample_rate= best;
613 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
615 if(codec && codec->pix_fmts){
616 const enum PixelFormat *p= codec->pix_fmts;
617 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
618 if(st->codec->codec_id==CODEC_ID_MJPEG){
619 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
620 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
621 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};
625 if(*p == st->codec->pix_fmt)
629 if(st->codec->pix_fmt != PIX_FMT_NONE)
630 av_log(NULL, AV_LOG_WARNING,
631 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
632 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
634 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
635 st->codec->pix_fmt = codec->pix_fmts[0];
641 get_sync_ipts(const OutputStream *ost)
643 const InputStream *ist = ost->sync_ist;
644 return (double)(ist->pts - start_time)/AV_TIME_BASE;
647 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
651 AVPacket new_pkt= *pkt;
652 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
653 &new_pkt.data, &new_pkt.size,
654 pkt->data, pkt->size,
655 pkt->flags & AV_PKT_FLAG_KEY);
658 new_pkt.destruct= av_destruct_packet;
660 fprintf(stderr, "%s failed for stream %d, codec %s",
661 bsfc->filter->name, pkt->stream_index,
662 avctx->codec ? avctx->codec->name : "copy");
672 ret= av_interleaved_write_frame(s, pkt);
674 print_error("av_interleaved_write_frame()", ret);
679 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
681 static void do_audio_out(AVFormatContext *s,
684 unsigned char *buf, int size)
687 int64_t audio_out_size, audio_buf_size;
688 int64_t allocated_for_size= size;
690 int size_out, frame_bytes, ret, resample_changed;
691 AVCodecContext *enc= ost->st->codec;
692 AVCodecContext *dec= ist->st->codec;
693 int osize = av_get_bytes_per_sample(enc->sample_fmt);
694 int isize = av_get_bytes_per_sample(dec->sample_fmt);
695 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
698 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
699 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
700 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
701 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
702 audio_buf_size*= osize*enc->channels;
704 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
705 if(coded_bps > 8*osize)
706 audio_out_size= audio_out_size * coded_bps / (8*osize);
707 audio_out_size += FF_MIN_BUFFER_SIZE;
709 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
710 fprintf(stderr, "Buffer sizes too large\n");
714 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
715 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
716 if (!audio_buf || !audio_out){
717 fprintf(stderr, "Out of memory in do_audio_out\n");
721 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
722 ost->audio_resample = 1;
724 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
725 ost->resample_channels != dec->channels ||
726 ost->resample_sample_rate != dec->sample_rate;
728 if ((ost->audio_resample && !ost->resample) || resample_changed) {
729 if (resample_changed) {
730 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",
731 ist->file_index, ist->st->index,
732 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
733 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
734 ost->resample_sample_fmt = dec->sample_fmt;
735 ost->resample_channels = dec->channels;
736 ost->resample_sample_rate = dec->sample_rate;
738 audio_resample_close(ost->resample);
740 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
741 if (audio_sync_method <= 1 &&
742 ost->resample_sample_fmt == enc->sample_fmt &&
743 ost->resample_channels == enc->channels &&
744 ost->resample_sample_rate == enc->sample_rate) {
745 ost->resample = NULL;
746 ost->audio_resample = 0;
747 } else if (ost->audio_resample) {
748 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
749 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
750 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
751 enc->sample_rate, dec->sample_rate,
752 enc->sample_fmt, dec->sample_fmt,
754 if (!ost->resample) {
755 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
756 dec->channels, dec->sample_rate,
757 enc->channels, enc->sample_rate);
763 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
764 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
765 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
766 if (ost->reformat_ctx)
767 av_audio_convert_free(ost->reformat_ctx);
768 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
769 dec->sample_fmt, 1, NULL, 0);
770 if (!ost->reformat_ctx) {
771 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
772 av_get_sample_fmt_name(dec->sample_fmt),
773 av_get_sample_fmt_name(enc->sample_fmt));
776 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
779 if(audio_sync_method){
780 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
781 - av_fifo_size(ost->fifo)/(enc->channels * 2);
782 double idelta= delta*dec->sample_rate / enc->sample_rate;
783 int byte_delta= ((int)idelta)*2*dec->channels;
785 //FIXME resample delay
786 if(fabs(delta) > 50){
787 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
789 byte_delta= FFMAX(byte_delta, -size);
793 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
798 static uint8_t *input_tmp= NULL;
799 input_tmp= av_realloc(input_tmp, byte_delta + size);
801 if(byte_delta > allocated_for_size - size){
802 allocated_for_size= byte_delta + (int64_t)size;
807 memset(input_tmp, 0, byte_delta);
808 memcpy(input_tmp + byte_delta, buf, size);
812 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
814 }else if(audio_sync_method>1){
815 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
816 av_assert0(ost->audio_resample);
818 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
819 // 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));
820 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
824 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
825 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
827 if (ost->audio_resample) {
829 size_out = audio_resample(ost->resample,
830 (short *)buftmp, (short *)buf,
831 size / (dec->channels * isize));
832 size_out = size_out * enc->channels * osize;
838 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
839 const void *ibuf[6]= {buftmp};
840 void *obuf[6]= {audio_buf};
841 int istride[6]= {isize};
842 int ostride[6]= {osize};
843 int len= size_out/istride[0];
844 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
845 printf("av_audio_convert() failed\n");
851 size_out = len*osize;
854 /* now encode as many frames as possible */
855 if (enc->frame_size > 1) {
856 /* output resampled raw samples */
857 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
858 fprintf(stderr, "av_fifo_realloc2() failed\n");
861 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
863 frame_bytes = enc->frame_size * osize * enc->channels;
865 while (av_fifo_size(ost->fifo) >= frame_bytes) {
867 av_init_packet(&pkt);
869 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
871 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
873 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
876 fprintf(stderr, "Audio encoding failed\n");
880 pkt.stream_index= ost->index;
883 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
884 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
885 pkt.flags |= AV_PKT_FLAG_KEY;
886 write_frame(s, &pkt, enc, ost->bitstream_filters);
888 ost->sync_opts += enc->frame_size;
892 av_init_packet(&pkt);
894 ost->sync_opts += size_out / (osize * enc->channels);
896 /* output a pcm frame */
897 /* determine the size of the coded buffer */
900 size_out = size_out*coded_bps/8;
902 if(size_out > audio_out_size){
903 fprintf(stderr, "Internal error, buffer size too small\n");
907 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
908 ret = avcodec_encode_audio(enc, audio_out, size_out,
911 fprintf(stderr, "Audio encoding failed\n");
915 pkt.stream_index= ost->index;
918 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
919 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
920 pkt.flags |= AV_PKT_FLAG_KEY;
921 write_frame(s, &pkt, enc, ost->bitstream_filters);
925 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
929 AVPicture picture_tmp;
932 dec = ist->st->codec;
934 /* deinterlace : must be done before any resize */
935 if (do_deinterlace) {
938 /* create temporary picture */
939 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
940 buf = av_malloc(size);
944 picture2 = &picture_tmp;
945 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
947 if(avpicture_deinterlace(picture2, picture,
948 dec->pix_fmt, dec->width, dec->height) < 0) {
949 /* if error, do not deinterlace */
950 fprintf(stderr, "Deinterlacing failed\n");
959 if (picture != picture2)
960 *picture = *picture2;
964 /* we begin to correct av delay at this threshold */
965 #define AV_DELAY_MAX 0.100
967 static void do_subtitle_out(AVFormatContext *s,
973 static uint8_t *subtitle_out = NULL;
974 int subtitle_out_max_size = 1024 * 1024;
975 int subtitle_out_size, nb, i;
979 if (pts == AV_NOPTS_VALUE) {
980 fprintf(stderr, "Subtitle packets must have a pts\n");
986 enc = ost->st->codec;
989 subtitle_out = av_malloc(subtitle_out_max_size);
992 /* Note: DVB subtitle need one packet to draw them and one other
993 packet to clear them */
994 /* XXX: signal it in the codec context ? */
995 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1000 for(i = 0; i < nb; i++) {
1001 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1002 // start_display_time is required to be 0
1003 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1004 sub->end_display_time -= sub->start_display_time;
1005 sub->start_display_time = 0;
1006 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1007 subtitle_out_max_size, sub);
1008 if (subtitle_out_size < 0) {
1009 fprintf(stderr, "Subtitle encoding failed\n");
1013 av_init_packet(&pkt);
1014 pkt.stream_index = ost->index;
1015 pkt.data = subtitle_out;
1016 pkt.size = subtitle_out_size;
1017 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1018 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1019 /* XXX: the pts correction is handled here. Maybe handling
1020 it in the codec would be better */
1022 pkt.pts += 90 * sub->start_display_time;
1024 pkt.pts += 90 * sub->end_display_time;
1026 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1030 static int bit_buffer_size= 1024*256;
1031 static uint8_t *bit_buffer= NULL;
1033 static void do_video_out(AVFormatContext *s,
1036 AVFrame *in_picture,
1037 int *frame_size, float quality)
1039 int nb_frames, i, ret, resample_changed;
1040 AVFrame *final_picture, *formatted_picture;
1041 AVCodecContext *enc, *dec;
1044 enc = ost->st->codec;
1045 dec = ist->st->codec;
1047 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1049 /* by default, we output a single frame */
1054 if(video_sync_method){
1055 double vdelta = sync_ipts - ost->sync_opts;
1056 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1059 else if (video_sync_method == 2 || (video_sync_method<0 && (s->oformat->flags & AVFMT_VARIABLE_FPS))){
1062 }else if(vdelta>0.6)
1063 ost->sync_opts= lrintf(sync_ipts);
1064 }else if (vdelta > 1.1)
1065 nb_frames = lrintf(vdelta);
1066 //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);
1067 if (nb_frames == 0){
1070 fprintf(stderr, "*** drop!\n");
1071 }else if (nb_frames > 1) {
1072 nb_frames_dup += nb_frames - 1;
1074 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1077 ost->sync_opts= lrintf(sync_ipts);
1079 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1083 formatted_picture = in_picture;
1084 final_picture = formatted_picture;
1086 resample_changed = ost->resample_width != dec->width ||
1087 ost->resample_height != dec->height ||
1088 ost->resample_pix_fmt != dec->pix_fmt;
1090 if (resample_changed) {
1091 av_log(NULL, AV_LOG_INFO,
1092 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1093 ist->file_index, ist->st->index,
1094 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1095 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1096 if(!ost->video_resample)
1097 ost->video_resample = 1;
1100 #if !CONFIG_AVFILTER
1101 if (ost->video_resample) {
1102 final_picture = &ost->pict_tmp;
1103 if (resample_changed) {
1104 /* initialize a new scaler context */
1105 sws_freeContext(ost->img_resample_ctx);
1106 ost->img_resample_ctx = sws_getContext(
1107 ist->st->codec->width,
1108 ist->st->codec->height,
1109 ist->st->codec->pix_fmt,
1110 ost->st->codec->width,
1111 ost->st->codec->height,
1112 ost->st->codec->pix_fmt,
1113 ost->sws_flags, NULL, NULL, NULL);
1114 if (ost->img_resample_ctx == NULL) {
1115 fprintf(stderr, "Cannot get resampling context\n");
1119 sws_scale(ost->img_resample_ctx, formatted_picture->data, formatted_picture->linesize,
1120 0, ost->resample_height, final_picture->data, final_picture->linesize);
1123 if (resample_changed) {
1124 avfilter_graph_free(&ost->graph);
1125 if (configure_video_filters(ist, ost)) {
1126 fprintf(stderr, "Error reinitialising filters!\n");
1131 if (resample_changed) {
1132 ost->resample_width = dec->width;
1133 ost->resample_height = dec->height;
1134 ost->resample_pix_fmt = dec->pix_fmt;
1137 /* duplicates frame if needed */
1138 for(i=0;i<nb_frames;i++) {
1140 av_init_packet(&pkt);
1141 pkt.stream_index= ost->index;
1143 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1144 /* raw pictures are written as AVPicture structure to
1145 avoid any copies. We support temorarily the older
1147 AVFrame* old_frame = enc->coded_frame;
1148 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1149 pkt.data= (uint8_t *)final_picture;
1150 pkt.size= sizeof(AVPicture);
1151 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1152 pkt.flags |= AV_PKT_FLAG_KEY;
1154 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1155 enc->coded_frame = old_frame;
1157 AVFrame big_picture;
1159 big_picture= *final_picture;
1160 /* better than nothing: use input picture interlaced
1162 big_picture.interlaced_frame = in_picture->interlaced_frame;
1163 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1164 if(top_field_first == -1)
1165 big_picture.top_field_first = in_picture->top_field_first;
1167 big_picture.top_field_first = top_field_first;
1170 /* handles same_quant here. This is not correct because it may
1171 not be a global option */
1172 big_picture.quality = quality;
1174 big_picture.pict_type = 0;
1175 // big_picture.pts = AV_NOPTS_VALUE;
1176 big_picture.pts= ost->sync_opts;
1177 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1178 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1179 if (ost->forced_kf_index < ost->forced_kf_count &&
1180 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1181 big_picture.pict_type = AV_PICTURE_TYPE_I;
1182 ost->forced_kf_index++;
1184 ret = avcodec_encode_video(enc,
1185 bit_buffer, bit_buffer_size,
1188 fprintf(stderr, "Video encoding failed\n");
1193 pkt.data= bit_buffer;
1195 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1196 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1197 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1198 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1199 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1201 if(enc->coded_frame->key_frame)
1202 pkt.flags |= AV_PKT_FLAG_KEY;
1203 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1206 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1207 // enc->frame_number-1, ret, enc->pict_type);
1208 /* if two pass, output log */
1209 if (ost->logfile && enc->stats_out) {
1210 fprintf(ost->logfile, "%s", enc->stats_out);
1215 ost->frame_number++;
1219 static double psnr(double d){
1220 return -10.0*log(d)/log(10.0);
1223 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1226 AVCodecContext *enc;
1228 double ti1, bitrate, avg_bitrate;
1230 /* this is executed just the first time do_video_stats is called */
1232 vstats_file = fopen(vstats_filename, "w");
1239 enc = ost->st->codec;
1240 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1241 frame_number = ost->frame_number;
1242 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1243 if (enc->flags&CODEC_FLAG_PSNR)
1244 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1246 fprintf(vstats_file,"f_size= %6d ", frame_size);
1247 /* compute pts value */
1248 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1252 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1253 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1254 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1255 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1256 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1260 static void print_report(AVFormatContext **output_files,
1261 OutputStream **ost_table, int nb_ostreams,
1266 AVFormatContext *oc;
1268 AVCodecContext *enc;
1269 int frame_number, vid, i;
1270 double bitrate, ti1, pts;
1271 static int64_t last_time = -1;
1272 static int qp_histogram[52];
1274 if (!is_last_report) {
1276 /* display the report every 0.5 seconds */
1277 cur_time = av_gettime();
1278 if (last_time == -1) {
1279 last_time = cur_time;
1282 if ((cur_time - last_time) < 500000)
1284 last_time = cur_time;
1288 oc = output_files[0];
1290 total_size = avio_size(oc->pb);
1291 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1292 total_size= avio_tell(oc->pb);
1297 for(i=0;i<nb_ostreams;i++) {
1300 enc = ost->st->codec;
1301 if (!ost->st->stream_copy && enc->coded_frame)
1302 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1303 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1304 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1306 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1307 float t = (av_gettime()-timer_start) / 1000000.0;
1309 frame_number = ost->frame_number;
1310 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1311 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1313 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1317 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1320 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1322 if (enc->flags&CODEC_FLAG_PSNR){
1324 double error, error_sum=0;
1325 double scale, scale_sum=0;
1326 char type[3]= {'Y','U','V'};
1327 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1330 error= enc->error[j];
1331 scale= enc->width*enc->height*255.0*255.0*frame_number;
1333 error= enc->coded_frame->error[j];
1334 scale= enc->width*enc->height*255.0*255.0;
1339 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1341 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1345 /* compute min output value */
1346 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1347 if ((pts < ti1) && (pts > 0))
1353 if (verbose > 0 || is_last_report) {
1354 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1356 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1357 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1358 (double)total_size / 1024, ti1, bitrate);
1360 if (nb_frames_dup || nb_frames_drop)
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1362 nb_frames_dup, nb_frames_drop);
1365 fprintf(stderr, "%s \r", buf);
1370 if (is_last_report && verbose >= 0){
1371 int64_t raw= audio_size + video_size + extra_size;
1372 fprintf(stderr, "\n");
1373 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1377 100.0*(total_size - raw)/raw
1382 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1384 int fill_char = 0x00;
1385 if (sample_fmt == AV_SAMPLE_FMT_U8)
1387 memset(buf, fill_char, size);
1390 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1391 static int output_packet(InputStream *ist, int ist_index,
1392 OutputStream **ost_table, int nb_ostreams,
1393 const AVPacket *pkt)
1395 AVFormatContext *os;
1400 void *buffer_to_free = NULL;
1401 static unsigned int samples_size= 0;
1402 AVSubtitle subtitle, *subtitle_to_free;
1403 int64_t pkt_pts = AV_NOPTS_VALUE;
1405 int frame_available;
1410 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1412 if(ist->next_pts == AV_NOPTS_VALUE)
1413 ist->next_pts= ist->pts;
1417 av_init_packet(&avpkt);
1425 if(pkt->dts != AV_NOPTS_VALUE)
1426 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1427 if(pkt->pts != AV_NOPTS_VALUE)
1428 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1430 //while we have more to decode or while the decoder did output something on EOF
1431 while (avpkt.size > 0 || (!pkt && got_output)) {
1432 uint8_t *data_buf, *decoded_data_buf;
1433 int data_size, decoded_data_size;
1435 ist->pts= ist->next_pts;
1437 if(avpkt.size && avpkt.size != pkt->size &&
1438 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1439 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1440 ist->showed_multi_packet_warning=1;
1443 /* decode the packet if needed */
1444 decoded_data_buf = NULL; /* fail safe */
1445 decoded_data_size= 0;
1446 data_buf = avpkt.data;
1447 data_size = avpkt.size;
1448 subtitle_to_free = NULL;
1449 if (ist->decoding_needed) {
1450 switch(ist->st->codec->codec_type) {
1451 case AVMEDIA_TYPE_AUDIO:{
1452 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1453 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1455 samples= av_malloc(samples_size);
1457 decoded_data_size= samples_size;
1458 /* XXX: could avoid copy if PCM 16 bits with same
1459 endianness as CPU */
1460 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1467 got_output = decoded_data_size > 0;
1468 /* Some bug in mpeg audio decoder gives */
1469 /* decoded_data_size < 0, it seems they are overflows */
1471 /* no audio frame */
1474 decoded_data_buf = (uint8_t *)samples;
1475 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1476 (ist->st->codec->sample_rate * ist->st->codec->channels);
1478 case AVMEDIA_TYPE_VIDEO:
1479 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1480 /* XXX: allocate picture correctly */
1481 avcodec_get_frame_defaults(&picture);
1482 avpkt.pts = pkt_pts;
1483 avpkt.dts = ist->pts;
1484 pkt_pts = AV_NOPTS_VALUE;
1486 ret = avcodec_decode_video2(ist->st->codec,
1487 &picture, &got_output, &avpkt);
1488 quality = same_quant ? picture.quality : 0;
1492 /* no picture yet */
1493 goto discard_packet;
1495 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1496 if (ist->st->codec->time_base.num != 0) {
1497 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1498 ist->next_pts += ((int64_t)AV_TIME_BASE *
1499 ist->st->codec->time_base.num * ticks) /
1500 ist->st->codec->time_base.den;
1503 buffer_to_free = NULL;
1504 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1506 case AVMEDIA_TYPE_SUBTITLE:
1507 ret = avcodec_decode_subtitle2(ist->st->codec,
1508 &subtitle, &got_output, &avpkt);
1512 goto discard_packet;
1514 subtitle_to_free = &subtitle;
1521 switch(ist->st->codec->codec_type) {
1522 case AVMEDIA_TYPE_AUDIO:
1523 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1524 ist->st->codec->sample_rate;
1526 case AVMEDIA_TYPE_VIDEO:
1527 if (ist->st->codec->time_base.num != 0) {
1528 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1529 ist->next_pts += ((int64_t)AV_TIME_BASE *
1530 ist->st->codec->time_base.num * ticks) /
1531 ist->st->codec->time_base.den;
1540 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1541 for (i = 0; i < nb_ostreams; i++) {
1543 if (ost->input_video_filter && ost->source_index == ist_index) {
1545 if (ist->st->sample_aspect_ratio.num)
1546 sar = ist->st->sample_aspect_ratio;
1548 sar = ist->st->codec->sample_aspect_ratio;
1549 // add it to be filtered
1550 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture,
1558 // preprocess audio (volume)
1559 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1560 if (audio_volume != 256) {
1563 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1564 int v = ((*volp) * audio_volume + 128) >> 8;
1565 if (v < -32768) v = -32768;
1566 if (v > 32767) v = 32767;
1572 /* frame rate emulation */
1574 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1575 int64_t now = av_gettime() - ist->start;
1579 /* if output time reached then transcode raw format,
1580 encode packets and output them */
1581 if (start_time == 0 || ist->pts >= start_time)
1582 for(i=0;i<nb_ostreams;i++) {
1586 if (ost->source_index == ist_index) {
1588 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1589 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1590 while (frame_available) {
1591 AVRational ist_pts_tb;
1592 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1593 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1595 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1597 os = output_files[ost->file_index];
1599 /* set the input output pts pairs */
1600 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1602 if (ost->encoding_needed) {
1603 av_assert0(ist->decoding_needed);
1604 switch(ost->st->codec->codec_type) {
1605 case AVMEDIA_TYPE_AUDIO:
1606 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1608 case AVMEDIA_TYPE_VIDEO:
1610 if (ost->picref->video && !ost->frame_aspect_ratio)
1611 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1613 do_video_out(os, ost, ist, &picture, &frame_size,
1614 same_quant ? quality : ost->st->codec->global_quality);
1615 if (vstats_filename && frame_size)
1616 do_video_stats(os, ost, frame_size);
1618 case AVMEDIA_TYPE_SUBTITLE:
1619 do_subtitle_out(os, ost, ist, &subtitle,
1626 AVFrame avframe; //FIXME/XXX remove this
1628 int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
1630 av_init_packet(&opkt);
1632 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1633 #if !CONFIG_AVFILTER
1639 /* no reencoding needed : output the packet directly */
1640 /* force the input stream PTS */
1642 avcodec_get_frame_defaults(&avframe);
1643 ost->st->codec->coded_frame= &avframe;
1644 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1646 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1647 audio_size += data_size;
1648 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1649 video_size += data_size;
1653 opkt.stream_index= ost->index;
1654 if(pkt->pts != AV_NOPTS_VALUE)
1655 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1657 opkt.pts= AV_NOPTS_VALUE;
1659 if (pkt->dts == AV_NOPTS_VALUE)
1660 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1662 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1663 opkt.dts -= ost_tb_start_time;
1665 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1666 opkt.flags= pkt->flags;
1668 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1669 if( ost->st->codec->codec_id != CODEC_ID_H264
1670 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1671 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1673 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1674 opkt.destruct= av_destruct_packet;
1676 opkt.data = data_buf;
1677 opkt.size = data_size;
1680 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1681 ost->st->codec->frame_number++;
1682 ost->frame_number++;
1683 av_free_packet(&opkt);
1687 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1688 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1690 avfilter_unref_buffer(ost->picref);
1696 av_free(buffer_to_free);
1697 /* XXX: allocate the subtitles in the codec ? */
1698 if (subtitle_to_free) {
1699 avsubtitle_free(subtitle_to_free);
1700 subtitle_to_free = NULL;
1707 for(i=0;i<nb_ostreams;i++) {
1709 if (ost->source_index == ist_index) {
1710 AVCodecContext *enc= ost->st->codec;
1711 os = output_files[ost->file_index];
1713 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1715 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1718 if (ost->encoding_needed) {
1722 av_init_packet(&pkt);
1723 pkt.stream_index= ost->index;
1725 switch(ost->st->codec->codec_type) {
1726 case AVMEDIA_TYPE_AUDIO:
1727 fifo_bytes = av_fifo_size(ost->fifo);
1729 /* encode any samples remaining in fifo */
1730 if (fifo_bytes > 0) {
1731 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1732 int fs_tmp = enc->frame_size;
1734 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1735 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1736 enc->frame_size = fifo_bytes / (osize * enc->channels);
1738 int frame_bytes = enc->frame_size*osize*enc->channels;
1739 if (allocated_audio_buf_size < frame_bytes)
1741 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1744 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1745 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1746 ost->st->time_base.num, enc->sample_rate);
1747 enc->frame_size = fs_tmp;
1750 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1753 fprintf(stderr, "Audio encoding failed\n");
1757 pkt.flags |= AV_PKT_FLAG_KEY;
1759 case AVMEDIA_TYPE_VIDEO:
1760 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1762 fprintf(stderr, "Video encoding failed\n");
1766 if(enc->coded_frame && enc->coded_frame->key_frame)
1767 pkt.flags |= AV_PKT_FLAG_KEY;
1768 if (ost->logfile && enc->stats_out) {
1769 fprintf(ost->logfile, "%s", enc->stats_out);
1778 pkt.data= bit_buffer;
1780 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1781 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1782 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1792 static void print_sdp(AVFormatContext **avc, int n)
1796 av_sdp_create(avc, n, sdp, sizeof(sdp));
1797 printf("SDP:\n%s\n", sdp);
1802 * The following code is the main loop of the file converter
1804 static int transcode(AVFormatContext **output_files,
1805 int nb_output_files,
1806 InputFile *input_files,
1809 int ret = 0, i, j, k, n, nb_ostreams = 0;
1810 AVFormatContext *is, *os;
1811 AVCodecContext *codec, *icodec;
1812 OutputStream *ost, **ost_table = NULL;
1816 uint8_t no_packet[MAX_FILES]={0};
1817 int no_packet_count=0;
1820 for (i = 0; i < nb_input_streams; i++)
1821 input_streams[i].start = av_gettime();
1823 /* output stream init */
1825 for(i=0;i<nb_output_files;i++) {
1826 os = output_files[i];
1827 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1828 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
1829 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1830 ret = AVERROR(EINVAL);
1833 nb_ostreams += os->nb_streams;
1836 ost_table = av_mallocz(sizeof(OutputStream *) * nb_ostreams);
1840 for(k=0;k<nb_output_files;k++) {
1841 os = output_files[k];
1842 for (i = 0; i < os->nb_streams; i++, n++)
1843 ost_table[n] = output_streams_for_file[k][i];
1846 /* for each output stream, we compute the right encoding parameters */
1847 for(i=0;i<nb_ostreams;i++) {
1849 os = output_files[ost->file_index];
1850 ist = &input_streams[ost->source_index];
1852 codec = ost->st->codec;
1853 icodec = ist->st->codec;
1855 ost->st->disposition = ist->st->disposition;
1856 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1857 codec->chroma_sample_location = icodec->chroma_sample_location;
1859 if (ost->st->stream_copy) {
1860 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1862 if (extra_size > INT_MAX)
1865 /* if stream_copy is selected, no need to decode or encode */
1866 codec->codec_id = icodec->codec_id;
1867 codec->codec_type = icodec->codec_type;
1869 if(!codec->codec_tag){
1870 if( !os->oformat->codec_tag
1871 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1872 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1873 codec->codec_tag = icodec->codec_tag;
1876 codec->bit_rate = icodec->bit_rate;
1877 codec->rc_max_rate = icodec->rc_max_rate;
1878 codec->rc_buffer_size = icodec->rc_buffer_size;
1879 codec->extradata= av_mallocz(extra_size);
1880 if (!codec->extradata)
1882 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1883 codec->extradata_size= icodec->extradata_size;
1884 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){
1885 codec->time_base = icodec->time_base;
1886 codec->time_base.num *= icodec->ticks_per_frame;
1887 av_reduce(&codec->time_base.num, &codec->time_base.den,
1888 codec->time_base.num, codec->time_base.den, INT_MAX);
1890 codec->time_base = ist->st->time_base;
1891 switch(codec->codec_type) {
1892 case AVMEDIA_TYPE_AUDIO:
1893 if(audio_volume != 256) {
1894 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1897 codec->channel_layout = icodec->channel_layout;
1898 codec->sample_rate = icodec->sample_rate;
1899 codec->channels = icodec->channels;
1900 codec->frame_size = icodec->frame_size;
1901 codec->audio_service_type = icodec->audio_service_type;
1902 codec->block_align= icodec->block_align;
1903 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1904 codec->block_align= 0;
1905 if(codec->codec_id == CODEC_ID_AC3)
1906 codec->block_align= 0;
1908 case AVMEDIA_TYPE_VIDEO:
1909 codec->pix_fmt = icodec->pix_fmt;
1910 codec->width = icodec->width;
1911 codec->height = icodec->height;
1912 codec->has_b_frames = icodec->has_b_frames;
1913 if (!codec->sample_aspect_ratio.num) {
1914 codec->sample_aspect_ratio =
1915 ost->st->sample_aspect_ratio =
1916 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1917 ist->st->codec->sample_aspect_ratio.num ?
1918 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1921 case AVMEDIA_TYPE_SUBTITLE:
1922 codec->width = icodec->width;
1923 codec->height = icodec->height;
1925 case AVMEDIA_TYPE_DATA:
1932 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1933 switch(codec->codec_type) {
1934 case AVMEDIA_TYPE_AUDIO:
1935 ost->fifo= av_fifo_alloc(1024);
1938 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
1939 if (!codec->sample_rate) {
1940 codec->sample_rate = icodec->sample_rate;
1942 codec->sample_rate >>= icodec->lowres;
1944 choose_sample_rate(ost->st, ost->enc);
1945 codec->time_base = (AVRational){1, codec->sample_rate};
1946 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
1947 codec->sample_fmt = icodec->sample_fmt;
1948 choose_sample_fmt(ost->st, ost->enc);
1949 if (!codec->channels)
1950 codec->channels = icodec->channels;
1951 codec->channel_layout = icodec->channel_layout;
1952 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
1953 codec->channel_layout = 0;
1954 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1955 icodec->request_channels = codec->channels;
1956 ist->decoding_needed = 1;
1957 ost->encoding_needed = 1;
1958 ost->resample_sample_fmt = icodec->sample_fmt;
1959 ost->resample_sample_rate = icodec->sample_rate;
1960 ost->resample_channels = icodec->channels;
1962 case AVMEDIA_TYPE_VIDEO:
1963 if (codec->pix_fmt == PIX_FMT_NONE)
1964 codec->pix_fmt = icodec->pix_fmt;
1965 choose_pixel_fmt(ost->st, ost->enc);
1967 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1968 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
1972 if (!codec->width || !codec->height) {
1973 codec->width = icodec->width;
1974 codec->height = icodec->height;
1977 ost->video_resample = codec->width != icodec->width ||
1978 codec->height != icodec->height ||
1979 codec->pix_fmt != icodec->pix_fmt;
1980 if (ost->video_resample) {
1981 #if !CONFIG_AVFILTER
1982 avcodec_get_frame_defaults(&ost->pict_tmp);
1983 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
1984 codec->width, codec->height)) {
1985 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
1988 ost->img_resample_ctx = sws_getContext(
1995 ost->sws_flags, NULL, NULL, NULL);
1996 if (ost->img_resample_ctx == NULL) {
1997 fprintf(stderr, "Cannot get resampling context\n");
2001 codec->bits_per_raw_sample= 0;
2004 ost->resample_height = icodec->height;
2005 ost->resample_width = icodec->width;
2006 ost->resample_pix_fmt= icodec->pix_fmt;
2007 ost->encoding_needed = 1;
2008 ist->decoding_needed = 1;
2010 if (!ost->frame_rate.num)
2011 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2012 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2013 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2014 ost->frame_rate = ost->enc->supported_framerates[idx];
2016 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2019 if (configure_video_filters(ist, ost)) {
2020 fprintf(stderr, "Error opening filters!\n");
2025 case AVMEDIA_TYPE_SUBTITLE:
2026 ost->encoding_needed = 1;
2027 ist->decoding_needed = 1;
2034 if (ost->encoding_needed &&
2035 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2036 char logfilename[1024];
2039 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2040 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2042 if (codec->flags & CODEC_FLAG_PASS1) {
2043 f = fopen(logfilename, "wb");
2045 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2051 size_t logbuffer_size;
2052 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2053 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2056 codec->stats_in = logbuffer;
2060 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2061 int size= codec->width * codec->height;
2062 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2067 bit_buffer = av_malloc(bit_buffer_size);
2069 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2071 ret = AVERROR(ENOMEM);
2075 /* open each encoder */
2076 for(i=0;i<nb_ostreams;i++) {
2078 if (ost->encoding_needed) {
2079 AVCodec *codec = ost->enc;
2080 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2082 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2083 ost->st->codec->codec_id, ost->file_index, ost->index);
2084 ret = AVERROR(EINVAL);
2087 if (dec->subtitle_header) {
2088 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2089 if (!ost->st->codec->subtitle_header) {
2090 ret = AVERROR(ENOMEM);
2093 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2094 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2096 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2097 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2098 ost->file_index, ost->index);
2099 ret = AVERROR(EINVAL);
2102 assert_codec_experimental(ost->st->codec, 1);
2103 assert_avoptions(ost->opts);
2104 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2105 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2106 "It takes bits/s as argument, not kbits/s\n");
2107 extra_size += ost->st->codec->extradata_size;
2111 /* open each decoder */
2112 for (i = 0; i < nb_input_streams; i++) {
2113 ist = &input_streams[i];
2114 if (ist->decoding_needed) {
2115 AVCodec *codec = ist->dec;
2117 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2119 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2120 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2121 ret = AVERROR(EINVAL);
2125 /* update requested sample format for the decoder based on the
2126 corresponding encoder sample format */
2127 for (j = 0; j < nb_ostreams; j++) {
2129 if (ost->source_index == i) {
2130 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2135 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2136 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2137 ist->file_index, ist->st->index);
2138 ret = AVERROR(EINVAL);
2141 assert_codec_experimental(ist->st->codec, 0);
2142 assert_avoptions(ost->opts);
2147 for (i = 0; i < nb_input_streams; i++) {
2149 ist = &input_streams[i];
2151 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2152 ist->next_pts = AV_NOPTS_VALUE;
2153 init_pts_correction(&ist->pts_ctx);
2157 /* open files and write file headers */
2158 for(i=0;i<nb_output_files;i++) {
2159 os = output_files[i];
2160 if (avformat_write_header(os, &output_opts[i]) < 0) {
2161 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2162 ret = AVERROR(EINVAL);
2165 assert_avoptions(output_opts[i]);
2166 if (strcmp(output_files[i]->oformat->name, "rtp")) {
2172 /* dump the file output parameters - cannot be done before in case
2174 for(i=0;i<nb_output_files;i++) {
2175 av_dump_format(output_files[i], i, output_files[i]->filename, 1);
2178 /* dump the stream mapping */
2180 fprintf(stderr, "Stream mapping:\n");
2181 for(i=0;i<nb_ostreams;i++) {
2183 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2184 input_streams[ost->source_index].file_index,
2185 input_streams[ost->source_index].st->index,
2188 if (ost->sync_ist != &input_streams[ost->source_index])
2189 fprintf(stderr, " [sync #%d.%d]",
2190 ost->sync_ist->file_index,
2191 ost->sync_ist->st->index);
2192 fprintf(stderr, "\n");
2197 fprintf(stderr, "%s\n", error);
2202 print_sdp(output_files, nb_output_files);
2206 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2209 timer_start = av_gettime();
2211 for(; received_sigterm == 0;) {
2212 int file_index, ist_index;
2221 /* select the stream that we must read now by looking at the
2222 smallest output pts */
2224 for(i=0;i<nb_ostreams;i++) {
2227 os = output_files[ost->file_index];
2228 ist = &input_streams[ost->source_index];
2229 if(ist->is_past_recording_time || no_packet[ist->file_index])
2231 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2232 ipts = (double)ist->pts;
2233 if (!input_files[ist->file_index].eof_reached){
2234 if(ipts < ipts_min) {
2236 if(input_sync ) file_index = ist->file_index;
2238 if(opts < opts_min) {
2240 if(!input_sync) file_index = ist->file_index;
2243 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2248 /* if none, if is finished */
2249 if (file_index < 0) {
2250 if(no_packet_count){
2252 memset(no_packet, 0, sizeof(no_packet));
2259 /* finish if limit size exhausted */
2260 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0]->pb))
2263 /* read a frame from it and output it in the fifo */
2264 is = input_files[file_index].ctx;
2265 ret= av_read_frame(is, &pkt);
2266 if(ret == AVERROR(EAGAIN)){
2267 no_packet[file_index]=1;
2272 input_files[file_index].eof_reached = 1;
2280 memset(no_packet, 0, sizeof(no_packet));
2283 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2284 is->streams[pkt.stream_index]);
2286 /* the following test is needed in case new streams appear
2287 dynamically in stream : we ignore them */
2288 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2289 goto discard_packet;
2290 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2291 ist = &input_streams[ist_index];
2293 goto discard_packet;
2295 if (pkt.dts != AV_NOPTS_VALUE)
2296 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2297 if (pkt.pts != AV_NOPTS_VALUE)
2298 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2300 if (ist->ts_scale) {
2301 if(pkt.pts != AV_NOPTS_VALUE)
2302 pkt.pts *= ist->ts_scale;
2303 if(pkt.dts != AV_NOPTS_VALUE)
2304 pkt.dts *= ist->ts_scale;
2307 // 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);
2308 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2309 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2310 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2311 int64_t delta= pkt_dts - ist->next_pts;
2312 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2313 input_files[ist->file_index].ts_offset -= delta;
2315 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2316 delta, input_files[ist->file_index].ts_offset);
2317 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2318 if(pkt.pts != AV_NOPTS_VALUE)
2319 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2323 /* finish if recording time exhausted */
2324 if (recording_time != INT64_MAX &&
2325 av_compare_ts(pkt.pts, ist->st->time_base, recording_time + start_time, (AVRational){1, 1000000}) >= 0) {
2326 ist->is_past_recording_time = 1;
2327 goto discard_packet;
2330 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2331 if (output_packet(ist, ist_index, ost_table, nb_ostreams, &pkt) < 0) {
2334 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2335 ist->file_index, ist->st->index);
2338 av_free_packet(&pkt);
2343 av_free_packet(&pkt);
2345 /* dump report by using the output first video and audio streams */
2346 print_report(output_files, ost_table, nb_ostreams, 0);
2349 /* at the end of stream, we must flush the decoder buffers */
2350 for (i = 0; i < nb_input_streams; i++) {
2351 ist = &input_streams[i];
2352 if (ist->decoding_needed) {
2353 output_packet(ist, i, ost_table, nb_ostreams, NULL);
2359 /* write the trailer if needed and close file */
2360 for(i=0;i<nb_output_files;i++) {
2361 os = output_files[i];
2362 av_write_trailer(os);
2365 /* dump report by using the first video and audio streams */
2366 print_report(output_files, ost_table, nb_ostreams, 1);
2368 /* close each encoder */
2369 for(i=0;i<nb_ostreams;i++) {
2371 if (ost->encoding_needed) {
2372 av_freep(&ost->st->codec->stats_in);
2373 avcodec_close(ost->st->codec);
2376 avfilter_graph_free(&ost->graph);
2380 /* close each decoder */
2381 for (i = 0; i < nb_input_streams; i++) {
2382 ist = &input_streams[i];
2383 if (ist->decoding_needed) {
2384 avcodec_close(ist->st->codec);
2392 av_freep(&bit_buffer);
2395 for(i=0;i<nb_ostreams;i++) {
2398 if (ost->st->stream_copy)
2399 av_freep(&ost->st->codec->extradata);
2401 fclose(ost->logfile);
2402 ost->logfile = NULL;
2404 av_fifo_free(ost->fifo); /* works even if fifo is not
2405 initialized but set to zero */
2406 av_freep(&ost->st->codec->subtitle_header);
2407 av_free(ost->pict_tmp.data[0]);
2408 av_free(ost->forced_kf_pts);
2409 if (ost->video_resample)
2410 sws_freeContext(ost->img_resample_ctx);
2412 audio_resample_close(ost->resample);
2413 if (ost->reformat_ctx)
2414 av_audio_convert_free(ost->reformat_ctx);
2415 av_dict_free(&ost->opts);
2424 static int opt_format(const char *opt, const char *arg)
2426 last_asked_format = arg;
2430 static int opt_video_rc_override_string(const char *opt, const char *arg)
2432 video_rc_override_string = arg;
2436 static int opt_me_threshold(const char *opt, const char *arg)
2438 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2442 static int opt_verbose(const char *opt, const char *arg)
2444 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2448 static int opt_frame_rate(const char *opt, const char *arg)
2450 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2451 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2457 static int opt_frame_crop(const char *opt, const char *arg)
2459 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2460 return AVERROR(EINVAL);
2463 static int opt_frame_size(const char *opt, const char *arg)
2465 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2466 fprintf(stderr, "Incorrect frame size\n");
2467 return AVERROR(EINVAL);
2472 static int opt_pad(const char *opt, const char *arg) {
2473 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2477 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2479 if (strcmp(arg, "list")) {
2480 frame_pix_fmt = av_get_pix_fmt(arg);
2481 if (frame_pix_fmt == PIX_FMT_NONE) {
2482 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2483 return AVERROR(EINVAL);
2492 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2499 p = strchr(arg, ':');
2501 x = strtol(arg, &end, 10);
2503 y = strtol(end+1, &end, 10);
2505 ar = (double)x / (double)y;
2507 ar = strtod(arg, NULL);
2510 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2511 return AVERROR(EINVAL);
2513 frame_aspect_ratio = ar;
2517 static int opt_metadata(const char *opt, const char *arg)
2519 char *mid= strchr(arg, '=');
2522 fprintf(stderr, "Missing =\n");
2527 av_dict_set(&metadata, arg, mid, 0);
2532 static int opt_qscale(const char *opt, const char *arg)
2534 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2535 if (video_qscale == 0) {
2536 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2537 return AVERROR(EINVAL);
2542 static int opt_top_field_first(const char *opt, const char *arg)
2544 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2548 static int opt_thread_count(const char *opt, const char *arg)
2550 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2553 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2558 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2560 if (strcmp(arg, "list")) {
2561 audio_sample_fmt = av_get_sample_fmt(arg);
2562 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2563 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2564 return AVERROR(EINVAL);
2569 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2570 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2576 static int opt_audio_rate(const char *opt, const char *arg)
2578 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2582 static int opt_audio_channels(const char *opt, const char *arg)
2584 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2588 static int opt_codec(const char *opt, const char *arg)
2590 return av_dict_set(&codec_names, opt, arg, 0);
2593 static int opt_audio_codec(const char *opt, const char *arg)
2595 return opt_codec("codec:a", arg);
2598 static int opt_video_codec(const char *opt, const char *arg)
2600 return opt_codec("codec:v", arg);
2603 static int opt_subtitle_codec(const char *opt, const char *arg)
2605 return opt_codec("codec:s", arg);
2608 static int opt_data_codec(const char *opt, const char *arg)
2610 return opt_codec("codec:d", arg);
2613 static int opt_codec_tag(const char *opt, const char *arg)
2616 uint32_t *codec_tag;
2618 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2619 !strcmp(opt, "vtag") ? &video_codec_tag :
2620 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2624 *codec_tag = strtol(arg, &tail, 0);
2626 *codec_tag = AV_RL32(arg);
2631 static int opt_map(const char *opt, const char *arg)
2633 StreamMap *m = NULL;
2634 int i, negative = 0, file_idx;
2635 int sync_file_idx = -1, sync_stream_idx;
2643 map = av_strdup(arg);
2645 /* parse sync stream first, just pick first matching stream */
2646 if (sync = strchr(map, ',')) {
2648 sync_file_idx = strtol(sync + 1, &sync, 0);
2649 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2650 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2655 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2656 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2657 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2658 sync_stream_idx = i;
2661 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2662 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2663 "match any streams.\n", arg);
2669 file_idx = strtol(map, &p, 0);
2670 if (file_idx >= nb_input_files || file_idx < 0) {
2671 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2675 /* disable some already defined maps */
2676 for (i = 0; i < nb_stream_maps; i++) {
2677 m = &stream_maps[i];
2678 if (check_stream_specifier(input_files[m->file_index].ctx,
2679 input_files[m->file_index].ctx->streams[m->stream_index],
2680 *p == ':' ? p + 1 : p) > 0)
2684 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2685 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2686 *p == ':' ? p + 1 : p) <= 0)
2688 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2689 m = &stream_maps[nb_stream_maps - 1];
2691 m->file_index = file_idx;
2692 m->stream_index = i;
2694 if (sync_file_idx >= 0) {
2695 m->sync_file_index = sync_file_idx;
2696 m->sync_stream_index = sync_stream_idx;
2698 m->sync_file_index = file_idx;
2699 m->sync_stream_index = i;
2704 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2712 static void parse_meta_type(char *arg, char *type, int *index)
2722 if (*(++arg) == ':')
2723 *index = strtol(++arg, NULL, 0);
2726 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2733 static int opt_map_metadata(const char *opt, const char *arg)
2735 MetadataMap *m, *m1;
2738 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2739 &nb_meta_data_maps, nb_meta_data_maps + 1);
2741 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2742 m->file = strtol(arg, &p, 0);
2743 parse_meta_type(p, &m->type, &m->index);
2745 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2746 if (p = strchr(opt, ':'))
2747 parse_meta_type(p, &m1->type, &m1->index);
2751 if (m->type == 'g' || m1->type == 'g')
2752 metadata_global_autocopy = 0;
2753 if (m->type == 's' || m1->type == 's')
2754 metadata_streams_autocopy = 0;
2755 if (m->type == 'c' || m1->type == 'c')
2756 metadata_chapters_autocopy = 0;
2761 static int opt_input_ts_scale(const char *opt, const char *arg)
2763 unsigned int stream;
2767 stream = strtol(arg, &p, 0);
2770 scale= strtod(p, &p);
2772 ts_scale = grow_array(ts_scale, sizeof(*ts_scale), &nb_ts_scale, stream + 1);
2773 ts_scale[stream] = scale;
2777 static int opt_recording_time(const char *opt, const char *arg)
2779 recording_time = parse_time_or_die(opt, arg, 1);
2783 static int opt_start_time(const char *opt, const char *arg)
2785 start_time = parse_time_or_die(opt, arg, 1);
2789 static int opt_input_ts_offset(const char *opt, const char *arg)
2791 input_ts_offset = parse_time_or_die(opt, arg, 1);
2795 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2797 const char *codec_string = encoder ? "encoder" : "decoder";
2801 return CODEC_ID_NONE;
2803 avcodec_find_encoder_by_name(name) :
2804 avcodec_find_decoder_by_name(name);
2806 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2809 if(codec->type != type) {
2810 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2816 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2818 AVDictionaryEntry *e = NULL;
2819 char *codec_name = NULL;
2822 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2823 char *p = strchr(e->key, ':');
2825 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2826 codec_name = e->value;
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);
2844 static int opt_input_file(const char *opt, const char *filename)
2846 AVFormatContext *ic;
2847 AVInputFormat *file_iformat = NULL;
2848 int err, i, ret, rfps, rfps_base;
2851 AVDictionary **opts;
2852 int orig_nb_streams; // number of streams before avformat_find_stream_info
2854 if (last_asked_format) {
2855 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2856 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2859 last_asked_format = NULL;
2862 if (!strcmp(filename, "-"))
2865 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2866 !strcmp(filename, "/dev/stdin");
2868 /* get default parameters from command line */
2869 ic = avformat_alloc_context();
2871 print_error(filename, AVERROR(ENOMEM));
2874 if (audio_sample_rate) {
2875 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2876 av_dict_set(&format_opts, "sample_rate", buf, 0);
2878 if (audio_channels) {
2879 snprintf(buf, sizeof(buf), "%d", audio_channels);
2880 av_dict_set(&format_opts, "channels", buf, 0);
2882 if (frame_rate.num) {
2883 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2884 av_dict_set(&format_opts, "framerate", buf, 0);
2886 if (frame_width && frame_height) {
2887 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2888 av_dict_set(&format_opts, "video_size", buf, 0);
2890 if (frame_pix_fmt != PIX_FMT_NONE)
2891 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2893 ic->flags |= AVFMT_FLAG_NONBLOCK;
2895 /* open the input file with generic libav function */
2896 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2898 print_error(filename, err);
2901 assert_avoptions(format_opts);
2906 for(i=0; i<ic->nb_streams; i++){
2907 ic->streams[i]->discard= AVDISCARD_ALL;
2909 for(i=0; i<ic->nb_programs; i++){
2910 AVProgram *p= ic->programs[i];
2911 if(p->id != opt_programid){
2912 p->discard = AVDISCARD_ALL;
2915 for(j=0; j<p->nb_stream_indexes; j++){
2916 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2921 fprintf(stderr, "Specified program id not found\n");
2927 /* apply forced codec ids */
2928 for (i = 0; i < ic->nb_streams; i++)
2929 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
2931 /* Set AVCodecContext options for avformat_find_stream_info */
2932 opts = setup_find_stream_info_opts(ic, codec_opts);
2933 orig_nb_streams = ic->nb_streams;
2935 /* If not enough info to get the stream parameters, we decode the
2936 first frames to get it. (used in mpeg case for example) */
2937 ret = avformat_find_stream_info(ic, opts);
2938 if (ret < 0 && verbose >= 0) {
2939 fprintf(stderr, "%s: could not find codec parameters\n", filename);
2940 av_close_input_file(ic);
2944 timestamp = start_time;
2945 /* add the stream start time */
2946 if (ic->start_time != AV_NOPTS_VALUE)
2947 timestamp += ic->start_time;
2949 /* if seeking requested, we execute it */
2950 if (start_time != 0) {
2951 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2953 fprintf(stderr, "%s: could not seek to position %0.3f\n",
2954 filename, (double)timestamp / AV_TIME_BASE);
2956 /* reset seek info */
2960 /* update the current parameters so that they match the one of the input stream */
2961 for(i=0;i<ic->nb_streams;i++) {
2962 AVStream *st = ic->streams[i];
2963 AVCodecContext *dec = st->codec;
2966 dec->thread_count = thread_count;
2968 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2969 ist = &input_streams[nb_input_streams - 1];
2971 ist->file_index = nb_input_files;
2973 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2975 if (i < nb_ts_scale)
2976 ist->ts_scale = ts_scale[i];
2978 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
2980 switch (dec->codec_type) {
2981 case AVMEDIA_TYPE_AUDIO:
2983 st->discard= AVDISCARD_ALL;
2985 case AVMEDIA_TYPE_VIDEO:
2986 rfps = ic->streams[i]->r_frame_rate.num;
2987 rfps_base = ic->streams[i]->r_frame_rate.den;
2989 dec->flags |= CODEC_FLAG_EMU_EDGE;
2990 dec->height >>= dec->lowres;
2991 dec->width >>= dec->lowres;
2994 dec->debug |= FF_DEBUG_MV;
2996 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2999 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
3000 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
3002 (float)rfps / rfps_base, rfps, rfps_base);
3006 st->discard= AVDISCARD_ALL;
3007 else if(video_discard)
3008 st->discard= video_discard;
3010 case AVMEDIA_TYPE_DATA:
3012 case AVMEDIA_TYPE_SUBTITLE:
3013 if(subtitle_disable)
3014 st->discard = AVDISCARD_ALL;
3016 case AVMEDIA_TYPE_ATTACHMENT:
3017 case AVMEDIA_TYPE_UNKNOWN:
3024 /* dump the file content */
3026 av_dump_format(ic, nb_input_files, filename, 0);
3028 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3029 input_files[nb_input_files - 1].ctx = ic;
3030 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3031 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3033 frame_rate = (AVRational){0, 0};
3034 frame_pix_fmt = PIX_FMT_NONE;
3037 audio_sample_rate = 0;
3039 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3040 av_freep(&ts_scale);
3043 for (i = 0; i < orig_nb_streams; i++)
3044 av_dict_free(&opts[i]);
3046 av_dict_free(&codec_names);
3052 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3053 AVCodecContext *avctx)
3059 for (p = kf; *p; p++)
3062 ost->forced_kf_count = n;
3063 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3064 if (!ost->forced_kf_pts) {
3065 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3068 for (i = 0; i < n; i++) {
3069 p = i ? strchr(p, ',') + 1 : kf;
3070 t = parse_time_or_die("force_key_frames", p, 1);
3071 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3075 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type, int source_idx)
3078 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3079 int idx = oc->nb_streams - 1;
3082 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3086 output_streams_for_file[nb_output_files] =
3087 grow_array(output_streams_for_file[nb_output_files],
3088 sizeof(*output_streams_for_file[nb_output_files]),
3089 &nb_output_streams_for_file[nb_output_files],
3091 ost = output_streams_for_file[nb_output_files][idx] =
3092 av_mallocz(sizeof(OutputStream));
3094 fprintf(stderr, "Could not alloc output stream\n");
3097 ost->file_index = nb_output_files;
3100 st->codec->codec_type = type;
3101 ost->enc = choose_codec(oc, st, type, codec_names);
3103 /* no codec specified, try copy if possible or fallback to format default */
3104 if (source_idx >= 0 && avformat_query_codec(oc->oformat, input_streams[source_idx].st->codec->codec_id,
3105 FF_COMPLIANCE_NORMAL) == 1) {
3106 st->codec->codec_id = input_streams[source_idx].st->codec->codec_id;
3107 st->stream_copy = 1;
3109 st->codec->codec_id = av_guess_codec(oc->oformat, NULL, oc->filename, NULL, type);
3110 ost->enc = avcodec_find_encoder(st->codec->codec_id);
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, int source_idx)
3129 AVCodecContext *video_enc;
3131 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO, source_idx);
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, int source_idx)
3244 AVCodecContext *audio_enc;
3246 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO, source_idx);
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, int source_idx)
3290 AVCodecContext *data_enc;
3292 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA, source_idx);
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, int source_idx)
3315 AVCodecContext *subtitle_enc;
3317 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE, source_idx);
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];
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, -1);
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, index);\
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];
3532 int source_idx = input_files[map->file_index].ist_index + map->stream_index;
3537 ist = &input_streams[source_idx];
3538 switch (ist->st->codec->codec_type) {
3539 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc, source_idx); break;
3540 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc, source_idx); break;
3541 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc, source_idx); break;
3542 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc, source_idx); break;
3544 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3545 map->file_index, map->stream_index);
3549 ost->source_index = source_idx;
3550 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3551 map->sync_stream_index];
3556 av_dict_copy(&oc->metadata, metadata, 0);
3557 av_dict_free(&metadata);
3559 av_dict_copy(&output_opts[nb_output_files], format_opts, 0);
3560 output_files[nb_output_files++] = oc;
3562 /* check filename in case of an image number is expected */
3563 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3564 if (!av_filename_number_test(oc->filename)) {
3565 print_error(oc->filename, AVERROR(EINVAL));
3570 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3571 /* test if it already exists to avoid loosing precious files */
3572 if (!file_overwrite &&
3573 (strchr(filename, ':') == NULL ||
3574 filename[1] == ':' ||
3575 av_strstart(filename, "file:", NULL))) {
3576 if (avio_check(filename, 0) == 0) {
3578 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3580 if (!read_yesno()) {
3581 fprintf(stderr, "Not overwriting - exiting\n");
3586 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3593 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3594 print_error(filename, err);
3599 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3600 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3601 oc->flags |= AVFMT_FLAG_NONBLOCK;
3604 if (chapters_input_file >= nb_input_files) {
3605 if (chapters_input_file == INT_MAX) {
3606 /* copy chapters from the first input file that has them*/
3607 chapters_input_file = -1;
3608 for (i = 0; i < nb_input_files; i++)
3609 if (input_files[i].ctx->nb_chapters) {
3610 chapters_input_file = i;
3614 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3615 chapters_input_file);
3619 if (chapters_input_file >= 0)
3620 copy_chapters(chapters_input_file, nb_output_files - 1);
3623 for (i = 0; i < nb_meta_data_maps; i++) {
3624 AVFormatContext *files[2];
3625 AVDictionary **meta[2];
3628 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3629 if ((index) < 0 || (index) >= (nb_elems)) {\
3630 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3635 int in_file_index = meta_data_maps[i][1].file;
3636 if (in_file_index < 0)
3638 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3641 files[1] = input_files[in_file_index].ctx;
3643 for (j = 0; j < 2; j++) {
3644 MetadataMap *map = &meta_data_maps[i][j];
3646 switch (map->type) {
3648 meta[j] = &files[j]->metadata;
3651 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3652 meta[j] = &files[j]->streams[map->index]->metadata;
3655 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3656 meta[j] = &files[j]->chapters[map->index]->metadata;
3659 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3660 meta[j] = &files[j]->programs[map->index]->metadata;
3665 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3668 /* copy global metadata by default */
3669 if (metadata_global_autocopy && nb_input_files)
3670 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3671 AV_DICT_DONT_OVERWRITE);
3672 if (metadata_streams_autocopy)
3673 for (i = 0; i < oc->nb_streams; i++) {
3674 InputStream *ist = &input_streams[output_streams_for_file[nb_output_files-1][i]->source_index];
3675 av_dict_copy(&oc->streams[i]->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3678 frame_rate = (AVRational){0, 0};
3681 audio_sample_rate = 0;
3683 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3684 chapters_input_file = INT_MAX;
3686 av_freep(&meta_data_maps);
3687 nb_meta_data_maps = 0;
3688 metadata_global_autocopy = 1;
3689 metadata_streams_autocopy = 1;
3690 metadata_chapters_autocopy = 1;
3691 av_freep(&stream_maps);
3694 av_dict_free(&codec_names);
3696 av_freep(&forced_key_frames);
3701 /* same option as mencoder */
3702 static int opt_pass(const char *opt, const char *arg)
3704 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3708 static int64_t getutime(void)
3711 struct rusage rusage;
3713 getrusage(RUSAGE_SELF, &rusage);
3714 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3715 #elif HAVE_GETPROCESSTIMES
3717 FILETIME c, e, k, u;
3718 proc = GetCurrentProcess();
3719 GetProcessTimes(proc, &c, &e, &k, &u);
3720 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3722 return av_gettime();
3726 static int64_t getmaxrss(void)
3728 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3729 struct rusage rusage;
3730 getrusage(RUSAGE_SELF, &rusage);
3731 return (int64_t)rusage.ru_maxrss * 1024;
3732 #elif HAVE_GETPROCESSMEMORYINFO
3734 PROCESS_MEMORY_COUNTERS memcounters;
3735 proc = GetCurrentProcess();
3736 memcounters.cb = sizeof(memcounters);
3737 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3738 return memcounters.PeakPagefileUsage;
3744 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3747 const char *p = str;
3754 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3761 static void opt_inter_matrix(const char *arg)
3763 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3764 parse_matrix_coeffs(inter_matrix, arg);
3767 static void opt_intra_matrix(const char *arg)
3769 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3770 parse_matrix_coeffs(intra_matrix, arg);
3773 static void show_usage(void)
3775 printf("Hyper fast Audio and Video encoder\n");
3776 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3780 static void show_help(void)
3783 AVOutputFormat *oformat = NULL;
3784 AVInputFormat *iformat = NULL;
3786 av_log_set_callback(log_callback_help);
3788 show_help_options(options, "Main options:\n",
3789 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3790 show_help_options(options, "\nAdvanced options:\n",
3791 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3793 show_help_options(options, "\nVideo options:\n",
3794 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3796 show_help_options(options, "\nAdvanced Video options:\n",
3797 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3798 OPT_VIDEO | OPT_EXPERT);
3799 show_help_options(options, "\nAudio options:\n",
3800 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3802 show_help_options(options, "\nAdvanced Audio options:\n",
3803 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3804 OPT_AUDIO | OPT_EXPERT);
3805 show_help_options(options, "\nSubtitle options:\n",
3806 OPT_SUBTITLE | OPT_GRAB,
3808 show_help_options(options, "\nAudio/Video grab options:\n",
3812 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3815 /* individual codec options */
3817 while ((c = av_codec_next(c))) {
3818 if (c->priv_class) {
3819 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3824 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3827 /* individual muxer options */
3828 while ((oformat = av_oformat_next(oformat))) {
3829 if (oformat->priv_class) {
3830 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3835 /* individual demuxer options */
3836 while ((iformat = av_iformat_next(iformat))) {
3837 if (iformat->priv_class) {
3838 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3843 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3846 static int opt_target(const char *opt, const char *arg)
3848 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3849 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3851 if(!strncmp(arg, "pal-", 4)) {
3854 } else if(!strncmp(arg, "ntsc-", 5)) {
3857 } else if(!strncmp(arg, "film-", 5)) {
3862 /* Calculate FR via float to avoid int overflow */
3863 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3866 } else if((fr == 29970) || (fr == 23976)) {
3869 /* Try to determine PAL/NTSC by peeking in the input files */
3870 if(nb_input_files) {
3872 for (j = 0; j < nb_input_files; j++) {
3873 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
3874 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3875 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3877 fr = c->time_base.den * 1000 / c->time_base.num;
3881 } else if((fr == 29970) || (fr == 23976)) {
3891 if(verbose > 0 && norm != UNKNOWN)
3892 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3895 if(norm == UNKNOWN) {
3896 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3897 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3898 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3902 if(!strcmp(arg, "vcd")) {
3903 opt_codec("c:v", "mpeg1video");
3904 opt_codec("c:a", "mp2");
3905 opt_format("f", "vcd");
3907 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3908 opt_frame_rate("r", frame_rates[norm]);
3909 opt_default("g", norm == PAL ? "15" : "18");
3911 opt_default("b", "1150000");
3912 opt_default("maxrate", "1150000");
3913 opt_default("minrate", "1150000");
3914 opt_default("bufsize", "327680"); // 40*1024*8;
3916 opt_default("b:a", "224000");
3917 audio_sample_rate = 44100;
3920 opt_default("packetsize", "2324");
3921 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3923 /* We have to offset the PTS, so that it is consistent with the SCR.
3924 SCR starts at 36000, but the first two packs contain only padding
3925 and the first pack from the other stream, respectively, may also have
3926 been written before.
3927 So the real data starts at SCR 36000+3*1200. */
3928 mux_preload= (36000+3*1200) / 90000.0; //0.44
3929 } else if(!strcmp(arg, "svcd")) {
3931 opt_codec("c:v", "mpeg2video");
3932 opt_codec("c:a", "mp2");
3933 opt_format("f", "svcd");
3935 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3936 opt_frame_rate("r", frame_rates[norm]);
3937 opt_default("g", norm == PAL ? "15" : "18");
3939 opt_default("b", "2040000");
3940 opt_default("maxrate", "2516000");
3941 opt_default("minrate", "0"); //1145000;
3942 opt_default("bufsize", "1835008"); //224*1024*8;
3943 opt_default("flags", "+scan_offset");
3946 opt_default("b:a", "224000");
3947 audio_sample_rate = 44100;
3949 opt_default("packetsize", "2324");
3951 } else if(!strcmp(arg, "dvd")) {
3953 opt_codec("c:v", "mpeg2video");
3954 opt_codec("c:a", "ac3");
3955 opt_format("f", "dvd");
3957 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3958 opt_frame_rate("r", frame_rates[norm]);
3959 opt_default("g", norm == PAL ? "15" : "18");
3961 opt_default("b", "6000000");
3962 opt_default("maxrate", "9000000");
3963 opt_default("minrate", "0"); //1500000;
3964 opt_default("bufsize", "1835008"); //224*1024*8;
3966 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3967 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3969 opt_default("b:a", "448000");
3970 audio_sample_rate = 48000;
3972 } else if(!strncmp(arg, "dv", 2)) {
3974 opt_format("f", "dv");
3976 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3977 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3978 norm == PAL ? "yuv420p" : "yuv411p");
3979 opt_frame_rate("r", frame_rates[norm]);
3981 audio_sample_rate = 48000;
3985 fprintf(stderr, "Unknown target: %s\n", arg);
3986 return AVERROR(EINVAL);
3991 static int opt_vstats_file(const char *opt, const char *arg)
3993 av_free (vstats_filename);
3994 vstats_filename=av_strdup (arg);
3998 static int opt_vstats(const char *opt, const char *arg)
4001 time_t today2 = time(NULL);
4002 struct tm *today = localtime(&today2);
4004 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4006 return opt_vstats_file(opt, filename);
4009 static int opt_bsf(const char *opt, const char *arg)
4011 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4012 AVBitStreamFilterContext **bsfp;
4015 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4019 bsfp= *opt == 'v' ? &video_bitstream_filters :
4020 *opt == 'a' ? &audio_bitstream_filters :
4021 &subtitle_bitstream_filters;
4023 bsfp= &(*bsfp)->next;
4030 static const OptionDef options[] = {
4032 #include "cmdutils_common_opts.h"
4033 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4034 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4035 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4036 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4037 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4038 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4039 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4040 "outfile[,metadata]:infile[,metadata]" },
4041 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4042 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4043 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4044 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4045 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4046 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "stream:scale" },
4047 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4048 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4049 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4050 "add timings for benchmarking" },
4051 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4052 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4053 "dump each input packet" },
4054 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4055 "when dumping packets, also dump the payload" },
4056 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4057 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4058 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4059 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4060 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4061 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4062 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4063 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4064 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4065 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4066 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4067 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4068 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4069 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4072 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4073 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4074 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4075 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4076 { "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" },
4077 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4078 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4079 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4080 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4081 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4082 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4083 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4084 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4085 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4086 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4087 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4088 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4089 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4090 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4091 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4092 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4093 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4094 "use same quantizer as source (implies VBR)" },
4095 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4096 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4097 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4098 "deinterlace pictures" },
4099 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4100 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4101 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4103 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4105 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4106 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4107 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4108 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4109 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4110 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4111 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4112 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4113 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4114 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4117 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4118 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4119 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4120 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4121 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4122 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4123 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4124 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4125 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4126 { "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" },
4128 /* subtitle options */
4129 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4130 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4131 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4132 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4135 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4138 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4139 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4141 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4142 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4143 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4145 /* data codec support */
4146 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4148 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4152 int main(int argc, char **argv)
4156 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4158 avcodec_register_all();
4160 avdevice_register_all();
4163 avfilter_register_all();
4167 avio_set_interrupt_cb(decode_interrupt_cb);
4174 parse_options(argc, argv, options, opt_output_file);
4176 if(nb_output_files <= 0 && nb_input_files == 0) {
4178 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4182 /* file converter / grab */
4183 if (nb_output_files <= 0) {
4184 fprintf(stderr, "At least one output file must be specified\n");
4188 if (nb_input_files == 0) {
4189 fprintf(stderr, "At least one input file must be specified\n");
4194 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4196 ti = getutime() - ti;
4198 int maxrss = getmaxrss() / 1024;
4199 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4202 return exit_program(0);