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 AVDictionary *ts_scale;
102 static int chapters_input_file = INT_MAX;
104 /* indexed by output file stream index */
105 static int *streamid_map = NULL;
106 static int nb_streamid_map = 0;
108 static int frame_width = 0;
109 static int frame_height = 0;
110 static float frame_aspect_ratio = 0;
111 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
112 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
113 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
114 static AVRational frame_rate;
115 static float video_qscale = 0;
116 static uint16_t *intra_matrix = NULL;
117 static uint16_t *inter_matrix = NULL;
118 static const char *video_rc_override_string=NULL;
119 static int video_disable = 0;
120 static int video_discard = 0;
121 static unsigned int video_codec_tag = 0;
122 static char *video_language = NULL;
123 static int same_quant = 0;
124 static int do_deinterlace = 0;
125 static int top_field_first = -1;
126 static int me_threshold = 0;
127 static int intra_dc_precision = 8;
128 static int qp_hist = 0;
130 static char *vfilters = NULL;
133 static int audio_sample_rate = 0;
134 #define QSCALE_NONE -99999
135 static float audio_qscale = QSCALE_NONE;
136 static int audio_disable = 0;
137 static int audio_channels = 0;
138 static unsigned int audio_codec_tag = 0;
139 static char *audio_language = NULL;
141 static int subtitle_disable = 0;
142 static char *subtitle_language = NULL;
143 static unsigned int subtitle_codec_tag = 0;
145 static int data_disable = 0;
146 static unsigned int data_codec_tag = 0;
148 static float mux_preload= 0.5;
149 static float mux_max_delay= 0.7;
151 static int file_overwrite = 0;
152 static AVDictionary *metadata;
153 static int do_benchmark = 0;
154 static int do_hex_dump = 0;
155 static int do_pkt_dump = 0;
156 static int do_psnr = 0;
157 static int do_pass = 0;
158 static char *pass_logfilename_prefix = NULL;
159 static int video_sync_method= -1;
160 static int audio_sync_method= 0;
161 static float audio_drift_threshold= 0.1;
162 static int copy_ts= 0;
164 static int opt_shortest = 0;
165 static char *vstats_filename;
166 static FILE *vstats_file;
167 static int opt_programid = 0;
168 static int copy_initial_nonkeyframes = 0;
170 static int rate_emu = 0;
172 static int audio_volume = 256;
174 static int exit_on_error = 0;
175 static int using_stdin = 0;
176 static int verbose = 1;
177 static int64_t video_size = 0;
178 static int64_t audio_size = 0;
179 static int64_t extra_size = 0;
180 static int nb_frames_dup = 0;
181 static int nb_frames_drop = 0;
182 static int input_sync;
183 static int force_fps = 0;
184 static char *forced_key_frames = NULL;
186 static float dts_delta_threshold = 10;
188 static uint8_t *audio_buf;
189 static uint8_t *audio_out;
190 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
192 static short *samples;
194 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
195 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
196 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
198 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
200 typedef struct InputStream {
203 int discard; /* true if stream data should be discarded */
204 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
207 int64_t start; /* time when read started */
208 int64_t next_pts; /* synthetic pts for cases where pkt.pts
210 int64_t pts; /* current pts */
211 PtsCorrectionContext pts_ctx;
213 int is_start; /* is 1 at the start and after a discontinuity */
214 int showed_multi_packet_warning;
218 typedef struct InputFile {
219 AVFormatContext *ctx;
220 int eof_reached; /* true if eof reached */
221 int ist_index; /* index of first stream in ist_table */
222 int buffer_size; /* current total buffer size */
224 int nb_streams; /* number of stream that avconv is aware of; may be different
225 from ctx.nb_streams if new streams appear during av_read_frame() */
228 typedef struct OutputStream {
229 int file_index; /* file index */
230 int index; /* stream index in the output file */
231 int source_index; /* InputStream index */
232 AVStream *st; /* stream in the output file */
233 int encoding_needed; /* true if encoding needed for this stream */
235 /* input pts and corresponding output pts
237 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
238 struct InputStream *sync_ist; /* input stream to sync against */
239 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
240 AVBitStreamFilterContext *bitstream_filters;
245 AVFrame pict_tmp; /* temporary image for resampling */
246 struct SwsContext *img_resample_ctx; /* for image resampling */
249 int resample_pix_fmt;
250 AVRational frame_rate;
252 float frame_aspect_ratio;
254 /* forced key frames */
255 int64_t *forced_kf_pts;
261 ReSampleContext *resample; /* for audio resampling */
262 int resample_sample_fmt;
263 int resample_channels;
264 int resample_sample_rate;
266 AVAudioConvert *reformat_ctx;
267 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
271 AVFilterContext *output_video_filter;
272 AVFilterContext *input_video_filter;
273 AVFilterBufferRef *picref;
275 AVFilterGraph *graph;
280 int is_past_recording_time;
284 typedef struct OutputFile {
285 AVFormatContext *ctx;
287 int ost_index; /* index of the first stream in output_streams */
288 int64_t recording_time; /* desired length of the resulting file in microseconds */
289 int64_t start_time; /* start time in microseconds */
290 uint64_t limit_filesize;
293 static InputStream *input_streams = NULL;
294 static int nb_input_streams = 0;
295 static InputFile *input_files = NULL;
296 static int nb_input_files = 0;
298 static OutputStream *output_streams = NULL;
299 static int nb_output_streams = 0;
300 static OutputFile *output_files = NULL;
301 static int nb_output_files = 0;
303 typedef struct OptionsContext {
304 /* input/output options */
308 SpecifierOpt *codec_names;
312 int64_t input_ts_offset;
315 StreamMap *stream_maps;
317 /* first item specifies output metadata, second is input */
318 MetadataMap (*meta_data_maps)[2];
319 int nb_meta_data_maps;
320 int metadata_global_manual;
321 int metadata_streams_manual;
322 int metadata_chapters_manual;
324 int64_t recording_time;
325 uint64_t limit_filesize;
328 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
331 for (i = 0; i < o->nb_ ## name; i++) {\
332 char *spec = o->name[i].specifier;\
333 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
334 outvar = o->name[i].u.type;\
340 static void reset_options(OptionsContext *o)
342 const OptionDef *po = options;
344 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
346 void *dst = (uint8_t*)o + po->u.off;
348 if (po->flags & OPT_SPEC) {
349 SpecifierOpt **so = dst;
350 int i, *count = (int*)(so + 1);
351 for (i = 0; i < *count; i++) {
352 av_freep(&(*so)[i].specifier);
353 if (po->flags & OPT_STRING)
354 av_freep(&(*so)[i].u.str);
358 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
363 av_freep(&o->stream_maps);
364 av_freep(&o->meta_data_maps);
366 memset(o, 0, sizeof(*o));
368 o->recording_time = INT64_MAX;
369 o->limit_filesize = UINT64_MAX;
377 static int configure_video_filters(InputStream *ist, OutputStream *ost)
379 AVFilterContext *last_filter, *filter;
380 /** filter graph containing all filters including input & output */
381 AVCodecContext *codec = ost->st->codec;
382 AVCodecContext *icodec = ist->st->codec;
383 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
384 AVRational sample_aspect_ratio;
388 ost->graph = avfilter_graph_alloc();
390 if (ist->st->sample_aspect_ratio.num){
391 sample_aspect_ratio = ist->st->sample_aspect_ratio;
393 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
395 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
396 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
397 sample_aspect_ratio.num, sample_aspect_ratio.den);
399 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
400 "src", args, NULL, ost->graph);
403 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
404 "out", NULL, &ffsink_ctx, ost->graph);
407 last_filter = ost->input_video_filter;
409 if (codec->width != icodec->width || codec->height != icodec->height) {
410 snprintf(args, 255, "%d:%d:flags=0x%X",
414 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
415 NULL, args, NULL, ost->graph)) < 0)
417 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
419 last_filter = filter;
422 snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
423 ost->graph->scale_sws_opts = av_strdup(args);
426 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
427 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
429 outputs->name = av_strdup("in");
430 outputs->filter_ctx = last_filter;
431 outputs->pad_idx = 0;
432 outputs->next = NULL;
434 inputs->name = av_strdup("out");
435 inputs->filter_ctx = ost->output_video_filter;
439 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
441 av_freep(&ost->avfilter);
443 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
447 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
450 codec->width = ost->output_video_filter->inputs[0]->w;
451 codec->height = ost->output_video_filter->inputs[0]->h;
452 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
453 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
454 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
455 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
459 #endif /* CONFIG_AVFILTER */
461 static void term_exit(void)
463 av_log(NULL, AV_LOG_QUIET, "");
466 static volatile int received_sigterm = 0;
467 static volatile int received_nb_signals = 0;
470 sigterm_handler(int sig)
472 received_sigterm = sig;
473 received_nb_signals++;
477 static void term_init(void)
479 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
480 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
482 signal(SIGXCPU, sigterm_handler);
486 static int decode_interrupt_cb(void)
488 return received_nb_signals > 1;
491 void exit_program(int ret)
496 for(i=0;i<nb_output_files;i++) {
497 AVFormatContext *s = output_files[i].ctx;
498 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
500 avformat_free_context(s);
501 av_dict_free(&output_files[i].opts);
503 for(i=0;i<nb_input_files;i++) {
504 av_close_input_file(input_files[i].ctx);
506 for (i = 0; i < nb_input_streams; i++)
507 av_dict_free(&input_streams[i].opts);
509 av_free(intra_matrix);
510 av_free(inter_matrix);
514 av_free(vstats_filename);
516 av_freep(&input_streams);
517 av_freep(&input_files);
518 av_freep(&output_streams);
519 av_freep(&output_files);
524 allocated_audio_buf_size= allocated_audio_out_size= 0;
531 if (received_sigterm) {
533 "Received signal %d: terminating.\n",
534 (int) received_sigterm);
538 exit(ret); /* not all OS-es handle main() return value */
541 static void assert_avoptions(AVDictionary *m)
543 AVDictionaryEntry *t;
544 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
545 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
550 static void assert_codec_experimental(AVCodecContext *c, int encoder)
552 const char *codec_string = encoder ? "encoder" : "decoder";
554 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
555 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
556 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
557 "results.\nAdd '-strict experimental' if you want to use it.\n",
558 codec_string, c->codec->name);
559 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
560 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
561 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
562 codec_string, codec->name);
567 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
569 if(codec && codec->sample_fmts){
570 const enum AVSampleFormat *p= codec->sample_fmts;
572 if(*p == st->codec->sample_fmt)
576 av_log(NULL, AV_LOG_WARNING,
577 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
578 av_get_sample_fmt_name(st->codec->sample_fmt),
580 av_get_sample_fmt_name(codec->sample_fmts[0]));
581 st->codec->sample_fmt = codec->sample_fmts[0];
587 * Update the requested input sample format based on the output sample format.
588 * This is currently only used to request float output from decoders which
589 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
590 * Ideally this will be removed in the future when decoders do not do format
591 * conversion and only output in their native format.
593 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
596 /* if sample formats match or a decoder sample format has already been
597 requested, just return */
598 if (enc->sample_fmt == dec->sample_fmt ||
599 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
602 /* if decoder supports more than one output format */
603 if (dec_codec && dec_codec->sample_fmts &&
604 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
605 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
606 const enum AVSampleFormat *p;
607 int min_dec = -1, min_inc = -1;
609 /* find a matching sample format in the encoder */
610 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
611 if (*p == enc->sample_fmt) {
612 dec->request_sample_fmt = *p;
614 } else if (*p > enc->sample_fmt) {
615 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
617 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
620 /* if none match, provide the one that matches quality closest */
621 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
622 enc->sample_fmt - min_dec;
626 static void choose_sample_rate(AVStream *st, AVCodec *codec)
628 if(codec && codec->supported_samplerates){
629 const int *p= codec->supported_samplerates;
631 int best_dist=INT_MAX;
633 int dist= abs(st->codec->sample_rate - *p);
634 if(dist < best_dist){
640 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
642 st->codec->sample_rate= best;
646 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
648 if(codec && codec->pix_fmts){
649 const enum PixelFormat *p= codec->pix_fmts;
650 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
651 if(st->codec->codec_id==CODEC_ID_MJPEG){
652 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
653 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
654 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};
658 if(*p == st->codec->pix_fmt)
662 if(st->codec->pix_fmt != PIX_FMT_NONE)
663 av_log(NULL, AV_LOG_WARNING,
664 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
665 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
667 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
668 st->codec->pix_fmt = codec->pix_fmts[0];
674 get_sync_ipts(const OutputStream *ost)
676 const InputStream *ist = ost->sync_ist;
677 OutputFile *of = &output_files[ost->file_index];
678 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
681 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
685 AVPacket new_pkt= *pkt;
686 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
687 &new_pkt.data, &new_pkt.size,
688 pkt->data, pkt->size,
689 pkt->flags & AV_PKT_FLAG_KEY);
692 new_pkt.destruct= av_destruct_packet;
694 fprintf(stderr, "%s failed for stream %d, codec %s",
695 bsfc->filter->name, pkt->stream_index,
696 avctx->codec ? avctx->codec->name : "copy");
706 ret= av_interleaved_write_frame(s, pkt);
708 print_error("av_interleaved_write_frame()", ret);
713 static void do_audio_out(AVFormatContext *s,
716 unsigned char *buf, int size)
719 int64_t audio_out_size, audio_buf_size;
720 int64_t allocated_for_size= size;
722 int size_out, frame_bytes, ret, resample_changed;
723 AVCodecContext *enc= ost->st->codec;
724 AVCodecContext *dec= ist->st->codec;
725 int osize = av_get_bytes_per_sample(enc->sample_fmt);
726 int isize = av_get_bytes_per_sample(dec->sample_fmt);
727 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
730 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
731 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
732 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
733 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
734 audio_buf_size*= osize*enc->channels;
736 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
737 if(coded_bps > 8*osize)
738 audio_out_size= audio_out_size * coded_bps / (8*osize);
739 audio_out_size += FF_MIN_BUFFER_SIZE;
741 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
742 fprintf(stderr, "Buffer sizes too large\n");
746 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
747 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
748 if (!audio_buf || !audio_out){
749 fprintf(stderr, "Out of memory in do_audio_out\n");
753 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
754 ost->audio_resample = 1;
756 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
757 ost->resample_channels != dec->channels ||
758 ost->resample_sample_rate != dec->sample_rate;
760 if ((ost->audio_resample && !ost->resample) || resample_changed) {
761 if (resample_changed) {
762 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",
763 ist->file_index, ist->st->index,
764 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
765 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
766 ost->resample_sample_fmt = dec->sample_fmt;
767 ost->resample_channels = dec->channels;
768 ost->resample_sample_rate = dec->sample_rate;
770 audio_resample_close(ost->resample);
772 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
773 if (audio_sync_method <= 1 &&
774 ost->resample_sample_fmt == enc->sample_fmt &&
775 ost->resample_channels == enc->channels &&
776 ost->resample_sample_rate == enc->sample_rate) {
777 ost->resample = NULL;
778 ost->audio_resample = 0;
779 } else if (ost->audio_resample) {
780 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
781 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
782 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
783 enc->sample_rate, dec->sample_rate,
784 enc->sample_fmt, dec->sample_fmt,
786 if (!ost->resample) {
787 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
788 dec->channels, dec->sample_rate,
789 enc->channels, enc->sample_rate);
795 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
796 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
797 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
798 if (ost->reformat_ctx)
799 av_audio_convert_free(ost->reformat_ctx);
800 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
801 dec->sample_fmt, 1, NULL, 0);
802 if (!ost->reformat_ctx) {
803 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
804 av_get_sample_fmt_name(dec->sample_fmt),
805 av_get_sample_fmt_name(enc->sample_fmt));
808 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
811 if(audio_sync_method){
812 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
813 - av_fifo_size(ost->fifo)/(enc->channels * 2);
814 double idelta= delta*dec->sample_rate / enc->sample_rate;
815 int byte_delta= ((int)idelta)*2*dec->channels;
817 //FIXME resample delay
818 if(fabs(delta) > 50){
819 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
821 byte_delta= FFMAX(byte_delta, -size);
825 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
830 static uint8_t *input_tmp= NULL;
831 input_tmp= av_realloc(input_tmp, byte_delta + size);
833 if(byte_delta > allocated_for_size - size){
834 allocated_for_size= byte_delta + (int64_t)size;
839 memset(input_tmp, 0, byte_delta);
840 memcpy(input_tmp + byte_delta, buf, size);
844 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
846 }else if(audio_sync_method>1){
847 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
848 av_assert0(ost->audio_resample);
850 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
851 // 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));
852 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
856 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
857 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
859 if (ost->audio_resample) {
861 size_out = audio_resample(ost->resample,
862 (short *)buftmp, (short *)buf,
863 size / (dec->channels * isize));
864 size_out = size_out * enc->channels * osize;
870 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
871 const void *ibuf[6]= {buftmp};
872 void *obuf[6]= {audio_buf};
873 int istride[6]= {isize};
874 int ostride[6]= {osize};
875 int len= size_out/istride[0];
876 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
877 printf("av_audio_convert() failed\n");
883 size_out = len*osize;
886 /* now encode as many frames as possible */
887 if (enc->frame_size > 1) {
888 /* output resampled raw samples */
889 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
890 fprintf(stderr, "av_fifo_realloc2() failed\n");
893 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
895 frame_bytes = enc->frame_size * osize * enc->channels;
897 while (av_fifo_size(ost->fifo) >= frame_bytes) {
899 av_init_packet(&pkt);
901 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
903 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
905 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
908 fprintf(stderr, "Audio encoding failed\n");
912 pkt.stream_index= ost->index;
915 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
916 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
917 pkt.flags |= AV_PKT_FLAG_KEY;
918 write_frame(s, &pkt, enc, ost->bitstream_filters);
920 ost->sync_opts += enc->frame_size;
924 av_init_packet(&pkt);
926 ost->sync_opts += size_out / (osize * enc->channels);
928 /* output a pcm frame */
929 /* determine the size of the coded buffer */
932 size_out = size_out*coded_bps/8;
934 if(size_out > audio_out_size){
935 fprintf(stderr, "Internal error, buffer size too small\n");
939 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
940 ret = avcodec_encode_audio(enc, audio_out, size_out,
943 fprintf(stderr, "Audio encoding failed\n");
947 pkt.stream_index= ost->index;
950 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
951 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
952 pkt.flags |= AV_PKT_FLAG_KEY;
953 write_frame(s, &pkt, enc, ost->bitstream_filters);
957 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
961 AVPicture picture_tmp;
964 dec = ist->st->codec;
966 /* deinterlace : must be done before any resize */
967 if (do_deinterlace) {
970 /* create temporary picture */
971 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
972 buf = av_malloc(size);
976 picture2 = &picture_tmp;
977 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
979 if(avpicture_deinterlace(picture2, picture,
980 dec->pix_fmt, dec->width, dec->height) < 0) {
981 /* if error, do not deinterlace */
982 fprintf(stderr, "Deinterlacing failed\n");
991 if (picture != picture2)
992 *picture = *picture2;
996 static void do_subtitle_out(AVFormatContext *s,
1002 static uint8_t *subtitle_out = NULL;
1003 int subtitle_out_max_size = 1024 * 1024;
1004 int subtitle_out_size, nb, i;
1005 AVCodecContext *enc;
1008 if (pts == AV_NOPTS_VALUE) {
1009 fprintf(stderr, "Subtitle packets must have a pts\n");
1015 enc = ost->st->codec;
1017 if (!subtitle_out) {
1018 subtitle_out = av_malloc(subtitle_out_max_size);
1021 /* Note: DVB subtitle need one packet to draw them and one other
1022 packet to clear them */
1023 /* XXX: signal it in the codec context ? */
1024 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1029 for(i = 0; i < nb; i++) {
1030 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1031 // start_display_time is required to be 0
1032 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1033 sub->end_display_time -= sub->start_display_time;
1034 sub->start_display_time = 0;
1035 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1036 subtitle_out_max_size, sub);
1037 if (subtitle_out_size < 0) {
1038 fprintf(stderr, "Subtitle encoding failed\n");
1042 av_init_packet(&pkt);
1043 pkt.stream_index = ost->index;
1044 pkt.data = subtitle_out;
1045 pkt.size = subtitle_out_size;
1046 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1047 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1048 /* XXX: the pts correction is handled here. Maybe handling
1049 it in the codec would be better */
1051 pkt.pts += 90 * sub->start_display_time;
1053 pkt.pts += 90 * sub->end_display_time;
1055 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1059 static int bit_buffer_size= 1024*256;
1060 static uint8_t *bit_buffer= NULL;
1062 static void do_video_resample(OutputStream *ost,
1064 AVFrame *in_picture,
1065 AVFrame **out_picture)
1067 int resample_changed = 0;
1068 AVCodecContext *dec = ist->st->codec;
1069 *out_picture = in_picture;
1071 resample_changed = ost->resample_width != dec->width ||
1072 ost->resample_height != dec->height ||
1073 ost->resample_pix_fmt != dec->pix_fmt;
1075 if (resample_changed) {
1076 av_log(NULL, AV_LOG_INFO,
1077 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1078 ist->file_index, ist->st->index,
1079 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1080 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1081 if(!ost->video_resample)
1082 ost->video_resample = 1;
1085 #if !CONFIG_AVFILTER
1086 if (ost->video_resample) {
1087 *out_picture = &ost->pict_tmp;
1088 if (resample_changed) {
1089 /* initialize a new scaler context */
1090 sws_freeContext(ost->img_resample_ctx);
1091 ost->img_resample_ctx = sws_getContext(
1092 ist->st->codec->width,
1093 ist->st->codec->height,
1094 ist->st->codec->pix_fmt,
1095 ost->st->codec->width,
1096 ost->st->codec->height,
1097 ost->st->codec->pix_fmt,
1098 ost->sws_flags, NULL, NULL, NULL);
1099 if (ost->img_resample_ctx == NULL) {
1100 fprintf(stderr, "Cannot get resampling context\n");
1104 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1105 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1108 if (resample_changed) {
1109 avfilter_graph_free(&ost->graph);
1110 if (configure_video_filters(ist, ost)) {
1111 fprintf(stderr, "Error reinitializing filters!\n");
1116 if (resample_changed) {
1117 ost->resample_width = dec->width;
1118 ost->resample_height = dec->height;
1119 ost->resample_pix_fmt = dec->pix_fmt;
1124 static void do_video_out(AVFormatContext *s,
1127 AVFrame *in_picture,
1128 int *frame_size, float quality)
1130 int nb_frames, i, ret, format_video_sync;
1131 AVFrame *final_picture;
1132 AVCodecContext *enc;
1135 enc = ost->st->codec;
1137 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1139 /* by default, we output a single frame */
1144 format_video_sync = video_sync_method;
1145 if (format_video_sync < 0)
1146 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1148 if (format_video_sync) {
1149 double vdelta = sync_ipts - ost->sync_opts;
1150 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1153 else if (format_video_sync == 2) {
1156 }else if(vdelta>0.6)
1157 ost->sync_opts= lrintf(sync_ipts);
1158 }else if (vdelta > 1.1)
1159 nb_frames = lrintf(vdelta);
1160 //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);
1161 if (nb_frames == 0){
1164 fprintf(stderr, "*** drop!\n");
1165 }else if (nb_frames > 1) {
1166 nb_frames_dup += nb_frames - 1;
1168 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1171 ost->sync_opts= lrintf(sync_ipts);
1173 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1177 do_video_resample(ost, ist, in_picture, &final_picture);
1179 /* duplicates frame if needed */
1180 for(i=0;i<nb_frames;i++) {
1182 av_init_packet(&pkt);
1183 pkt.stream_index= ost->index;
1185 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1186 /* raw pictures are written as AVPicture structure to
1187 avoid any copies. We support temporarily the older
1189 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1190 enc->coded_frame->top_field_first = in_picture->top_field_first;
1191 pkt.data= (uint8_t *)final_picture;
1192 pkt.size= sizeof(AVPicture);
1193 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1194 pkt.flags |= AV_PKT_FLAG_KEY;
1196 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1198 AVFrame big_picture;
1200 big_picture= *final_picture;
1201 /* better than nothing: use input picture interlaced
1203 big_picture.interlaced_frame = in_picture->interlaced_frame;
1204 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1205 if(top_field_first == -1)
1206 big_picture.top_field_first = in_picture->top_field_first;
1208 big_picture.top_field_first = top_field_first;
1211 /* handles same_quant here. This is not correct because it may
1212 not be a global option */
1213 big_picture.quality = quality;
1215 big_picture.pict_type = 0;
1216 // big_picture.pts = AV_NOPTS_VALUE;
1217 big_picture.pts= ost->sync_opts;
1218 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1219 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1220 if (ost->forced_kf_index < ost->forced_kf_count &&
1221 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1222 big_picture.pict_type = AV_PICTURE_TYPE_I;
1223 ost->forced_kf_index++;
1225 ret = avcodec_encode_video(enc,
1226 bit_buffer, bit_buffer_size,
1229 fprintf(stderr, "Video encoding failed\n");
1234 pkt.data= bit_buffer;
1236 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1237 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1238 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1239 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1240 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1242 if(enc->coded_frame->key_frame)
1243 pkt.flags |= AV_PKT_FLAG_KEY;
1244 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1247 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1248 // enc->frame_number-1, ret, enc->pict_type);
1249 /* if two pass, output log */
1250 if (ost->logfile && enc->stats_out) {
1251 fprintf(ost->logfile, "%s", enc->stats_out);
1256 ost->frame_number++;
1260 static double psnr(double d){
1261 return -10.0*log(d)/log(10.0);
1264 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1267 AVCodecContext *enc;
1269 double ti1, bitrate, avg_bitrate;
1271 /* this is executed just the first time do_video_stats is called */
1273 vstats_file = fopen(vstats_filename, "w");
1280 enc = ost->st->codec;
1281 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1282 frame_number = ost->frame_number;
1283 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1284 if (enc->flags&CODEC_FLAG_PSNR)
1285 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1287 fprintf(vstats_file,"f_size= %6d ", frame_size);
1288 /* compute pts value */
1289 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1293 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1294 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1295 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1296 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1297 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1301 static void print_report(OutputFile *output_files,
1302 OutputStream *ost_table, int nb_ostreams,
1303 int is_last_report, int64_t timer_start)
1307 AVFormatContext *oc;
1309 AVCodecContext *enc;
1310 int frame_number, vid, i;
1311 double bitrate, ti1, pts;
1312 static int64_t last_time = -1;
1313 static int qp_histogram[52];
1315 if (!is_last_report) {
1317 /* display the report every 0.5 seconds */
1318 cur_time = av_gettime();
1319 if (last_time == -1) {
1320 last_time = cur_time;
1323 if ((cur_time - last_time) < 500000)
1325 last_time = cur_time;
1329 oc = output_files[0].ctx;
1331 total_size = avio_size(oc->pb);
1332 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1333 total_size= avio_tell(oc->pb);
1338 for(i=0;i<nb_ostreams;i++) {
1340 ost = &ost_table[i];
1341 enc = ost->st->codec;
1342 if (!ost->st->stream_copy && enc->coded_frame)
1343 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1344 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1345 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1347 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1348 float t = (av_gettime()-timer_start) / 1000000.0;
1350 frame_number = ost->frame_number;
1351 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1352 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1354 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1358 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1363 if (enc->flags&CODEC_FLAG_PSNR){
1365 double error, error_sum=0;
1366 double scale, scale_sum=0;
1367 char type[3]= {'Y','U','V'};
1368 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1371 error= enc->error[j];
1372 scale= enc->width*enc->height*255.0*255.0*frame_number;
1374 error= enc->coded_frame->error[j];
1375 scale= enc->width*enc->height*255.0*255.0;
1380 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1386 /* compute min output value */
1387 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1388 if ((pts < ti1) && (pts > 0))
1394 if (verbose > 0 || is_last_report) {
1395 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1397 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1398 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1399 (double)total_size / 1024, ti1, bitrate);
1401 if (nb_frames_dup || nb_frames_drop)
1402 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1403 nb_frames_dup, nb_frames_drop);
1406 fprintf(stderr, "%s \r", buf);
1411 if (is_last_report && verbose >= 0){
1412 int64_t raw= audio_size + video_size + extra_size;
1413 fprintf(stderr, "\n");
1414 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1418 100.0*(total_size - raw)/raw
1423 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1425 int fill_char = 0x00;
1426 if (sample_fmt == AV_SAMPLE_FMT_U8)
1428 memset(buf, fill_char, size);
1431 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1435 for (i = 0; i < nb_ostreams; i++) {
1436 OutputStream *ost = &ost_table[i];
1437 AVCodecContext *enc = ost->st->codec;
1438 AVFormatContext *os = output_files[ost->file_index].ctx;
1440 if (!ost->encoding_needed)
1443 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1445 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1451 av_init_packet(&pkt);
1452 pkt.stream_index= ost->index;
1454 switch (ost->st->codec->codec_type) {
1455 case AVMEDIA_TYPE_AUDIO:
1456 fifo_bytes = av_fifo_size(ost->fifo);
1458 /* encode any samples remaining in fifo */
1459 if (fifo_bytes > 0) {
1460 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1461 int fs_tmp = enc->frame_size;
1463 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1464 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1465 enc->frame_size = fifo_bytes / (osize * enc->channels);
1467 int frame_bytes = enc->frame_size*osize*enc->channels;
1468 if (allocated_audio_buf_size < frame_bytes)
1470 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1473 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1474 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1475 ost->st->time_base.num, enc->sample_rate);
1476 enc->frame_size = fs_tmp;
1479 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1482 fprintf(stderr, "Audio encoding failed\n");
1486 pkt.flags |= AV_PKT_FLAG_KEY;
1488 case AVMEDIA_TYPE_VIDEO:
1489 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1491 fprintf(stderr, "Video encoding failed\n");
1495 if(enc->coded_frame && enc->coded_frame->key_frame)
1496 pkt.flags |= AV_PKT_FLAG_KEY;
1497 if (ost->logfile && enc->stats_out) {
1498 fprintf(ost->logfile, "%s", enc->stats_out);
1507 pkt.data = bit_buffer;
1509 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1510 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1511 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1516 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1517 static int output_packet(InputStream *ist, int ist_index,
1518 OutputStream *ost_table, int nb_ostreams,
1519 const AVPacket *pkt)
1521 AVFormatContext *os;
1526 void *buffer_to_free = NULL;
1527 static unsigned int samples_size= 0;
1528 AVSubtitle subtitle, *subtitle_to_free;
1529 int64_t pkt_pts = AV_NOPTS_VALUE;
1531 int frame_available;
1536 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1538 if(ist->next_pts == AV_NOPTS_VALUE)
1539 ist->next_pts= ist->pts;
1543 av_init_packet(&avpkt);
1551 if(pkt->dts != AV_NOPTS_VALUE)
1552 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1553 if(pkt->pts != AV_NOPTS_VALUE)
1554 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1556 //while we have more to decode or while the decoder did output something on EOF
1557 while (avpkt.size > 0 || (!pkt && got_output)) {
1558 uint8_t *data_buf, *decoded_data_buf;
1559 int data_size, decoded_data_size;
1561 ist->pts= ist->next_pts;
1563 if(avpkt.size && avpkt.size != pkt->size &&
1564 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1565 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1566 ist->showed_multi_packet_warning=1;
1569 /* decode the packet if needed */
1570 decoded_data_buf = NULL; /* fail safe */
1571 decoded_data_size= 0;
1572 data_buf = avpkt.data;
1573 data_size = avpkt.size;
1574 subtitle_to_free = NULL;
1575 if (ist->decoding_needed) {
1576 switch(ist->st->codec->codec_type) {
1577 case AVMEDIA_TYPE_AUDIO:{
1578 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1579 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1581 samples= av_malloc(samples_size);
1583 decoded_data_size= samples_size;
1584 /* XXX: could avoid copy if PCM 16 bits with same
1585 endianness as CPU */
1586 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1593 got_output = decoded_data_size > 0;
1594 /* Some bug in mpeg audio decoder gives */
1595 /* decoded_data_size < 0, it seems they are overflows */
1597 /* no audio frame */
1600 decoded_data_buf = (uint8_t *)samples;
1601 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1602 (ist->st->codec->sample_rate * ist->st->codec->channels);
1604 case AVMEDIA_TYPE_VIDEO:
1605 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1606 /* XXX: allocate picture correctly */
1607 avcodec_get_frame_defaults(&picture);
1608 avpkt.pts = pkt_pts;
1609 avpkt.dts = ist->pts;
1610 pkt_pts = AV_NOPTS_VALUE;
1612 ret = avcodec_decode_video2(ist->st->codec,
1613 &picture, &got_output, &avpkt);
1614 quality = same_quant ? picture.quality : 0;
1618 /* no picture yet */
1619 goto discard_packet;
1621 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1622 if (ist->st->codec->time_base.num != 0) {
1623 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1624 ist->next_pts += ((int64_t)AV_TIME_BASE *
1625 ist->st->codec->time_base.num * ticks) /
1626 ist->st->codec->time_base.den;
1629 buffer_to_free = NULL;
1630 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1632 case AVMEDIA_TYPE_SUBTITLE:
1633 ret = avcodec_decode_subtitle2(ist->st->codec,
1634 &subtitle, &got_output, &avpkt);
1638 goto discard_packet;
1640 subtitle_to_free = &subtitle;
1647 switch(ist->st->codec->codec_type) {
1648 case AVMEDIA_TYPE_AUDIO:
1649 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1650 ist->st->codec->sample_rate;
1652 case AVMEDIA_TYPE_VIDEO:
1653 if (ist->st->codec->time_base.num != 0) {
1654 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1655 ist->next_pts += ((int64_t)AV_TIME_BASE *
1656 ist->st->codec->time_base.num * ticks) /
1657 ist->st->codec->time_base.den;
1664 // preprocess audio (volume)
1665 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1666 if (audio_volume != 256) {
1669 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1670 int v = ((*volp) * audio_volume + 128) >> 8;
1671 *volp++ = av_clip_int16(v);
1676 /* frame rate emulation */
1678 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1679 int64_t now = av_gettime() - ist->start;
1683 /* if output time reached then transcode raw format,
1684 encode packets and output them */
1685 for (i = 0; i < nb_ostreams; i++) {
1686 OutputFile *of = &output_files[ost_table[i].file_index];
1689 ost = &ost_table[i];
1690 if (ost->source_index != ist_index)
1693 if (of->start_time && ist->pts < of->start_time)
1696 if (of->recording_time != INT64_MAX &&
1697 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1698 (AVRational){1, 1000000}) >= 0) {
1699 ost->is_past_recording_time = 1;
1704 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1705 ost->input_video_filter) {
1707 if (ist->st->sample_aspect_ratio.num)
1708 sar = ist->st->sample_aspect_ratio;
1710 sar = ist->st->codec->sample_aspect_ratio;
1711 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1713 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1714 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1715 while (frame_available) {
1716 AVRational ist_pts_tb;
1717 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1718 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1720 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1722 os = output_files[ost->file_index].ctx;
1724 /* set the input output pts pairs */
1725 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1727 if (ost->encoding_needed) {
1728 av_assert0(ist->decoding_needed);
1729 switch(ost->st->codec->codec_type) {
1730 case AVMEDIA_TYPE_AUDIO:
1731 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1733 case AVMEDIA_TYPE_VIDEO:
1735 if (ost->picref->video && !ost->frame_aspect_ratio)
1736 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1738 do_video_out(os, ost, ist, &picture, &frame_size,
1739 same_quant ? quality : ost->st->codec->global_quality);
1740 if (vstats_filename && frame_size)
1741 do_video_stats(os, ost, frame_size);
1743 case AVMEDIA_TYPE_SUBTITLE:
1744 do_subtitle_out(os, ost, ist, &subtitle,
1751 AVFrame avframe; //FIXME/XXX remove this
1753 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1755 av_init_packet(&opkt);
1757 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1758 #if !CONFIG_AVFILTER
1764 /* no reencoding needed : output the packet directly */
1765 /* force the input stream PTS */
1767 avcodec_get_frame_defaults(&avframe);
1768 ost->st->codec->coded_frame= &avframe;
1769 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1771 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1772 audio_size += data_size;
1773 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1774 video_size += data_size;
1778 opkt.stream_index= ost->index;
1779 if(pkt->pts != AV_NOPTS_VALUE)
1780 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1782 opkt.pts= AV_NOPTS_VALUE;
1784 if (pkt->dts == AV_NOPTS_VALUE)
1785 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1787 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1788 opkt.dts -= ost_tb_start_time;
1790 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1791 opkt.flags= pkt->flags;
1793 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1794 if( ost->st->codec->codec_id != CODEC_ID_H264
1795 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1796 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1798 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1799 opkt.destruct= av_destruct_packet;
1801 opkt.data = data_buf;
1802 opkt.size = data_size;
1805 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1806 ost->st->codec->frame_number++;
1807 ost->frame_number++;
1808 av_free_packet(&opkt);
1812 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1813 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1815 avfilter_unref_buffer(ost->picref);
1820 av_free(buffer_to_free);
1821 /* XXX: allocate the subtitles in the codec ? */
1822 if (subtitle_to_free) {
1823 avsubtitle_free(subtitle_to_free);
1824 subtitle_to_free = NULL;
1832 static void print_sdp(OutputFile *output_files, int n)
1836 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1840 for (i = 0; i < n; i++)
1841 avc[i] = output_files[i].ctx;
1843 av_sdp_create(avc, n, sdp, sizeof(sdp));
1844 printf("SDP:\n%s\n", sdp);
1849 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1850 char *error, int error_len)
1853 InputStream *ist = &input_streams[ist_index];
1854 if (ist->decoding_needed) {
1855 AVCodec *codec = ist->dec;
1857 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1858 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1859 return AVERROR(EINVAL);
1862 /* update requested sample format for the decoder based on the
1863 corresponding encoder sample format */
1864 for (i = 0; i < nb_output_streams; i++) {
1865 OutputStream *ost = &output_streams[i];
1866 if (ost->source_index == ist_index) {
1867 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1872 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1873 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1874 ist->file_index, ist->st->index);
1875 return AVERROR(EINVAL);
1877 assert_codec_experimental(ist->st->codec, 0);
1878 assert_avoptions(ist->opts);
1881 ist->pts = ist->st->avg_frame_rate.num ? - ist->st->codec->has_b_frames*AV_TIME_BASE / av_q2d(ist->st->avg_frame_rate) : 0;
1882 ist->next_pts = AV_NOPTS_VALUE;
1883 init_pts_correction(&ist->pts_ctx);
1889 static int transcode_init(OutputFile *output_files,
1890 int nb_output_files,
1891 InputFile *input_files,
1895 AVFormatContext *os;
1896 AVCodecContext *codec, *icodec;
1903 for (i = 0; i < nb_input_streams; i++)
1904 input_streams[i].start = av_gettime();
1906 /* output stream init */
1907 for(i=0;i<nb_output_files;i++) {
1908 os = output_files[i].ctx;
1909 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1910 av_dump_format(os, i, os->filename, 1);
1911 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1912 return AVERROR(EINVAL);
1916 /* for each output stream, we compute the right encoding parameters */
1917 for (i = 0; i < nb_output_streams; i++) {
1918 ost = &output_streams[i];
1919 os = output_files[ost->file_index].ctx;
1920 ist = &input_streams[ost->source_index];
1922 codec = ost->st->codec;
1923 icodec = ist->st->codec;
1925 ost->st->disposition = ist->st->disposition;
1926 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1927 codec->chroma_sample_location = icodec->chroma_sample_location;
1929 if (ost->st->stream_copy) {
1930 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1932 if (extra_size > INT_MAX) {
1933 return AVERROR(EINVAL);
1936 /* if stream_copy is selected, no need to decode or encode */
1937 codec->codec_id = icodec->codec_id;
1938 codec->codec_type = icodec->codec_type;
1940 if(!codec->codec_tag){
1941 if( !os->oformat->codec_tag
1942 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1943 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1944 codec->codec_tag = icodec->codec_tag;
1947 codec->bit_rate = icodec->bit_rate;
1948 codec->rc_max_rate = icodec->rc_max_rate;
1949 codec->rc_buffer_size = icodec->rc_buffer_size;
1950 codec->extradata= av_mallocz(extra_size);
1951 if (!codec->extradata) {
1952 return AVERROR(ENOMEM);
1954 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1955 codec->extradata_size= icodec->extradata_size;
1956 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){
1957 codec->time_base = icodec->time_base;
1958 codec->time_base.num *= icodec->ticks_per_frame;
1959 av_reduce(&codec->time_base.num, &codec->time_base.den,
1960 codec->time_base.num, codec->time_base.den, INT_MAX);
1962 codec->time_base = ist->st->time_base;
1963 switch(codec->codec_type) {
1964 case AVMEDIA_TYPE_AUDIO:
1965 if(audio_volume != 256) {
1966 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1969 codec->channel_layout = icodec->channel_layout;
1970 codec->sample_rate = icodec->sample_rate;
1971 codec->channels = icodec->channels;
1972 codec->frame_size = icodec->frame_size;
1973 codec->audio_service_type = icodec->audio_service_type;
1974 codec->block_align= icodec->block_align;
1975 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1976 codec->block_align= 0;
1977 if(codec->codec_id == CODEC_ID_AC3)
1978 codec->block_align= 0;
1980 case AVMEDIA_TYPE_VIDEO:
1981 codec->pix_fmt = icodec->pix_fmt;
1982 codec->width = icodec->width;
1983 codec->height = icodec->height;
1984 codec->has_b_frames = icodec->has_b_frames;
1985 if (!codec->sample_aspect_ratio.num) {
1986 codec->sample_aspect_ratio =
1987 ost->st->sample_aspect_ratio =
1988 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1989 ist->st->codec->sample_aspect_ratio.num ?
1990 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1993 case AVMEDIA_TYPE_SUBTITLE:
1994 codec->width = icodec->width;
1995 codec->height = icodec->height;
1997 case AVMEDIA_TYPE_DATA:
2004 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2005 switch(codec->codec_type) {
2006 case AVMEDIA_TYPE_AUDIO:
2007 ost->fifo= av_fifo_alloc(1024);
2009 return AVERROR(ENOMEM);
2011 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2012 if (!codec->sample_rate) {
2013 codec->sample_rate = icodec->sample_rate;
2015 codec->sample_rate >>= icodec->lowres;
2017 choose_sample_rate(ost->st, ost->enc);
2018 codec->time_base = (AVRational){1, codec->sample_rate};
2019 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2020 codec->sample_fmt = icodec->sample_fmt;
2021 choose_sample_fmt(ost->st, ost->enc);
2022 if (!codec->channels)
2023 codec->channels = icodec->channels;
2024 codec->channel_layout = icodec->channel_layout;
2025 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2026 codec->channel_layout = 0;
2027 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2028 icodec->request_channels = codec->channels;
2029 ist->decoding_needed = 1;
2030 ost->encoding_needed = 1;
2031 ost->resample_sample_fmt = icodec->sample_fmt;
2032 ost->resample_sample_rate = icodec->sample_rate;
2033 ost->resample_channels = icodec->channels;
2035 case AVMEDIA_TYPE_VIDEO:
2036 if (codec->pix_fmt == PIX_FMT_NONE)
2037 codec->pix_fmt = icodec->pix_fmt;
2038 choose_pixel_fmt(ost->st, ost->enc);
2040 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2041 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2045 if (!codec->width || !codec->height) {
2046 codec->width = icodec->width;
2047 codec->height = icodec->height;
2050 ost->video_resample = codec->width != icodec->width ||
2051 codec->height != icodec->height ||
2052 codec->pix_fmt != icodec->pix_fmt;
2053 if (ost->video_resample) {
2054 #if !CONFIG_AVFILTER
2055 avcodec_get_frame_defaults(&ost->pict_tmp);
2056 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2057 codec->width, codec->height)) {
2058 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2061 ost->img_resample_ctx = sws_getContext(
2068 ost->sws_flags, NULL, NULL, NULL);
2069 if (ost->img_resample_ctx == NULL) {
2070 fprintf(stderr, "Cannot get resampling context\n");
2074 codec->bits_per_raw_sample= 0;
2077 ost->resample_height = icodec->height;
2078 ost->resample_width = icodec->width;
2079 ost->resample_pix_fmt= icodec->pix_fmt;
2080 ost->encoding_needed = 1;
2081 ist->decoding_needed = 1;
2083 if (!ost->frame_rate.num)
2084 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2085 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2086 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2087 ost->frame_rate = ost->enc->supported_framerates[idx];
2089 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2092 if (configure_video_filters(ist, ost)) {
2093 fprintf(stderr, "Error opening filters!\n");
2098 case AVMEDIA_TYPE_SUBTITLE:
2099 ost->encoding_needed = 1;
2100 ist->decoding_needed = 1;
2107 if (ost->encoding_needed &&
2108 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2109 char logfilename[1024];
2112 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2113 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2115 if (codec->flags & CODEC_FLAG_PASS1) {
2116 f = fopen(logfilename, "wb");
2118 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2124 size_t logbuffer_size;
2125 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2126 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2129 codec->stats_in = logbuffer;
2133 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2134 int size= codec->width * codec->height;
2135 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2140 bit_buffer = av_malloc(bit_buffer_size);
2142 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2144 return AVERROR(ENOMEM);
2147 /* open each encoder */
2148 for (i = 0; i < nb_output_streams; i++) {
2149 ost = &output_streams[i];
2150 if (ost->encoding_needed) {
2151 AVCodec *codec = ost->enc;
2152 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2154 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2155 ost->st->codec->codec_id, ost->file_index, ost->index);
2156 ret = AVERROR(EINVAL);
2159 if (dec->subtitle_header) {
2160 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2161 if (!ost->st->codec->subtitle_header) {
2162 ret = AVERROR(ENOMEM);
2165 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2166 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2168 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2169 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2170 ost->file_index, ost->index);
2171 ret = AVERROR(EINVAL);
2174 assert_codec_experimental(ost->st->codec, 1);
2175 assert_avoptions(ost->opts);
2176 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2177 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2178 "It takes bits/s as argument, not kbits/s\n");
2179 extra_size += ost->st->codec->extradata_size;
2183 /* init input streams */
2184 for (i = 0; i < nb_input_streams; i++)
2185 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2188 /* open files and write file headers */
2189 for (i = 0; i < nb_output_files; i++) {
2190 os = output_files[i].ctx;
2191 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2192 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2193 ret = AVERROR(EINVAL);
2196 assert_avoptions(output_files[i].opts);
2197 if (strcmp(os->oformat->name, "rtp")) {
2203 /* dump the file output parameters - cannot be done before in case
2205 for(i=0;i<nb_output_files;i++) {
2206 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2209 /* dump the stream mapping */
2211 fprintf(stderr, "Stream mapping:\n");
2212 for (i = 0; i < nb_output_streams;i ++) {
2213 ost = &output_streams[i];
2214 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2215 input_streams[ost->source_index].file_index,
2216 input_streams[ost->source_index].st->index,
2219 if (ost->sync_ist != &input_streams[ost->source_index])
2220 fprintf(stderr, " [sync #%d.%d]",
2221 ost->sync_ist->file_index,
2222 ost->sync_ist->st->index);
2223 if (ost->st->stream_copy)
2224 fprintf(stderr, " (copy)");
2226 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2227 input_streams[ost->source_index].dec->name : "?",
2228 ost->enc ? ost->enc->name : "?");
2229 fprintf(stderr, "\n");
2234 fprintf(stderr, "%s\n", error);
2239 print_sdp(output_files, nb_output_files);
2246 * The following code is the main loop of the file converter
2248 static int transcode(OutputFile *output_files,
2249 int nb_output_files,
2250 InputFile *input_files,
2254 AVFormatContext *is, *os;
2258 int no_packet_count=0;
2259 int64_t timer_start;
2261 if (!(no_packet = av_mallocz(nb_input_files)))
2264 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2269 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2272 timer_start = av_gettime();
2274 for(; received_sigterm == 0;) {
2275 int file_index, ist_index;
2280 ipts_min = INT64_MAX;
2283 /* select the stream that we must read now by looking at the
2284 smallest output pts */
2286 for (i = 0; i < nb_output_streams; i++) {
2290 ost = &output_streams[i];
2291 of = &output_files[ost->file_index];
2292 os = output_files[ost->file_index].ctx;
2293 ist = &input_streams[ost->source_index];
2294 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2295 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2297 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2299 if (!input_files[ist->file_index].eof_reached){
2300 if(ipts < ipts_min) {
2302 if(input_sync ) file_index = ist->file_index;
2304 if(opts < opts_min) {
2306 if(!input_sync) file_index = ist->file_index;
2309 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2314 /* if none, if is finished */
2315 if (file_index < 0) {
2316 if(no_packet_count){
2318 memset(no_packet, 0, nb_input_files);
2325 /* read a frame from it and output it in the fifo */
2326 is = input_files[file_index].ctx;
2327 ret= av_read_frame(is, &pkt);
2328 if(ret == AVERROR(EAGAIN)){
2329 no_packet[file_index]=1;
2334 input_files[file_index].eof_reached = 1;
2342 memset(no_packet, 0, nb_input_files);
2345 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2346 is->streams[pkt.stream_index]);
2348 /* the following test is needed in case new streams appear
2349 dynamically in stream : we ignore them */
2350 if (pkt.stream_index >= input_files[file_index].nb_streams)
2351 goto discard_packet;
2352 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2353 ist = &input_streams[ist_index];
2355 goto discard_packet;
2357 if (pkt.dts != AV_NOPTS_VALUE)
2358 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2359 if (pkt.pts != AV_NOPTS_VALUE)
2360 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2362 if (ist->ts_scale) {
2363 if(pkt.pts != AV_NOPTS_VALUE)
2364 pkt.pts *= ist->ts_scale;
2365 if(pkt.dts != AV_NOPTS_VALUE)
2366 pkt.dts *= ist->ts_scale;
2369 // 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);
2370 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2371 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2372 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2373 int64_t delta= pkt_dts - ist->next_pts;
2374 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2375 input_files[ist->file_index].ts_offset -= delta;
2377 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2378 delta, input_files[ist->file_index].ts_offset);
2379 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2380 if(pkt.pts != AV_NOPTS_VALUE)
2381 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2385 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2386 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2389 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2390 ist->file_index, ist->st->index);
2393 av_free_packet(&pkt);
2398 av_free_packet(&pkt);
2400 /* dump report by using the output first video and audio streams */
2401 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2404 /* at the end of stream, we must flush the decoder buffers */
2405 for (i = 0; i < nb_input_streams; i++) {
2406 ist = &input_streams[i];
2407 if (ist->decoding_needed) {
2408 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2411 flush_encoders(output_streams, nb_output_streams);
2415 /* write the trailer if needed and close file */
2416 for(i=0;i<nb_output_files;i++) {
2417 os = output_files[i].ctx;
2418 av_write_trailer(os);
2421 /* dump report by using the first video and audio streams */
2422 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2424 /* close each encoder */
2425 for (i = 0; i < nb_output_streams; i++) {
2426 ost = &output_streams[i];
2427 if (ost->encoding_needed) {
2428 av_freep(&ost->st->codec->stats_in);
2429 avcodec_close(ost->st->codec);
2432 avfilter_graph_free(&ost->graph);
2436 /* close each decoder */
2437 for (i = 0; i < nb_input_streams; i++) {
2438 ist = &input_streams[i];
2439 if (ist->decoding_needed) {
2440 avcodec_close(ist->st->codec);
2448 av_freep(&bit_buffer);
2449 av_freep(&no_packet);
2451 if (output_streams) {
2452 for (i = 0; i < nb_output_streams; i++) {
2453 ost = &output_streams[i];
2455 if (ost->st->stream_copy)
2456 av_freep(&ost->st->codec->extradata);
2458 fclose(ost->logfile);
2459 ost->logfile = NULL;
2461 av_fifo_free(ost->fifo); /* works even if fifo is not
2462 initialized but set to zero */
2463 av_freep(&ost->st->codec->subtitle_header);
2464 av_free(ost->pict_tmp.data[0]);
2465 av_free(ost->forced_kf_pts);
2466 if (ost->video_resample)
2467 sws_freeContext(ost->img_resample_ctx);
2469 audio_resample_close(ost->resample);
2470 if (ost->reformat_ctx)
2471 av_audio_convert_free(ost->reformat_ctx);
2472 av_dict_free(&ost->opts);
2479 static int opt_video_rc_override_string(const char *opt, const char *arg)
2481 video_rc_override_string = arg;
2485 static int opt_me_threshold(const char *opt, const char *arg)
2487 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2491 static int opt_verbose(const char *opt, const char *arg)
2493 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2497 static int opt_frame_rate(const char *opt, const char *arg)
2499 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2500 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2506 static int opt_frame_size(const char *opt, const char *arg)
2508 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2509 fprintf(stderr, "Incorrect frame size\n");
2510 return AVERROR(EINVAL);
2515 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2517 if (strcmp(arg, "list")) {
2518 frame_pix_fmt = av_get_pix_fmt(arg);
2519 if (frame_pix_fmt == PIX_FMT_NONE) {
2520 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2521 return AVERROR(EINVAL);
2530 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2537 p = strchr(arg, ':');
2539 x = strtol(arg, &end, 10);
2541 y = strtol(end+1, &end, 10);
2543 ar = (double)x / (double)y;
2545 ar = strtod(arg, NULL);
2548 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2549 return AVERROR(EINVAL);
2551 frame_aspect_ratio = ar;
2555 static int opt_metadata(const char *opt, const char *arg)
2557 char *mid= strchr(arg, '=');
2560 fprintf(stderr, "Missing =\n");
2565 av_dict_set(&metadata, arg, mid, 0);
2570 static int opt_qscale(const char *opt, const char *arg)
2572 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2573 if (video_qscale == 0) {
2574 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2575 return AVERROR(EINVAL);
2580 static int opt_top_field_first(const char *opt, const char *arg)
2582 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2586 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2588 if (strcmp(arg, "list")) {
2589 audio_sample_fmt = av_get_sample_fmt(arg);
2590 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2591 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2592 return AVERROR(EINVAL);
2597 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2598 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2604 static int opt_audio_rate(const char *opt, const char *arg)
2606 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2610 static int opt_audio_channels(const char *opt, const char *arg)
2612 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2616 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2618 return parse_option(o, "codec:a", arg, options);
2621 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2623 return parse_option(o, "codec:v", arg, options);
2626 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2628 return parse_option(o, "codec:s", arg, options);
2631 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2633 return parse_option(o, "codec:d", arg, options);
2636 static int opt_codec_tag(const char *opt, const char *arg)
2639 uint32_t *codec_tag;
2641 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2642 !strcmp(opt, "vtag") ? &video_codec_tag :
2643 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2647 *codec_tag = strtol(arg, &tail, 0);
2649 *codec_tag = AV_RL32(arg);
2654 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2656 StreamMap *m = NULL;
2657 int i, negative = 0, file_idx;
2658 int sync_file_idx = -1, sync_stream_idx;
2666 map = av_strdup(arg);
2668 /* parse sync stream first, just pick first matching stream */
2669 if (sync = strchr(map, ',')) {
2671 sync_file_idx = strtol(sync + 1, &sync, 0);
2672 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2673 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2678 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2679 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2680 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2681 sync_stream_idx = i;
2684 if (i == input_files[sync_file_idx].nb_streams) {
2685 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2686 "match any streams.\n", arg);
2692 file_idx = strtol(map, &p, 0);
2693 if (file_idx >= nb_input_files || file_idx < 0) {
2694 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2698 /* disable some already defined maps */
2699 for (i = 0; i < o->nb_stream_maps; i++) {
2700 m = &o->stream_maps[i];
2701 if (check_stream_specifier(input_files[m->file_index].ctx,
2702 input_files[m->file_index].ctx->streams[m->stream_index],
2703 *p == ':' ? p + 1 : p) > 0)
2707 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2708 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2709 *p == ':' ? p + 1 : p) <= 0)
2711 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2712 &o->nb_stream_maps, o->nb_stream_maps + 1);
2713 m = &o->stream_maps[o->nb_stream_maps - 1];
2715 m->file_index = file_idx;
2716 m->stream_index = i;
2718 if (sync_file_idx >= 0) {
2719 m->sync_file_index = sync_file_idx;
2720 m->sync_stream_index = sync_stream_idx;
2722 m->sync_file_index = file_idx;
2723 m->sync_stream_index = i;
2728 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2736 static void parse_meta_type(char *arg, char *type, int *index)
2746 if (*(++arg) == ':')
2747 *index = strtol(++arg, NULL, 0);
2750 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2757 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2759 MetadataMap *m, *m1;
2762 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2763 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2765 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2766 m->file = strtol(arg, &p, 0);
2767 parse_meta_type(p, &m->type, &m->index);
2769 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2770 if (p = strchr(opt, ':'))
2771 parse_meta_type(p, &m1->type, &m1->index);
2775 if (m->type == 'g' || m1->type == 'g')
2776 o->metadata_global_manual = 1;
2777 if (m->type == 's' || m1->type == 's')
2778 o->metadata_streams_manual = 1;
2779 if (m->type == 'c' || m1->type == 'c')
2780 o->metadata_chapters_manual = 1;
2785 static int opt_input_ts_scale(const char *opt, const char *arg)
2787 return av_dict_set(&ts_scale, opt, arg, 0);
2790 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2792 const char *codec_string = encoder ? "encoder" : "decoder";
2796 return CODEC_ID_NONE;
2798 avcodec_find_encoder_by_name(name) :
2799 avcodec_find_decoder_by_name(name);
2801 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2804 if(codec->type != type) {
2805 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2811 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2813 char *codec_name = NULL;
2815 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2819 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2820 return avcodec_find_encoder(st->codec->codec_id);
2822 } else if (!strcmp(codec_name, "copy"))
2823 st->stream_copy = 1;
2825 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2826 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2827 avcodec_find_decoder_by_name(codec_name);
2834 * Add all the streams from the given input file to the global
2835 * list of input streams.
2837 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2839 int i, rfps, rfps_base, ret;
2841 for (i = 0; i < ic->nb_streams; i++) {
2842 AVStream *st = ic->streams[i];
2843 AVCodecContext *dec = st->codec;
2844 AVDictionaryEntry *e = NULL;
2848 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2849 ist = &input_streams[nb_input_streams - 1];
2851 ist->file_index = nb_input_files;
2853 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2855 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2856 char *p = strchr(e->key, ':');
2858 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2864 ist->ts_scale = strtod(scale, NULL);
2866 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2868 ist->dec = avcodec_find_decoder(dec->codec_id);
2870 switch (dec->codec_type) {
2871 case AVMEDIA_TYPE_AUDIO:
2873 st->discard= AVDISCARD_ALL;
2875 case AVMEDIA_TYPE_VIDEO:
2876 rfps = ic->streams[i]->r_frame_rate.num;
2877 rfps_base = ic->streams[i]->r_frame_rate.den;
2879 dec->flags |= CODEC_FLAG_EMU_EDGE;
2880 dec->height >>= dec->lowres;
2881 dec->width >>= dec->lowres;
2884 dec->debug |= FF_DEBUG_MV;
2886 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2889 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2890 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2892 (float)rfps / rfps_base, rfps, rfps_base);
2896 st->discard= AVDISCARD_ALL;
2897 else if(video_discard)
2898 st->discard= video_discard;
2900 case AVMEDIA_TYPE_DATA:
2902 case AVMEDIA_TYPE_SUBTITLE:
2903 if(subtitle_disable)
2904 st->discard = AVDISCARD_ALL;
2906 case AVMEDIA_TYPE_ATTACHMENT:
2907 case AVMEDIA_TYPE_UNKNOWN:
2915 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2917 AVFormatContext *ic;
2918 AVInputFormat *file_iformat = NULL;
2922 AVDictionary **opts;
2923 int orig_nb_streams; // number of streams before avformat_find_stream_info
2926 if (!(file_iformat = av_find_input_format(o->format))) {
2927 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2932 if (!strcmp(filename, "-"))
2935 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2936 !strcmp(filename, "/dev/stdin");
2938 /* get default parameters from command line */
2939 ic = avformat_alloc_context();
2941 print_error(filename, AVERROR(ENOMEM));
2944 if (audio_sample_rate) {
2945 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2946 av_dict_set(&format_opts, "sample_rate", buf, 0);
2948 if (audio_channels) {
2949 snprintf(buf, sizeof(buf), "%d", audio_channels);
2950 av_dict_set(&format_opts, "channels", buf, 0);
2952 if (frame_rate.num) {
2953 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2954 av_dict_set(&format_opts, "framerate", buf, 0);
2956 if (frame_width && frame_height) {
2957 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2958 av_dict_set(&format_opts, "video_size", buf, 0);
2960 if (frame_pix_fmt != PIX_FMT_NONE)
2961 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2963 ic->flags |= AVFMT_FLAG_NONBLOCK;
2965 /* open the input file with generic libav function */
2966 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2968 print_error(filename, err);
2971 assert_avoptions(format_opts);
2976 for(i=0; i<ic->nb_streams; i++){
2977 ic->streams[i]->discard= AVDISCARD_ALL;
2979 for(i=0; i<ic->nb_programs; i++){
2980 AVProgram *p= ic->programs[i];
2981 if(p->id != opt_programid){
2982 p->discard = AVDISCARD_ALL;
2985 for(j=0; j<p->nb_stream_indexes; j++){
2986 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2991 fprintf(stderr, "Specified program id not found\n");
2997 /* apply forced codec ids */
2998 for (i = 0; i < ic->nb_streams; i++)
2999 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
3001 /* Set AVCodecContext options for avformat_find_stream_info */
3002 opts = setup_find_stream_info_opts(ic, codec_opts);
3003 orig_nb_streams = ic->nb_streams;
3005 /* If not enough info to get the stream parameters, we decode the
3006 first frames to get it. (used in mpeg case for example) */
3007 ret = avformat_find_stream_info(ic, opts);
3008 if (ret < 0 && verbose >= 0) {
3009 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3010 av_close_input_file(ic);
3014 timestamp = o->start_time;
3015 /* add the stream start time */
3016 if (ic->start_time != AV_NOPTS_VALUE)
3017 timestamp += ic->start_time;
3019 /* if seeking requested, we execute it */
3020 if (o->start_time != 0) {
3021 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3023 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3024 filename, (double)timestamp / AV_TIME_BASE);
3028 /* update the current parameters so that they match the one of the input stream */
3029 add_input_streams(o, ic);
3031 /* dump the file content */
3033 av_dump_format(ic, nb_input_files, filename, 0);
3035 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3036 input_files[nb_input_files - 1].ctx = ic;
3037 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3038 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3039 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3041 frame_rate = (AVRational){0, 0};
3042 frame_pix_fmt = PIX_FMT_NONE;
3045 audio_sample_rate = 0;
3047 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3048 av_dict_free(&ts_scale);
3050 for (i = 0; i < orig_nb_streams; i++)
3051 av_dict_free(&opts[i]);
3058 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3059 AVCodecContext *avctx)
3065 for (p = kf; *p; p++)
3068 ost->forced_kf_count = n;
3069 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3070 if (!ost->forced_kf_pts) {
3071 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3074 for (i = 0; i < n; i++) {
3075 p = i ? strchr(p, ',') + 1 : kf;
3076 t = parse_time_or_die("force_key_frames", p, 1);
3077 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3081 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3084 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3085 int idx = oc->nb_streams - 1;
3088 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3092 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3093 nb_output_streams + 1);
3094 ost = &output_streams[nb_output_streams - 1];
3095 ost->file_index = nb_output_files;
3098 st->codec->codec_type = type;
3099 ost->enc = choose_codec(o, oc, st, type);
3101 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3104 avcodec_get_context_defaults3(st->codec, ost->enc);
3105 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3107 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3111 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3115 AVCodecContext *video_enc;
3117 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3119 if (!st->stream_copy) {
3120 ost->frame_aspect_ratio = frame_aspect_ratio;
3121 frame_aspect_ratio = 0;
3123 ost->avfilter= vfilters;
3128 ost->bitstream_filters = video_bitstream_filters;
3129 video_bitstream_filters= NULL;
3131 video_enc = st->codec;
3134 video_enc->codec_tag= video_codec_tag;
3136 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3137 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3140 if (st->stream_copy) {
3141 video_enc->sample_aspect_ratio =
3142 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3148 ost->frame_rate = frame_rate;
3150 video_enc->width = frame_width;
3151 video_enc->height = frame_height;
3152 video_enc->pix_fmt = frame_pix_fmt;
3153 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3155 if (video_qscale || same_quant) {
3156 video_enc->flags |= CODEC_FLAG_QSCALE;
3157 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3161 video_enc->intra_matrix = intra_matrix;
3163 video_enc->inter_matrix = inter_matrix;
3165 p= video_rc_override_string;
3168 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3170 fprintf(stderr, "error parsing rc_override\n");
3173 video_enc->rc_override=
3174 av_realloc(video_enc->rc_override,
3175 sizeof(RcOverride)*(i+1));
3176 video_enc->rc_override[i].start_frame= start;
3177 video_enc->rc_override[i].end_frame = end;
3179 video_enc->rc_override[i].qscale= q;
3180 video_enc->rc_override[i].quality_factor= 1.0;
3183 video_enc->rc_override[i].qscale= 0;
3184 video_enc->rc_override[i].quality_factor= -q/100.0;
3189 video_enc->rc_override_count=i;
3190 if (!video_enc->rc_initial_buffer_occupancy)
3191 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3192 video_enc->me_threshold= me_threshold;
3193 video_enc->intra_dc_precision= intra_dc_precision - 8;
3196 video_enc->flags|= CODEC_FLAG_PSNR;
3201 video_enc->flags |= CODEC_FLAG_PASS1;
3203 video_enc->flags |= CODEC_FLAG_PASS2;
3207 if (forced_key_frames)
3208 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3210 if (video_language) {
3211 av_dict_set(&st->metadata, "language", video_language, 0);
3212 av_freep(&video_language);
3215 /* reset some key parameters */
3217 av_freep(&forced_key_frames);
3218 frame_pix_fmt = PIX_FMT_NONE;
3222 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3226 AVCodecContext *audio_enc;
3228 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3231 ost->bitstream_filters = audio_bitstream_filters;
3232 audio_bitstream_filters= NULL;
3234 audio_enc = st->codec;
3235 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3238 audio_enc->codec_tag= audio_codec_tag;
3240 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3241 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3243 if (!st->stream_copy) {
3244 if (audio_qscale > QSCALE_NONE) {
3245 audio_enc->flags |= CODEC_FLAG_QSCALE;
3246 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3249 audio_enc->channels = audio_channels;
3250 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3251 audio_enc->sample_fmt = audio_sample_fmt;
3252 if (audio_sample_rate)
3253 audio_enc->sample_rate = audio_sample_rate;
3255 if (audio_language) {
3256 av_dict_set(&st->metadata, "language", audio_language, 0);
3257 av_freep(&audio_language);
3260 /* reset some key parameters */
3266 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3270 AVCodecContext *data_enc;
3272 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3274 data_enc = st->codec;
3275 if (!st->stream_copy) {
3276 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3281 data_enc->codec_tag= data_codec_tag;
3283 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3284 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3291 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3295 AVCodecContext *subtitle_enc;
3297 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3299 subtitle_enc = st->codec;
3301 ost->bitstream_filters = subtitle_bitstream_filters;
3302 subtitle_bitstream_filters= NULL;
3304 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3306 if(subtitle_codec_tag)
3307 subtitle_enc->codec_tag= subtitle_codec_tag;
3309 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3310 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3313 if (subtitle_language) {
3314 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3315 av_freep(&subtitle_language);
3318 subtitle_disable = 0;
3322 /* arg format is "output-stream-index:streamid-value". */
3323 static int opt_streamid(const char *opt, const char *arg)
3329 av_strlcpy(idx_str, arg, sizeof(idx_str));
3330 p = strchr(idx_str, ':');
3333 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3338 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3339 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3340 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3344 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3346 AVFormatContext *is = ifile->ctx;
3347 AVFormatContext *os = ofile->ctx;
3350 for (i = 0; i < is->nb_chapters; i++) {
3351 AVChapter *in_ch = is->chapters[i], *out_ch;
3352 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3353 AV_TIME_BASE_Q, in_ch->time_base);
3354 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3355 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3358 if (in_ch->end < ts_off)
3360 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3363 out_ch = av_mallocz(sizeof(AVChapter));
3365 return AVERROR(ENOMEM);
3367 out_ch->id = in_ch->id;
3368 out_ch->time_base = in_ch->time_base;
3369 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3370 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3373 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3376 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3378 return AVERROR(ENOMEM);
3379 os->chapters[os->nb_chapters - 1] = out_ch;
3384 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3387 AVFormatContext *ic = NULL;
3389 err = avformat_open_input(&ic, filename, NULL, NULL);
3392 /* copy stream format */
3393 for(i=0;i<ic->nb_streams;i++) {
3398 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3399 ost = new_output_stream(o, s, codec->type);
3402 // FIXME: a more elegant solution is needed
3403 memcpy(st, ic->streams[i], sizeof(AVStream));
3405 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3407 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3408 choose_sample_fmt(st, codec);
3409 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3410 choose_pixel_fmt(st, codec);
3413 av_close_input_file(ic);
3417 static void opt_output_file(void *optctx, const char *filename)
3419 OptionsContext *o = optctx;
3420 AVFormatContext *oc;
3422 AVOutputFormat *file_oformat;
3426 if (!strcmp(filename, "-"))
3429 oc = avformat_alloc_context();
3431 print_error(filename, AVERROR(ENOMEM));
3436 file_oformat = av_guess_format(o->format, NULL, NULL);
3437 if (!file_oformat) {
3438 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3442 file_oformat = av_guess_format(NULL, filename, NULL);
3443 if (!file_oformat) {
3444 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3450 oc->oformat = file_oformat;
3451 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3453 if (!strcmp(file_oformat->name, "ffm") &&
3454 av_strstart(filename, "http:", NULL)) {
3455 /* special case for files sent to avserver: we get the stream
3456 parameters from avserver */
3457 int err = read_avserver_streams(o, oc, filename);
3459 print_error(filename, err);
3462 } else if (!o->nb_stream_maps) {
3463 /* pick the "best" stream of each type */
3464 #define NEW_STREAM(type, index)\
3466 ost = new_ ## type ## _stream(o, oc);\
3467 ost->source_index = index;\
3468 ost->sync_ist = &input_streams[index];\
3469 input_streams[index].discard = 0;\
3472 /* video: highest resolution */
3473 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3474 int area = 0, idx = -1;
3475 for (i = 0; i < nb_input_streams; i++) {
3476 ist = &input_streams[i];
3477 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3478 ist->st->codec->width * ist->st->codec->height > area) {
3479 area = ist->st->codec->width * ist->st->codec->height;
3483 NEW_STREAM(video, idx);
3486 /* audio: most channels */
3487 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3488 int channels = 0, idx = -1;
3489 for (i = 0; i < nb_input_streams; i++) {
3490 ist = &input_streams[i];
3491 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3492 ist->st->codec->channels > channels) {
3493 channels = ist->st->codec->channels;
3497 NEW_STREAM(audio, idx);
3500 /* subtitles: pick first */
3501 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3502 for (i = 0; i < nb_input_streams; i++)
3503 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3504 NEW_STREAM(subtitle, i);
3508 /* do something with data? */
3510 for (i = 0; i < o->nb_stream_maps; i++) {
3511 StreamMap *map = &o->stream_maps[i];
3516 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3517 switch (ist->st->codec->codec_type) {
3518 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3519 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3520 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3521 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3523 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3524 map->file_index, map->stream_index);
3528 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3529 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3530 map->sync_stream_index];
3535 av_dict_copy(&oc->metadata, metadata, 0);
3536 av_dict_free(&metadata);
3539 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3540 output_files[nb_output_files - 1].ctx = oc;
3541 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3542 output_files[nb_output_files - 1].recording_time = o->recording_time;
3543 output_files[nb_output_files - 1].start_time = o->start_time;
3544 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3545 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3547 /* check filename in case of an image number is expected */
3548 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3549 if (!av_filename_number_test(oc->filename)) {
3550 print_error(oc->filename, AVERROR(EINVAL));
3555 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3556 /* test if it already exists to avoid loosing precious files */
3557 if (!file_overwrite &&
3558 (strchr(filename, ':') == NULL ||
3559 filename[1] == ':' ||
3560 av_strstart(filename, "file:", NULL))) {
3561 if (avio_check(filename, 0) == 0) {
3563 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3565 if (!read_yesno()) {
3566 fprintf(stderr, "Not overwriting - exiting\n");
3571 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3578 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3579 print_error(filename, err);
3584 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3585 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3586 oc->flags |= AVFMT_FLAG_NONBLOCK;
3589 if (chapters_input_file >= nb_input_files) {
3590 if (chapters_input_file == INT_MAX) {
3591 /* copy chapters from the first input file that has them*/
3592 chapters_input_file = -1;
3593 for (i = 0; i < nb_input_files; i++)
3594 if (input_files[i].ctx->nb_chapters) {
3595 chapters_input_file = i;
3599 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3600 chapters_input_file);
3604 if (chapters_input_file >= 0)
3605 copy_chapters(&input_files[chapters_input_file], &output_files[nb_output_files - 1],
3606 o->metadata_chapters_manual);
3609 for (i = 0; i < o->nb_meta_data_maps; i++) {
3610 AVFormatContext *files[2];
3611 AVDictionary **meta[2];
3614 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3615 if ((index) < 0 || (index) >= (nb_elems)) {\
3616 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3621 int in_file_index = o->meta_data_maps[i][1].file;
3622 if (in_file_index < 0)
3624 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3627 files[1] = input_files[in_file_index].ctx;
3629 for (j = 0; j < 2; j++) {
3630 MetadataMap *map = &o->meta_data_maps[i][j];
3632 switch (map->type) {
3634 meta[j] = &files[j]->metadata;
3637 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3638 meta[j] = &files[j]->streams[map->index]->metadata;
3641 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3642 meta[j] = &files[j]->chapters[map->index]->metadata;
3645 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3646 meta[j] = &files[j]->programs[map->index]->metadata;
3651 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3654 /* copy global metadata by default */
3655 if (!o->metadata_global_manual && nb_input_files)
3656 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3657 AV_DICT_DONT_OVERWRITE);
3658 if (!o->metadata_streams_manual)
3659 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3660 InputStream *ist = &input_streams[output_streams[i].source_index];
3661 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3664 frame_rate = (AVRational){0, 0};
3667 audio_sample_rate = 0;
3669 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3670 chapters_input_file = INT_MAX;
3672 av_freep(&streamid_map);
3673 nb_streamid_map = 0;
3675 av_freep(&forced_key_frames);
3679 /* same option as mencoder */
3680 static int opt_pass(const char *opt, const char *arg)
3682 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3686 static int64_t getutime(void)
3689 struct rusage rusage;
3691 getrusage(RUSAGE_SELF, &rusage);
3692 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3693 #elif HAVE_GETPROCESSTIMES
3695 FILETIME c, e, k, u;
3696 proc = GetCurrentProcess();
3697 GetProcessTimes(proc, &c, &e, &k, &u);
3698 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3700 return av_gettime();
3704 static int64_t getmaxrss(void)
3706 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3707 struct rusage rusage;
3708 getrusage(RUSAGE_SELF, &rusage);
3709 return (int64_t)rusage.ru_maxrss * 1024;
3710 #elif HAVE_GETPROCESSMEMORYINFO
3712 PROCESS_MEMORY_COUNTERS memcounters;
3713 proc = GetCurrentProcess();
3714 memcounters.cb = sizeof(memcounters);
3715 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3716 return memcounters.PeakPagefileUsage;
3722 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3725 const char *p = str;
3732 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3739 static void opt_inter_matrix(const char *arg)
3741 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3742 parse_matrix_coeffs(inter_matrix, arg);
3745 static void opt_intra_matrix(const char *arg)
3747 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3748 parse_matrix_coeffs(intra_matrix, arg);
3751 static void show_usage(void)
3753 printf("Hyper fast Audio and Video encoder\n");
3754 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3758 static void show_help(void)
3761 AVOutputFormat *oformat = NULL;
3762 AVInputFormat *iformat = NULL;
3763 const AVClass *class;
3765 av_log_set_callback(log_callback_help);
3767 show_help_options(options, "Main options:\n",
3768 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3769 show_help_options(options, "\nAdvanced options:\n",
3770 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3772 show_help_options(options, "\nVideo options:\n",
3773 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3775 show_help_options(options, "\nAdvanced Video options:\n",
3776 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3777 OPT_VIDEO | OPT_EXPERT);
3778 show_help_options(options, "\nAudio options:\n",
3779 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3781 show_help_options(options, "\nAdvanced Audio options:\n",
3782 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3783 OPT_AUDIO | OPT_EXPERT);
3784 show_help_options(options, "\nSubtitle options:\n",
3785 OPT_SUBTITLE | OPT_GRAB,
3787 show_help_options(options, "\nAudio/Video grab options:\n",
3791 class = avcodec_get_class();
3792 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3795 /* individual codec options */
3797 while ((c = av_codec_next(c))) {
3798 if (c->priv_class) {
3799 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3804 class = avformat_get_class();
3805 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3808 /* individual muxer options */
3809 while ((oformat = av_oformat_next(oformat))) {
3810 if (oformat->priv_class) {
3811 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3816 /* individual demuxer options */
3817 while ((iformat = av_iformat_next(iformat))) {
3818 if (iformat->priv_class) {
3819 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3824 class = sws_get_class();
3825 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3828 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3830 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3831 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3833 if(!strncmp(arg, "pal-", 4)) {
3836 } else if(!strncmp(arg, "ntsc-", 5)) {
3839 } else if(!strncmp(arg, "film-", 5)) {
3844 /* Calculate FR via float to avoid int overflow */
3845 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3848 } else if((fr == 29970) || (fr == 23976)) {
3851 /* Try to determine PAL/NTSC by peeking in the input files */
3852 if(nb_input_files) {
3854 for (j = 0; j < nb_input_files; j++) {
3855 for (i = 0; i < input_files[j].nb_streams; i++) {
3856 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3857 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3859 fr = c->time_base.den * 1000 / c->time_base.num;
3863 } else if((fr == 29970) || (fr == 23976)) {
3873 if(verbose > 0 && norm != UNKNOWN)
3874 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3877 if(norm == UNKNOWN) {
3878 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3879 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3880 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3884 if(!strcmp(arg, "vcd")) {
3885 opt_video_codec(o, "c:v", "mpeg1video");
3886 opt_audio_codec(o, "c:a", "mp2");
3887 parse_option(o, "f", "vcd", options);
3889 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3890 opt_frame_rate("r", frame_rates[norm]);
3891 opt_default("g", norm == PAL ? "15" : "18");
3893 opt_default("b", "1150000");
3894 opt_default("maxrate", "1150000");
3895 opt_default("minrate", "1150000");
3896 opt_default("bufsize", "327680"); // 40*1024*8;
3898 opt_default("b:a", "224000");
3899 audio_sample_rate = 44100;
3902 opt_default("packetsize", "2324");
3903 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3905 /* We have to offset the PTS, so that it is consistent with the SCR.
3906 SCR starts at 36000, but the first two packs contain only padding
3907 and the first pack from the other stream, respectively, may also have
3908 been written before.
3909 So the real data starts at SCR 36000+3*1200. */
3910 mux_preload= (36000+3*1200) / 90000.0; //0.44
3911 } else if(!strcmp(arg, "svcd")) {
3913 opt_video_codec(o, "c:v", "mpeg2video");
3914 opt_audio_codec(o, "c:a", "mp2");
3915 parse_option(o, "f", "svcd", options);
3917 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3918 opt_frame_rate("r", frame_rates[norm]);
3919 opt_default("g", norm == PAL ? "15" : "18");
3921 opt_default("b", "2040000");
3922 opt_default("maxrate", "2516000");
3923 opt_default("minrate", "0"); //1145000;
3924 opt_default("bufsize", "1835008"); //224*1024*8;
3925 opt_default("flags", "+scan_offset");
3928 opt_default("b:a", "224000");
3929 audio_sample_rate = 44100;
3931 opt_default("packetsize", "2324");
3933 } else if(!strcmp(arg, "dvd")) {
3935 opt_video_codec(o, "c:v", "mpeg2video");
3936 opt_audio_codec(o, "c:a", "ac3");
3937 parse_option(o, "f", "dvd", options);
3939 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3940 opt_frame_rate("r", frame_rates[norm]);
3941 opt_default("g", norm == PAL ? "15" : "18");
3943 opt_default("b", "6000000");
3944 opt_default("maxrate", "9000000");
3945 opt_default("minrate", "0"); //1500000;
3946 opt_default("bufsize", "1835008"); //224*1024*8;
3948 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3949 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3951 opt_default("b:a", "448000");
3952 audio_sample_rate = 48000;
3954 } else if(!strncmp(arg, "dv", 2)) {
3956 parse_option(o, "f", "dv", options);
3958 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3959 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3960 norm == PAL ? "yuv420p" : "yuv411p");
3961 opt_frame_rate("r", frame_rates[norm]);
3963 audio_sample_rate = 48000;
3967 fprintf(stderr, "Unknown target: %s\n", arg);
3968 return AVERROR(EINVAL);
3973 static int opt_vstats_file(const char *opt, const char *arg)
3975 av_free (vstats_filename);
3976 vstats_filename=av_strdup (arg);
3980 static int opt_vstats(const char *opt, const char *arg)
3983 time_t today2 = time(NULL);
3984 struct tm *today = localtime(&today2);
3986 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3988 return opt_vstats_file(opt, filename);
3991 static int opt_bsf(const char *opt, const char *arg)
3993 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
3994 AVBitStreamFilterContext **bsfp;
3997 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4001 bsfp= *opt == 'v' ? &video_bitstream_filters :
4002 *opt == 'a' ? &audio_bitstream_filters :
4003 &subtitle_bitstream_filters;
4005 bsfp= &(*bsfp)->next;
4012 #define OFFSET(x) offsetof(OptionsContext, x)
4013 static const OptionDef options[] = {
4015 #include "cmdutils_common_opts.h"
4016 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4017 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4018 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4019 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4020 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4021 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4022 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4023 "outfile[,metadata]:infile[,metadata]" },
4024 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4025 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4026 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4027 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4028 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4029 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4030 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4031 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4032 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4033 "add timings for benchmarking" },
4034 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4035 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4036 "dump each input packet" },
4037 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4038 "when dumping packets, also dump the payload" },
4039 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4040 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4041 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4042 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4043 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4044 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4045 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4046 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4047 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4048 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4049 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4050 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4051 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4054 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4055 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4056 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4057 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4058 { "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" },
4059 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4060 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4061 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4062 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4063 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4064 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4065 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4066 "use same quantizer as source (implies VBR)" },
4067 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4068 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4069 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4070 "deinterlace pictures" },
4071 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4072 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4073 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4075 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4077 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4078 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4079 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4080 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4081 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4082 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4083 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4084 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4085 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4086 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4089 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4090 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4091 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4092 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4093 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4094 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4095 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4096 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4097 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4098 { "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" },
4100 /* subtitle options */
4101 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4102 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4103 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4104 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4107 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4110 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4111 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4113 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4114 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4115 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4117 /* data codec support */
4118 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4120 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4124 int main(int argc, char **argv)
4126 OptionsContext o = { 0 };
4131 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4133 avcodec_register_all();
4135 avdevice_register_all();
4138 avfilter_register_all();
4142 avio_set_interrupt_cb(decode_interrupt_cb);
4147 parse_options(&o, argc, argv, options, opt_output_file);
4149 if(nb_output_files <= 0 && nb_input_files == 0) {
4151 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4155 /* file converter / grab */
4156 if (nb_output_files <= 0) {
4157 fprintf(stderr, "At least one output file must be specified\n");
4161 if (nb_input_files == 0) {
4162 fprintf(stderr, "At least one input file must be specified\n");
4167 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4169 ti = getutime() - ti;
4171 int maxrss = getmaxrss() / 1024;
4172 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);