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 /* first item specifies output metadata, second is input */
103 static MetadataMap (*meta_data_maps)[2] = NULL;
104 static int nb_meta_data_maps;
105 static int metadata_global_autocopy = 1;
106 static int metadata_streams_autocopy = 1;
107 static int metadata_chapters_autocopy = 1;
109 static int chapters_input_file = INT_MAX;
111 /* indexed by output file stream index */
112 static int *streamid_map = NULL;
113 static int nb_streamid_map = 0;
115 static int frame_width = 0;
116 static int frame_height = 0;
117 static float frame_aspect_ratio = 0;
118 static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
119 static enum AVSampleFormat audio_sample_fmt = AV_SAMPLE_FMT_NONE;
120 static int max_frames[4] = {INT_MAX, INT_MAX, INT_MAX, INT_MAX};
121 static AVRational frame_rate;
122 static float video_qscale = 0;
123 static uint16_t *intra_matrix = NULL;
124 static uint16_t *inter_matrix = NULL;
125 static const char *video_rc_override_string=NULL;
126 static int video_disable = 0;
127 static int video_discard = 0;
128 static unsigned int video_codec_tag = 0;
129 static char *video_language = NULL;
130 static int same_quant = 0;
131 static int do_deinterlace = 0;
132 static int top_field_first = -1;
133 static int me_threshold = 0;
134 static int intra_dc_precision = 8;
135 static int qp_hist = 0;
137 static char *vfilters = NULL;
140 static int audio_sample_rate = 0;
141 #define QSCALE_NONE -99999
142 static float audio_qscale = QSCALE_NONE;
143 static int audio_disable = 0;
144 static int audio_channels = 0;
145 static unsigned int audio_codec_tag = 0;
146 static char *audio_language = NULL;
148 static int subtitle_disable = 0;
149 static char *subtitle_language = NULL;
150 static unsigned int subtitle_codec_tag = 0;
152 static int data_disable = 0;
153 static unsigned int data_codec_tag = 0;
155 static float mux_preload= 0.5;
156 static float mux_max_delay= 0.7;
158 static int file_overwrite = 0;
159 static AVDictionary *metadata;
160 static int do_benchmark = 0;
161 static int do_hex_dump = 0;
162 static int do_pkt_dump = 0;
163 static int do_psnr = 0;
164 static int do_pass = 0;
165 static char *pass_logfilename_prefix = NULL;
166 static int video_sync_method= -1;
167 static int audio_sync_method= 0;
168 static float audio_drift_threshold= 0.1;
169 static int copy_ts= 0;
171 static int opt_shortest = 0;
172 static char *vstats_filename;
173 static FILE *vstats_file;
174 static int opt_programid = 0;
175 static int copy_initial_nonkeyframes = 0;
177 static int rate_emu = 0;
179 static int audio_volume = 256;
181 static int exit_on_error = 0;
182 static int using_stdin = 0;
183 static int verbose = 1;
184 static int64_t video_size = 0;
185 static int64_t audio_size = 0;
186 static int64_t extra_size = 0;
187 static int nb_frames_dup = 0;
188 static int nb_frames_drop = 0;
189 static int input_sync;
190 static int force_fps = 0;
191 static char *forced_key_frames = NULL;
193 static float dts_delta_threshold = 10;
195 static uint8_t *audio_buf;
196 static uint8_t *audio_out;
197 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
199 static short *samples;
201 static AVBitStreamFilterContext *video_bitstream_filters=NULL;
202 static AVBitStreamFilterContext *audio_bitstream_filters=NULL;
203 static AVBitStreamFilterContext *subtitle_bitstream_filters=NULL;
205 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
207 typedef struct InputStream {
210 int discard; /* true if stream data should be discarded */
211 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
214 int64_t start; /* time when read started */
215 int64_t next_pts; /* synthetic pts for cases where pkt.pts
217 int64_t pts; /* current pts */
218 PtsCorrectionContext pts_ctx;
220 int is_start; /* is 1 at the start and after a discontinuity */
221 int showed_multi_packet_warning;
225 typedef struct InputFile {
226 AVFormatContext *ctx;
227 int eof_reached; /* true if eof reached */
228 int ist_index; /* index of first stream in ist_table */
229 int buffer_size; /* current total buffer size */
231 int nb_streams; /* number of stream that avconv is aware of; may be different
232 from ctx.nb_streams if new streams appear during av_read_frame() */
235 typedef struct OutputStream {
236 int file_index; /* file index */
237 int index; /* stream index in the output file */
238 int source_index; /* InputStream index */
239 AVStream *st; /* stream in the output file */
240 int encoding_needed; /* true if encoding needed for this stream */
242 /* input pts and corresponding output pts
244 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
245 struct InputStream *sync_ist; /* input stream to sync against */
246 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
247 AVBitStreamFilterContext *bitstream_filters;
252 AVFrame pict_tmp; /* temporary image for resampling */
253 struct SwsContext *img_resample_ctx; /* for image resampling */
256 int resample_pix_fmt;
257 AVRational frame_rate;
259 float frame_aspect_ratio;
261 /* forced key frames */
262 int64_t *forced_kf_pts;
268 ReSampleContext *resample; /* for audio resampling */
269 int resample_sample_fmt;
270 int resample_channels;
271 int resample_sample_rate;
273 AVAudioConvert *reformat_ctx;
274 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
278 AVFilterContext *output_video_filter;
279 AVFilterContext *input_video_filter;
280 AVFilterBufferRef *picref;
282 AVFilterGraph *graph;
287 int is_past_recording_time;
291 typedef struct OutputFile {
292 AVFormatContext *ctx;
294 int ost_index; /* index of the first stream in output_streams */
295 int64_t recording_time; /* desired length of the resulting file in microseconds */
296 int64_t start_time; /* start time in microseconds */
297 uint64_t limit_filesize;
300 static InputStream *input_streams = NULL;
301 static int nb_input_streams = 0;
302 static InputFile *input_files = NULL;
303 static int nb_input_files = 0;
305 static OutputStream *output_streams = NULL;
306 static int nb_output_streams = 0;
307 static OutputFile *output_files = NULL;
308 static int nb_output_files = 0;
310 typedef struct OptionsContext {
311 /* input/output options */
315 SpecifierOpt *codec_names;
319 int64_t input_ts_offset;
322 StreamMap *stream_maps;
325 int64_t recording_time;
326 uint64_t limit_filesize;
329 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
332 for (i = 0; i < o->nb_ ## name; i++) {\
333 char *spec = o->name[i].specifier;\
334 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
335 outvar = o->name[i].u.type;\
341 static void reset_options(OptionsContext *o)
343 const OptionDef *po = options;
345 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
347 void *dst = (uint8_t*)o + po->u.off;
349 if (po->flags & OPT_SPEC) {
350 SpecifierOpt **so = dst;
351 int i, *count = (int*)(so + 1);
352 for (i = 0; i < *count; i++) {
353 av_freep(&(*so)[i].specifier);
354 if (po->flags & OPT_STRING)
355 av_freep(&(*so)[i].u.str);
359 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
364 av_freep(&o->stream_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_free(meta_data_maps);
518 av_freep(&input_streams);
519 av_freep(&input_files);
520 av_freep(&output_streams);
521 av_freep(&output_files);
526 allocated_audio_buf_size= allocated_audio_out_size= 0;
533 if (received_sigterm) {
535 "Received signal %d: terminating.\n",
536 (int) received_sigterm);
540 exit(ret); /* not all OS-es handle main() return value */
543 static void assert_avoptions(AVDictionary *m)
545 AVDictionaryEntry *t;
546 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
547 av_log(NULL, AV_LOG_ERROR, "Option %s not found.\n", t->key);
552 static void assert_codec_experimental(AVCodecContext *c, int encoder)
554 const char *codec_string = encoder ? "encoder" : "decoder";
556 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
557 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
558 av_log(NULL, AV_LOG_ERROR, "%s '%s' is experimental and might produce bad "
559 "results.\nAdd '-strict experimental' if you want to use it.\n",
560 codec_string, c->codec->name);
561 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
562 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
563 av_log(NULL, AV_LOG_ERROR, "Or use the non experimental %s '%s'.\n",
564 codec_string, codec->name);
569 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
571 if(codec && codec->sample_fmts){
572 const enum AVSampleFormat *p= codec->sample_fmts;
574 if(*p == st->codec->sample_fmt)
578 av_log(NULL, AV_LOG_WARNING,
579 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
580 av_get_sample_fmt_name(st->codec->sample_fmt),
582 av_get_sample_fmt_name(codec->sample_fmts[0]));
583 st->codec->sample_fmt = codec->sample_fmts[0];
589 * Update the requested input sample format based on the output sample format.
590 * This is currently only used to request float output from decoders which
591 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
592 * Ideally this will be removed in the future when decoders do not do format
593 * conversion and only output in their native format.
595 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
598 /* if sample formats match or a decoder sample format has already been
599 requested, just return */
600 if (enc->sample_fmt == dec->sample_fmt ||
601 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
604 /* if decoder supports more than one output format */
605 if (dec_codec && dec_codec->sample_fmts &&
606 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
607 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
608 const enum AVSampleFormat *p;
609 int min_dec = -1, min_inc = -1;
611 /* find a matching sample format in the encoder */
612 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
613 if (*p == enc->sample_fmt) {
614 dec->request_sample_fmt = *p;
616 } else if (*p > enc->sample_fmt) {
617 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
619 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
622 /* if none match, provide the one that matches quality closest */
623 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
624 enc->sample_fmt - min_dec;
628 static void choose_sample_rate(AVStream *st, AVCodec *codec)
630 if(codec && codec->supported_samplerates){
631 const int *p= codec->supported_samplerates;
633 int best_dist=INT_MAX;
635 int dist= abs(st->codec->sample_rate - *p);
636 if(dist < best_dist){
642 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
644 st->codec->sample_rate= best;
648 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
650 if(codec && codec->pix_fmts){
651 const enum PixelFormat *p= codec->pix_fmts;
652 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
653 if(st->codec->codec_id==CODEC_ID_MJPEG){
654 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
655 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
656 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};
660 if(*p == st->codec->pix_fmt)
664 if(st->codec->pix_fmt != PIX_FMT_NONE)
665 av_log(NULL, AV_LOG_WARNING,
666 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
667 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
669 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
670 st->codec->pix_fmt = codec->pix_fmts[0];
676 get_sync_ipts(const OutputStream *ost)
678 const InputStream *ist = ost->sync_ist;
679 OutputFile *of = &output_files[ost->file_index];
680 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
683 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
687 AVPacket new_pkt= *pkt;
688 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
689 &new_pkt.data, &new_pkt.size,
690 pkt->data, pkt->size,
691 pkt->flags & AV_PKT_FLAG_KEY);
694 new_pkt.destruct= av_destruct_packet;
696 fprintf(stderr, "%s failed for stream %d, codec %s",
697 bsfc->filter->name, pkt->stream_index,
698 avctx->codec ? avctx->codec->name : "copy");
708 ret= av_interleaved_write_frame(s, pkt);
710 print_error("av_interleaved_write_frame()", ret);
715 static void do_audio_out(AVFormatContext *s,
718 unsigned char *buf, int size)
721 int64_t audio_out_size, audio_buf_size;
722 int64_t allocated_for_size= size;
724 int size_out, frame_bytes, ret, resample_changed;
725 AVCodecContext *enc= ost->st->codec;
726 AVCodecContext *dec= ist->st->codec;
727 int osize = av_get_bytes_per_sample(enc->sample_fmt);
728 int isize = av_get_bytes_per_sample(dec->sample_fmt);
729 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
732 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
733 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
734 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
735 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
736 audio_buf_size*= osize*enc->channels;
738 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
739 if(coded_bps > 8*osize)
740 audio_out_size= audio_out_size * coded_bps / (8*osize);
741 audio_out_size += FF_MIN_BUFFER_SIZE;
743 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
744 fprintf(stderr, "Buffer sizes too large\n");
748 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
749 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
750 if (!audio_buf || !audio_out){
751 fprintf(stderr, "Out of memory in do_audio_out\n");
755 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
756 ost->audio_resample = 1;
758 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
759 ost->resample_channels != dec->channels ||
760 ost->resample_sample_rate != dec->sample_rate;
762 if ((ost->audio_resample && !ost->resample) || resample_changed) {
763 if (resample_changed) {
764 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",
765 ist->file_index, ist->st->index,
766 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
767 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
768 ost->resample_sample_fmt = dec->sample_fmt;
769 ost->resample_channels = dec->channels;
770 ost->resample_sample_rate = dec->sample_rate;
772 audio_resample_close(ost->resample);
774 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
775 if (audio_sync_method <= 1 &&
776 ost->resample_sample_fmt == enc->sample_fmt &&
777 ost->resample_channels == enc->channels &&
778 ost->resample_sample_rate == enc->sample_rate) {
779 ost->resample = NULL;
780 ost->audio_resample = 0;
781 } else if (ost->audio_resample) {
782 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
783 fprintf(stderr, "Warning, using s16 intermediate sample format for resampling\n");
784 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
785 enc->sample_rate, dec->sample_rate,
786 enc->sample_fmt, dec->sample_fmt,
788 if (!ost->resample) {
789 fprintf(stderr, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
790 dec->channels, dec->sample_rate,
791 enc->channels, enc->sample_rate);
797 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
798 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
799 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
800 if (ost->reformat_ctx)
801 av_audio_convert_free(ost->reformat_ctx);
802 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
803 dec->sample_fmt, 1, NULL, 0);
804 if (!ost->reformat_ctx) {
805 fprintf(stderr, "Cannot convert %s sample format to %s sample format\n",
806 av_get_sample_fmt_name(dec->sample_fmt),
807 av_get_sample_fmt_name(enc->sample_fmt));
810 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
813 if(audio_sync_method){
814 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
815 - av_fifo_size(ost->fifo)/(enc->channels * 2);
816 double idelta= delta*dec->sample_rate / enc->sample_rate;
817 int byte_delta= ((int)idelta)*2*dec->channels;
819 //FIXME resample delay
820 if(fabs(delta) > 50){
821 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
823 byte_delta= FFMAX(byte_delta, -size);
827 fprintf(stderr, "discarding %d audio samples\n", (int)-delta);
832 static uint8_t *input_tmp= NULL;
833 input_tmp= av_realloc(input_tmp, byte_delta + size);
835 if(byte_delta > allocated_for_size - size){
836 allocated_for_size= byte_delta + (int64_t)size;
841 memset(input_tmp, 0, byte_delta);
842 memcpy(input_tmp + byte_delta, buf, size);
846 fprintf(stderr, "adding %d audio samples of silence\n", (int)delta);
848 }else if(audio_sync_method>1){
849 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
850 av_assert0(ost->audio_resample);
852 fprintf(stderr, "compensating audio timestamp drift:%f compensation:%d in:%d\n", delta, comp, enc->sample_rate);
853 // 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));
854 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
858 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
859 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
861 if (ost->audio_resample) {
863 size_out = audio_resample(ost->resample,
864 (short *)buftmp, (short *)buf,
865 size / (dec->channels * isize));
866 size_out = size_out * enc->channels * osize;
872 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
873 const void *ibuf[6]= {buftmp};
874 void *obuf[6]= {audio_buf};
875 int istride[6]= {isize};
876 int ostride[6]= {osize};
877 int len= size_out/istride[0];
878 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
879 printf("av_audio_convert() failed\n");
885 size_out = len*osize;
888 /* now encode as many frames as possible */
889 if (enc->frame_size > 1) {
890 /* output resampled raw samples */
891 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
892 fprintf(stderr, "av_fifo_realloc2() failed\n");
895 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
897 frame_bytes = enc->frame_size * osize * enc->channels;
899 while (av_fifo_size(ost->fifo) >= frame_bytes) {
901 av_init_packet(&pkt);
903 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
905 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
907 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
910 fprintf(stderr, "Audio encoding failed\n");
914 pkt.stream_index= ost->index;
917 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
918 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
919 pkt.flags |= AV_PKT_FLAG_KEY;
920 write_frame(s, &pkt, enc, ost->bitstream_filters);
922 ost->sync_opts += enc->frame_size;
926 av_init_packet(&pkt);
928 ost->sync_opts += size_out / (osize * enc->channels);
930 /* output a pcm frame */
931 /* determine the size of the coded buffer */
934 size_out = size_out*coded_bps/8;
936 if(size_out > audio_out_size){
937 fprintf(stderr, "Internal error, buffer size too small\n");
941 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
942 ret = avcodec_encode_audio(enc, audio_out, size_out,
945 fprintf(stderr, "Audio encoding failed\n");
949 pkt.stream_index= ost->index;
952 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
953 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
954 pkt.flags |= AV_PKT_FLAG_KEY;
955 write_frame(s, &pkt, enc, ost->bitstream_filters);
959 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
963 AVPicture picture_tmp;
966 dec = ist->st->codec;
968 /* deinterlace : must be done before any resize */
969 if (do_deinterlace) {
972 /* create temporary picture */
973 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
974 buf = av_malloc(size);
978 picture2 = &picture_tmp;
979 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
981 if(avpicture_deinterlace(picture2, picture,
982 dec->pix_fmt, dec->width, dec->height) < 0) {
983 /* if error, do not deinterlace */
984 fprintf(stderr, "Deinterlacing failed\n");
993 if (picture != picture2)
994 *picture = *picture2;
998 static void do_subtitle_out(AVFormatContext *s,
1004 static uint8_t *subtitle_out = NULL;
1005 int subtitle_out_max_size = 1024 * 1024;
1006 int subtitle_out_size, nb, i;
1007 AVCodecContext *enc;
1010 if (pts == AV_NOPTS_VALUE) {
1011 fprintf(stderr, "Subtitle packets must have a pts\n");
1017 enc = ost->st->codec;
1019 if (!subtitle_out) {
1020 subtitle_out = av_malloc(subtitle_out_max_size);
1023 /* Note: DVB subtitle need one packet to draw them and one other
1024 packet to clear them */
1025 /* XXX: signal it in the codec context ? */
1026 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1031 for(i = 0; i < nb; i++) {
1032 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1033 // start_display_time is required to be 0
1034 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1035 sub->end_display_time -= sub->start_display_time;
1036 sub->start_display_time = 0;
1037 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1038 subtitle_out_max_size, sub);
1039 if (subtitle_out_size < 0) {
1040 fprintf(stderr, "Subtitle encoding failed\n");
1044 av_init_packet(&pkt);
1045 pkt.stream_index = ost->index;
1046 pkt.data = subtitle_out;
1047 pkt.size = subtitle_out_size;
1048 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1049 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1050 /* XXX: the pts correction is handled here. Maybe handling
1051 it in the codec would be better */
1053 pkt.pts += 90 * sub->start_display_time;
1055 pkt.pts += 90 * sub->end_display_time;
1057 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1061 static int bit_buffer_size= 1024*256;
1062 static uint8_t *bit_buffer= NULL;
1064 static void do_video_resample(OutputStream *ost,
1066 AVFrame *in_picture,
1067 AVFrame **out_picture)
1069 int resample_changed = 0;
1070 AVCodecContext *dec = ist->st->codec;
1071 *out_picture = in_picture;
1073 resample_changed = ost->resample_width != dec->width ||
1074 ost->resample_height != dec->height ||
1075 ost->resample_pix_fmt != dec->pix_fmt;
1077 if (resample_changed) {
1078 av_log(NULL, AV_LOG_INFO,
1079 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1080 ist->file_index, ist->st->index,
1081 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1082 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1083 if(!ost->video_resample)
1084 ost->video_resample = 1;
1087 #if !CONFIG_AVFILTER
1088 if (ost->video_resample) {
1089 *out_picture = &ost->pict_tmp;
1090 if (resample_changed) {
1091 /* initialize a new scaler context */
1092 sws_freeContext(ost->img_resample_ctx);
1093 ost->img_resample_ctx = sws_getContext(
1094 ist->st->codec->width,
1095 ist->st->codec->height,
1096 ist->st->codec->pix_fmt,
1097 ost->st->codec->width,
1098 ost->st->codec->height,
1099 ost->st->codec->pix_fmt,
1100 ost->sws_flags, NULL, NULL, NULL);
1101 if (ost->img_resample_ctx == NULL) {
1102 fprintf(stderr, "Cannot get resampling context\n");
1106 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1107 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1110 if (resample_changed) {
1111 avfilter_graph_free(&ost->graph);
1112 if (configure_video_filters(ist, ost)) {
1113 fprintf(stderr, "Error reinitializing filters!\n");
1118 if (resample_changed) {
1119 ost->resample_width = dec->width;
1120 ost->resample_height = dec->height;
1121 ost->resample_pix_fmt = dec->pix_fmt;
1126 static void do_video_out(AVFormatContext *s,
1129 AVFrame *in_picture,
1130 int *frame_size, float quality)
1132 int nb_frames, i, ret, format_video_sync;
1133 AVFrame *final_picture;
1134 AVCodecContext *enc;
1137 enc = ost->st->codec;
1139 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1141 /* by default, we output a single frame */
1146 format_video_sync = video_sync_method;
1147 if (format_video_sync < 0)
1148 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1150 if (format_video_sync) {
1151 double vdelta = sync_ipts - ost->sync_opts;
1152 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1155 else if (format_video_sync == 2) {
1158 }else if(vdelta>0.6)
1159 ost->sync_opts= lrintf(sync_ipts);
1160 }else if (vdelta > 1.1)
1161 nb_frames = lrintf(vdelta);
1162 //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);
1163 if (nb_frames == 0){
1166 fprintf(stderr, "*** drop!\n");
1167 }else if (nb_frames > 1) {
1168 nb_frames_dup += nb_frames - 1;
1170 fprintf(stderr, "*** %d dup!\n", nb_frames-1);
1173 ost->sync_opts= lrintf(sync_ipts);
1175 nb_frames= FFMIN(nb_frames, max_frames[AVMEDIA_TYPE_VIDEO] - ost->frame_number);
1179 do_video_resample(ost, ist, in_picture, &final_picture);
1181 /* duplicates frame if needed */
1182 for(i=0;i<nb_frames;i++) {
1184 av_init_packet(&pkt);
1185 pkt.stream_index= ost->index;
1187 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1188 /* raw pictures are written as AVPicture structure to
1189 avoid any copies. We support temporarily the older
1191 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1192 enc->coded_frame->top_field_first = in_picture->top_field_first;
1193 pkt.data= (uint8_t *)final_picture;
1194 pkt.size= sizeof(AVPicture);
1195 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1196 pkt.flags |= AV_PKT_FLAG_KEY;
1198 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1200 AVFrame big_picture;
1202 big_picture= *final_picture;
1203 /* better than nothing: use input picture interlaced
1205 big_picture.interlaced_frame = in_picture->interlaced_frame;
1206 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1207 if(top_field_first == -1)
1208 big_picture.top_field_first = in_picture->top_field_first;
1210 big_picture.top_field_first = top_field_first;
1213 /* handles same_quant here. This is not correct because it may
1214 not be a global option */
1215 big_picture.quality = quality;
1217 big_picture.pict_type = 0;
1218 // big_picture.pts = AV_NOPTS_VALUE;
1219 big_picture.pts= ost->sync_opts;
1220 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1221 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1222 if (ost->forced_kf_index < ost->forced_kf_count &&
1223 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1224 big_picture.pict_type = AV_PICTURE_TYPE_I;
1225 ost->forced_kf_index++;
1227 ret = avcodec_encode_video(enc,
1228 bit_buffer, bit_buffer_size,
1231 fprintf(stderr, "Video encoding failed\n");
1236 pkt.data= bit_buffer;
1238 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1239 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1240 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1241 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1242 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1244 if(enc->coded_frame->key_frame)
1245 pkt.flags |= AV_PKT_FLAG_KEY;
1246 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1249 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1250 // enc->frame_number-1, ret, enc->pict_type);
1251 /* if two pass, output log */
1252 if (ost->logfile && enc->stats_out) {
1253 fprintf(ost->logfile, "%s", enc->stats_out);
1258 ost->frame_number++;
1262 static double psnr(double d){
1263 return -10.0*log(d)/log(10.0);
1266 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1269 AVCodecContext *enc;
1271 double ti1, bitrate, avg_bitrate;
1273 /* this is executed just the first time do_video_stats is called */
1275 vstats_file = fopen(vstats_filename, "w");
1282 enc = ost->st->codec;
1283 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1284 frame_number = ost->frame_number;
1285 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1286 if (enc->flags&CODEC_FLAG_PSNR)
1287 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1289 fprintf(vstats_file,"f_size= %6d ", frame_size);
1290 /* compute pts value */
1291 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1295 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1296 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1297 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1298 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1299 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1303 static void print_report(OutputFile *output_files,
1304 OutputStream *ost_table, int nb_ostreams,
1305 int is_last_report, int64_t timer_start)
1309 AVFormatContext *oc;
1311 AVCodecContext *enc;
1312 int frame_number, vid, i;
1313 double bitrate, ti1, pts;
1314 static int64_t last_time = -1;
1315 static int qp_histogram[52];
1317 if (!is_last_report) {
1319 /* display the report every 0.5 seconds */
1320 cur_time = av_gettime();
1321 if (last_time == -1) {
1322 last_time = cur_time;
1325 if ((cur_time - last_time) < 500000)
1327 last_time = cur_time;
1331 oc = output_files[0].ctx;
1333 total_size = avio_size(oc->pb);
1334 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1335 total_size= avio_tell(oc->pb);
1340 for(i=0;i<nb_ostreams;i++) {
1342 ost = &ost_table[i];
1343 enc = ost->st->codec;
1344 if (!ost->st->stream_copy && enc->coded_frame)
1345 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1346 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1347 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1349 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1350 float t = (av_gettime()-timer_start) / 1000000.0;
1352 frame_number = ost->frame_number;
1353 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1354 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1356 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1360 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1363 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1365 if (enc->flags&CODEC_FLAG_PSNR){
1367 double error, error_sum=0;
1368 double scale, scale_sum=0;
1369 char type[3]= {'Y','U','V'};
1370 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1373 error= enc->error[j];
1374 scale= enc->width*enc->height*255.0*255.0*frame_number;
1376 error= enc->coded_frame->error[j];
1377 scale= enc->width*enc->height*255.0*255.0;
1382 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1384 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1388 /* compute min output value */
1389 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1390 if ((pts < ti1) && (pts > 0))
1396 if (verbose > 0 || is_last_report) {
1397 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1399 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1400 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1401 (double)total_size / 1024, ti1, bitrate);
1403 if (nb_frames_dup || nb_frames_drop)
1404 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1405 nb_frames_dup, nb_frames_drop);
1408 fprintf(stderr, "%s \r", buf);
1413 if (is_last_report && verbose >= 0){
1414 int64_t raw= audio_size + video_size + extra_size;
1415 fprintf(stderr, "\n");
1416 fprintf(stderr, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1420 100.0*(total_size - raw)/raw
1425 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1427 int fill_char = 0x00;
1428 if (sample_fmt == AV_SAMPLE_FMT_U8)
1430 memset(buf, fill_char, size);
1433 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1437 for (i = 0; i < nb_ostreams; i++) {
1438 OutputStream *ost = &ost_table[i];
1439 AVCodecContext *enc = ost->st->codec;
1440 AVFormatContext *os = output_files[ost->file_index].ctx;
1442 if (!ost->encoding_needed)
1445 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1447 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1453 av_init_packet(&pkt);
1454 pkt.stream_index= ost->index;
1456 switch (ost->st->codec->codec_type) {
1457 case AVMEDIA_TYPE_AUDIO:
1458 fifo_bytes = av_fifo_size(ost->fifo);
1460 /* encode any samples remaining in fifo */
1461 if (fifo_bytes > 0) {
1462 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1463 int fs_tmp = enc->frame_size;
1465 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1466 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1467 enc->frame_size = fifo_bytes / (osize * enc->channels);
1469 int frame_bytes = enc->frame_size*osize*enc->channels;
1470 if (allocated_audio_buf_size < frame_bytes)
1472 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1475 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1476 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1477 ost->st->time_base.num, enc->sample_rate);
1478 enc->frame_size = fs_tmp;
1481 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1484 fprintf(stderr, "Audio encoding failed\n");
1488 pkt.flags |= AV_PKT_FLAG_KEY;
1490 case AVMEDIA_TYPE_VIDEO:
1491 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1493 fprintf(stderr, "Video encoding failed\n");
1497 if(enc->coded_frame && enc->coded_frame->key_frame)
1498 pkt.flags |= AV_PKT_FLAG_KEY;
1499 if (ost->logfile && enc->stats_out) {
1500 fprintf(ost->logfile, "%s", enc->stats_out);
1509 pkt.data = bit_buffer;
1511 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1512 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1513 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1518 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1519 static int output_packet(InputStream *ist, int ist_index,
1520 OutputStream *ost_table, int nb_ostreams,
1521 const AVPacket *pkt)
1523 AVFormatContext *os;
1528 void *buffer_to_free = NULL;
1529 static unsigned int samples_size= 0;
1530 AVSubtitle subtitle, *subtitle_to_free;
1531 int64_t pkt_pts = AV_NOPTS_VALUE;
1533 int frame_available;
1538 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1540 if(ist->next_pts == AV_NOPTS_VALUE)
1541 ist->next_pts= ist->pts;
1545 av_init_packet(&avpkt);
1553 if(pkt->dts != AV_NOPTS_VALUE)
1554 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1555 if(pkt->pts != AV_NOPTS_VALUE)
1556 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1558 //while we have more to decode or while the decoder did output something on EOF
1559 while (avpkt.size > 0 || (!pkt && got_output)) {
1560 uint8_t *data_buf, *decoded_data_buf;
1561 int data_size, decoded_data_size;
1563 ist->pts= ist->next_pts;
1565 if(avpkt.size && avpkt.size != pkt->size &&
1566 ((!ist->showed_multi_packet_warning && verbose>0) || verbose>1)){
1567 fprintf(stderr, "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1568 ist->showed_multi_packet_warning=1;
1571 /* decode the packet if needed */
1572 decoded_data_buf = NULL; /* fail safe */
1573 decoded_data_size= 0;
1574 data_buf = avpkt.data;
1575 data_size = avpkt.size;
1576 subtitle_to_free = NULL;
1577 if (ist->decoding_needed) {
1578 switch(ist->st->codec->codec_type) {
1579 case AVMEDIA_TYPE_AUDIO:{
1580 if(pkt && samples_size < FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1581 samples_size = FFMAX(pkt->size*sizeof(*samples), AVCODEC_MAX_AUDIO_FRAME_SIZE);
1583 samples= av_malloc(samples_size);
1585 decoded_data_size= samples_size;
1586 /* XXX: could avoid copy if PCM 16 bits with same
1587 endianness as CPU */
1588 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1595 got_output = decoded_data_size > 0;
1596 /* Some bug in mpeg audio decoder gives */
1597 /* decoded_data_size < 0, it seems they are overflows */
1599 /* no audio frame */
1602 decoded_data_buf = (uint8_t *)samples;
1603 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1604 (ist->st->codec->sample_rate * ist->st->codec->channels);
1606 case AVMEDIA_TYPE_VIDEO:
1607 decoded_data_size = (ist->st->codec->width * ist->st->codec->height * 3) / 2;
1608 /* XXX: allocate picture correctly */
1609 avcodec_get_frame_defaults(&picture);
1610 avpkt.pts = pkt_pts;
1611 avpkt.dts = ist->pts;
1612 pkt_pts = AV_NOPTS_VALUE;
1614 ret = avcodec_decode_video2(ist->st->codec,
1615 &picture, &got_output, &avpkt);
1616 quality = same_quant ? picture.quality : 0;
1620 /* no picture yet */
1621 goto discard_packet;
1623 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, picture.pkt_pts, picture.pkt_dts);
1624 if (ist->st->codec->time_base.num != 0) {
1625 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1626 ist->next_pts += ((int64_t)AV_TIME_BASE *
1627 ist->st->codec->time_base.num * ticks) /
1628 ist->st->codec->time_base.den;
1631 buffer_to_free = NULL;
1632 pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
1634 case AVMEDIA_TYPE_SUBTITLE:
1635 ret = avcodec_decode_subtitle2(ist->st->codec,
1636 &subtitle, &got_output, &avpkt);
1640 goto discard_packet;
1642 subtitle_to_free = &subtitle;
1649 switch(ist->st->codec->codec_type) {
1650 case AVMEDIA_TYPE_AUDIO:
1651 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1652 ist->st->codec->sample_rate;
1654 case AVMEDIA_TYPE_VIDEO:
1655 if (ist->st->codec->time_base.num != 0) {
1656 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1657 ist->next_pts += ((int64_t)AV_TIME_BASE *
1658 ist->st->codec->time_base.num * ticks) /
1659 ist->st->codec->time_base.den;
1666 // preprocess audio (volume)
1667 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1668 if (audio_volume != 256) {
1671 for(i=0;i<(decoded_data_size / sizeof(short));i++) {
1672 int v = ((*volp) * audio_volume + 128) >> 8;
1673 *volp++ = av_clip_int16(v);
1678 /* frame rate emulation */
1680 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1681 int64_t now = av_gettime() - ist->start;
1685 /* if output time reached then transcode raw format,
1686 encode packets and output them */
1687 for (i = 0; i < nb_ostreams; i++) {
1688 OutputFile *of = &output_files[ost_table[i].file_index];
1691 ost = &ost_table[i];
1692 if (ost->source_index != ist_index)
1695 if (of->start_time && ist->pts < of->start_time)
1698 if (of->recording_time != INT64_MAX &&
1699 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1700 (AVRational){1, 1000000}) >= 0) {
1701 ost->is_past_recording_time = 1;
1706 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1707 ost->input_video_filter) {
1709 if (ist->st->sample_aspect_ratio.num)
1710 sar = ist->st->sample_aspect_ratio;
1712 sar = ist->st->codec->sample_aspect_ratio;
1713 av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, ist->pts, sar);
1715 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1716 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1717 while (frame_available) {
1718 AVRational ist_pts_tb;
1719 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1720 get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
1722 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1724 os = output_files[ost->file_index].ctx;
1726 /* set the input output pts pairs */
1727 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1729 if (ost->encoding_needed) {
1730 av_assert0(ist->decoding_needed);
1731 switch(ost->st->codec->codec_type) {
1732 case AVMEDIA_TYPE_AUDIO:
1733 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1735 case AVMEDIA_TYPE_VIDEO:
1737 if (ost->picref->video && !ost->frame_aspect_ratio)
1738 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1740 do_video_out(os, ost, ist, &picture, &frame_size,
1741 same_quant ? quality : ost->st->codec->global_quality);
1742 if (vstats_filename && frame_size)
1743 do_video_stats(os, ost, frame_size);
1745 case AVMEDIA_TYPE_SUBTITLE:
1746 do_subtitle_out(os, ost, ist, &subtitle,
1753 AVFrame avframe; //FIXME/XXX remove this
1755 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1757 av_init_packet(&opkt);
1759 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1760 #if !CONFIG_AVFILTER
1766 /* no reencoding needed : output the packet directly */
1767 /* force the input stream PTS */
1769 avcodec_get_frame_defaults(&avframe);
1770 ost->st->codec->coded_frame= &avframe;
1771 avframe.key_frame = pkt->flags & AV_PKT_FLAG_KEY;
1773 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1774 audio_size += data_size;
1775 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1776 video_size += data_size;
1780 opkt.stream_index= ost->index;
1781 if(pkt->pts != AV_NOPTS_VALUE)
1782 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1784 opkt.pts= AV_NOPTS_VALUE;
1786 if (pkt->dts == AV_NOPTS_VALUE)
1787 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1789 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1790 opkt.dts -= ost_tb_start_time;
1792 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1793 opkt.flags= pkt->flags;
1795 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1796 if( ost->st->codec->codec_id != CODEC_ID_H264
1797 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1798 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1800 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1801 opkt.destruct= av_destruct_packet;
1803 opkt.data = data_buf;
1804 opkt.size = data_size;
1807 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1808 ost->st->codec->frame_number++;
1809 ost->frame_number++;
1810 av_free_packet(&opkt);
1814 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1815 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1817 avfilter_unref_buffer(ost->picref);
1822 av_free(buffer_to_free);
1823 /* XXX: allocate the subtitles in the codec ? */
1824 if (subtitle_to_free) {
1825 avsubtitle_free(subtitle_to_free);
1826 subtitle_to_free = NULL;
1834 static void print_sdp(OutputFile *output_files, int n)
1838 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1842 for (i = 0; i < n; i++)
1843 avc[i] = output_files[i].ctx;
1845 av_sdp_create(avc, n, sdp, sizeof(sdp));
1846 printf("SDP:\n%s\n", sdp);
1851 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1852 char *error, int error_len)
1855 InputStream *ist = &input_streams[ist_index];
1856 if (ist->decoding_needed) {
1857 AVCodec *codec = ist->dec;
1859 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1860 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1861 return AVERROR(EINVAL);
1864 /* update requested sample format for the decoder based on the
1865 corresponding encoder sample format */
1866 for (i = 0; i < nb_output_streams; i++) {
1867 OutputStream *ost = &output_streams[i];
1868 if (ost->source_index == ist_index) {
1869 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1874 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1875 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1876 ist->file_index, ist->st->index);
1877 return AVERROR(EINVAL);
1879 assert_codec_experimental(ist->st->codec, 0);
1880 assert_avoptions(ist->opts);
1883 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;
1884 ist->next_pts = AV_NOPTS_VALUE;
1885 init_pts_correction(&ist->pts_ctx);
1891 static int transcode_init(OutputFile *output_files,
1892 int nb_output_files,
1893 InputFile *input_files,
1897 AVFormatContext *os;
1898 AVCodecContext *codec, *icodec;
1905 for (i = 0; i < nb_input_streams; i++)
1906 input_streams[i].start = av_gettime();
1908 /* output stream init */
1909 for(i=0;i<nb_output_files;i++) {
1910 os = output_files[i].ctx;
1911 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1912 av_dump_format(os, i, os->filename, 1);
1913 fprintf(stderr, "Output file #%d does not contain any stream\n", i);
1914 return AVERROR(EINVAL);
1918 /* for each output stream, we compute the right encoding parameters */
1919 for (i = 0; i < nb_output_streams; i++) {
1920 ost = &output_streams[i];
1921 os = output_files[ost->file_index].ctx;
1922 ist = &input_streams[ost->source_index];
1924 codec = ost->st->codec;
1925 icodec = ist->st->codec;
1927 ost->st->disposition = ist->st->disposition;
1928 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1929 codec->chroma_sample_location = icodec->chroma_sample_location;
1931 if (ost->st->stream_copy) {
1932 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1934 if (extra_size > INT_MAX) {
1935 return AVERROR(EINVAL);
1938 /* if stream_copy is selected, no need to decode or encode */
1939 codec->codec_id = icodec->codec_id;
1940 codec->codec_type = icodec->codec_type;
1942 if(!codec->codec_tag){
1943 if( !os->oformat->codec_tag
1944 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
1945 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
1946 codec->codec_tag = icodec->codec_tag;
1949 codec->bit_rate = icodec->bit_rate;
1950 codec->rc_max_rate = icodec->rc_max_rate;
1951 codec->rc_buffer_size = icodec->rc_buffer_size;
1952 codec->extradata= av_mallocz(extra_size);
1953 if (!codec->extradata) {
1954 return AVERROR(ENOMEM);
1956 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
1957 codec->extradata_size= icodec->extradata_size;
1958 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){
1959 codec->time_base = icodec->time_base;
1960 codec->time_base.num *= icodec->ticks_per_frame;
1961 av_reduce(&codec->time_base.num, &codec->time_base.den,
1962 codec->time_base.num, codec->time_base.den, INT_MAX);
1964 codec->time_base = ist->st->time_base;
1965 switch(codec->codec_type) {
1966 case AVMEDIA_TYPE_AUDIO:
1967 if(audio_volume != 256) {
1968 fprintf(stderr,"-acodec copy and -vol are incompatible (frames are not decoded)\n");
1971 codec->channel_layout = icodec->channel_layout;
1972 codec->sample_rate = icodec->sample_rate;
1973 codec->channels = icodec->channels;
1974 codec->frame_size = icodec->frame_size;
1975 codec->audio_service_type = icodec->audio_service_type;
1976 codec->block_align= icodec->block_align;
1977 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
1978 codec->block_align= 0;
1979 if(codec->codec_id == CODEC_ID_AC3)
1980 codec->block_align= 0;
1982 case AVMEDIA_TYPE_VIDEO:
1983 codec->pix_fmt = icodec->pix_fmt;
1984 codec->width = icodec->width;
1985 codec->height = icodec->height;
1986 codec->has_b_frames = icodec->has_b_frames;
1987 if (!codec->sample_aspect_ratio.num) {
1988 codec->sample_aspect_ratio =
1989 ost->st->sample_aspect_ratio =
1990 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
1991 ist->st->codec->sample_aspect_ratio.num ?
1992 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
1995 case AVMEDIA_TYPE_SUBTITLE:
1996 codec->width = icodec->width;
1997 codec->height = icodec->height;
1999 case AVMEDIA_TYPE_DATA:
2006 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2007 switch(codec->codec_type) {
2008 case AVMEDIA_TYPE_AUDIO:
2009 ost->fifo= av_fifo_alloc(1024);
2011 return AVERROR(ENOMEM);
2013 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2014 if (!codec->sample_rate) {
2015 codec->sample_rate = icodec->sample_rate;
2017 codec->sample_rate >>= icodec->lowres;
2019 choose_sample_rate(ost->st, ost->enc);
2020 codec->time_base = (AVRational){1, codec->sample_rate};
2021 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2022 codec->sample_fmt = icodec->sample_fmt;
2023 choose_sample_fmt(ost->st, ost->enc);
2024 if (!codec->channels)
2025 codec->channels = icodec->channels;
2026 codec->channel_layout = icodec->channel_layout;
2027 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2028 codec->channel_layout = 0;
2029 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2030 icodec->request_channels = codec->channels;
2031 ist->decoding_needed = 1;
2032 ost->encoding_needed = 1;
2033 ost->resample_sample_fmt = icodec->sample_fmt;
2034 ost->resample_sample_rate = icodec->sample_rate;
2035 ost->resample_channels = icodec->channels;
2037 case AVMEDIA_TYPE_VIDEO:
2038 if (codec->pix_fmt == PIX_FMT_NONE)
2039 codec->pix_fmt = icodec->pix_fmt;
2040 choose_pixel_fmt(ost->st, ost->enc);
2042 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2043 fprintf(stderr, "Video pixel format is unknown, stream cannot be encoded\n");
2047 if (!codec->width || !codec->height) {
2048 codec->width = icodec->width;
2049 codec->height = icodec->height;
2052 ost->video_resample = codec->width != icodec->width ||
2053 codec->height != icodec->height ||
2054 codec->pix_fmt != icodec->pix_fmt;
2055 if (ost->video_resample) {
2056 #if !CONFIG_AVFILTER
2057 avcodec_get_frame_defaults(&ost->pict_tmp);
2058 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2059 codec->width, codec->height)) {
2060 fprintf(stderr, "Cannot allocate temp picture, check pix fmt\n");
2063 ost->img_resample_ctx = sws_getContext(
2070 ost->sws_flags, NULL, NULL, NULL);
2071 if (ost->img_resample_ctx == NULL) {
2072 fprintf(stderr, "Cannot get resampling context\n");
2076 codec->bits_per_raw_sample= 0;
2079 ost->resample_height = icodec->height;
2080 ost->resample_width = icodec->width;
2081 ost->resample_pix_fmt= icodec->pix_fmt;
2082 ost->encoding_needed = 1;
2083 ist->decoding_needed = 1;
2085 if (!ost->frame_rate.num)
2086 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2087 if (ost->enc && ost->enc->supported_framerates && !force_fps) {
2088 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2089 ost->frame_rate = ost->enc->supported_framerates[idx];
2091 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2094 if (configure_video_filters(ist, ost)) {
2095 fprintf(stderr, "Error opening filters!\n");
2100 case AVMEDIA_TYPE_SUBTITLE:
2101 ost->encoding_needed = 1;
2102 ist->decoding_needed = 1;
2109 if (ost->encoding_needed &&
2110 (codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2111 char logfilename[1024];
2114 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2115 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2117 if (codec->flags & CODEC_FLAG_PASS1) {
2118 f = fopen(logfilename, "wb");
2120 fprintf(stderr, "Cannot write log file '%s' for pass-1 encoding: %s\n", logfilename, strerror(errno));
2126 size_t logbuffer_size;
2127 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2128 fprintf(stderr, "Error reading log file '%s' for pass-2 encoding\n", logfilename);
2131 codec->stats_in = logbuffer;
2135 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2136 int size= codec->width * codec->height;
2137 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2142 bit_buffer = av_malloc(bit_buffer_size);
2144 fprintf(stderr, "Cannot allocate %d bytes output buffer\n",
2146 return AVERROR(ENOMEM);
2149 /* open each encoder */
2150 for (i = 0; i < nb_output_streams; i++) {
2151 ost = &output_streams[i];
2152 if (ost->encoding_needed) {
2153 AVCodec *codec = ost->enc;
2154 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2156 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2157 ost->st->codec->codec_id, ost->file_index, ost->index);
2158 ret = AVERROR(EINVAL);
2161 if (dec->subtitle_header) {
2162 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2163 if (!ost->st->codec->subtitle_header) {
2164 ret = AVERROR(ENOMEM);
2167 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2168 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2170 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2171 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2172 ost->file_index, ost->index);
2173 ret = AVERROR(EINVAL);
2176 assert_codec_experimental(ost->st->codec, 1);
2177 assert_avoptions(ost->opts);
2178 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2179 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2180 "It takes bits/s as argument, not kbits/s\n");
2181 extra_size += ost->st->codec->extradata_size;
2185 /* init input streams */
2186 for (i = 0; i < nb_input_streams; i++)
2187 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2190 /* open files and write file headers */
2191 for (i = 0; i < nb_output_files; i++) {
2192 os = output_files[i].ctx;
2193 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2194 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2195 ret = AVERROR(EINVAL);
2198 assert_avoptions(output_files[i].opts);
2199 if (strcmp(os->oformat->name, "rtp")) {
2205 /* dump the file output parameters - cannot be done before in case
2207 for(i=0;i<nb_output_files;i++) {
2208 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2211 /* dump the stream mapping */
2213 fprintf(stderr, "Stream mapping:\n");
2214 for (i = 0; i < nb_output_streams;i ++) {
2215 ost = &output_streams[i];
2216 fprintf(stderr, " Stream #%d.%d -> #%d.%d",
2217 input_streams[ost->source_index].file_index,
2218 input_streams[ost->source_index].st->index,
2221 if (ost->sync_ist != &input_streams[ost->source_index])
2222 fprintf(stderr, " [sync #%d.%d]",
2223 ost->sync_ist->file_index,
2224 ost->sync_ist->st->index);
2225 if (ost->st->stream_copy)
2226 fprintf(stderr, " (copy)");
2228 fprintf(stderr, " (%s -> %s)", input_streams[ost->source_index].dec ?
2229 input_streams[ost->source_index].dec->name : "?",
2230 ost->enc ? ost->enc->name : "?");
2231 fprintf(stderr, "\n");
2236 fprintf(stderr, "%s\n", error);
2241 print_sdp(output_files, nb_output_files);
2248 * The following code is the main loop of the file converter
2250 static int transcode(OutputFile *output_files,
2251 int nb_output_files,
2252 InputFile *input_files,
2256 AVFormatContext *is, *os;
2260 int no_packet_count=0;
2261 int64_t timer_start;
2263 if (!(no_packet = av_mallocz(nb_input_files)))
2266 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2271 fprintf(stderr, "Press ctrl-c to stop encoding\n");
2274 timer_start = av_gettime();
2276 for(; received_sigterm == 0;) {
2277 int file_index, ist_index;
2282 ipts_min = INT64_MAX;
2285 /* select the stream that we must read now by looking at the
2286 smallest output pts */
2288 for (i = 0; i < nb_output_streams; i++) {
2292 ost = &output_streams[i];
2293 of = &output_files[ost->file_index];
2294 os = output_files[ost->file_index].ctx;
2295 ist = &input_streams[ost->source_index];
2296 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2297 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2299 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2301 if (!input_files[ist->file_index].eof_reached){
2302 if(ipts < ipts_min) {
2304 if(input_sync ) file_index = ist->file_index;
2306 if(opts < opts_min) {
2308 if(!input_sync) file_index = ist->file_index;
2311 if(ost->frame_number >= max_frames[ost->st->codec->codec_type]){
2316 /* if none, if is finished */
2317 if (file_index < 0) {
2318 if(no_packet_count){
2320 memset(no_packet, 0, nb_input_files);
2327 /* read a frame from it and output it in the fifo */
2328 is = input_files[file_index].ctx;
2329 ret= av_read_frame(is, &pkt);
2330 if(ret == AVERROR(EAGAIN)){
2331 no_packet[file_index]=1;
2336 input_files[file_index].eof_reached = 1;
2344 memset(no_packet, 0, nb_input_files);
2347 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2348 is->streams[pkt.stream_index]);
2350 /* the following test is needed in case new streams appear
2351 dynamically in stream : we ignore them */
2352 if (pkt.stream_index >= input_files[file_index].nb_streams)
2353 goto discard_packet;
2354 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2355 ist = &input_streams[ist_index];
2357 goto discard_packet;
2359 if (pkt.dts != AV_NOPTS_VALUE)
2360 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2361 if (pkt.pts != AV_NOPTS_VALUE)
2362 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2364 if (ist->ts_scale) {
2365 if(pkt.pts != AV_NOPTS_VALUE)
2366 pkt.pts *= ist->ts_scale;
2367 if(pkt.dts != AV_NOPTS_VALUE)
2368 pkt.dts *= ist->ts_scale;
2371 // 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);
2372 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2373 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2374 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2375 int64_t delta= pkt_dts - ist->next_pts;
2376 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2377 input_files[ist->file_index].ts_offset -= delta;
2379 fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2380 delta, input_files[ist->file_index].ts_offset);
2381 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2382 if(pkt.pts != AV_NOPTS_VALUE)
2383 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2387 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2388 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2391 fprintf(stderr, "Error while decoding stream #%d.%d\n",
2392 ist->file_index, ist->st->index);
2395 av_free_packet(&pkt);
2400 av_free_packet(&pkt);
2402 /* dump report by using the output first video and audio streams */
2403 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2406 /* at the end of stream, we must flush the decoder buffers */
2407 for (i = 0; i < nb_input_streams; i++) {
2408 ist = &input_streams[i];
2409 if (ist->decoding_needed) {
2410 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2413 flush_encoders(output_streams, nb_output_streams);
2417 /* write the trailer if needed and close file */
2418 for(i=0;i<nb_output_files;i++) {
2419 os = output_files[i].ctx;
2420 av_write_trailer(os);
2423 /* dump report by using the first video and audio streams */
2424 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2426 /* close each encoder */
2427 for (i = 0; i < nb_output_streams; i++) {
2428 ost = &output_streams[i];
2429 if (ost->encoding_needed) {
2430 av_freep(&ost->st->codec->stats_in);
2431 avcodec_close(ost->st->codec);
2434 avfilter_graph_free(&ost->graph);
2438 /* close each decoder */
2439 for (i = 0; i < nb_input_streams; i++) {
2440 ist = &input_streams[i];
2441 if (ist->decoding_needed) {
2442 avcodec_close(ist->st->codec);
2450 av_freep(&bit_buffer);
2451 av_freep(&no_packet);
2453 if (output_streams) {
2454 for (i = 0; i < nb_output_streams; i++) {
2455 ost = &output_streams[i];
2457 if (ost->st->stream_copy)
2458 av_freep(&ost->st->codec->extradata);
2460 fclose(ost->logfile);
2461 ost->logfile = NULL;
2463 av_fifo_free(ost->fifo); /* works even if fifo is not
2464 initialized but set to zero */
2465 av_freep(&ost->st->codec->subtitle_header);
2466 av_free(ost->pict_tmp.data[0]);
2467 av_free(ost->forced_kf_pts);
2468 if (ost->video_resample)
2469 sws_freeContext(ost->img_resample_ctx);
2471 audio_resample_close(ost->resample);
2472 if (ost->reformat_ctx)
2473 av_audio_convert_free(ost->reformat_ctx);
2474 av_dict_free(&ost->opts);
2481 static int opt_video_rc_override_string(const char *opt, const char *arg)
2483 video_rc_override_string = arg;
2487 static int opt_me_threshold(const char *opt, const char *arg)
2489 me_threshold = parse_number_or_die(opt, arg, OPT_INT64, INT_MIN, INT_MAX);
2493 static int opt_verbose(const char *opt, const char *arg)
2495 verbose = parse_number_or_die(opt, arg, OPT_INT64, -10, 10);
2499 static int opt_frame_rate(const char *opt, const char *arg)
2501 if (av_parse_video_rate(&frame_rate, arg) < 0) {
2502 fprintf(stderr, "Incorrect value for %s: %s\n", opt, arg);
2508 static int opt_frame_size(const char *opt, const char *arg)
2510 if (av_parse_video_size(&frame_width, &frame_height, arg) < 0) {
2511 fprintf(stderr, "Incorrect frame size\n");
2512 return AVERROR(EINVAL);
2517 static int opt_frame_pix_fmt(const char *opt, const char *arg)
2519 if (strcmp(arg, "list")) {
2520 frame_pix_fmt = av_get_pix_fmt(arg);
2521 if (frame_pix_fmt == PIX_FMT_NONE) {
2522 fprintf(stderr, "Unknown pixel format requested: %s\n", arg);
2523 return AVERROR(EINVAL);
2532 static int opt_frame_aspect_ratio(const char *opt, const char *arg)
2539 p = strchr(arg, ':');
2541 x = strtol(arg, &end, 10);
2543 y = strtol(end+1, &end, 10);
2545 ar = (double)x / (double)y;
2547 ar = strtod(arg, NULL);
2550 fprintf(stderr, "Incorrect aspect ratio specification.\n");
2551 return AVERROR(EINVAL);
2553 frame_aspect_ratio = ar;
2557 static int opt_metadata(const char *opt, const char *arg)
2559 char *mid= strchr(arg, '=');
2562 fprintf(stderr, "Missing =\n");
2567 av_dict_set(&metadata, arg, mid, 0);
2572 static int opt_qscale(const char *opt, const char *arg)
2574 video_qscale = parse_number_or_die(opt, arg, OPT_FLOAT, 0, 255);
2575 if (video_qscale == 0) {
2576 fprintf(stderr, "qscale must be > 0.0 and <= 255\n");
2577 return AVERROR(EINVAL);
2582 static int opt_top_field_first(const char *opt, const char *arg)
2584 top_field_first = parse_number_or_die(opt, arg, OPT_INT, 0, 1);
2588 static int opt_audio_sample_fmt(const char *opt, const char *arg)
2590 if (strcmp(arg, "list")) {
2591 audio_sample_fmt = av_get_sample_fmt(arg);
2592 if (audio_sample_fmt == AV_SAMPLE_FMT_NONE) {
2593 av_log(NULL, AV_LOG_ERROR, "Invalid sample format '%s'\n", arg);
2594 return AVERROR(EINVAL);
2599 for (i = -1; i < AV_SAMPLE_FMT_NB; i++)
2600 printf("%s\n", av_get_sample_fmt_string(fmt_str, sizeof(fmt_str), i));
2606 static int opt_audio_rate(const char *opt, const char *arg)
2608 audio_sample_rate = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2612 static int opt_audio_channels(const char *opt, const char *arg)
2614 audio_channels = parse_number_or_die(opt, arg, OPT_INT64, 0, INT_MAX);
2618 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2620 return parse_option(o, "codec:a", arg, options);
2623 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2625 return parse_option(o, "codec:v", arg, options);
2628 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2630 return parse_option(o, "codec:s", arg, options);
2633 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2635 return parse_option(o, "codec:d", arg, options);
2638 static int opt_codec_tag(const char *opt, const char *arg)
2641 uint32_t *codec_tag;
2643 codec_tag = !strcmp(opt, "atag") ? &audio_codec_tag :
2644 !strcmp(opt, "vtag") ? &video_codec_tag :
2645 !strcmp(opt, "stag") ? &subtitle_codec_tag : NULL;
2649 *codec_tag = strtol(arg, &tail, 0);
2651 *codec_tag = AV_RL32(arg);
2656 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2658 StreamMap *m = NULL;
2659 int i, negative = 0, file_idx;
2660 int sync_file_idx = -1, sync_stream_idx;
2668 map = av_strdup(arg);
2670 /* parse sync stream first, just pick first matching stream */
2671 if (sync = strchr(map, ',')) {
2673 sync_file_idx = strtol(sync + 1, &sync, 0);
2674 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2675 av_log(NULL, AV_LOG_ERROR, "Invalid sync file index: %d.\n", sync_file_idx);
2680 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2681 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2682 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2683 sync_stream_idx = i;
2686 if (i == input_files[sync_file_idx].nb_streams) {
2687 av_log(NULL, AV_LOG_ERROR, "Sync stream specification in map %s does not "
2688 "match any streams.\n", arg);
2694 file_idx = strtol(map, &p, 0);
2695 if (file_idx >= nb_input_files || file_idx < 0) {
2696 av_log(NULL, AV_LOG_ERROR, "Invalid input file index: %d.\n", file_idx);
2700 /* disable some already defined maps */
2701 for (i = 0; i < o->nb_stream_maps; i++) {
2702 m = &o->stream_maps[i];
2703 if (check_stream_specifier(input_files[m->file_index].ctx,
2704 input_files[m->file_index].ctx->streams[m->stream_index],
2705 *p == ':' ? p + 1 : p) > 0)
2709 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2710 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2711 *p == ':' ? p + 1 : p) <= 0)
2713 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2714 &o->nb_stream_maps, o->nb_stream_maps + 1);
2715 m = &o->stream_maps[o->nb_stream_maps - 1];
2717 m->file_index = file_idx;
2718 m->stream_index = i;
2720 if (sync_file_idx >= 0) {
2721 m->sync_file_index = sync_file_idx;
2722 m->sync_stream_index = sync_stream_idx;
2724 m->sync_file_index = file_idx;
2725 m->sync_stream_index = i;
2730 av_log(NULL, AV_LOG_ERROR, "Stream map '%s' matches no streams.\n", arg);
2738 static void parse_meta_type(char *arg, char *type, int *index)
2748 if (*(++arg) == ':')
2749 *index = strtol(++arg, NULL, 0);
2752 fprintf(stderr, "Invalid metadata type %c.\n", *arg);
2759 static int opt_map_metadata(const char *opt, const char *arg)
2761 MetadataMap *m, *m1;
2764 meta_data_maps = grow_array(meta_data_maps, sizeof(*meta_data_maps),
2765 &nb_meta_data_maps, nb_meta_data_maps + 1);
2767 m = &meta_data_maps[nb_meta_data_maps - 1][1];
2768 m->file = strtol(arg, &p, 0);
2769 parse_meta_type(p, &m->type, &m->index);
2771 m1 = &meta_data_maps[nb_meta_data_maps - 1][0];
2772 if (p = strchr(opt, ':'))
2773 parse_meta_type(p, &m1->type, &m1->index);
2777 if (m->type == 'g' || m1->type == 'g')
2778 metadata_global_autocopy = 0;
2779 if (m->type == 's' || m1->type == 's')
2780 metadata_streams_autocopy = 0;
2781 if (m->type == 'c' || m1->type == 'c')
2782 metadata_chapters_autocopy = 0;
2787 static int opt_input_ts_scale(const char *opt, const char *arg)
2789 return av_dict_set(&ts_scale, opt, arg, 0);
2792 static enum CodecID find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2794 const char *codec_string = encoder ? "encoder" : "decoder";
2798 return CODEC_ID_NONE;
2800 avcodec_find_encoder_by_name(name) :
2801 avcodec_find_decoder_by_name(name);
2803 av_log(NULL, AV_LOG_ERROR, "Unknown %s '%s'\n", codec_string, name);
2806 if(codec->type != type) {
2807 av_log(NULL, AV_LOG_ERROR, "Invalid %s type '%s'\n", codec_string, name);
2813 static AVCodec *choose_codec(OptionsContext *o, AVFormatContext *s, AVStream *st, enum AVMediaType type)
2815 char *codec_name = NULL;
2817 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2821 st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename, NULL, type);
2822 return avcodec_find_encoder(st->codec->codec_id);
2824 } else if (!strcmp(codec_name, "copy"))
2825 st->stream_copy = 1;
2827 st->codec->codec_id = find_codec_or_die(codec_name, type, s->iformat == NULL);
2828 return s->oformat ? avcodec_find_encoder_by_name(codec_name) :
2829 avcodec_find_decoder_by_name(codec_name);
2836 * Add all the streams from the given input file to the global
2837 * list of input streams.
2839 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2841 int i, rfps, rfps_base, ret;
2843 for (i = 0; i < ic->nb_streams; i++) {
2844 AVStream *st = ic->streams[i];
2845 AVCodecContext *dec = st->codec;
2846 AVDictionaryEntry *e = NULL;
2850 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2851 ist = &input_streams[nb_input_streams - 1];
2853 ist->file_index = nb_input_files;
2855 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2857 while (e = av_dict_get(ts_scale, "", e, AV_DICT_IGNORE_SUFFIX)) {
2858 char *p = strchr(e->key, ':');
2860 if ((ret = check_stream_specifier(ic, st, p ? p + 1 : "")) > 0)
2866 ist->ts_scale = strtod(scale, NULL);
2868 ist->dec = choose_codec(o, ic, st, dec->codec_type);
2870 ist->dec = avcodec_find_decoder(dec->codec_id);
2872 switch (dec->codec_type) {
2873 case AVMEDIA_TYPE_AUDIO:
2875 st->discard= AVDISCARD_ALL;
2877 case AVMEDIA_TYPE_VIDEO:
2878 rfps = ic->streams[i]->r_frame_rate.num;
2879 rfps_base = ic->streams[i]->r_frame_rate.den;
2881 dec->flags |= CODEC_FLAG_EMU_EDGE;
2882 dec->height >>= dec->lowres;
2883 dec->width >>= dec->lowres;
2886 dec->debug |= FF_DEBUG_MV;
2888 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2891 fprintf(stderr,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2892 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2894 (float)rfps / rfps_base, rfps, rfps_base);
2898 st->discard= AVDISCARD_ALL;
2899 else if(video_discard)
2900 st->discard= video_discard;
2902 case AVMEDIA_TYPE_DATA:
2904 case AVMEDIA_TYPE_SUBTITLE:
2905 if(subtitle_disable)
2906 st->discard = AVDISCARD_ALL;
2908 case AVMEDIA_TYPE_ATTACHMENT:
2909 case AVMEDIA_TYPE_UNKNOWN:
2917 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2919 AVFormatContext *ic;
2920 AVInputFormat *file_iformat = NULL;
2924 AVDictionary **opts;
2925 int orig_nb_streams; // number of streams before avformat_find_stream_info
2928 if (!(file_iformat = av_find_input_format(o->format))) {
2929 fprintf(stderr, "Unknown input format: '%s'\n", o->format);
2934 if (!strcmp(filename, "-"))
2937 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2938 !strcmp(filename, "/dev/stdin");
2940 /* get default parameters from command line */
2941 ic = avformat_alloc_context();
2943 print_error(filename, AVERROR(ENOMEM));
2946 if (audio_sample_rate) {
2947 snprintf(buf, sizeof(buf), "%d", audio_sample_rate);
2948 av_dict_set(&format_opts, "sample_rate", buf, 0);
2950 if (audio_channels) {
2951 snprintf(buf, sizeof(buf), "%d", audio_channels);
2952 av_dict_set(&format_opts, "channels", buf, 0);
2954 if (frame_rate.num) {
2955 snprintf(buf, sizeof(buf), "%d/%d", frame_rate.num, frame_rate.den);
2956 av_dict_set(&format_opts, "framerate", buf, 0);
2958 if (frame_width && frame_height) {
2959 snprintf(buf, sizeof(buf), "%dx%d", frame_width, frame_height);
2960 av_dict_set(&format_opts, "video_size", buf, 0);
2962 if (frame_pix_fmt != PIX_FMT_NONE)
2963 av_dict_set(&format_opts, "pixel_format", av_get_pix_fmt_name(frame_pix_fmt), 0);
2965 ic->flags |= AVFMT_FLAG_NONBLOCK;
2967 /* open the input file with generic libav function */
2968 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2970 print_error(filename, err);
2973 assert_avoptions(format_opts);
2978 for(i=0; i<ic->nb_streams; i++){
2979 ic->streams[i]->discard= AVDISCARD_ALL;
2981 for(i=0; i<ic->nb_programs; i++){
2982 AVProgram *p= ic->programs[i];
2983 if(p->id != opt_programid){
2984 p->discard = AVDISCARD_ALL;
2987 for(j=0; j<p->nb_stream_indexes; j++){
2988 ic->streams[p->stream_index[j]]->discard= AVDISCARD_DEFAULT;
2993 fprintf(stderr, "Specified program id not found\n");
2999 /* apply forced codec ids */
3000 for (i = 0; i < ic->nb_streams; i++)
3001 choose_codec(o, ic, ic->streams[i], ic->streams[i]->codec->codec_type);
3003 /* Set AVCodecContext options for avformat_find_stream_info */
3004 opts = setup_find_stream_info_opts(ic, codec_opts);
3005 orig_nb_streams = ic->nb_streams;
3007 /* If not enough info to get the stream parameters, we decode the
3008 first frames to get it. (used in mpeg case for example) */
3009 ret = avformat_find_stream_info(ic, opts);
3010 if (ret < 0 && verbose >= 0) {
3011 fprintf(stderr, "%s: could not find codec parameters\n", filename);
3012 av_close_input_file(ic);
3016 timestamp = o->start_time;
3017 /* add the stream start time */
3018 if (ic->start_time != AV_NOPTS_VALUE)
3019 timestamp += ic->start_time;
3021 /* if seeking requested, we execute it */
3022 if (o->start_time != 0) {
3023 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3025 fprintf(stderr, "%s: could not seek to position %0.3f\n",
3026 filename, (double)timestamp / AV_TIME_BASE);
3030 /* update the current parameters so that they match the one of the input stream */
3031 add_input_streams(o, ic);
3033 /* dump the file content */
3035 av_dump_format(ic, nb_input_files, filename, 0);
3037 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3038 input_files[nb_input_files - 1].ctx = ic;
3039 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3040 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3041 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3043 frame_rate = (AVRational){0, 0};
3044 frame_pix_fmt = PIX_FMT_NONE;
3047 audio_sample_rate = 0;
3049 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3050 av_dict_free(&ts_scale);
3052 for (i = 0; i < orig_nb_streams; i++)
3053 av_dict_free(&opts[i]);
3060 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3061 AVCodecContext *avctx)
3067 for (p = kf; *p; p++)
3070 ost->forced_kf_count = n;
3071 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3072 if (!ost->forced_kf_pts) {
3073 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3076 for (i = 0; i < n; i++) {
3077 p = i ? strchr(p, ',') + 1 : kf;
3078 t = parse_time_or_die("force_key_frames", p, 1);
3079 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3083 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3086 AVStream *st = av_new_stream(oc, oc->nb_streams < nb_streamid_map ? streamid_map[oc->nb_streams] : 0);
3087 int idx = oc->nb_streams - 1;
3090 av_log(NULL, AV_LOG_ERROR, "Could not alloc stream.\n");
3094 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3095 nb_output_streams + 1);
3096 ost = &output_streams[nb_output_streams - 1];
3097 ost->file_index = nb_output_files;
3100 st->codec->codec_type = type;
3101 ost->enc = choose_codec(o, oc, st, type);
3103 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3106 avcodec_get_context_defaults3(st->codec, ost->enc);
3107 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3109 ost->sws_flags = av_get_int(sws_opts, "sws_flags", NULL);
3113 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3117 AVCodecContext *video_enc;
3119 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3121 if (!st->stream_copy) {
3122 ost->frame_aspect_ratio = frame_aspect_ratio;
3123 frame_aspect_ratio = 0;
3125 ost->avfilter= vfilters;
3130 ost->bitstream_filters = video_bitstream_filters;
3131 video_bitstream_filters= NULL;
3133 video_enc = st->codec;
3136 video_enc->codec_tag= video_codec_tag;
3138 if(oc->oformat->flags & AVFMT_GLOBALHEADER) {
3139 video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3142 if (st->stream_copy) {
3143 video_enc->sample_aspect_ratio =
3144 st->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
3150 ost->frame_rate = frame_rate;
3152 video_enc->width = frame_width;
3153 video_enc->height = frame_height;
3154 video_enc->pix_fmt = frame_pix_fmt;
3155 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3157 if (video_qscale || same_quant) {
3158 video_enc->flags |= CODEC_FLAG_QSCALE;
3159 video_enc->global_quality = FF_QP2LAMBDA * video_qscale;
3163 video_enc->intra_matrix = intra_matrix;
3165 video_enc->inter_matrix = inter_matrix;
3167 p= video_rc_override_string;
3170 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3172 fprintf(stderr, "error parsing rc_override\n");
3175 video_enc->rc_override=
3176 av_realloc(video_enc->rc_override,
3177 sizeof(RcOverride)*(i+1));
3178 video_enc->rc_override[i].start_frame= start;
3179 video_enc->rc_override[i].end_frame = end;
3181 video_enc->rc_override[i].qscale= q;
3182 video_enc->rc_override[i].quality_factor= 1.0;
3185 video_enc->rc_override[i].qscale= 0;
3186 video_enc->rc_override[i].quality_factor= -q/100.0;
3191 video_enc->rc_override_count=i;
3192 if (!video_enc->rc_initial_buffer_occupancy)
3193 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3194 video_enc->me_threshold= me_threshold;
3195 video_enc->intra_dc_precision= intra_dc_precision - 8;
3198 video_enc->flags|= CODEC_FLAG_PSNR;
3203 video_enc->flags |= CODEC_FLAG_PASS1;
3205 video_enc->flags |= CODEC_FLAG_PASS2;
3209 if (forced_key_frames)
3210 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3212 if (video_language) {
3213 av_dict_set(&st->metadata, "language", video_language, 0);
3214 av_freep(&video_language);
3217 /* reset some key parameters */
3219 av_freep(&forced_key_frames);
3220 frame_pix_fmt = PIX_FMT_NONE;
3224 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3228 AVCodecContext *audio_enc;
3230 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3233 ost->bitstream_filters = audio_bitstream_filters;
3234 audio_bitstream_filters= NULL;
3236 audio_enc = st->codec;
3237 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3240 audio_enc->codec_tag= audio_codec_tag;
3242 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3243 audio_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3245 if (!st->stream_copy) {
3246 if (audio_qscale > QSCALE_NONE) {
3247 audio_enc->flags |= CODEC_FLAG_QSCALE;
3248 audio_enc->global_quality = FF_QP2LAMBDA * audio_qscale;
3251 audio_enc->channels = audio_channels;
3252 if (audio_sample_fmt != AV_SAMPLE_FMT_NONE)
3253 audio_enc->sample_fmt = audio_sample_fmt;
3254 if (audio_sample_rate)
3255 audio_enc->sample_rate = audio_sample_rate;
3257 if (audio_language) {
3258 av_dict_set(&st->metadata, "language", audio_language, 0);
3259 av_freep(&audio_language);
3262 /* reset some key parameters */
3268 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3272 AVCodecContext *data_enc;
3274 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3276 data_enc = st->codec;
3277 if (!st->stream_copy) {
3278 fprintf(stderr, "Data stream encoding not supported yet (only streamcopy)\n");
3283 data_enc->codec_tag= data_codec_tag;
3285 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3286 data_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3293 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3297 AVCodecContext *subtitle_enc;
3299 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3301 subtitle_enc = st->codec;
3303 ost->bitstream_filters = subtitle_bitstream_filters;
3304 subtitle_bitstream_filters= NULL;
3306 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3308 if(subtitle_codec_tag)
3309 subtitle_enc->codec_tag= subtitle_codec_tag;
3311 if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
3312 subtitle_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
3315 if (subtitle_language) {
3316 av_dict_set(&st->metadata, "language", subtitle_language, 0);
3317 av_freep(&subtitle_language);
3320 subtitle_disable = 0;
3324 /* arg format is "output-stream-index:streamid-value". */
3325 static int opt_streamid(const char *opt, const char *arg)
3331 av_strlcpy(idx_str, arg, sizeof(idx_str));
3332 p = strchr(idx_str, ':');
3335 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3340 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3341 streamid_map = grow_array(streamid_map, sizeof(*streamid_map), &nb_streamid_map, idx+1);
3342 streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3346 static int copy_chapters(InputFile *ifile, OutputFile *ofile)
3348 AVFormatContext *is = ifile->ctx;
3349 AVFormatContext *os = ofile->ctx;
3352 for (i = 0; i < is->nb_chapters; i++) {
3353 AVChapter *in_ch = is->chapters[i], *out_ch;
3354 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3355 AV_TIME_BASE_Q, in_ch->time_base);
3356 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3357 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3360 if (in_ch->end < ts_off)
3362 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3365 out_ch = av_mallocz(sizeof(AVChapter));
3367 return AVERROR(ENOMEM);
3369 out_ch->id = in_ch->id;
3370 out_ch->time_base = in_ch->time_base;
3371 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3372 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3374 if (metadata_chapters_autocopy)
3375 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3378 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3380 return AVERROR(ENOMEM);
3381 os->chapters[os->nb_chapters - 1] = out_ch;
3386 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3389 AVFormatContext *ic = NULL;
3391 err = avformat_open_input(&ic, filename, NULL, NULL);
3394 /* copy stream format */
3395 for(i=0;i<ic->nb_streams;i++) {
3400 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3401 ost = new_output_stream(o, s, codec->type);
3404 // FIXME: a more elegant solution is needed
3405 memcpy(st, ic->streams[i], sizeof(AVStream));
3407 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3409 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3410 choose_sample_fmt(st, codec);
3411 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3412 choose_pixel_fmt(st, codec);
3415 av_close_input_file(ic);
3419 static void opt_output_file(void *optctx, const char *filename)
3421 OptionsContext *o = optctx;
3422 AVFormatContext *oc;
3424 AVOutputFormat *file_oformat;
3428 if (!strcmp(filename, "-"))
3431 oc = avformat_alloc_context();
3433 print_error(filename, AVERROR(ENOMEM));
3438 file_oformat = av_guess_format(o->format, NULL, NULL);
3439 if (!file_oformat) {
3440 fprintf(stderr, "Requested output format '%s' is not a suitable output format\n", o->format);
3444 file_oformat = av_guess_format(NULL, filename, NULL);
3445 if (!file_oformat) {
3446 fprintf(stderr, "Unable to find a suitable output format for '%s'\n",
3452 oc->oformat = file_oformat;
3453 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3455 if (!strcmp(file_oformat->name, "ffm") &&
3456 av_strstart(filename, "http:", NULL)) {
3457 /* special case for files sent to avserver: we get the stream
3458 parameters from avserver */
3459 int err = read_avserver_streams(o, oc, filename);
3461 print_error(filename, err);
3464 } else if (!o->nb_stream_maps) {
3465 /* pick the "best" stream of each type */
3466 #define NEW_STREAM(type, index)\
3468 ost = new_ ## type ## _stream(o, oc);\
3469 ost->source_index = index;\
3470 ost->sync_ist = &input_streams[index];\
3471 input_streams[index].discard = 0;\
3474 /* video: highest resolution */
3475 if (!video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3476 int area = 0, idx = -1;
3477 for (i = 0; i < nb_input_streams; i++) {
3478 ist = &input_streams[i];
3479 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3480 ist->st->codec->width * ist->st->codec->height > area) {
3481 area = ist->st->codec->width * ist->st->codec->height;
3485 NEW_STREAM(video, idx);
3488 /* audio: most channels */
3489 if (!audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3490 int channels = 0, idx = -1;
3491 for (i = 0; i < nb_input_streams; i++) {
3492 ist = &input_streams[i];
3493 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3494 ist->st->codec->channels > channels) {
3495 channels = ist->st->codec->channels;
3499 NEW_STREAM(audio, idx);
3502 /* subtitles: pick first */
3503 if (!subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3504 for (i = 0; i < nb_input_streams; i++)
3505 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3506 NEW_STREAM(subtitle, i);
3510 /* do something with data? */
3512 for (i = 0; i < o->nb_stream_maps; i++) {
3513 StreamMap *map = &o->stream_maps[i];
3518 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3519 switch (ist->st->codec->codec_type) {
3520 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3521 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3522 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3523 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3525 av_log(NULL, AV_LOG_ERROR, "Cannot map stream #%d.%d - unsupported type.\n",
3526 map->file_index, map->stream_index);
3530 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3531 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3532 map->sync_stream_index];
3537 av_dict_copy(&oc->metadata, metadata, 0);
3538 av_dict_free(&metadata);
3541 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3542 output_files[nb_output_files - 1].ctx = oc;
3543 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3544 output_files[nb_output_files - 1].recording_time = o->recording_time;
3545 output_files[nb_output_files - 1].start_time = o->start_time;
3546 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3547 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3549 /* check filename in case of an image number is expected */
3550 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3551 if (!av_filename_number_test(oc->filename)) {
3552 print_error(oc->filename, AVERROR(EINVAL));
3557 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3558 /* test if it already exists to avoid loosing precious files */
3559 if (!file_overwrite &&
3560 (strchr(filename, ':') == NULL ||
3561 filename[1] == ':' ||
3562 av_strstart(filename, "file:", NULL))) {
3563 if (avio_check(filename, 0) == 0) {
3565 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3567 if (!read_yesno()) {
3568 fprintf(stderr, "Not overwriting - exiting\n");
3573 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3580 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3581 print_error(filename, err);
3586 oc->preload= (int)(mux_preload*AV_TIME_BASE);
3587 oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
3588 oc->flags |= AVFMT_FLAG_NONBLOCK;
3591 if (chapters_input_file >= nb_input_files) {
3592 if (chapters_input_file == INT_MAX) {
3593 /* copy chapters from the first input file that has them*/
3594 chapters_input_file = -1;
3595 for (i = 0; i < nb_input_files; i++)
3596 if (input_files[i].ctx->nb_chapters) {
3597 chapters_input_file = i;
3601 av_log(NULL, AV_LOG_ERROR, "Invalid input file index %d in chapter mapping.\n",
3602 chapters_input_file);
3606 if (chapters_input_file >= 0)
3607 copy_chapters(&input_files[chapters_input_file], &output_files[nb_output_files - 1]);
3610 for (i = 0; i < nb_meta_data_maps; i++) {
3611 AVFormatContext *files[2];
3612 AVDictionary **meta[2];
3615 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3616 if ((index) < 0 || (index) >= (nb_elems)) {\
3617 av_log(NULL, AV_LOG_ERROR, "Invalid %s index %d while processing metadata maps\n",\
3622 int in_file_index = meta_data_maps[i][1].file;
3623 if (in_file_index < 0)
3625 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3628 files[1] = input_files[in_file_index].ctx;
3630 for (j = 0; j < 2; j++) {
3631 MetadataMap *map = &meta_data_maps[i][j];
3633 switch (map->type) {
3635 meta[j] = &files[j]->metadata;
3638 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3639 meta[j] = &files[j]->streams[map->index]->metadata;
3642 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3643 meta[j] = &files[j]->chapters[map->index]->metadata;
3646 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3647 meta[j] = &files[j]->programs[map->index]->metadata;
3652 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3655 /* copy global metadata by default */
3656 if (metadata_global_autocopy && nb_input_files)
3657 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3658 AV_DICT_DONT_OVERWRITE);
3659 if (metadata_streams_autocopy)
3660 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3661 InputStream *ist = &input_streams[output_streams[i].source_index];
3662 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3665 frame_rate = (AVRational){0, 0};
3668 audio_sample_rate = 0;
3670 audio_sample_fmt = AV_SAMPLE_FMT_NONE;
3671 chapters_input_file = INT_MAX;
3673 av_freep(&meta_data_maps);
3674 nb_meta_data_maps = 0;
3675 metadata_global_autocopy = 1;
3676 metadata_streams_autocopy = 1;
3677 metadata_chapters_autocopy = 1;
3678 av_freep(&streamid_map);
3679 nb_streamid_map = 0;
3681 av_freep(&forced_key_frames);
3685 /* same option as mencoder */
3686 static int opt_pass(const char *opt, const char *arg)
3688 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3692 static int64_t getutime(void)
3695 struct rusage rusage;
3697 getrusage(RUSAGE_SELF, &rusage);
3698 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3699 #elif HAVE_GETPROCESSTIMES
3701 FILETIME c, e, k, u;
3702 proc = GetCurrentProcess();
3703 GetProcessTimes(proc, &c, &e, &k, &u);
3704 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3706 return av_gettime();
3710 static int64_t getmaxrss(void)
3712 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3713 struct rusage rusage;
3714 getrusage(RUSAGE_SELF, &rusage);
3715 return (int64_t)rusage.ru_maxrss * 1024;
3716 #elif HAVE_GETPROCESSMEMORYINFO
3718 PROCESS_MEMORY_COUNTERS memcounters;
3719 proc = GetCurrentProcess();
3720 memcounters.cb = sizeof(memcounters);
3721 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3722 return memcounters.PeakPagefileUsage;
3728 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3731 const char *p = str;
3738 fprintf(stderr, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3745 static void opt_inter_matrix(const char *arg)
3747 inter_matrix = av_mallocz(sizeof(uint16_t) * 64);
3748 parse_matrix_coeffs(inter_matrix, arg);
3751 static void opt_intra_matrix(const char *arg)
3753 intra_matrix = av_mallocz(sizeof(uint16_t) * 64);
3754 parse_matrix_coeffs(intra_matrix, arg);
3757 static void show_usage(void)
3759 printf("Hyper fast Audio and Video encoder\n");
3760 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3764 static void show_help(void)
3767 AVOutputFormat *oformat = NULL;
3768 AVInputFormat *iformat = NULL;
3769 const AVClass *class;
3771 av_log_set_callback(log_callback_help);
3773 show_help_options(options, "Main options:\n",
3774 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3775 show_help_options(options, "\nAdvanced options:\n",
3776 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3778 show_help_options(options, "\nVideo options:\n",
3779 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3781 show_help_options(options, "\nAdvanced Video options:\n",
3782 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3783 OPT_VIDEO | OPT_EXPERT);
3784 show_help_options(options, "\nAudio options:\n",
3785 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3787 show_help_options(options, "\nAdvanced Audio options:\n",
3788 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3789 OPT_AUDIO | OPT_EXPERT);
3790 show_help_options(options, "\nSubtitle options:\n",
3791 OPT_SUBTITLE | OPT_GRAB,
3793 show_help_options(options, "\nAudio/Video grab options:\n",
3797 class = avcodec_get_class();
3798 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3801 /* individual codec options */
3803 while ((c = av_codec_next(c))) {
3804 if (c->priv_class) {
3805 av_opt_show2(&c->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3810 class = avformat_get_class();
3811 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3814 /* individual muxer options */
3815 while ((oformat = av_oformat_next(oformat))) {
3816 if (oformat->priv_class) {
3817 av_opt_show2(&oformat->priv_class, NULL, AV_OPT_FLAG_ENCODING_PARAM, 0);
3822 /* individual demuxer options */
3823 while ((iformat = av_iformat_next(iformat))) {
3824 if (iformat->priv_class) {
3825 av_opt_show2(&iformat->priv_class, NULL, AV_OPT_FLAG_DECODING_PARAM, 0);
3830 class = sws_get_class();
3831 av_opt_show2(&class, NULL, AV_OPT_FLAG_ENCODING_PARAM|AV_OPT_FLAG_DECODING_PARAM, 0);
3834 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3836 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3837 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3839 if(!strncmp(arg, "pal-", 4)) {
3842 } else if(!strncmp(arg, "ntsc-", 5)) {
3845 } else if(!strncmp(arg, "film-", 5)) {
3850 /* Calculate FR via float to avoid int overflow */
3851 fr = (int)(frame_rate.num * 1000.0 / frame_rate.den);
3854 } else if((fr == 29970) || (fr == 23976)) {
3857 /* Try to determine PAL/NTSC by peeking in the input files */
3858 if(nb_input_files) {
3860 for (j = 0; j < nb_input_files; j++) {
3861 for (i = 0; i < input_files[j].nb_streams; i++) {
3862 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3863 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3865 fr = c->time_base.den * 1000 / c->time_base.num;
3869 } else if((fr == 29970) || (fr == 23976)) {
3879 if(verbose > 0 && norm != UNKNOWN)
3880 fprintf(stderr, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3883 if(norm == UNKNOWN) {
3884 fprintf(stderr, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3885 fprintf(stderr, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3886 fprintf(stderr, "or set a framerate with \"-r xxx\".\n");
3890 if(!strcmp(arg, "vcd")) {
3891 opt_video_codec(o, "c:v", "mpeg1video");
3892 opt_audio_codec(o, "c:a", "mp2");
3893 parse_option(o, "f", "vcd", options);
3895 opt_frame_size("s", norm == PAL ? "352x288" : "352x240");
3896 opt_frame_rate("r", frame_rates[norm]);
3897 opt_default("g", norm == PAL ? "15" : "18");
3899 opt_default("b", "1150000");
3900 opt_default("maxrate", "1150000");
3901 opt_default("minrate", "1150000");
3902 opt_default("bufsize", "327680"); // 40*1024*8;
3904 opt_default("b:a", "224000");
3905 audio_sample_rate = 44100;
3908 opt_default("packetsize", "2324");
3909 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3911 /* We have to offset the PTS, so that it is consistent with the SCR.
3912 SCR starts at 36000, but the first two packs contain only padding
3913 and the first pack from the other stream, respectively, may also have
3914 been written before.
3915 So the real data starts at SCR 36000+3*1200. */
3916 mux_preload= (36000+3*1200) / 90000.0; //0.44
3917 } else if(!strcmp(arg, "svcd")) {
3919 opt_video_codec(o, "c:v", "mpeg2video");
3920 opt_audio_codec(o, "c:a", "mp2");
3921 parse_option(o, "f", "svcd", options);
3923 opt_frame_size("s", norm == PAL ? "480x576" : "480x480");
3924 opt_frame_rate("r", frame_rates[norm]);
3925 opt_default("g", norm == PAL ? "15" : "18");
3927 opt_default("b", "2040000");
3928 opt_default("maxrate", "2516000");
3929 opt_default("minrate", "0"); //1145000;
3930 opt_default("bufsize", "1835008"); //224*1024*8;
3931 opt_default("flags", "+scan_offset");
3934 opt_default("b:a", "224000");
3935 audio_sample_rate = 44100;
3937 opt_default("packetsize", "2324");
3939 } else if(!strcmp(arg, "dvd")) {
3941 opt_video_codec(o, "c:v", "mpeg2video");
3942 opt_audio_codec(o, "c:a", "ac3");
3943 parse_option(o, "f", "dvd", options);
3945 opt_frame_size("vcodec", norm == PAL ? "720x576" : "720x480");
3946 opt_frame_rate("r", frame_rates[norm]);
3947 opt_default("g", norm == PAL ? "15" : "18");
3949 opt_default("b", "6000000");
3950 opt_default("maxrate", "9000000");
3951 opt_default("minrate", "0"); //1500000;
3952 opt_default("bufsize", "1835008"); //224*1024*8;
3954 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3955 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3957 opt_default("b:a", "448000");
3958 audio_sample_rate = 48000;
3960 } else if(!strncmp(arg, "dv", 2)) {
3962 parse_option(o, "f", "dv", options);
3964 opt_frame_size("s", norm == PAL ? "720x576" : "720x480");
3965 opt_frame_pix_fmt("pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3966 norm == PAL ? "yuv420p" : "yuv411p");
3967 opt_frame_rate("r", frame_rates[norm]);
3969 audio_sample_rate = 48000;
3973 fprintf(stderr, "Unknown target: %s\n", arg);
3974 return AVERROR(EINVAL);
3979 static int opt_vstats_file(const char *opt, const char *arg)
3981 av_free (vstats_filename);
3982 vstats_filename=av_strdup (arg);
3986 static int opt_vstats(const char *opt, const char *arg)
3989 time_t today2 = time(NULL);
3990 struct tm *today = localtime(&today2);
3992 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3994 return opt_vstats_file(opt, filename);
3997 static int opt_bsf(const char *opt, const char *arg)
3999 AVBitStreamFilterContext *bsfc= av_bitstream_filter_init(arg); //FIXME split name and args for filter at '='
4000 AVBitStreamFilterContext **bsfp;
4003 fprintf(stderr, "Unknown bitstream filter %s\n", arg);
4007 bsfp= *opt == 'v' ? &video_bitstream_filters :
4008 *opt == 'a' ? &audio_bitstream_filters :
4009 &subtitle_bitstream_filters;
4011 bsfp= &(*bsfp)->next;
4018 #define OFFSET(x) offsetof(OptionsContext, x)
4019 static const OptionDef options[] = {
4021 #include "cmdutils_common_opts.h"
4022 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4023 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4024 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4025 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4026 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4027 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4028 { "map_metadata", HAS_ARG | OPT_EXPERT, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4029 "outfile[,metadata]:infile[,metadata]" },
4030 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT, {(void*)&chapters_input_file}, "set chapters mapping", "input_file_index" },
4031 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4032 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4033 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4034 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4035 { "itsscale", HAS_ARG, {(void*)opt_input_ts_scale}, "set the input ts scale", "scale" },
4036 { "metadata", HAS_ARG, {(void*)opt_metadata}, "add metadata", "string=string" },
4037 { "dframes", OPT_INT | HAS_ARG, {(void*)&max_frames[AVMEDIA_TYPE_DATA]}, "set the number of data frames to record", "number" },
4038 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4039 "add timings for benchmarking" },
4040 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4041 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4042 "dump each input packet" },
4043 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4044 "when dumping packets, also dump the payload" },
4045 { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" },
4046 { "v", HAS_ARG, {(void*)opt_verbose}, "set the verbosity level", "number" },
4047 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4048 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4049 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4050 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4051 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4052 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4053 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4054 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4055 { "programid", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&opt_programid}, "desired program number", "" },
4056 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4057 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4060 { "vframes", OPT_INT | HAS_ARG | OPT_VIDEO, {(void*)&max_frames[AVMEDIA_TYPE_VIDEO]}, "set the number of video frames to record", "number" },
4061 { "r", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_rate}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4062 { "s", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_size}, "set frame size (WxH or abbreviation)", "size" },
4063 { "aspect", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_aspect_ratio}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4064 { "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" },
4065 { "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
4066 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4067 { "qscale", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_qscale}, "use fixed video quantizer scale (VBR)", "q" },
4068 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_video_rc_override_string}, "rate control override for specific intervals", "override" },
4069 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4070 { "me_threshold", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_me_threshold}, "motion estimation threshold", "threshold" },
4071 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4072 "use same quantizer as source (implies VBR)" },
4073 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4074 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4075 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4076 "deinterlace pictures" },
4077 { "psnr", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_psnr}, "calculate PSNR of compressed frames" },
4078 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4079 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4081 { "vf", OPT_STRING | HAS_ARG, {(void*)&vfilters}, "video filters", "filter list" },
4083 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_intra_matrix}, "specify intra matrix coeffs", "matrix" },
4084 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_inter_matrix}, "specify inter matrix coeffs", "matrix" },
4085 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_top_field_first}, "top=1/bottom=0/auto=-1 field first", "" },
4086 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4087 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_codec_tag}, "force video tag/fourcc", "fourcc/tag" },
4088 { "vlang", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void *)&video_language}, "set the ISO 639 language code (3 letters) of the current video stream" , "code" },
4089 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4090 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&force_fps}, "force the selected framerate, disable the best supported framerate selection" },
4091 { "streamid", HAS_ARG | OPT_EXPERT, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4092 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void *)&forced_key_frames}, "force key frames at specified timestamps", "timestamps" },
4095 { "aframes", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&max_frames[AVMEDIA_TYPE_AUDIO]}, "set the number of audio frames to record", "number" },
4096 { "aq", OPT_FLOAT | HAS_ARG | OPT_AUDIO, {(void*)&audio_qscale}, "set audio quality (codec-specific)", "quality", },
4097 { "ar", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_rate}, "set audio sampling rate (in Hz)", "rate" },
4098 { "ac", HAS_ARG | OPT_AUDIO, {(void*)opt_audio_channels}, "set number of audio channels", "channels" },
4099 { "an", OPT_BOOL | OPT_AUDIO, {(void*)&audio_disable}, "disable audio" },
4100 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4101 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO, {(void*)opt_codec_tag}, "force audio tag/fourcc", "fourcc/tag" },
4102 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4103 { "alang", HAS_ARG | OPT_STRING | OPT_AUDIO, {(void *)&audio_language}, "set the ISO 639 language code (3 letters) of the current audio stream" , "code" },
4104 { "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" },
4106 /* subtitle options */
4107 { "sn", OPT_BOOL | OPT_SUBTITLE, {(void*)&subtitle_disable}, "disable subtitle" },
4108 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4109 { "slang", HAS_ARG | OPT_STRING | OPT_SUBTITLE, {(void *)&subtitle_language}, "set the ISO 639 language code (3 letters) of the current subtitle stream" , "code" },
4110 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE, {(void*)opt_codec_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4113 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4116 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_max_delay}, "set the maximum demux-decode delay", "seconds" },
4117 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT, {(void*)&mux_preload}, "set the initial demux-decode delay", "seconds" },
4119 { "absf", HAS_ARG | OPT_AUDIO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4120 { "vbsf", HAS_ARG | OPT_VIDEO | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4121 { "sbsf", HAS_ARG | OPT_SUBTITLE | OPT_EXPERT, {(void*)opt_bsf}, "", "bitstream_filter" },
4123 /* data codec support */
4124 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4126 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4130 int main(int argc, char **argv)
4132 OptionsContext o = { 0 };
4137 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4139 avcodec_register_all();
4141 avdevice_register_all();
4144 avfilter_register_all();
4148 avio_set_interrupt_cb(decode_interrupt_cb);
4153 parse_options(&o, argc, argv, options, opt_output_file);
4155 if(nb_output_files <= 0 && nb_input_files == 0) {
4157 fprintf(stderr, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4161 /* file converter / grab */
4162 if (nb_output_files <= 0) {
4163 fprintf(stderr, "At least one output file must be specified\n");
4167 if (nb_input_files == 0) {
4168 fprintf(stderr, "At least one input file must be specified\n");
4173 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4175 ti = getutime() - ti;
4177 int maxrss = getmaxrss() / 1024;
4178 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);