3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "avconv";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
82 int disabled; /** 1 is this mapping is disabled by a negative map */
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct MetadataMap {
93 int file; //< file index
94 char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; //< stream/chapter/program number
98 static const OptionDef options[];
100 static const char *last_asked_format = NULL;
101 static AVDictionary *ts_scale;
103 static StreamMap *stream_maps = NULL;
104 static int nb_stream_maps;
106 static AVDictionary *codec_names;
108 /* first item specifies output metadata, second is input */
109 static MetadataMap (*meta_data_maps)[2] = NULL;
110 static int nb_meta_data_maps;
111 static int metadata_global_autocopy = 1;
112 static int metadata_streams_autocopy = 1;
113 static int metadata_chapters_autocopy = 1;
115 static int chapters_input_file = INT_MAX;
117 /* indexed by output file stream index */
118 static int *streamid_map = NULL;
119 static int nb_streamid_map = 0;
121 static int frame_width = 0;
122 static int frame_height = 0;
123 static float frame_aspect_ratio = 0;
124 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
125 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
126 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
127 static AVRational frame_rate;
128 static float video_qscale = 0;
129 static uint16_t *intra_matrix = NULL;
130 static uint16_t *inter_matrix = NULL;
131 static const char *video_rc_override_string=NULL;
132 static int video_disable = 0;
133 static int video_discard = 0;
134 static unsigned int video_codec_tag = 0;
135 static char *video_language = NULL;
136 static int same_quant = 0;
137 static int do_deinterlace = 0;
138 static int top_field_first = -1;
139 static int me_threshold = 0;
140 static int intra_dc_precision = 8;
141 static int qp_hist = 0;
143 static char *vfilters = NULL;
146 static int intra_only = 0;
147 static int audio_sample_rate = 0;
148 #define QSCALE_NONE -99999
149 static float audio_qscale = QSCALE_NONE;
150 static int audio_disable = 0;
151 static int audio_channels = 0;
152 static unsigned int audio_codec_tag = 0;
153 static char *audio_language = NULL;
155 static int subtitle_disable = 0;
156 static char *subtitle_language = NULL;
157 static unsigned int subtitle_codec_tag = 0;
159 static int data_disable = 0;
160 static unsigned int data_codec_tag = 0;
162 static float mux_preload= 0.5;
163 static float mux_max_delay= 0.7;
165 static int64_t recording_time = INT64_MAX;
166 static int64_t start_time = 0;
167 static int64_t input_ts_offset = 0;
168 static int file_overwrite = 0;
169 static AVDictionary *metadata;
170 static int do_benchmark = 0;
171 static int do_hex_dump = 0;
172 static int do_pkt_dump = 0;
173 static int do_psnr = 0;
174 static int do_pass = 0;
175 static char *pass_logfilename_prefix = NULL;
176 static int video_sync_method= -1;
177 static int audio_sync_method= 0;
178 static float audio_drift_threshold= 0.1;
179 static int copy_ts= 0;
181 static int opt_shortest = 0;
182 static char *vstats_filename;
183 static FILE *vstats_file;
184 static int opt_programid = 0;
185 static int copy_initial_nonkeyframes = 0;
187 static int rate_emu = 0;
189 static int audio_volume = 256;
191 static int exit_on_error = 0;
192 static int using_stdin = 0;
193 static int verbose = 1;
194 static int thread_count= 1;
195 static int64_t video_size = 0;
196 static int64_t audio_size = 0;
197 static int64_t extra_size = 0;
198 static int nb_frames_dup = 0;
199 static int nb_frames_drop = 0;
200 static int input_sync;
201 static uint64_t limit_filesize = 0;
202 static int force_fps = 0;
203 static char *forced_key_frames = NULL;
205 static float dts_delta_threshold = 10;
207 static int64_t timer_start;
209 static uint8_t *audio_buf;
210 static uint8_t *audio_out;
211 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
213 static short *samples;
215 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
216 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
217 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
219 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
223 typedef struct OutputStream {
224 int file_index; /* file index */
225 int index; /* stream index in the output file */
226 int source_index; /* InputStream index */
227 AVStream *st; /* stream in the output file */
228 int encoding_needed; /* true if encoding needed for this stream */
230 /* input pts and corresponding output pts
232 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
233 struct InputStream *sync_ist; /* input stream to sync against */
234 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
235 AVBitStreamFilterContext *bitstream_filters;
240 AVFrame pict_tmp; /* temporary image for resampling */
241 struct SwsContext *img_resample_ctx; /* for image resampling */
244 int resample_pix_fmt;
245 AVRational frame_rate;
247 float frame_aspect_ratio;
249 /* forced key frames */
250 int64_t *forced_kf_pts;
256 ReSampleContext *resample; /* for audio resampling */
257 int resample_sample_fmt;
258 int resample_channels;
259 int resample_sample_rate;
261 AVAudioConvert *reformat_ctx;
262 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
266 AVFilterContext *output_video_filter;
267 AVFilterContext *input_video_filter;
268 AVFilterBufferRef *picref;
270 AVFilterGraph *graph;
275 int is_past_recording_time;
278 typedef struct InputStream {
281 int discard; /* true if stream data should be discarded */
282 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
285 int64_t start; /* time when read started */
286 int64_t next_pts; /* synthetic pts for cases where pkt.pts
288 int64_t pts; /* current pts */
289 PtsCorrectionContext pts_ctx;
291 int is_start; /* is 1 at the start and after a discontinuity */
292 int showed_multi_packet_warning;
296 typedef struct InputFile {
297 AVFormatContext *ctx;
298 int eof_reached; /* true if eof reached */
299 int ist_index; /* index of first stream in ist_table */
300 int buffer_size; /* current total buffer size */
304 typedef struct OutputFile {
305 AVFormatContext *ctx;
307 int ost_index; /* index of the first stream in output_streams */
308 int64_t recording_time; /* desired length of the resulting file in microseconds */
309 int64_t start_time; /* start time in microseconds */
312 static InputStream *input_streams = NULL;
313 static int nb_input_streams = 0;
314 static InputFile *input_files = NULL;
315 static int nb_input_files = 0;
317 static OutputStream *output_streams = NULL;
318 static int nb_output_streams = 0;
319 static OutputFile *output_files = NULL;
320 static int nb_output_files = 0;
324 static int configure_video_filters(InputStream *ist, OutputStream *ost)
326 AVFilterContext *last_filter, *filter;
327 /** filter graph containing all filters including input & output */
328 AVCodecContext *codec = ost->st->codec;
329 AVCodecContext *icodec = ist->st->codec;
330 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
331 AVRational sample_aspect_ratio;
335 ost->graph = avfilter_graph_alloc();
337 if (ist->st->sample_aspect_ratio.num){
338 sample_aspect_ratio = ist->st->sample_aspect_ratio;
340 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
342 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
343 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
344 sample_aspect_ratio.num, sample_aspect_ratio.den);
346 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
347 "src", args, NULL, ost->graph);
350 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
351 "out", NULL, &ffsink_ctx, ost->graph);
354 last_filter = ost->input_video_filter;
356 if (codec->width != icodec->width || codec->height != icodec->height) {
357 snprintf(args, 255, "%d:%d:flags=0x%X",
361 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
362 NULL, args, NULL, ost->graph)) < 0)
364 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
366 last_filter = filter;
369 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
370 ost->graph->scale_sws_opts = av_strdup(args);
373 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
374 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
376 outputs->name = av_strdup("in");
377 outputs->filter_ctx = last_filter;
378 outputs->pad_idx = 0;
379 outputs->next = NULL;
381 inputs->name = av_strdup("out");
382 inputs->filter_ctx = ost->output_video_filter;
386 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
388 av_freep(&ost->avfilter);
390 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
394 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
397 codec->width = ost->output_video_filter->inputs[0]->w;
398 codec->height = ost->output_video_filter->inputs[0]->h;
399 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
400 ost->frame_aspect_ratio ? // overriden by the -aspect cli option
401 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
402 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
406 #endif /* CONFIG_AVFILTER */
408 static void term_exit(void)
410 av_log(NULL, AV_LOG_QUIET, "");
413 static volatile int received_sigterm = 0;
414 static volatile int received_nb_signals = 0;
417 sigterm_handler(int sig)
419 received_sigterm = sig;
420 received_nb_signals++;
424 static void term_init(void)
426 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
427 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
429 signal(SIGXCPU, sigterm_handler);
433 static int decode_interrupt_cb(void)
435 return received_nb_signals > 1;
438 static int exit_program(int ret)
443 for(i=0;i<nb_output_files;i++) {
444 AVFormatContext *s = output_files[i].ctx;
445 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
447 avformat_free_context(s);
448 av_dict_free(&output_files[i].opts);
450 for(i=0;i<nb_input_files;i++) {
451 av_close_input_file(input_files[i].ctx);
453 for (i = 0; i < nb_input_streams; i++)
454 av_dict_free(&input_streams[i].opts);
456 av_free(intra_matrix);
457 av_free(inter_matrix);
461 av_free(vstats_filename);
463 av_free(streamid_map);
464 av_free(meta_data_maps);
466 av_freep(&input_streams);
467 av_freep(&input_files);
468 av_freep(&output_streams);
469 av_freep(&output_files);
474 allocated_audio_buf_size= allocated_audio_out_size= 0;
481 if (received_sigterm) {
483 "Received signal %d: terminating.\n",
484 (int) received_sigterm);
488 exit(ret); /* not all OS-es handle main() return value */
492 static void assert_avoptions(AVDictionary *m)
494 AVDictionaryEntry *t;
495 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
496 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
501 static void assert_codec_experimental(AVCodecContext *c, int encoder)
503 const char *codec_string = encoder ? "encoder" : "decoder";
505 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
506 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
507 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
508 "results.\nAdd '-strict experimental' if you want to use it.\n",
509 codec_string, c->codec->name);
510 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
511 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
512 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
513 codec_string, codec->name);
518 /* similar to ff_dynarray_add() and av_fast_realloc() */
519 static void *grow_array(void *array, int elem_size, int *size, int new_size)
521 if (new_size >= INT_MAX / elem_size) {
522 fprintf(stderr, "Array too big.\n");
525 if (*size < new_size) {
526 uint8_t *tmp = av_realloc(array, new_size*elem_size);
528 fprintf(stderr, "Could not alloc buffer.\n");
531 memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
538 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
540 if(codec && codec->sample_fmts){
541 const enum AVSampleFormat *p= codec->sample_fmts;
543 if(*p == st->codec->sample_fmt)
547 av_log(NULL, AV_LOG_WARNING,
548 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
549 av_get_sample_fmt_name(st->codec->sample_fmt),
551 av_get_sample_fmt_name(codec->sample_fmts[0]));
552 st->codec->sample_fmt = codec->sample_fmts[0];
558 * Update the requested input sample format based on the output sample format.
559 * This is currently only used to request float output from decoders which
560 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
561 * Ideally this will be removed in the future when decoders do not do format
562 * conversion and only output in their native format.
564 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
567 /* if sample formats match or a decoder sample format has already been
568 requested, just return */
569 if (enc->sample_fmt == dec->sample_fmt ||
570 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
573 /* if decoder supports more than one output format */
574 if (dec_codec && dec_codec->sample_fmts &&
575 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
576 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
577 const enum AVSampleFormat *p;
578 int min_dec = -1, min_inc = -1;
580 /* find a matching sample format in the encoder */
581 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
582 if (*p == enc->sample_fmt) {
583 dec->request_sample_fmt = *p;
585 } else if (*p > enc->sample_fmt) {
586 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
588 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
591 /* if none match, provide the one that matches quality closest */
592 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
593 enc->sample_fmt - min_dec;
597 static void choose_sample_rate(AVStream *st, AVCodec *codec)
599 if(codec && codec->supported_samplerates){
600 const int *p= codec->supported_samplerates;
602 int best_dist=INT_MAX;
604 int dist= abs(st->codec->sample_rate - *p);
605 if(dist < best_dist){
611 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
613 st->codec->sample_rate= best;
617 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
619 if(codec && codec->pix_fmts){
620 const enum PixelFormat *p= codec->pix_fmts;
621 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
622 if(st->codec->codec_id==CODEC_ID_MJPEG){
623 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
624 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
625 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};
629 if(*p == st->codec->pix_fmt)
633 if(st->codec->pix_fmt != PIX_FMT_NONE)
634 av_log(NULL, AV_LOG_WARNING,
635 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
636 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
638 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
639 st->codec->pix_fmt = codec->pix_fmts[0];
645 get_sync_ipts(const OutputStream *ost)
647 const InputStream *ist = ost->sync_ist;
648 OutputFile *of = &output_files[ost->file_index];
649 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
652 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
656 AVPacket new_pkt= *pkt;
657 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
658 &new_pkt.data, &new_pkt.size,
659 pkt->data, pkt->size,
660 pkt->flags & AV_PKT_FLAG_KEY);
663 new_pkt.destruct= av_destruct_packet;
665 fprintf(stderr, "%s failed for stream %d, codec %s",
666 bsfc->filter->name, pkt->stream_index,
667 avctx->codec ? avctx->codec->name : "copy");
677 ret= av_interleaved_write_frame(s, pkt);
679 print_error("av_interleaved_write_frame()", ret);
684 #define MAX_AUDIO_PACKET_SIZE (128 * 1024)
686 static void do_audio_out(AVFormatContext *s,
689 unsigned char *buf, int size)
692 int64_t audio_out_size, audio_buf_size;
693 int64_t allocated_for_size= size;
695 int size_out, frame_bytes, ret, resample_changed;
696 AVCodecContext *enc= ost->st->codec;
697 AVCodecContext *dec= ist->st->codec;
698 int osize = av_get_bytes_per_sample(enc->sample_fmt);
699 int isize = av_get_bytes_per_sample(dec->sample_fmt);
700 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
703 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
704 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
705 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
706 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
707 audio_buf_size*= osize*enc->channels;
709 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
710 if(coded_bps > 8*osize)
711 audio_out_size= audio_out_size * coded_bps / (8*osize);
712 audio_out_size += FF_MIN_BUFFER_SIZE;
714 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
715 fprintf(stderr, "Buffer sizes too large\n");
719 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
720 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
721 if (!audio_buf || !audio_out){
722 fprintf(stderr, "Out of memory in do_audio_out\n");
726 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
727 ost->audio_resample = 1;
729 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
730 ost->resample_channels != dec->channels ||
731 ost->resample_sample_rate != dec->sample_rate;
733 if ((ost->audio_resample && !ost->resample) || resample_changed) {
734 if (resample_changed) {
735 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",
736 ist->file_index, ist->st->index,
737 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
738 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
739 ost->resample_sample_fmt = dec->sample_fmt;
740 ost->resample_channels = dec->channels;
741 ost->resample_sample_rate = dec->sample_rate;
743 audio_resample_close(ost->resample);
745 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
746 if (audio_sync_method <= 1 &&
747 ost->resample_sample_fmt == enc->sample_fmt &&
748 ost->resample_channels == enc->channels &&
749 ost->resample_sample_rate == enc->sample_rate) {
750 ost->resample = NULL;
751 ost->audio_resample = 0;
752 } else if (ost->audio_resample) {
753 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
754 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
755 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
756 enc->sample_rate, dec->sample_rate,
757 enc->sample_fmt, dec->sample_fmt,
759 if (!ost->resample) {
760 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
761 dec->channels, dec->sample_rate,
762 enc->channels, enc->sample_rate);
768 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
769 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
770 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
771 if (ost->reformat_ctx)
772 av_audio_convert_free(ost->reformat_ctx);
773 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
774 dec->sample_fmt, 1, NULL, 0);
775 if (!ost->reformat_ctx) {
776 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
777 av_get_sample_fmt_name(dec->sample_fmt),
778 av_get_sample_fmt_name(enc->sample_fmt));
781 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
784 if(audio_sync_method){
785 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
786 - av_fifo_size(ost->fifo)/(enc->channels * 2);
787 double idelta= delta*dec->sample_rate / enc->sample_rate;
788 int byte_delta= ((int)idelta)*2*dec->channels;
790 //FIXME resample delay
791 if(fabs(delta) > 50){
792 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
794 byte_delta= FFMAX(byte_delta, -size);
798 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
803 static uint8_t *input_tmp= NULL;
804 input_tmp= av_realloc(input_tmp, byte_delta + size);
806 if(byte_delta > allocated_for_size - size){
807 allocated_for_size= byte_delta + (int64_t)size;
812 memset(input_tmp, 0, byte_delta);
813 memcpy(input_tmp + byte_delta, buf, size);
817 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
819 }else if(audio_sync_method>1){
820 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
821 av_assert0(ost->audio_resample);
823 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
824 // 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));
825 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
829 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
830 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
832 if (ost->audio_resample) {
834 size_out = audio_resample(ost->resample,
835 (short *)buftmp, (short *)buf,
836 size / (dec->channels * isize));
837 size_out = size_out * enc->channels * osize;
843 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
844 const void *ibuf[6]= {buftmp};
845 void *obuf[6]= {audio_buf};
846 int istride[6]= {isize};
847 int ostride[6]= {osize};
848 int len= size_out/istride[0];
849 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
850 printf("av_audio_convert() failed\n");
856 size_out = len*osize;
859 /* now encode as many frames as possible */
860 if (enc->frame_size > 1) {
861 /* output resampled raw samples */
862 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
863 fprintf(stderr, "av_fifo_realloc2() failed\n");
866 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
868 frame_bytes = enc->frame_size * osize * enc->channels;
870 while (av_fifo_size(ost->fifo) >= frame_bytes) {
872 av_init_packet(&pkt);
874 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
876 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
878 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
881 fprintf(stderr, "Audio encoding failed\n");
885 pkt.stream_index= ost->index;
888 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
889 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
890 pkt.flags |= AV_PKT_FLAG_KEY;
891 write_frame(s, &pkt, enc, ost->bitstream_filters);
893 ost->sync_opts += enc->frame_size;
897 av_init_packet(&pkt);
899 ost->sync_opts += size_out / (osize * enc->channels);
901 /* output a pcm frame */
902 /* determine the size of the coded buffer */
905 size_out = size_out*coded_bps/8;
907 if(size_out > audio_out_size){
908 fprintf(stderr, "Internal error, buffer size too small\n");
912 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
913 ret = avcodec_encode_audio(enc, audio_out, size_out,
916 fprintf(stderr, "Audio encoding failed\n");
920 pkt.stream_index= ost->index;
923 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
924 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
925 pkt.flags |= AV_PKT_FLAG_KEY;
926 write_frame(s, &pkt, enc, ost->bitstream_filters);
930 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
934 AVPicture picture_tmp;
937 dec = ist->st->codec;
939 /* deinterlace : must be done before any resize */
940 if (do_deinterlace) {
943 /* create temporary picture */
944 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
945 buf = av_malloc(size);
949 picture2 = &picture_tmp;
950 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
952 if(avpicture_deinterlace(picture2, picture,
953 dec->pix_fmt, dec->width, dec->height) < 0) {
954 /* if error, do not deinterlace */
955 fprintf(stderr, "Deinterlacing failed\n");
964 if (picture != picture2)
965 *picture = *picture2;
969 /* we begin to correct av delay at this threshold */
970 #define AV_DELAY_MAX 0.100
972 static void do_subtitle_out(AVFormatContext *s,
978 static uint8_t *subtitle_out = NULL;
979 int subtitle_out_max_size = 1024 * 1024;
980 int subtitle_out_size, nb, i;
984 if (pts == AV_NOPTS_VALUE) {
985 fprintf(stderr, "Subtitle packets must have a pts\n");
991 enc = ost->st->codec;
994 subtitle_out = av_malloc(subtitle_out_max_size);
997 /* Note: DVB subtitle need one packet to draw them and one other
998 packet to clear them */
999 /* XXX: signal it in the codec context ? */
1000 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1005 for(i = 0; i < nb; i++) {
1006 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1007 // start_display_time is required to be 0
1008 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1009 sub->end_display_time -= sub->start_display_time;
1010 sub->start_display_time = 0;
1011 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1012 subtitle_out_max_size, sub);
1013 if (subtitle_out_size < 0) {
1014 fprintf(stderr, "Subtitle encoding failed\n");
1018 av_init_packet(&pkt);
1019 pkt.stream_index = ost->index;
1020 pkt.data = subtitle_out;
1021 pkt.size = subtitle_out_size;
1022 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1023 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1024 /* XXX: the pts correction is handled here. Maybe handling
1025 it in the codec would be better */
1027 pkt.pts += 90 * sub->start_display_time;
1029 pkt.pts += 90 * sub->end_display_time;
1031 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1035 static int bit_buffer_size= 1024*256;
1036 static uint8_t *bit_buffer= NULL;
1038 static void do_video_resample(OutputStream *ost,
1040 AVFrame *in_picture,
1041 AVFrame **out_picture)
1043 int resample_changed = 0;
1044 AVCodecContext *dec = ist->st->codec;
1045 *out_picture = in_picture;
1047 resample_changed = ost->resample_width != dec->width ||
1048 ost->resample_height != dec->height ||
1049 ost->resample_pix_fmt != dec->pix_fmt;
1051 if (resample_changed) {
1052 av_log(NULL, AV_LOG_INFO,
1053 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1054 ist->file_index, ist->st->index,
1055 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1056 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1057 if(!ost->video_resample)
1058 ost->video_resample = 1;
1061 #if !CONFIG_AVFILTER
1062 if (ost->video_resample) {
1063 *out_picture = &ost->pict_tmp;
1064 if (resample_changed) {
1065 /* initialize a new scaler context */
1066 sws_freeContext(ost->img_resample_ctx);
1067 ost->img_resample_ctx = sws_getContext(
1068 ist->st->codec->width,
1069 ist->st->codec->height,
1070 ist->st->codec->pix_fmt,
1071 ost->st->codec->width,
1072 ost->st->codec->height,
1073 ost->st->codec->pix_fmt,
1074 ost->sws_flags, NULL, NULL, NULL);
1075 if (ost->img_resample_ctx == NULL) {
1076 fprintf(stderr, "Cannot get resampling context\n");
1080 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1081 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1084 if (resample_changed) {
1085 avfilter_graph_free(&ost->graph);
1086 if (configure_video_filters(ist, ost)) {
1087 fprintf(stderr, "Error reinitialising filters!\n");
1092 if (resample_changed) {
1093 ost->resample_width = dec->width;
1094 ost->resample_height = dec->height;
1095 ost->resample_pix_fmt = dec->pix_fmt;
1100 static void do_video_out(AVFormatContext *s,
1103 AVFrame *in_picture,
1104 int *frame_size, float quality)
1106 int nb_frames, i, ret, format_video_sync;
1107 AVFrame *final_picture;
1108 AVCodecContext *enc, *dec;
1111 enc = ost->st->codec;
1112 dec = ist->st->codec;
1114 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1116 /* by default, we output a single frame */
1121 format_video_sync = video_sync_method;
1122 if (format_video_sync < 0)
1123 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1125 if (format_video_sync) {
1126 double vdelta = sync_ipts - ost->sync_opts;
1127 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1130 else if (format_video_sync == 2) {
1133 }else if(vdelta>0.6)
1134 ost->sync_opts= lrintf(sync_ipts);
1135 }else if (vdelta > 1.1)
1136 nb_frames = lrintf(vdelta);
1137 //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);
1138 if (nb_frames == 0){
1141 fprintf(stderr, "*** drop!\n");
1142 }else if (nb_frames > 1) {
1143 nb_frames_dup += nb_frames - 1;
1145 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1148 ost->sync_opts= lrintf(sync_ipts);
1150 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1154 do_video_resample(ost, ist, in_picture, &final_picture);
1156 /* duplicates frame if needed */
1157 for(i=0;i<nb_frames;i++) {
1159 av_init_packet(&pkt);
1160 pkt.stream_index= ost->index;
1162 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1163 /* raw pictures are written as AVPicture structure to
1164 avoid any copies. We support temorarily the older
1166 AVFrame* old_frame = enc->coded_frame;
1167 enc->coded_frame = dec->coded_frame; //FIXME/XXX remove this hack
1168 pkt.data= (uint8_t *)final_picture;
1169 pkt.size= sizeof(AVPicture);
1170 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1171 pkt.flags |= AV_PKT_FLAG_KEY;
1173 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1174 enc->coded_frame = old_frame;
1176 AVFrame big_picture;
1178 big_picture= *final_picture;
1179 /* better than nothing: use input picture interlaced
1181 big_picture.interlaced_frame = in_picture->interlaced_frame;
1182 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1183 if(top_field_first == -1)
1184 big_picture.top_field_first = in_picture->top_field_first;
1186 big_picture.top_field_first = top_field_first;
1189 /* handles same_quant here. This is not correct because it may
1190 not be a global option */
1191 big_picture.quality = quality;
1193 big_picture.pict_type = 0;
1194 // big_picture.pts = AV_NOPTS_VALUE;
1195 big_picture.pts= ost->sync_opts;
1196 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1197 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1198 if (ost->forced_kf_index < ost->forced_kf_count &&
1199 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1200 big_picture.pict_type = AV_PICTURE_TYPE_I;
1201 ost->forced_kf_index++;
1203 ret = avcodec_encode_video(enc,
1204 bit_buffer, bit_buffer_size,
1207 fprintf(stderr, "Video encoding failed\n");
1212 pkt.data= bit_buffer;
1214 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1215 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1216 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1217 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1218 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1220 if(enc->coded_frame->key_frame)
1221 pkt.flags |= AV_PKT_FLAG_KEY;
1222 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1225 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1226 // enc->frame_number-1, ret, enc->pict_type);
1227 /* if two pass, output log */
1228 if (ost->logfile && enc->stats_out) {
1229 fprintf(ost->logfile, "%s", enc->stats_out);
1234 ost->frame_number++;
1238 static double psnr(double d){
1239 return -10.0*log(d)/log(10.0);
1242 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1245 AVCodecContext *enc;
1247 double ti1, bitrate, avg_bitrate;
1249 /* this is executed just the first time do_video_stats is called */
1251 vstats_file = fopen(vstats_filename, "w");
1258 enc = ost->st->codec;
1259 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1260 frame_number = ost->frame_number;
1261 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1262 if (enc->flags&CODEC_FLAG_PSNR)
1263 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1265 fprintf(vstats_file,"f_size= %6d ", frame_size);
1266 /* compute pts value */
1267 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1271 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1272 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1273 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1274 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1275 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1279 static void print_report(OutputFile *output_files,
1280 OutputStream *ost_table, int nb_ostreams,
1285 AVFormatContext *oc;
1287 AVCodecContext *enc;
1288 int frame_number, vid, i;
1289 double bitrate, ti1, pts;
1290 static int64_t last_time = -1;
1291 static int qp_histogram[52];
1293 if (!is_last_report) {
1295 /* display the report every 0.5 seconds */
1296 cur_time = av_gettime();
1297 if (last_time == -1) {
1298 last_time = cur_time;
1301 if ((cur_time - last_time) < 500000)
1303 last_time = cur_time;
1307 oc = output_files[0].ctx;
1309 total_size = avio_size(oc->pb);
1310 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1311 total_size= avio_tell(oc->pb);
1316 for(i=0;i<nb_ostreams;i++) {
1318 ost = &ost_table[i];
1319 enc = ost->st->codec;
1320 if (!ost->st->stream_copy && enc->coded_frame)
1321 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1322 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1323 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1325 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1326 float t = (av_gettime()-timer_start) / 1000000.0;
1328 frame_number = ost->frame_number;
1329 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1330 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1332 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1336 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1339 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1341 if (enc->flags&CODEC_FLAG_PSNR){
1343 double error, error_sum=0;
1344 double scale, scale_sum=0;
1345 char type[3]= {'Y','U','V'};
1346 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1349 error= enc->error[j];
1350 scale= enc->width*enc->height*255.0*255.0*frame_number;
1352 error= enc->coded_frame->error[j];
1353 scale= enc->width*enc->height*255.0*255.0;
1358 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1360 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1364 /* compute min output value */
1365 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1366 if ((pts < ti1) && (pts > 0))
1372 if (verbose > 0 || is_last_report) {
1373 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1375 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1376 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1377 (double)total_size / 1024, ti1, bitrate);
1379 if (nb_frames_dup || nb_frames_drop)
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1381 nb_frames_dup, nb_frames_drop);
1384 fprintf(stderr, "%s \r", buf);
1389 if (is_last_report && verbose >= 0){
1390 int64_t raw= audio_size + video_size + extra_size;
1391 fprintf(stderr, "\n");
1392 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1396 100.0*(total_size - raw)/raw
1401 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1403 int fill_char = 0x00;
1404 if (sample_fmt == AV_SAMPLE_FMT_U8)
1406 memset(buf, fill_char, size);
1409 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1410 static int output_packet(InputStream *ist, int ist_index,
1411 OutputStream *ost_table, int nb_ostreams,
1412 const AVPacket *pkt)
1414 AVFormatContext *os;
1419 void *buffer_to_free = NULL;
1420 static unsigned int samples_size= 0;
1421 AVSubtitle subtitle, *subtitle_to_free;
1422 int64_t pkt_pts = AV_NOPTS_VALUE;
1424 int frame_available;
1429 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1431 if(ist->next_pts == AV_NOPTS_VALUE)
1432 ist->next_pts= ist->pts;
1436 av_init_packet(&avpkt);
1444 if(pkt->dts != AV_NOPTS_VALUE)
1445 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1446 if(pkt->pts != AV_NOPTS_VALUE)
1447 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1449 //while we have more to decode or while the decoder did output something on EOF
1450 while (avpkt.size > 0 || (!pkt && got_output)) {
1451 uint8_t *data_buf, *decoded_data_buf;
1452 int data_size, decoded_data_size;
1454 ist->pts= ist->next_pts;
1456 if(avpkt.size && avpkt.size != pkt->size &&
1457 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1458 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1459 ist->showed_multi_packet_warning=1;
1462 /* decode the packet if needed */
1463 decoded_data_buf = NULL; /* fail safe */
1464 decoded_data_size= 0;
1465 data_buf = avpkt.data;
1466 data_size = avpkt.size;
1467 subtitle_to_free = NULL;
1468 if (ist->decoding_needed) {
1469 switch(ist->st->codec->codec_type) {
1470 case AVMEDIA_TYPE_AUDIO:{
1471 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1472 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1474 samples= av_malloc(samples_size);
1476 decoded_data_size= samples_size;
1477 /* XXX: could avoid copy if PCM 16 bits with same
1478 endianness as CPU */
1479 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1486 got_output = decoded_data_size > 0;
1487 /* Some bug in mpeg audio decoder gives */
1488 /* decoded_data_size < 0, it seems they are overflows */
1490 /* no audio frame */
1493 decoded_data_buf = (uint8_t *)samples;
1494 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1495 (ist->st->codec->sample_rate * ist->st->codec->channels);
1497 case AVMEDIA_TYPE_VIDEO:
1498 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1499 /* XXX: allocate picture correctly */
1500 avcodec_get_frame_defaults(&picture);
1501 avpkt.pts = pkt_pts;
1502 avpkt.dts = ist->pts;
1503 pkt_pts = AV_NOPTS_VALUE;
1505 ret = avcodec_decode_video2(ist->st->codec,
1506 &picture, &got_output, &avpkt);
1507 quality = same_quant ? picture.quality : 0;
1511 /* no picture yet */
1512 goto discard_packet;
1514 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1515 if (ist->st->codec->time_base.num != 0) {
1516 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1517 ist->next_pts += ((int64_t)AV_TIME_BASE *
1518 ist->st->codec->time_base.num * ticks) /
1519 ist->st->codec->time_base.den;
1522 buffer_to_free = NULL;
1523 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1525 case AVMEDIA_TYPE_SUBTITLE:
1526 ret = avcodec_decode_subtitle2(ist->st->codec,
1527 &subtitle, &got_output, &avpkt);
1531 goto discard_packet;
1533 subtitle_to_free = &subtitle;
1540 switch(ist->st->codec->codec_type) {
1541 case AVMEDIA_TYPE_AUDIO:
1542 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1543 ist->st->codec->sample_rate;
1545 case AVMEDIA_TYPE_VIDEO:
1546 if (ist->st->codec->time_base.num != 0) {
1547 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1548 ist->next_pts += ((int64_t)AV_TIME_BASE *
1549 ist->st->codec->time_base.num * ticks) /
1550 ist->st->codec->time_base.den;
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 for (i = 0; i < nb_ostreams; i++) {
1582 OutputFile *of = &output_files[ost_table[i].file_index];
1585 ost = &ost_table[i];
1586 if (ost->source_index != ist_index)
1589 if (of->start_time && ist->pts < of->start_time)
1592 if (of->recording_time != INT64_MAX &&
1593 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1594 (AVRational){1, 1000000}) >= 0) {
1595 ost->is_past_recording_time = 1;
1600 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1601 ost->input_video_filter) {
1603 if (ist->st->sample_aspect_ratio.num)
1604 sar = ist->st->sample_aspect_ratio;
1606 sar = ist->st->codec->sample_aspect_ratio;
1607 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1609 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1610 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1611 while (frame_available) {
1612 AVRational ist_pts_tb;
1613 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1614 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1616 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1618 os = output_files[ost->file_index].ctx;
1620 /* set the input output pts pairs */
1621 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1623 if (ost->encoding_needed) {
1624 av_assert0(ist->decoding_needed);
1625 switch(ost->st->codec->codec_type) {
1626 case AVMEDIA_TYPE_AUDIO:
1627 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1629 case AVMEDIA_TYPE_VIDEO:
1631 if (ost->picref->video && !ost->frame_aspect_ratio)
1632 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1634 do_video_out(os, ost, ist, &picture, &frame_size,
1635 same_quant ? quality : ost->st->codec->global_quality);
1636 if (vstats_filename && frame_size)
1637 do_video_stats(os, ost, frame_size);
1639 case AVMEDIA_TYPE_SUBTITLE:
1640 do_subtitle_out(os, ost, ist, &subtitle,
1647 AVFrame avframe; //FIXME/XXX remove this
1649 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1651 av_init_packet(&opkt);
1653 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1654 #if !CONFIG_AVFILTER
1660 /* no reencoding needed : output the packet directly */
1661 /* force the input stream PTS */
1663 avcodec_get_frame_defaults(&avframe);
1664 ost->st->codec->coded_frame= &avframe;
1665 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1667 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1668 audio_size += data_size;
1669 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1670 video_size += data_size;
1674 opkt.stream_index= ost->index;
1675 if(pkt->pts != AV_NOPTS_VALUE)
1676 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1678 opkt.pts= AV_NOPTS_VALUE;
1680 if (pkt->dts == AV_NOPTS_VALUE)
1681 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1683 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1684 opkt.dts -= ost_tb_start_time;
1686 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1687 opkt.flags= pkt->flags;
1689 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1690 if( ost->st->codec->codec_id != CODEC_ID_H264
1691 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1692 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1694 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1695 opkt.destruct= av_destruct_packet;
1697 opkt.data = data_buf;
1698 opkt.size = data_size;
1701 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1702 ost->st->codec->frame_number++;
1703 ost->frame_number++;
1704 av_free_packet(&opkt);
1708 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1709 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1711 avfilter_unref_buffer(ost->picref);
1716 av_free(buffer_to_free);
1717 /* XXX: allocate the subtitles in the codec ? */
1718 if (subtitle_to_free) {
1719 avsubtitle_free(subtitle_to_free);
1720 subtitle_to_free = NULL;
1727 for(i=0;i<nb_ostreams;i++) {
1728 ost = &ost_table[i];
1729 if (ost->source_index == ist_index) {
1730 AVCodecContext *enc= ost->st->codec;
1731 os = output_files[ost->file_index].ctx;
1733 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1735 if(ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1738 if (ost->encoding_needed) {
1742 av_init_packet(&pkt);
1743 pkt.stream_index= ost->index;
1745 switch(ost->st->codec->codec_type) {
1746 case AVMEDIA_TYPE_AUDIO:
1747 fifo_bytes = av_fifo_size(ost->fifo);
1749 /* encode any samples remaining in fifo */
1750 if (fifo_bytes > 0) {
1751 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1752 int fs_tmp = enc->frame_size;
1754 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1755 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1756 enc->frame_size = fifo_bytes / (osize * enc->channels);
1758 int frame_bytes = enc->frame_size*osize*enc->channels;
1759 if (allocated_audio_buf_size < frame_bytes)
1761 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1764 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1765 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1766 ost->st->time_base.num, enc->sample_rate);
1767 enc->frame_size = fs_tmp;
1770 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1773 fprintf(stderr, "Audio encoding failed\n");
1777 pkt.flags |= AV_PKT_FLAG_KEY;
1779 case AVMEDIA_TYPE_VIDEO:
1780 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1782 fprintf(stderr, "Video encoding failed\n");
1786 if(enc->coded_frame && enc->coded_frame->key_frame)
1787 pkt.flags |= AV_PKT_FLAG_KEY;
1788 if (ost->logfile && enc->stats_out) {
1789 fprintf(ost->logfile, "%s", enc->stats_out);
1798 pkt.data= bit_buffer;
1800 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1801 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1802 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1812 static void print_sdp(OutputFile *output_files, int n)
1816 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1820 for (i = 0; i < n; i++)
1821 avc[i] = output_files[i].ctx;
1823 av_sdp_create(avc, n, sdp, sizeof(sdp));
1824 printf("SDP:\n%s\n", sdp);
1830 * The following code is the main loop of the file converter
1832 static int transcode(OutputFile *output_files,
1833 int nb_output_files,
1834 InputFile *input_files,
1838 AVFormatContext *is, *os;
1839 AVCodecContext *codec, *icodec;
1845 int no_packet_count=0;
1847 if (!(no_packet = av_mallocz(nb_input_files)))
1851 for (i = 0; i < nb_input_streams; i++)
1852 input_streams[i].start = av_gettime();
1854 /* output stream init */
1855 for(i=0;i<nb_output_files;i++) {
1856 os = output_files[i].ctx;
1857 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1858 av_dump_format(os, i, os->filename, 1);
1859 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1860 ret = AVERROR(EINVAL);
1865 /* for each output stream, we compute the right encoding parameters */
1866 for (i = 0; i < nb_output_streams; i++) {
1867 ost = &output_streams[i];
1868 os = output_files[ost->file_index].ctx;
1869 ist = &input_streams[ost->source_index];
1871 codec = ost->st->codec;
1872 icodec = ist->st->codec;
1874 ost->st->disposition = ist->st->disposition;
1875 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1876 codec->chroma_sample_location = icodec->chroma_sample_location;
1878 if (ost->st->stream_copy) {
1879 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1881 if (extra_size > INT_MAX)
1884 /* if stream_copy is selected, no need to decode or encode */
1885 codec->codec_id = icodec->codec_id;
1886 codec->codec_type = icodec->codec_type;
1888 if(!codec->codec_tag){
1889 if( !os->oformat->codec_tag
1890 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1891 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1892 codec->codec_tag = icodec->codec_tag;
1895 codec->bit_rate = icodec->bit_rate;
1896 codec->rc_max_rate = icodec->rc_max_rate;
1897 codec->rc_buffer_size = icodec->rc_buffer_size;
1898 codec->extradata= av_mallocz(extra_size);
1899 if (!codec->extradata)
1901 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1902 codec->extradata_size= icodec->extradata_size;
1903 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){
1904 codec->time_base = icodec->time_base;
1905 codec->time_base.num *= icodec->ticks_per_frame;
1906 av_reduce(&codec->time_base.num, &codec->time_base.den,
1907 codec->time_base.num, codec->time_base.den, INT_MAX);
1909 codec->time_base = ist->st->time_base;
1910 switch(codec->codec_type) {
1911 case AVMEDIA_TYPE_AUDIO:
1912 if(audio_volume != 256) {
1913 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1916 codec->channel_layout = icodec->channel_layout;
1917 codec->sample_rate = icodec->sample_rate;
1918 codec->channels = icodec->channels;
1919 codec->frame_size = icodec->frame_size;
1920 codec->audio_service_type = icodec->audio_service_type;
1921 codec->block_align= icodec->block_align;
1922 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1923 codec->block_align= 0;
1924 if(codec->codec_id == CODEC_ID_AC3)
1925 codec->block_align= 0;
1927 case AVMEDIA_TYPE_VIDEO:
1928 codec->pix_fmt = icodec->pix_fmt;
1929 codec->width = icodec->width;
1930 codec->height = icodec->height;
1931 codec->has_b_frames = icodec->has_b_frames;
1932 if (!codec->sample_aspect_ratio.num) {
1933 codec->sample_aspect_ratio =
1934 ost->st->sample_aspect_ratio =
1935 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1936 ist->st->codec->sample_aspect_ratio.num ?
1937 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1940 case AVMEDIA_TYPE_SUBTITLE:
1941 codec->width = icodec->width;
1942 codec->height = icodec->height;
1944 case AVMEDIA_TYPE_DATA:
1951 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
1952 switch(codec->codec_type) {
1953 case AVMEDIA_TYPE_AUDIO:
1954 ost->fifo= av_fifo_alloc(1024);
1957 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
1958 if (!codec->sample_rate) {
1959 codec->sample_rate = icodec->sample_rate;
1961 codec->sample_rate >>= icodec->lowres;
1963 choose_sample_rate(ost->st, ost->enc);
1964 codec->time_base = (AVRational){1, codec->sample_rate};
1965 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
1966 codec->sample_fmt = icodec->sample_fmt;
1967 choose_sample_fmt(ost->st, ost->enc);
1968 if (!codec->channels)
1969 codec->channels = icodec->channels;
1970 codec->channel_layout = icodec->channel_layout;
1971 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
1972 codec->channel_layout = 0;
1973 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
1974 icodec->request_channels = codec->channels;
1975 ist->decoding_needed = 1;
1976 ost->encoding_needed = 1;
1977 ost->resample_sample_fmt = icodec->sample_fmt;
1978 ost->resample_sample_rate = icodec->sample_rate;
1979 ost->resample_channels = icodec->channels;
1981 case AVMEDIA_TYPE_VIDEO:
1982 if (codec->pix_fmt == PIX_FMT_NONE)
1983 codec->pix_fmt = icodec->pix_fmt;
1984 choose_pixel_fmt(ost->st, ost->enc);
1986 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
1987 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
1991 if (!codec->width || !codec->height) {
1992 codec->width = icodec->width;
1993 codec->height = icodec->height;
1996 ost->video_resample = codec->width != icodec->width ||
1997 codec->height != icodec->height ||
1998 codec->pix_fmt != icodec->pix_fmt;
1999 if (ost->video_resample) {
2000 #if !CONFIG_AVFILTER
2001 avcodec_get_frame_defaults(&ost->pict_tmp);
2002 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2003 codec->width, codec->height)) {
2004 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2007 ost->img_resample_ctx = sws_getContext(
2014 ost->sws_flags, NULL, NULL, NULL);
2015 if (ost->img_resample_ctx == NULL) {
2016 fprintf(stderr, "Cannot get resampling context\n");
2020 codec->bits_per_raw_sample= 0;
2023 ost->resample_height = icodec->height;
2024 ost->resample_width = icodec->width;
2025 ost->resample_pix_fmt= icodec->pix_fmt;
2026 ost->encoding_needed = 1;
2027 ist->decoding_needed = 1;
2029 if (!ost->frame_rate.num)
2030 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2031 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2032 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2033 ost->frame_rate = ost->enc->supported_framerates[idx];
2035 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2038 if (configure_video_filters(ist, ost)) {
2039 fprintf(stderr, "Error opening filters!\n");
2044 case AVMEDIA_TYPE_SUBTITLE:
2045 ost->encoding_needed = 1;
2046 ist->decoding_needed = 1;
2053 if (ost->encoding_needed &&
2054 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2055 char logfilename[1024];
2058 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2059 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2061 if (codec->flags & CODEC_FLAG_PASS1) {
2062 f = fopen(logfilename, "wb");
2064 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2070 size_t logbuffer_size;
2071 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2072 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2075 codec->stats_in = logbuffer;
2079 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2080 int size= codec->width * codec->height;
2081 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2086 bit_buffer = av_malloc(bit_buffer_size);
2088 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2090 ret = AVERROR(ENOMEM);
2094 /* open each encoder */
2095 for (i = 0; i < nb_output_streams; i++) {
2096 ost = &output_streams[i];
2097 if (ost->encoding_needed) {
2098 AVCodec *codec = ost->enc;
2099 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2101 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2102 ost->st->codec->codec_id, ost->file_index, ost->index);
2103 ret = AVERROR(EINVAL);
2106 if (dec->subtitle_header) {
2107 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2108 if (!ost->st->codec->subtitle_header) {
2109 ret = AVERROR(ENOMEM);
2112 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2113 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2115 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2116 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2117 ost->file_index, ost->index);
2118 ret = AVERROR(EINVAL);
2121 assert_codec_experimental(ost->st->codec, 1);
2122 assert_avoptions(ost->opts);
2123 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2124 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2125 "It takes bits/s as argument, not kbits/s\n");
2126 extra_size += ost->st->codec->extradata_size;
2130 /* open each decoder */
2131 for (i = 0; i < nb_input_streams; i++) {
2132 ist = &input_streams[i];
2133 if (ist->decoding_needed) {
2134 AVCodec *codec = ist->dec;
2136 codec = avcodec_find_decoder(ist->st->codec->codec_id);
2138 snprintf(error, sizeof(error), "Decoder (codec id %d) not found for input stream #%d.%d",
2139 ist->st->codec->codec_id, ist->file_index, ist->st->index);
2140 ret = AVERROR(EINVAL);
2144 /* update requested sample format for the decoder based on the
2145 corresponding encoder sample format */
2146 for (j = 0; j < nb_output_streams; j++) {
2147 ost = &output_streams[j];
2148 if (ost->source_index == i) {
2149 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
2154 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
2155 snprintf(error, sizeof(error), "Error while opening decoder for input stream #%d.%d",
2156 ist->file_index, ist->st->index);
2157 ret = AVERROR(EINVAL);
2160 assert_codec_experimental(ist->st->codec, 0);
2161 assert_avoptions(ost->opts);
2166 for (i = 0; i < nb_input_streams; i++) {
2168 ist = &input_streams[i];
2170 ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
2171 ist->next_pts = AV_NOPTS_VALUE;
2172 init_pts_correction(&ist->pts_ctx);
2176 /* open files and write file headers */
2177 for (i = 0; i < nb_output_files; i++) {
2178 os = output_files[i].ctx;
2179 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2180 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2181 ret = AVERROR(EINVAL);
2184 assert_avoptions(output_files[i].opts);
2185 if (strcmp(os->oformat->name, "rtp")) {
2191 /* dump the file output parameters - cannot be done before in case
2193 for(i=0;i<nb_output_files;i++) {
2194 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2197 /* dump the stream mapping */
2199 fprintf(stderr, "Stream mapping:\n");
2200 for (i = 0; i < nb_output_streams;i ++) {
2201 ost = &output_streams[i];
2202 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2203 input_streams[ost->source_index].file_index,
2204 input_streams[ost->source_index].st->index,
2207 if (ost->sync_ist != &input_streams[ost->source_index])
2208 fprintf(stderr, " [sync #%d.%d]",
2209 ost->sync_ist->file_index,
2210 ost->sync_ist->st->index);
2211 if (ost->st->stream_copy)
2212 fprintf(stderr, " (copy)");
2213 fprintf(stderr, "\n");
2218 fprintf(stderr, "%s\n", error);
2223 print_sdp(output_files, nb_output_files);
2227 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2230 timer_start = av_gettime();
2232 for(; received_sigterm == 0;) {
2233 int file_index, ist_index;
2239 ipts_min = INT64_MAX;
2242 /* select the stream that we must read now by looking at the
2243 smallest output pts */
2245 for (i = 0; i < nb_output_streams; i++) {
2248 ost = &output_streams[i];
2249 os = output_files[ost->file_index].ctx;
2250 ist = &input_streams[ost->source_index];
2251 if(ost->is_past_recording_time || no_packet[ist->file_index])
2253 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2255 if (!input_files[ist->file_index].eof_reached){
2256 if(ipts < ipts_min) {
2258 if(input_sync ) file_index = ist->file_index;
2260 if(opts < opts_min) {
2262 if(!input_sync) file_index = ist->file_index;
2265 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2270 /* if none, if is finished */
2271 if (file_index < 0) {
2272 if(no_packet_count){
2274 memset(no_packet, 0, nb_input_files);
2281 /* finish if limit size exhausted */
2282 if (limit_filesize != 0 && limit_filesize <= avio_tell(output_files[0].ctx->pb))
2285 /* read a frame from it and output it in the fifo */
2286 is = input_files[file_index].ctx;
2287 ret= av_read_frame(is, &pkt);
2288 if(ret == AVERROR(EAGAIN)){
2289 no_packet[file_index]=1;
2294 input_files[file_index].eof_reached = 1;
2302 memset(no_packet, 0, nb_input_files);
2305 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2306 is->streams[pkt.stream_index]);
2308 /* the following test is needed in case new streams appear
2309 dynamically in stream : we ignore them */
2310 if (pkt.stream_index >= input_files[file_index].ctx->nb_streams)
2311 goto discard_packet;
2312 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2313 ist = &input_streams[ist_index];
2315 goto discard_packet;
2317 if (pkt.dts != AV_NOPTS_VALUE)
2318 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2319 if (pkt.pts != AV_NOPTS_VALUE)
2320 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2322 if (ist->ts_scale) {
2323 if(pkt.pts != AV_NOPTS_VALUE)
2324 pkt.pts *= ist->ts_scale;
2325 if(pkt.dts != AV_NOPTS_VALUE)
2326 pkt.dts *= ist->ts_scale;
2329 // 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);
2330 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2331 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2332 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2333 int64_t delta= pkt_dts - ist->next_pts;
2334 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2335 input_files[ist->file_index].ts_offset -= delta;
2337 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2338 delta, input_files[ist->file_index].ts_offset);
2339 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2340 if(pkt.pts != AV_NOPTS_VALUE)
2341 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2345 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2346 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2349 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2350 ist->file_index, ist->st->index);
2353 av_free_packet(&pkt);
2358 av_free_packet(&pkt);
2360 /* dump report by using the output first video and audio streams */
2361 print_report(output_files, output_streams, nb_output_streams, 0);
2364 /* at the end of stream, we must flush the decoder buffers */
2365 for (i = 0; i < nb_input_streams; i++) {
2366 ist = &input_streams[i];
2367 if (ist->decoding_needed) {
2368 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2374 /* write the trailer if needed and close file */
2375 for(i=0;i<nb_output_files;i++) {
2376 os = output_files[i].ctx;
2377 av_write_trailer(os);
2380 /* dump report by using the first video and audio streams */
2381 print_report(output_files, output_streams, nb_output_streams, 1);
2383 /* close each encoder */
2384 for (i = 0; i < nb_output_streams; i++) {
2385 ost = &output_streams[i];
2386 if (ost->encoding_needed) {
2387 av_freep(&ost->st->codec->stats_in);
2388 avcodec_close(ost->st->codec);
2391 avfilter_graph_free(&ost->graph);
2395 /* close each decoder */
2396 for (i = 0; i < nb_input_streams; i++) {
2397 ist = &input_streams[i];
2398 if (ist->decoding_needed) {
2399 avcodec_close(ist->st->codec);
2407 av_freep(&bit_buffer);
2408 av_freep(&no_packet);
2410 if (output_streams) {
2411 for (i = 0; i < nb_output_streams; i++) {
2412 ost = &output_streams[i];
2414 if (ost->st->stream_copy)
2415 av_freep(&ost->st->codec->extradata);
2417 fclose(ost->logfile);
2418 ost->logfile = NULL;
2420 av_fifo_free(ost->fifo); /* works even if fifo is not
2421 initialized but set to zero */
2422 av_freep(&ost->st->codec->subtitle_header);
2423 av_free(ost->pict_tmp.data[0]);
2424 av_free(ost->forced_kf_pts);
2425 if (ost->video_resample)
2426 sws_freeContext(ost->img_resample_ctx);
2428 audio_resample_close(ost->resample);
2429 if (ost->reformat_ctx)
2430 av_audio_convert_free(ost->reformat_ctx);
2431 av_dict_free(&ost->opts);
2438 static int opt_format(const char *opt, const char *arg)
2440 last_asked_format = arg;
2444 static int opt_video_rc_override_string(const char *opt, const char *arg)
2446 video_rc_override_string = arg;
2450 static int opt_me_threshold(const char *opt, const char *arg)
2452 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2456 static int opt_verbose(const char *opt, const char *arg)
2458 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2462 static int opt_frame_rate(const char *opt, const char *arg)
2464 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2465 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2471 static int opt_frame_crop(const char *opt, const char *arg)
2473 fprintf(stderr, "Option '%s' has been removed, use the crop filter instead\n", opt);
2474 return AVERROR(EINVAL);
2477 static int opt_frame_size(const char *opt, const char *arg)
2479 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2480 fprintf(stderr, "Incorrect frame size\n");
2481 return AVERROR(EINVAL);
2486 static int opt_pad(const char *opt, const char *arg) {
2487 fprintf(stderr, "Option '%s' has been removed, use the pad filter instead\n", opt);
2491 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2493 if (strcmp(arg, "list")) {
2494 frame_pix_fmt = av_get_pix_fmt(arg);
2495 if (frame_pix_fmt == PIX_FMT_NONE) {
2496 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2497 return AVERROR(EINVAL);
2506 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2513 p = strchr(arg, ':');
2515 x = strtol(arg, &end, 10);
2517 y = strtol(end+1, &end, 10);
2519 ar = (double)x / (double)y;
2521 ar = strtod(arg, NULL);
2524 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2525 return AVERROR(EINVAL);
2527 frame_aspect_ratio = ar;
2531 static int opt_metadata(const char *opt, const char *arg)
2533 char *mid= strchr(arg, '=');
2536 fprintf(stderr, "Missing =\n");
2541 av_dict_set(&metadata, arg, mid, 0);
2546 static int opt_qscale(const char *opt, const char *arg)
2548 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2549 if (video_qscale == 0) {
2550 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2551 return AVERROR(EINVAL);
2556 static int opt_top_field_first(const char *opt, const char *arg)
2558 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2562 static int opt_thread_count(const char *opt, const char *arg)
2564 thread_count= parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2567 fprintf(stderr, "Warning: not compiled with thread support, using thread emulation\n");
2572 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2574 if (strcmp(arg, "list")) {
2575 audio_sample_fmt = av_get_sample_fmt(arg);
2576 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2577 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2578 return AVERROR(EINVAL);
2583 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2584 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2590 static int opt_audio_rate(const char *opt, const char *arg)
2592 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2596 static int opt_audio_channels(const char *opt, const char *arg)
2598 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2602 static int opt_codec(const char *opt, const char *arg)
2604 return av_dict_set(&codec_names, opt, arg, 0);
2607 static int opt_audio_codec(const char *opt, const char *arg)
2609 return opt_codec("codec:a", arg);
2612 static int opt_video_codec(const char *opt, const char *arg)
2614 return opt_codec("codec:v", arg);
2617 static int opt_subtitle_codec(const char *opt, const char *arg)
2619 return opt_codec("codec:s", arg);
2622 static int opt_data_codec(const char *opt, const char *arg)
2624 return opt_codec("codec:d", arg);
2627 static int opt_codec_tag(const char *opt, const char *arg)
2630 uint32_t *codec_tag;
2632 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2633 !strcmp(opt, "vtag") ? &video_codec_tag :
2634 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2638 *codec_tag = strtol(arg, &tail, 0);
2640 *codec_tag = AV_RL32(arg);
2645 static int opt_map(const char *opt, const char *arg)
2647 StreamMap *m = NULL;
2648 int i, negative = 0, file_idx;
2649 int sync_file_idx = -1, sync_stream_idx;
2657 map = av_strdup(arg);
2659 /* parse sync stream first, just pick first matching stream */
2660 if (sync = strchr(map, ',')) {
2662 sync_file_idx = strtol(sync + 1, &sync, 0);
2663 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2664 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2669 for (i = 0; i < input_files[sync_file_idx].ctx->nb_streams; i++)
2670 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2671 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2672 sync_stream_idx = i;
2675 if (i == input_files[sync_file_idx].ctx->nb_streams) {
2676 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2677 "match any streams.\n", arg);
2683 file_idx = strtol(map, &p, 0);
2684 if (file_idx >= nb_input_files || file_idx < 0) {
2685 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2689 /* disable some already defined maps */
2690 for (i = 0; i < nb_stream_maps; i++) {
2691 m = &stream_maps[i];
2692 if (check_stream_specifier(input_files[m->file_index].ctx,
2693 input_files[m->file_index].ctx->streams[m->stream_index],
2694 *p == ':' ? p + 1 : p) > 0)
2698 for (i = 0; i < input_files[file_idx].ctx->nb_streams; i++) {
2699 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2700 *p == ':' ? p + 1 : p) <= 0)
2702 stream_maps = grow_array(stream_maps, sizeof(*stream_maps), &nb_stream_maps, nb_stream_maps + 1);
2703 m = &stream_maps[nb_stream_maps - 1];
2705 m->file_index = file_idx;
2706 m->stream_index = i;
2708 if (sync_file_idx >= 0) {
2709 m->sync_file_index = sync_file_idx;
2710 m->sync_stream_index = sync_stream_idx;
2712 m->sync_file_index = file_idx;
2713 m->sync_stream_index = i;
2718 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2726 static void parse_meta_type(char *arg, char *type, int *index)
2736 if (*(++arg) == ':')
2737 *index = strtol(++arg, NULL, 0);
2740 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2747 static int opt_map_metadata(const char *opt, const char *arg)
2749 MetadataMap *m, *m1;
2752 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2753 &nb_meta_data_maps, nb_meta_data_maps + 1);
2755 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2756 m->file = strtol(arg, &p, 0);
2757 parse_meta_type(p, &m->type, &m->index);
2759 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2760 if (p = strchr(opt, ':'))
2761 parse_meta_type(p, &m1->type, &m1->index);
2765 if (m->type == 'g' || m1->type == 'g')
2766 metadata_global_autocopy = 0;
2767 if (m->type == 's' || m1->type == 's')
2768 metadata_streams_autocopy = 0;
2769 if (m->type == 'c' || m1->type == 'c')
2770 metadata_chapters_autocopy = 0;
2775 static int opt_input_ts_scale(const char *opt, const char *arg)
2777 return av_dict_set(&ts_scale, opt, arg, 0);
2780 static int opt_recording_time(const char *opt, const char *arg)
2782 recording_time = parse_time_or_die(opt, arg, 1);
2786 static int opt_start_time(const char *opt, const char *arg)
2788 start_time = parse_time_or_die(opt, arg, 1);
2792 static int opt_input_ts_offset(const char *opt, const char *arg)
2794 input_ts_offset = parse_time_or_die(opt, arg, 1);
2798 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2800 const char *codec_string = encoder ? "encoder" : "decoder";
2804 return CODEC_ID_NONE;
2806 avcodec_find_encoder_by_name(name) :
2807 avcodec_find_decoder_by_name(name);
2809 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2812 if(codec->type != type) {
2813 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2819 static AVCodec *choose_codec(AVFormatContext *s, AVStream *st, enum AVMediaType type, AVDictionary *codec_names)
2821 AVDictionaryEntry *e = NULL;
2822 char *codec_name = NULL;
2825 while (e = av_dict_get(codec_names, "", e, AV_DICT_IGNORE_SUFFIX)) {
2826 char *p = strchr(e->key, ':');
2828 if ((ret = check_stream_specifier(s, st, p ? p + 1 : "")) > 0)
2829 codec_name = e->value;
2836 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2837 return avcodec_find_encoder(st->codec->codec_id);
2839 } else if (!strcmp(codec_name, "copy"))
2840 st->stream_copy = 1;
2842 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2843 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2844 avcodec_find_decoder_by_name(codec_name);
2851 * Add all the streams from the given input file to the global
2852 * list of input streams.
2854 static void add_input_streams(AVFormatContext *ic)
2856 int i, rfps, rfps_base, ret;
2858 for (i = 0; i < ic->nb_streams; i++) {
2859 AVStream *st = ic->streams[i];
2860 AVCodecContext *dec = st->codec;
2861 AVDictionaryEntry *e = NULL;
2865 dec->thread_count = thread_count;
2867 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2868 ist = &input_streams[nb_input_streams - 1];
2870 ist->file_index = nb_input_files;
2872 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2874 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2875 char *p = strchr(e->key, ':');
2877 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2883 ist->ts_scale = strtod(scale, NULL);
2885 ist->dec = choose_codec(ic, st, dec->codec_type, codec_names);
2887 switch (dec->codec_type) {
2888 case AVMEDIA_TYPE_AUDIO:
2890 st->discard= AVDISCARD_ALL;
2892 case AVMEDIA_TYPE_VIDEO:
2893 rfps = ic->streams[i]->r_frame_rate.num;
2894 rfps_base = ic->streams[i]->r_frame_rate.den;
2896 dec->flags |= CODEC_FLAG_EMU_EDGE;
2897 dec->height >>= dec->lowres;
2898 dec->width >>= dec->lowres;
2901 dec->debug |= FF_DEBUG_MV;
2903 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2906 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2907 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2909 (float)rfps / rfps_base, rfps, rfps_base);
2913 st->discard= AVDISCARD_ALL;
2914 else if(video_discard)
2915 st->discard= video_discard;
2917 case AVMEDIA_TYPE_DATA:
2919 case AVMEDIA_TYPE_SUBTITLE:
2920 if(subtitle_disable)
2921 st->discard = AVDISCARD_ALL;
2923 case AVMEDIA_TYPE_ATTACHMENT:
2924 case AVMEDIA_TYPE_UNKNOWN:
2932 static int opt_input_file(const char *opt, const char *filename)
2934 AVFormatContext *ic;
2935 AVInputFormat *file_iformat = NULL;
2939 AVDictionary **opts;
2940 int orig_nb_streams; // number of streams before avformat_find_stream_info
2942 if (last_asked_format) {
2943 if (!(file_iformat = av_find_input_format(last_asked_format))) {
2944 fprintf(stderr, "Unknown input format: '%s'\n", last_asked_format);
2947 last_asked_format = NULL;
2950 if (!strcmp(filename, "-"))
2953 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2954 !strcmp(filename, "/dev/stdin");
2956 /* get default parameters from command line */
2957 ic = avformat_alloc_context();
2959 print_error(filename, AVERROR(ENOMEM));
2962 if (audio_sample_rate) {
2963 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2964 av_dict_set(&format_opts, "sample_rate", buf, 0);
2966 if (audio_channels) {
2967 snprintf(buf, sizeof(buf), "%d", audio_channels);
2968 av_dict_set(&format_opts, "channels", buf, 0);
2970 if (frame_rate.num) {
2971 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2972 av_dict_set(&format_opts, "framerate", buf, 0);
2974 if (frame_width && frame_height) {
2975 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2976 av_dict_set(&format_opts, "video_size", buf, 0);
2978 if (frame_pix_fmt != PIX_FMT_NONE)
2979 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2981 ic->flags |= AVFMT_FLAG_NONBLOCK;
2983 /* open the input file with generic libav function */
2984 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2986 print_error(filename, err);
2989 assert_avoptions(format_opts);
2994 for(i=0; i<ic->nb_streams; i++){
2995 ic->streams[i]->discard= AVDISCARD_ALL;
2997 for(i=0; i<ic->nb_programs; i++){
2998 AVProgram *p= ic->programs[i];
2999 if(p->id != opt_programid){
3000 p->discard = AVDISCARD_ALL;
3003 for(j=0; j<p->nb_stream_indexes; j++){
3004 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
3009 fprintf(stderr, "Specified program id not found\n");
3015 /* apply forced codec ids */
3016 for (i = 0; i < ic->nb_streams; i++)
3017 choose_codec(ic, ic->streams[i], ic->streams[i]->codec->codec_type, codec_names);
3019 /* Set AVCodecContext options for avformat_find_stream_info */
3020 opts = setup_find_stream_info_opts(ic, codec_opts);
3021 orig_nb_streams = ic->nb_streams;
3023 /* If not enough info to get the stream parameters, we decode the
3024 first frames to get it. (used in mpeg case for example) */
3025 ret = avformat_find_stream_info(ic, opts);
3026 if (ret < 0 && verbose >= 0) {
3027 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3028 av_close_input_file(ic);
3032 timestamp = start_time;
3033 /* add the stream start time */
3034 if (ic->start_time != AV_NOPTS_VALUE)
3035 timestamp += ic->start_time;
3037 /* if seeking requested, we execute it */
3038 if (start_time != 0) {
3039 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3041 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3042 filename, (double)timestamp / AV_TIME_BASE);
3044 /* reset seek info */
3048 /* update the current parameters so that they match the one of the input stream */
3049 add_input_streams(ic);
3051 /* dump the file content */
3053 av_dump_format(ic, nb_input_files, filename, 0);
3055 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3056 input_files[nb_input_files - 1].ctx = ic;
3057 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3058 input_files[nb_input_files - 1].ts_offset = input_ts_offset - (copy_ts ? 0 : timestamp);
3060 frame_rate = (AVRational){0, 0};
3061 frame_pix_fmt = PIX_FMT_NONE;
3064 audio_sample_rate = 0;
3066 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3067 av_dict_free(&ts_scale);
3069 for (i = 0; i < orig_nb_streams; i++)
3070 av_dict_free(&opts[i]);
3072 av_dict_free(&codec_names);
3078 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3079 AVCodecContext *avctx)
3085 for (p = kf; *p; p++)
3088 ost->forced_kf_count = n;
3089 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3090 if (!ost->forced_kf_pts) {
3091 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3094 for (i = 0; i < n; i++) {
3095 p = i ? strchr(p, ',') + 1 : kf;
3096 t = parse_time_or_die("force_key_frames", p, 1);
3097 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3101 static OutputStream *new_output_stream(AVFormatContext *oc, enum AVMediaType type)
3104 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3105 int idx = oc->nb_streams - 1;
3108 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3112 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3113 nb_output_streams + 1);
3114 ost = &output_streams[nb_output_streams - 1];
3115 ost->file_index = nb_output_files;
3118 st->codec->codec_type = type;
3119 ost->enc = choose_codec(oc, st, type, codec_names);
3121 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3124 avcodec_get_context_defaults3(st->codec, ost->enc);
3125 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3127 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3131 static OutputStream *new_video_stream(AVFormatContext *oc)
3135 AVCodecContext *video_enc;
3137 ost = new_output_stream(oc, AVMEDIA_TYPE_VIDEO);
3139 if (!st->stream_copy) {
3140 ost->frame_aspect_ratio = frame_aspect_ratio;
3141 frame_aspect_ratio = 0;
3143 ost->avfilter= vfilters;
3148 ost->bitstream_filters = video_bitstream_filters;
3149 video_bitstream_filters= NULL;
3151 st->codec->thread_count= thread_count;
3153 video_enc = st->codec;
3156 video_enc->codec_tag= video_codec_tag;
3158 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3159 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3162 if (st->stream_copy) {
3163 video_enc->sample_aspect_ratio =
3164 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3170 ost->frame_rate = frame_rate;
3172 video_enc->width = frame_width;
3173 video_enc->height = frame_height;
3174 video_enc->pix_fmt = frame_pix_fmt;
3175 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3178 video_enc->gop_size = 0;
3179 if (video_qscale || same_quant) {
3180 video_enc->flags |= CODEC_FLAG_QSCALE;
3181 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3185 video_enc->intra_matrix = intra_matrix;
3187 video_enc->inter_matrix = inter_matrix;
3189 p= video_rc_override_string;
3192 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3194 fprintf(stderr, "error parsing rc_override\n");
3197 video_enc->rc_override=
3198 av_realloc(video_enc->rc_override,
3199 sizeof(RcOverride)*(i+1));
3200 video_enc->rc_override[i].start_frame= start;
3201 video_enc->rc_override[i].end_frame = end;
3203 video_enc->rc_override[i].qscale= q;
3204 video_enc->rc_override[i].quality_factor= 1.0;
3207 video_enc->rc_override[i].qscale= 0;
3208 video_enc->rc_override[i].quality_factor= -q/100.0;
3213 video_enc->rc_override_count=i;
3214 if (!video_enc->rc_initial_buffer_occupancy)
3215 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3216 video_enc->me_threshold= me_threshold;
3217 video_enc->intra_dc_precision= intra_dc_precision - 8;
3220 video_enc->flags|= CODEC_FLAG_PSNR;
3225 video_enc->flags |= CODEC_FLAG_PASS1;
3227 video_enc->flags |= CODEC_FLAG_PASS2;
3231 if (forced_key_frames)
3232 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3234 if (video_language) {
3235 av_dict_set(&st->metadata, "language", video_language, 0);
3236 av_freep(&video_language);
3239 /* reset some key parameters */
3241 av_freep(&forced_key_frames);
3242 frame_pix_fmt = PIX_FMT_NONE;
3246 static OutputStream *new_audio_stream(AVFormatContext *oc)
3250 AVCodecContext *audio_enc;
3252 ost = new_output_stream(oc, AVMEDIA_TYPE_AUDIO);
3255 ost->bitstream_filters = audio_bitstream_filters;
3256 audio_bitstream_filters= NULL;
3258 st->codec->thread_count= thread_count;
3260 audio_enc = st->codec;
3261 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3264 audio_enc->codec_tag= audio_codec_tag;
3266 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3267 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3269 if (!st->stream_copy) {
3270 if (audio_qscale > QSCALE_NONE) {
3271 audio_enc->flags |= CODEC_FLAG_QSCALE;
3272 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3275 audio_enc->channels = audio_channels;
3276 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3277 audio_enc->sample_fmt = audio_sample_fmt;
3278 if (audio_sample_rate)
3279 audio_enc->sample_rate = audio_sample_rate;
3281 if (audio_language) {
3282 av_dict_set(&st->metadata, "language", audio_language, 0);
3283 av_freep(&audio_language);
3286 /* reset some key parameters */
3292 static OutputStream *new_data_stream(AVFormatContext *oc)
3296 AVCodecContext *data_enc;
3298 ost = new_output_stream(oc, AVMEDIA_TYPE_DATA);
3300 data_enc = st->codec;
3301 if (!st->stream_copy) {
3302 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3307 data_enc->codec_tag= data_codec_tag;
3309 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3310 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3317 static OutputStream *new_subtitle_stream(AVFormatContext *oc)
3321 AVCodecContext *subtitle_enc;
3323 ost = new_output_stream(oc, AVMEDIA_TYPE_SUBTITLE);
3325 subtitle_enc = st->codec;
3327 ost->bitstream_filters = subtitle_bitstream_filters;
3328 subtitle_bitstream_filters= NULL;
3330 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3332 if(subtitle_codec_tag)
3333 subtitle_enc->codec_tag= subtitle_codec_tag;
3335 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3336 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3339 if (subtitle_language) {
3340 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3341 av_freep(&subtitle_language);
3344 subtitle_disable = 0;
3348 /* arg format is "output-stream-index:streamid-value". */
3349 static int opt_streamid(const char *opt, const char *arg)
3355 av_strlcpy(idx_str, arg, sizeof(idx_str));
3356 p = strchr(idx_str, ':');
3359 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3364 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3365 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3366 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3370 static int copy_chapters(int infile, int outfile)
3372 AVFormatContext *is = input_files[infile].ctx;
3373 AVFormatContext *os = output_files[outfile].ctx;
3376 for (i = 0; i < is->nb_chapters; i++) {
3377 AVChapter *in_ch = is->chapters[i], *out_ch;
3378 int64_t ts_off = av_rescale_q(start_time - input_files[infile].ts_offset,
3379 AV_TIME_BASE_Q, in_ch->time_base);
3380 int64_t rt = (recording_time == INT64_MAX) ? INT64_MAX :
3381 av_rescale_q(recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3384 if (in_ch->end < ts_off)
3386 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3389 out_ch = av_mallocz(sizeof(AVChapter));
3391 return AVERROR(ENOMEM);
3393 out_ch->id = in_ch->id;
3394 out_ch->time_base = in_ch->time_base;
3395 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3396 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3398 if (metadata_chapters_autocopy)
3399 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3402 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3404 return AVERROR(ENOMEM);
3405 os->chapters[os->nb_chapters - 1] = out_ch;
3410 static int read_avserver_streams(AVFormatContext *s, const char *filename)
3413 AVFormatContext *ic = NULL;
3415 err = avformat_open_input(&ic, filename, NULL, NULL);
3418 /* copy stream format */
3419 for(i=0;i<ic->nb_streams;i++) {
3424 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3425 ost = new_output_stream(s, codec->type);
3428 // FIXME: a more elegant solution is needed
3429 memcpy(st, ic->streams[i], sizeof(AVStream));
3431 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3433 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3434 choose_sample_fmt(st, codec);
3435 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3436 choose_pixel_fmt(st, codec);
3439 av_close_input_file(ic);
3443 static void opt_output_file(const char *filename)
3445 AVFormatContext *oc;
3447 AVOutputFormat *file_oformat;
3451 if (!strcmp(filename, "-"))
3454 oc = avformat_alloc_context();
3456 print_error(filename, AVERROR(ENOMEM));
3460 if (last_asked_format) {
3461 file_oformat = av_guess_format(last_asked_format, NULL, NULL);
3462 if (!file_oformat) {
3463 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", last_asked_format);
3466 last_asked_format = NULL;
3468 file_oformat = av_guess_format(NULL, filename, NULL);
3469 if (!file_oformat) {
3470 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3476 oc->oformat = file_oformat;
3477 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3479 if (!strcmp(file_oformat->name, "ffm") &&
3480 av_strstart(filename, "http:", NULL)) {
3481 /* special case for files sent to avserver: we get the stream
3482 parameters from avserver */
3483 int err = read_avserver_streams(oc, filename);
3485 print_error(filename, err);
3488 } else if (!nb_stream_maps) {
3489 /* pick the "best" stream of each type */
3490 #define NEW_STREAM(type, index)\
3492 ost = new_ ## type ## _stream(oc);\
3493 ost->source_index = index;\
3494 ost->sync_ist = &input_streams[index];\
3495 input_streams[index].discard = 0;\
3498 /* video: highest resolution */
3499 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3500 int area = 0, idx = -1;
3501 for (i = 0; i < nb_input_streams; i++) {
3502 ist = &input_streams[i];
3503 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3504 ist->st->codec->width * ist->st->codec->height > area) {
3505 area = ist->st->codec->width * ist->st->codec->height;
3509 NEW_STREAM(video, idx);
3512 /* audio: most channels */
3513 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3514 int channels = 0, idx = -1;
3515 for (i = 0; i < nb_input_streams; i++) {
3516 ist = &input_streams[i];
3517 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3518 ist->st->codec->channels > channels) {
3519 channels = ist->st->codec->channels;
3523 NEW_STREAM(audio, idx);
3526 /* subtitles: pick first */
3527 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3528 for (i = 0; i < nb_input_streams; i++)
3529 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3530 NEW_STREAM(subtitle, i);
3534 /* do something with data? */
3536 for (i = 0; i < nb_stream_maps; i++) {
3537 StreamMap *map = &stream_maps[i];
3542 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3543 switch (ist->st->codec->codec_type) {
3544 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(oc); break;
3545 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(oc); break;
3546 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(oc); break;
3547 case AVMEDIA_TYPE_DATA: ost = new_data_stream(oc); break;
3549 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3550 map->file_index, map->stream_index);
3554 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3555 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3556 map->sync_stream_index];
3561 av_dict_copy(&oc->metadata, metadata, 0);
3562 av_dict_free(&metadata);
3565 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3566 output_files[nb_output_files - 1].ctx = oc;
3567 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3568 output_files[nb_output_files - 1].recording_time = recording_time;
3569 output_files[nb_output_files - 1].start_time = start_time;
3570 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3572 /* check filename in case of an image number is expected */
3573 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3574 if (!av_filename_number_test(oc->filename)) {
3575 print_error(oc->filename, AVERROR(EINVAL));
3580 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3581 /* test if it already exists to avoid loosing precious files */
3582 if (!file_overwrite &&
3583 (strchr(filename, ':') == NULL ||
3584 filename[1] == ':' ||
3585 av_strstart(filename, "file:", NULL))) {
3586 if (avio_check(filename, 0) == 0) {
3588 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3590 if (!read_yesno()) {
3591 fprintf(stderr, "Not overwriting - exiting\n");
3596 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3603 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3604 print_error(filename, err);
3609 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3610 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3611 oc->flags |= AVFMT_FLAG_NONBLOCK;
3614 if (chapters_input_file >= nb_input_files) {
3615 if (chapters_input_file == INT_MAX) {
3616 /* copy chapters from the first input file that has them*/
3617 chapters_input_file = -1;
3618 for (i = 0; i < nb_input_files; i++)
3619 if (input_files[i].ctx->nb_chapters) {
3620 chapters_input_file = i;
3624 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3625 chapters_input_file);
3629 if (chapters_input_file >= 0)
3630 copy_chapters(chapters_input_file, nb_output_files - 1);
3633 for (i = 0; i < nb_meta_data_maps; i++) {
3634 AVFormatContext *files[2];
3635 AVDictionary **meta[2];
3638 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3639 if ((index) < 0 || (index) >= (nb_elems)) {\
3640 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3645 int in_file_index = meta_data_maps[i][1].file;
3646 if (in_file_index < 0)
3648 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3651 files[1] = input_files[in_file_index].ctx;
3653 for (j = 0; j < 2; j++) {
3654 MetadataMap *map = &meta_data_maps[i][j];
3656 switch (map->type) {
3658 meta[j] = &files[j]->metadata;
3661 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3662 meta[j] = &files[j]->streams[map->index]->metadata;
3665 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3666 meta[j] = &files[j]->chapters[map->index]->metadata;
3669 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3670 meta[j] = &files[j]->programs[map->index]->metadata;
3675 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3678 /* copy global metadata by default */
3679 if (metadata_global_autocopy && nb_input_files)
3680 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3681 AV_DICT_DONT_OVERWRITE);
3682 if (metadata_streams_autocopy)
3683 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3684 InputStream *ist = &input_streams[output_streams[i].source_index];
3685 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3688 frame_rate = (AVRational){0, 0};
3691 audio_sample_rate = 0;
3693 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3694 chapters_input_file = INT_MAX;
3695 recording_time = INT64_MAX;
3698 av_freep(&meta_data_maps);
3699 nb_meta_data_maps = 0;
3700 metadata_global_autocopy = 1;
3701 metadata_streams_autocopy = 1;
3702 metadata_chapters_autocopy = 1;
3703 av_freep(&stream_maps);
3706 av_dict_free(&codec_names);
3708 av_freep(&forced_key_frames);
3713 /* same option as mencoder */
3714 static int opt_pass(const char *opt, const char *arg)
3716 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3720 static int64_t getutime(void)
3723 struct rusage rusage;
3725 getrusage(RUSAGE_SELF, &rusage);
3726 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3727 #elif HAVE_GETPROCESSTIMES
3729 FILETIME c, e, k, u;
3730 proc = GetCurrentProcess();
3731 GetProcessTimes(proc, &c, &e, &k, &u);
3732 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3734 return av_gettime();
3738 static int64_t getmaxrss(void)
3740 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3741 struct rusage rusage;
3742 getrusage(RUSAGE_SELF, &rusage);
3743 return (int64_t)rusage.ru_maxrss * 1024;
3744 #elif HAVE_GETPROCESSMEMORYINFO
3746 PROCESS_MEMORY_COUNTERS memcounters;
3747 proc = GetCurrentProcess();
3748 memcounters.cb = sizeof(memcounters);
3749 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3750 return memcounters.PeakPagefileUsage;
3756 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3759 const char *p = str;
3766 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3773 static void opt_inter_matrix(const char *arg)
3775 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3776 parse_matrix_coeffs(inter_matrix, arg);
3779 static void opt_intra_matrix(const char *arg)
3781 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3782 parse_matrix_coeffs(intra_matrix, arg);
3785 static void show_usage(void)
3787 printf("Hyper fast Audio and Video encoder\n");
3788 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3792 static void show_help(void)
3795 AVOutputFormat *oformat = NULL;
3796 AVInputFormat *iformat = NULL;
3798 av_log_set_callback(log_callback_help);
3800 show_help_options(options, "Main options:\n",
3801 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3802 show_help_options(options, "\nAdvanced options:\n",
3803 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3805 show_help_options(options, "\nVideo options:\n",
3806 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3808 show_help_options(options, "\nAdvanced Video options:\n",
3809 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3810 OPT_VIDEO | OPT_EXPERT);
3811 show_help_options(options, "\nAudio options:\n",
3812 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3814 show_help_options(options, "\nAdvanced Audio options:\n",
3815 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3816 OPT_AUDIO | OPT_EXPERT);
3817 show_help_options(options, "\nSubtitle options:\n",
3818 OPT_SUBTITLE | OPT_GRAB,
3820 show_help_options(options, "\nAudio/Video grab options:\n",
3824 av_opt_show2(avcodec_opts[0], NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3827 /* individual codec options */
3829 while ((c = av_codec_next(c))) {
3830 if (c->priv_class) {
3831 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3836 av_opt_show2(avformat_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3839 /* individual muxer options */
3840 while ((oformat = av_oformat_next(oformat))) {
3841 if (oformat->priv_class) {
3842 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3847 /* individual demuxer options */
3848 while ((iformat = av_iformat_next(iformat))) {
3849 if (iformat->priv_class) {
3850 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3855 av_opt_show2(sws_opts, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3858 static int opt_target(const char *opt, const char *arg)
3860 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3861 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3863 if(!strncmp(arg, "pal-", 4)) {
3866 } else if(!strncmp(arg, "ntsc-", 5)) {
3869 } else if(!strncmp(arg, "film-", 5)) {
3874 /* Calculate FR via float to avoid int overflow */
3875 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3878 } else if((fr == 29970) || (fr == 23976)) {
3881 /* Try to determine PAL/NTSC by peeking in the input files */
3882 if(nb_input_files) {
3884 for (j = 0; j < nb_input_files; j++) {
3885 for (i = 0; i < input_files[j].ctx->nb_streams; i++) {
3886 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3887 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3889 fr = c->time_base.den * 1000 / c->time_base.num;
3893 } else if((fr == 29970) || (fr == 23976)) {
3903 if(verbose > 0 && norm != UNKNOWN)
3904 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3907 if(norm == UNKNOWN) {
3908 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3909 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3910 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3914 if(!strcmp(arg, "vcd")) {
3915 opt_codec("c:v", "mpeg1video");
3916 opt_codec("c:a", "mp2");
3917 opt_format("f", "vcd");
3919 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3920 opt_frame_rate("r", frame_rates[norm]);
3921 opt_default("g", norm == PAL ? "15" : "18");
3923 opt_default("b", "1150000");
3924 opt_default("maxrate", "1150000");
3925 opt_default("minrate", "1150000");
3926 opt_default("bufsize", "327680"); // 40*1024*8;
3928 opt_default("b:a", "224000");
3929 audio_sample_rate = 44100;
3932 opt_default("packetsize", "2324");
3933 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3935 /* We have to offset the PTS, so that it is consistent with the SCR.
3936 SCR starts at 36000, but the first two packs contain only padding
3937 and the first pack from the other stream, respectively, may also have
3938 been written before.
3939 So the real data starts at SCR 36000+3*1200. */
3940 mux_preload= (36000+3*1200) / 90000.0; //0.44
3941 } else if(!strcmp(arg, "svcd")) {
3943 opt_codec("c:v", "mpeg2video");
3944 opt_codec("c:a", "mp2");
3945 opt_format("f", "svcd");
3947 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3948 opt_frame_rate("r", frame_rates[norm]);
3949 opt_default("g", norm == PAL ? "15" : "18");
3951 opt_default("b", "2040000");
3952 opt_default("maxrate", "2516000");
3953 opt_default("minrate", "0"); //1145000;
3954 opt_default("bufsize", "1835008"); //224*1024*8;
3955 opt_default("flags", "+scan_offset");
3958 opt_default("b:a", "224000");
3959 audio_sample_rate = 44100;
3961 opt_default("packetsize", "2324");
3963 } else if(!strcmp(arg, "dvd")) {
3965 opt_codec("c:v", "mpeg2video");
3966 opt_codec("c:a", "ac3");
3967 opt_format("f", "dvd");
3969 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3970 opt_frame_rate("r", frame_rates[norm]);
3971 opt_default("g", norm == PAL ? "15" : "18");
3973 opt_default("b", "6000000");
3974 opt_default("maxrate", "9000000");
3975 opt_default("minrate", "0"); //1500000;
3976 opt_default("bufsize", "1835008"); //224*1024*8;
3978 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3979 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3981 opt_default("b:a", "448000");
3982 audio_sample_rate = 48000;
3984 } else if(!strncmp(arg, "dv", 2)) {
3986 opt_format("f", "dv");
3988 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3989 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3990 norm == PAL ? "yuv420p" : "yuv411p");
3991 opt_frame_rate("r", frame_rates[norm]);
3993 audio_sample_rate = 48000;
3997 fprintf(stderr, "Unknown target: %s\n", arg);
3998 return AVERROR(EINVAL);
4003 static int opt_vstats_file(const char *opt, const char *arg)
4005 av_free (vstats_filename);
4006 vstats_filename=av_strdup (arg);
4010 static int opt_vstats(const char *opt, const char *arg)
4013 time_t today2 = time(NULL);
4014 struct tm *today = localtime(&today2);
4016 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4018 return opt_vstats_file(opt, filename);
4021 static int opt_bsf(const char *opt, const char *arg)
4023 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4024 AVBitStreamFilterContext **bsfp;
4027 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4031 bsfp= *opt == 'v' ? &video_bitstream_filters :
4032 *opt == 'a' ? &audio_bitstream_filters :
4033 &subtitle_bitstream_filters;
4035 bsfp= &(*bsfp)->next;
4042 static const OptionDef options[] = {
4044 #include "cmdutils_common_opts.h"
4045 { "f", HAS_ARG, {(void*)opt_format}, "force format", "fmt" },
4046 { "i", HAS_ARG, {(void*)opt_input_file}, "input file name", "filename" },
4047 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4048 { "c", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4049 { "codec", HAS_ARG, {(void*)opt_codec}, "codec name", "codec" },
4050 { "map", HAS_ARG | OPT_EXPERT, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4051 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4052 "outfile[,metadata]:infile[,metadata]" },
4053 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4054 { "t", HAS_ARG, {(void*)opt_recording_time}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4055 { "fs", HAS_ARG | OPT_INT64, {(void*)&limit_filesize}, "set the limit file size in bytes", "limit_size" }, //
4056 { "ss", HAS_ARG, {(void*)opt_start_time}, "set the start time offset", "time_off" },
4057 { "itsoffset", HAS_ARG, {(void*)opt_input_ts_offset}, "set the input ts offset", "time_off" },
4058 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4059 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4060 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4061 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4062 "add timings for benchmarking" },
4063 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4064 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4065 "dump each input packet" },
4066 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4067 "when dumping packets, also dump the payload" },
4068 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4069 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4070 { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4071 { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" },
4072 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4073 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4074 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4075 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4076 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4077 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4078 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4079 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4080 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4081 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4084 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4085 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4086 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4087 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4088 { "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" },
4089 { "croptop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4090 { "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4091 { "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4092 { "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop}, "Removed, use the crop filter instead", "size" },
4093 { "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4094 { "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4095 { "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4096 { "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "size" },
4097 { "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "Removed, use the pad filter instead", "color" },
4098 { "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
4099 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4100 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4101 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4102 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4103 { "vcodec", HAS_ARG | OPT_VIDEO, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4104 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimaton threshold", "threshold" },
4105 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4106 "use same quantizer as source (implies VBR)" },
4107 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4108 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4109 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4110 "deinterlace pictures" },
4111 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4112 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4113 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4115 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4117 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4118 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4119 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4120 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4121 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4122 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4123 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4124 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4125 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4126 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4129 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4130 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4131 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4132 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4133 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4134 { "acodec", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4135 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4136 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4137 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4138 { "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" },
4140 /* subtitle options */
4141 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4142 { "scodec", HAS_ARG | OPT_SUBTITLE, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4143 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4144 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4147 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4150 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4151 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4153 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4154 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4155 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4157 /* data codec support */
4158 { "dcodec", HAS_ARG | OPT_DATA, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4160 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4164 int main(int argc, char **argv)
4168 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4170 avcodec_register_all();
4172 avdevice_register_all();
4175 avfilter_register_all();
4179 avio_set_interrupt_cb(decode_interrupt_cb);
4186 parse_options(argc, argv, options, opt_output_file);
4188 if(nb_output_files <= 0 && nb_input_files == 0) {
4190 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4194 /* file converter / grab */
4195 if (nb_output_files <= 0) {
4196 fprintf(stderr, "At least one output file must be specified\n");
4200 if (nb_input_files == 0) {
4201 fprintf(stderr, "At least one input file must be specified\n");
4206 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4208 ti = getutime() - ti;
4210 int maxrss = getmaxrss() / 1024;
4211 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);
4214 return exit_program(0);