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 int video_discard = 0;
101 static int same_quant = 0;
102 static int do_deinterlace = 0;
103 static int intra_dc_precision = 8;
104 static int qp_hist = 0;
106 static int file_overwrite = 0;
107 static int do_benchmark = 0;
108 static int do_hex_dump = 0;
109 static int do_pkt_dump = 0;
110 static int do_pass = 0;
111 static char *pass_logfilename_prefix = NULL;
112 static int video_sync_method= -1;
113 static int audio_sync_method= 0;
114 static float audio_drift_threshold= 0.1;
115 static int copy_ts= 0;
117 static int opt_shortest = 0;
118 static char *vstats_filename;
119 static FILE *vstats_file;
121 static int audio_volume = 256;
123 static int exit_on_error = 0;
124 static int using_stdin = 0;
125 static int64_t video_size = 0;
126 static int64_t audio_size = 0;
127 static int64_t extra_size = 0;
128 static int nb_frames_dup = 0;
129 static int nb_frames_drop = 0;
130 static int input_sync;
132 static float dts_delta_threshold = 10;
134 static int print_stats = 1;
136 static uint8_t *audio_buf;
137 static uint8_t *audio_out;
138 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
140 static void *samples;
142 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
144 typedef struct InputStream {
147 int discard; /* true if stream data should be discarded */
148 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
151 int64_t start; /* time when read started */
152 int64_t next_pts; /* synthetic pts for cases where pkt.pts
154 int64_t pts; /* current pts */
155 PtsCorrectionContext pts_ctx;
157 int is_start; /* is 1 at the start and after a discontinuity */
158 int showed_multi_packet_warning;
162 typedef struct InputFile {
163 AVFormatContext *ctx;
164 int eof_reached; /* true if eof reached */
165 int ist_index; /* index of first stream in ist_table */
166 int buffer_size; /* current total buffer size */
168 int nb_streams; /* number of stream that avconv is aware of; may be different
169 from ctx.nb_streams if new streams appear during av_read_frame() */
173 typedef struct OutputStream {
174 int file_index; /* file index */
175 int index; /* stream index in the output file */
176 int source_index; /* InputStream index */
177 AVStream *st; /* stream in the output file */
178 int encoding_needed; /* true if encoding needed for this stream */
180 /* input pts and corresponding output pts
182 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
183 struct InputStream *sync_ist; /* input stream to sync against */
184 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
185 AVBitStreamFilterContext *bitstream_filters;
191 AVFrame pict_tmp; /* temporary image for resampling */
192 struct SwsContext *img_resample_ctx; /* for image resampling */
195 int resample_pix_fmt;
196 AVRational frame_rate;
200 float frame_aspect_ratio;
202 /* forced key frames */
203 int64_t *forced_kf_pts;
209 ReSampleContext *resample; /* for audio resampling */
210 int resample_sample_fmt;
211 int resample_channels;
212 int resample_sample_rate;
214 AVAudioConvert *reformat_ctx;
215 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
219 AVFilterContext *output_video_filter;
220 AVFilterContext *input_video_filter;
221 AVFilterBufferRef *picref;
223 AVFilterGraph *graph;
228 int is_past_recording_time;
230 const char *attachment_filename;
231 int copy_initial_nonkeyframes;
235 typedef struct OutputFile {
236 AVFormatContext *ctx;
238 int ost_index; /* index of the first stream in output_streams */
239 int64_t recording_time; /* desired length of the resulting file in microseconds */
240 int64_t start_time; /* start time in microseconds */
241 uint64_t limit_filesize;
244 static InputStream *input_streams = NULL;
245 static int nb_input_streams = 0;
246 static InputFile *input_files = NULL;
247 static int nb_input_files = 0;
249 static OutputStream *output_streams = NULL;
250 static int nb_output_streams = 0;
251 static OutputFile *output_files = NULL;
252 static int nb_output_files = 0;
254 typedef struct OptionsContext {
255 /* input/output options */
259 SpecifierOpt *codec_names;
261 SpecifierOpt *audio_channels;
262 int nb_audio_channels;
263 SpecifierOpt *audio_sample_rate;
264 int nb_audio_sample_rate;
265 SpecifierOpt *frame_rates;
267 SpecifierOpt *frame_sizes;
269 SpecifierOpt *frame_pix_fmts;
270 int nb_frame_pix_fmts;
273 int64_t input_ts_offset;
276 SpecifierOpt *ts_scale;
278 SpecifierOpt *dump_attachment;
279 int nb_dump_attachment;
282 StreamMap *stream_maps;
284 /* first item specifies output metadata, second is input */
285 MetadataMap (*meta_data_maps)[2];
286 int nb_meta_data_maps;
287 int metadata_global_manual;
288 int metadata_streams_manual;
289 int metadata_chapters_manual;
290 const char **attachments;
293 int chapters_input_file;
295 int64_t recording_time;
296 uint64_t limit_filesize;
302 int subtitle_disable;
305 /* indexed by output file stream index */
309 SpecifierOpt *metadata;
311 SpecifierOpt *max_frames;
313 SpecifierOpt *bitstream_filters;
314 int nb_bitstream_filters;
315 SpecifierOpt *codec_tags;
317 SpecifierOpt *sample_fmts;
319 SpecifierOpt *qscale;
321 SpecifierOpt *forced_key_frames;
322 int nb_forced_key_frames;
323 SpecifierOpt *force_fps;
325 SpecifierOpt *frame_aspect_ratios;
326 int nb_frame_aspect_ratios;
327 SpecifierOpt *rc_overrides;
329 SpecifierOpt *intra_matrices;
330 int nb_intra_matrices;
331 SpecifierOpt *inter_matrices;
332 int nb_inter_matrices;
333 SpecifierOpt *top_field_first;
334 int nb_top_field_first;
335 SpecifierOpt *presets;
337 SpecifierOpt *copy_initial_nonkeyframes;
338 int nb_copy_initial_nonkeyframes;
340 SpecifierOpt *filters;
345 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
348 for (i = 0; i < o->nb_ ## name; i++) {\
349 char *spec = o->name[i].specifier;\
350 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
351 outvar = o->name[i].u.type;\
357 static void reset_options(OptionsContext *o)
359 const OptionDef *po = options;
361 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
363 void *dst = (uint8_t*)o + po->u.off;
365 if (po->flags & OPT_SPEC) {
366 SpecifierOpt **so = dst;
367 int i, *count = (int*)(so + 1);
368 for (i = 0; i < *count; i++) {
369 av_freep(&(*so)[i].specifier);
370 if (po->flags & OPT_STRING)
371 av_freep(&(*so)[i].u.str);
375 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
380 av_freep(&o->stream_maps);
381 av_freep(&o->meta_data_maps);
382 av_freep(&o->streamid_map);
384 memset(o, 0, sizeof(*o));
386 o->mux_max_delay = 0.7;
387 o->recording_time = INT64_MAX;
388 o->limit_filesize = UINT64_MAX;
389 o->chapters_input_file = INT_MAX;
397 static int configure_video_filters(InputStream *ist, OutputStream *ost)
399 AVFilterContext *last_filter, *filter;
400 /** filter graph containing all filters including input & output */
401 AVCodecContext *codec = ost->st->codec;
402 AVCodecContext *icodec = ist->st->codec;
403 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
404 AVRational sample_aspect_ratio;
408 ost->graph = avfilter_graph_alloc();
410 if (ist->st->sample_aspect_ratio.num){
411 sample_aspect_ratio = ist->st->sample_aspect_ratio;
413 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
415 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
416 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
417 sample_aspect_ratio.num, sample_aspect_ratio.den);
419 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
420 "src", args, NULL, ost->graph);
423 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
424 "out", NULL, &ffsink_ctx, ost->graph);
427 last_filter = ost->input_video_filter;
429 if (codec->width != icodec->width || codec->height != icodec->height) {
430 snprintf(args, 255, "%d:%d:flags=0x%X",
433 (unsigned)ost->sws_flags);
434 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
435 NULL, args, NULL, ost->graph)) < 0)
437 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
439 last_filter = filter;
442 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
443 ost->graph->scale_sws_opts = av_strdup(args);
446 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
447 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
449 outputs->name = av_strdup("in");
450 outputs->filter_ctx = last_filter;
451 outputs->pad_idx = 0;
452 outputs->next = NULL;
454 inputs->name = av_strdup("out");
455 inputs->filter_ctx = ost->output_video_filter;
459 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
461 av_freep(&ost->avfilter);
463 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
467 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
470 codec->width = ost->output_video_filter->inputs[0]->w;
471 codec->height = ost->output_video_filter->inputs[0]->h;
472 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
473 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
474 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
475 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
479 #endif /* CONFIG_AVFILTER */
481 static void term_exit(void)
483 av_log(NULL, AV_LOG_QUIET, "");
486 static volatile int received_sigterm = 0;
487 static volatile int received_nb_signals = 0;
490 sigterm_handler(int sig)
492 received_sigterm = sig;
493 received_nb_signals++;
497 static void term_init(void)
499 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
500 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
502 signal(SIGXCPU, sigterm_handler);
506 static int decode_interrupt_cb(void *ctx)
508 return received_nb_signals > 1;
511 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
513 void exit_program(int ret)
518 for(i=0;i<nb_output_files;i++) {
519 AVFormatContext *s = output_files[i].ctx;
520 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
522 avformat_free_context(s);
523 av_dict_free(&output_files[i].opts);
525 for(i=0;i<nb_input_files;i++) {
526 av_close_input_file(input_files[i].ctx);
528 for (i = 0; i < nb_input_streams; i++)
529 av_dict_free(&input_streams[i].opts);
533 av_free(vstats_filename);
535 av_freep(&input_streams);
536 av_freep(&input_files);
537 av_freep(&output_streams);
538 av_freep(&output_files);
543 allocated_audio_buf_size= allocated_audio_out_size= 0;
549 avformat_network_deinit();
551 if (received_sigterm) {
552 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
553 (int) received_sigterm);
557 exit(ret); /* not all OS-es handle main() return value */
560 static void assert_avoptions(AVDictionary *m)
562 AVDictionaryEntry *t;
563 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
564 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
569 static void assert_codec_experimental(AVCodecContext *c, int encoder)
571 const char *codec_string = encoder ? "encoder" : "decoder";
573 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
574 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
575 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
576 "results.\nAdd '-strict experimental' if you want to use it.\n",
577 codec_string, c->codec->name);
578 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
579 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
580 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
581 codec_string, codec->name);
586 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
588 if(codec && codec->sample_fmts){
589 const enum AVSampleFormat *p= codec->sample_fmts;
591 if(*p == st->codec->sample_fmt)
595 av_log(NULL, AV_LOG_WARNING,
596 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
597 av_get_sample_fmt_name(st->codec->sample_fmt),
599 av_get_sample_fmt_name(codec->sample_fmts[0]));
600 st->codec->sample_fmt = codec->sample_fmts[0];
606 * Update the requested input sample format based on the output sample format.
607 * This is currently only used to request float output from decoders which
608 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
609 * Ideally this will be removed in the future when decoders do not do format
610 * conversion and only output in their native format.
612 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
615 /* if sample formats match or a decoder sample format has already been
616 requested, just return */
617 if (enc->sample_fmt == dec->sample_fmt ||
618 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
621 /* if decoder supports more than one output format */
622 if (dec_codec && dec_codec->sample_fmts &&
623 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
624 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
625 const enum AVSampleFormat *p;
626 int min_dec = -1, min_inc = -1;
628 /* find a matching sample format in the encoder */
629 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
630 if (*p == enc->sample_fmt) {
631 dec->request_sample_fmt = *p;
633 } else if (*p > enc->sample_fmt) {
634 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
636 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
639 /* if none match, provide the one that matches quality closest */
640 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
641 enc->sample_fmt - min_dec;
645 static void choose_sample_rate(AVStream *st, AVCodec *codec)
647 if(codec && codec->supported_samplerates){
648 const int *p= codec->supported_samplerates;
650 int best_dist=INT_MAX;
652 int dist= abs(st->codec->sample_rate - *p);
653 if(dist < best_dist){
659 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
661 st->codec->sample_rate= best;
665 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
667 if(codec && codec->pix_fmts){
668 const enum PixelFormat *p= codec->pix_fmts;
669 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
670 if(st->codec->codec_id==CODEC_ID_MJPEG){
671 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
672 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
673 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};
677 if(*p == st->codec->pix_fmt)
681 if(st->codec->pix_fmt != PIX_FMT_NONE)
682 av_log(NULL, AV_LOG_WARNING,
683 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
684 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
686 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
687 st->codec->pix_fmt = codec->pix_fmts[0];
693 get_sync_ipts(const OutputStream *ost)
695 const InputStream *ist = ost->sync_ist;
696 OutputFile *of = &output_files[ost->file_index];
697 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
700 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
704 AVPacket new_pkt= *pkt;
705 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
706 &new_pkt.data, &new_pkt.size,
707 pkt->data, pkt->size,
708 pkt->flags & AV_PKT_FLAG_KEY);
711 new_pkt.destruct= av_destruct_packet;
713 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
714 bsfc->filter->name, pkt->stream_index,
715 avctx->codec ? avctx->codec->name : "copy");
725 ret= av_interleaved_write_frame(s, pkt);
727 print_error("av_interleaved_write_frame()", ret);
732 static void do_audio_out(AVFormatContext *s,
735 unsigned char *buf, int size)
738 int64_t audio_out_size, audio_buf_size;
739 int64_t allocated_for_size= size;
741 int size_out, frame_bytes, ret, resample_changed;
742 AVCodecContext *enc= ost->st->codec;
743 AVCodecContext *dec= ist->st->codec;
744 int osize = av_get_bytes_per_sample(enc->sample_fmt);
745 int isize = av_get_bytes_per_sample(dec->sample_fmt);
746 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
749 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
750 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
751 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
752 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
753 audio_buf_size*= osize*enc->channels;
755 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
756 if(coded_bps > 8*osize)
757 audio_out_size= audio_out_size * coded_bps / (8*osize);
758 audio_out_size += FF_MIN_BUFFER_SIZE;
760 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
761 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
765 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
766 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
767 if (!audio_buf || !audio_out){
768 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
772 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
773 ost->audio_resample = 1;
775 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
776 ost->resample_channels != dec->channels ||
777 ost->resample_sample_rate != dec->sample_rate;
779 if ((ost->audio_resample && !ost->resample) || resample_changed) {
780 if (resample_changed) {
781 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",
782 ist->file_index, ist->st->index,
783 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
784 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
785 ost->resample_sample_fmt = dec->sample_fmt;
786 ost->resample_channels = dec->channels;
787 ost->resample_sample_rate = dec->sample_rate;
789 audio_resample_close(ost->resample);
791 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
792 if (audio_sync_method <= 1 &&
793 ost->resample_sample_fmt == enc->sample_fmt &&
794 ost->resample_channels == enc->channels &&
795 ost->resample_sample_rate == enc->sample_rate) {
796 ost->resample = NULL;
797 ost->audio_resample = 0;
798 } else if (ost->audio_resample) {
799 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
800 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
801 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
802 enc->sample_rate, dec->sample_rate,
803 enc->sample_fmt, dec->sample_fmt,
805 if (!ost->resample) {
806 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
807 dec->channels, dec->sample_rate,
808 enc->channels, enc->sample_rate);
814 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
815 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
816 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
817 if (ost->reformat_ctx)
818 av_audio_convert_free(ost->reformat_ctx);
819 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
820 dec->sample_fmt, 1, NULL, 0);
821 if (!ost->reformat_ctx) {
822 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
823 av_get_sample_fmt_name(dec->sample_fmt),
824 av_get_sample_fmt_name(enc->sample_fmt));
827 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
830 if(audio_sync_method){
831 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
832 - av_fifo_size(ost->fifo)/(enc->channels * 2);
833 double idelta= delta*dec->sample_rate / enc->sample_rate;
834 int byte_delta= ((int)idelta)*2*dec->channels;
836 //FIXME resample delay
837 if(fabs(delta) > 50){
838 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
840 byte_delta= FFMAX(byte_delta, -size);
843 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
848 static uint8_t *input_tmp= NULL;
849 input_tmp= av_realloc(input_tmp, byte_delta + size);
851 if(byte_delta > allocated_for_size - size){
852 allocated_for_size= byte_delta + (int64_t)size;
857 memset(input_tmp, 0, byte_delta);
858 memcpy(input_tmp + byte_delta, buf, size);
861 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
863 }else if(audio_sync_method>1){
864 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
865 av_assert0(ost->audio_resample);
866 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
867 delta, comp, enc->sample_rate);
868 // 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));
869 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
873 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
874 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
876 if (ost->audio_resample) {
878 size_out = audio_resample(ost->resample,
879 (short *)buftmp, (short *)buf,
880 size / (dec->channels * isize));
881 size_out = size_out * enc->channels * osize;
887 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
888 const void *ibuf[6]= {buftmp};
889 void *obuf[6]= {audio_buf};
890 int istride[6]= {isize};
891 int ostride[6]= {osize};
892 int len= size_out/istride[0];
893 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
894 printf("av_audio_convert() failed\n");
900 size_out = len*osize;
903 /* now encode as many frames as possible */
904 if (enc->frame_size > 1) {
905 /* output resampled raw samples */
906 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
907 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
910 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
912 frame_bytes = enc->frame_size * osize * enc->channels;
914 while (av_fifo_size(ost->fifo) >= frame_bytes) {
916 av_init_packet(&pkt);
918 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
920 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
922 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
925 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
929 pkt.stream_index= ost->index;
932 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
933 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
934 pkt.flags |= AV_PKT_FLAG_KEY;
935 write_frame(s, &pkt, enc, ost->bitstream_filters);
937 ost->sync_opts += enc->frame_size;
941 av_init_packet(&pkt);
943 ost->sync_opts += size_out / (osize * enc->channels);
945 /* output a pcm frame */
946 /* determine the size of the coded buffer */
949 size_out = size_out*coded_bps/8;
951 if(size_out > audio_out_size){
952 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
956 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
957 ret = avcodec_encode_audio(enc, audio_out, size_out,
960 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
964 pkt.stream_index= ost->index;
967 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
968 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
969 pkt.flags |= AV_PKT_FLAG_KEY;
970 write_frame(s, &pkt, enc, ost->bitstream_filters);
974 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
978 AVPicture picture_tmp;
981 dec = ist->st->codec;
983 /* deinterlace : must be done before any resize */
984 if (do_deinterlace) {
987 /* create temporary picture */
988 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
989 buf = av_malloc(size);
993 picture2 = &picture_tmp;
994 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
996 if(avpicture_deinterlace(picture2, picture,
997 dec->pix_fmt, dec->width, dec->height) < 0) {
998 /* if error, do not deinterlace */
999 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1008 if (picture != picture2)
1009 *picture = *picture2;
1013 static void do_subtitle_out(AVFormatContext *s,
1019 static uint8_t *subtitle_out = NULL;
1020 int subtitle_out_max_size = 1024 * 1024;
1021 int subtitle_out_size, nb, i;
1022 AVCodecContext *enc;
1025 if (pts == AV_NOPTS_VALUE) {
1026 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1032 enc = ost->st->codec;
1034 if (!subtitle_out) {
1035 subtitle_out = av_malloc(subtitle_out_max_size);
1038 /* Note: DVB subtitle need one packet to draw them and one other
1039 packet to clear them */
1040 /* XXX: signal it in the codec context ? */
1041 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1046 for(i = 0; i < nb; i++) {
1047 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1048 // start_display_time is required to be 0
1049 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1050 sub->end_display_time -= sub->start_display_time;
1051 sub->start_display_time = 0;
1052 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1053 subtitle_out_max_size, sub);
1054 if (subtitle_out_size < 0) {
1055 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1059 av_init_packet(&pkt);
1060 pkt.stream_index = ost->index;
1061 pkt.data = subtitle_out;
1062 pkt.size = subtitle_out_size;
1063 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1064 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1065 /* XXX: the pts correction is handled here. Maybe handling
1066 it in the codec would be better */
1068 pkt.pts += 90 * sub->start_display_time;
1070 pkt.pts += 90 * sub->end_display_time;
1072 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1076 static int bit_buffer_size= 1024*256;
1077 static uint8_t *bit_buffer= NULL;
1079 static void do_video_resample(OutputStream *ost,
1081 AVFrame *in_picture,
1082 AVFrame **out_picture)
1084 int resample_changed = 0;
1085 AVCodecContext *dec = ist->st->codec;
1086 *out_picture = in_picture;
1088 resample_changed = ost->resample_width != dec->width ||
1089 ost->resample_height != dec->height ||
1090 ost->resample_pix_fmt != dec->pix_fmt;
1092 if (resample_changed) {
1093 av_log(NULL, AV_LOG_INFO,
1094 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1095 ist->file_index, ist->st->index,
1096 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1097 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1098 if(!ost->video_resample)
1099 ost->video_resample = 1;
1102 #if !CONFIG_AVFILTER
1103 if (ost->video_resample) {
1104 *out_picture = &ost->pict_tmp;
1105 if (resample_changed) {
1106 /* initialize a new scaler context */
1107 sws_freeContext(ost->img_resample_ctx);
1108 ost->img_resample_ctx = sws_getContext(
1109 ist->st->codec->width,
1110 ist->st->codec->height,
1111 ist->st->codec->pix_fmt,
1112 ost->st->codec->width,
1113 ost->st->codec->height,
1114 ost->st->codec->pix_fmt,
1115 ost->sws_flags, NULL, NULL, NULL);
1116 if (ost->img_resample_ctx == NULL) {
1117 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1121 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1122 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1125 if (resample_changed) {
1126 avfilter_graph_free(&ost->graph);
1127 if (configure_video_filters(ist, ost)) {
1128 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1133 if (resample_changed) {
1134 ost->resample_width = dec->width;
1135 ost->resample_height = dec->height;
1136 ost->resample_pix_fmt = dec->pix_fmt;
1141 static void do_video_out(AVFormatContext *s,
1144 AVFrame *in_picture,
1145 int *frame_size, float quality)
1147 int nb_frames, i, ret, format_video_sync;
1148 AVFrame *final_picture;
1149 AVCodecContext *enc;
1152 enc = ost->st->codec;
1154 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1156 /* by default, we output a single frame */
1161 format_video_sync = video_sync_method;
1162 if (format_video_sync < 0)
1163 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1165 if (format_video_sync) {
1166 double vdelta = sync_ipts - ost->sync_opts;
1167 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1170 else if (format_video_sync == 2) {
1173 }else if(vdelta>0.6)
1174 ost->sync_opts= lrintf(sync_ipts);
1175 }else if (vdelta > 1.1)
1176 nb_frames = lrintf(vdelta);
1177 //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);
1178 if (nb_frames == 0){
1180 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1181 }else if (nb_frames > 1) {
1182 nb_frames_dup += nb_frames - 1;
1183 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1186 ost->sync_opts= lrintf(sync_ipts);
1188 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1192 do_video_resample(ost, ist, in_picture, &final_picture);
1194 /* duplicates frame if needed */
1195 for(i=0;i<nb_frames;i++) {
1197 av_init_packet(&pkt);
1198 pkt.stream_index= ost->index;
1200 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1201 /* raw pictures are written as AVPicture structure to
1202 avoid any copies. We support temporarily the older
1204 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1205 enc->coded_frame->top_field_first = in_picture->top_field_first;
1206 pkt.data= (uint8_t *)final_picture;
1207 pkt.size= sizeof(AVPicture);
1208 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1209 pkt.flags |= AV_PKT_FLAG_KEY;
1211 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1213 AVFrame big_picture;
1215 big_picture= *final_picture;
1216 /* better than nothing: use input picture interlaced
1218 big_picture.interlaced_frame = in_picture->interlaced_frame;
1219 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1220 if (ost->top_field_first == -1)
1221 big_picture.top_field_first = in_picture->top_field_first;
1223 big_picture.top_field_first = !!ost->top_field_first;
1226 /* handles same_quant here. This is not correct because it may
1227 not be a global option */
1228 big_picture.quality = quality;
1229 if (!enc->me_threshold)
1230 big_picture.pict_type = 0;
1231 // big_picture.pts = AV_NOPTS_VALUE;
1232 big_picture.pts= ost->sync_opts;
1233 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1234 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1235 if (ost->forced_kf_index < ost->forced_kf_count &&
1236 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1237 big_picture.pict_type = AV_PICTURE_TYPE_I;
1238 ost->forced_kf_index++;
1240 ret = avcodec_encode_video(enc,
1241 bit_buffer, bit_buffer_size,
1244 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1249 pkt.data= bit_buffer;
1251 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1252 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1253 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1254 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1255 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1257 if(enc->coded_frame->key_frame)
1258 pkt.flags |= AV_PKT_FLAG_KEY;
1259 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1262 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1263 // enc->frame_number-1, ret, enc->pict_type);
1264 /* if two pass, output log */
1265 if (ost->logfile && enc->stats_out) {
1266 fprintf(ost->logfile, "%s", enc->stats_out);
1271 ost->frame_number++;
1275 static double psnr(double d){
1276 return -10.0*log(d)/log(10.0);
1279 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1282 AVCodecContext *enc;
1284 double ti1, bitrate, avg_bitrate;
1286 /* this is executed just the first time do_video_stats is called */
1288 vstats_file = fopen(vstats_filename, "w");
1295 enc = ost->st->codec;
1296 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1297 frame_number = ost->frame_number;
1298 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1299 if (enc->flags&CODEC_FLAG_PSNR)
1300 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1302 fprintf(vstats_file,"f_size= %6d ", frame_size);
1303 /* compute pts value */
1304 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1308 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1309 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1310 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1311 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1312 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1316 static void print_report(OutputFile *output_files,
1317 OutputStream *ost_table, int nb_ostreams,
1318 int is_last_report, int64_t timer_start)
1322 AVFormatContext *oc;
1324 AVCodecContext *enc;
1325 int frame_number, vid, i;
1326 double bitrate, ti1, pts;
1327 static int64_t last_time = -1;
1328 static int qp_histogram[52];
1330 if (!print_stats && !is_last_report)
1333 if (!is_last_report) {
1335 /* display the report every 0.5 seconds */
1336 cur_time = av_gettime();
1337 if (last_time == -1) {
1338 last_time = cur_time;
1341 if ((cur_time - last_time) < 500000)
1343 last_time = cur_time;
1347 oc = output_files[0].ctx;
1349 total_size = avio_size(oc->pb);
1350 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1351 total_size= avio_tell(oc->pb);
1356 for(i=0;i<nb_ostreams;i++) {
1358 ost = &ost_table[i];
1359 enc = ost->st->codec;
1360 if (!ost->stream_copy && enc->coded_frame)
1361 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1362 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1363 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1365 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1366 float t = (av_gettime()-timer_start) / 1000000.0;
1368 frame_number = ost->frame_number;
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1370 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1372 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1376 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1379 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1381 if (enc->flags&CODEC_FLAG_PSNR){
1383 double error, error_sum=0;
1384 double scale, scale_sum=0;
1385 char type[3]= {'Y','U','V'};
1386 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1389 error= enc->error[j];
1390 scale= enc->width*enc->height*255.0*255.0*frame_number;
1392 error= enc->coded_frame->error[j];
1393 scale= enc->width*enc->height*255.0*255.0;
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1400 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1404 /* compute min output value */
1405 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1406 if ((pts < ti1) && (pts > 0))
1412 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1414 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1415 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1416 (double)total_size / 1024, ti1, bitrate);
1418 if (nb_frames_dup || nb_frames_drop)
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1420 nb_frames_dup, nb_frames_drop);
1422 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1426 if (is_last_report) {
1427 int64_t raw= audio_size + video_size + extra_size;
1428 av_log(NULL, AV_LOG_INFO, "\n");
1429 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1433 100.0*(total_size - raw)/raw
1438 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1440 int fill_char = 0x00;
1441 if (sample_fmt == AV_SAMPLE_FMT_U8)
1443 memset(buf, fill_char, size);
1446 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1450 for (i = 0; i < nb_ostreams; i++) {
1451 OutputStream *ost = &ost_table[i];
1452 AVCodecContext *enc = ost->st->codec;
1453 AVFormatContext *os = output_files[ost->file_index].ctx;
1455 if (!ost->encoding_needed)
1458 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1460 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1466 av_init_packet(&pkt);
1467 pkt.stream_index= ost->index;
1469 switch (ost->st->codec->codec_type) {
1470 case AVMEDIA_TYPE_AUDIO:
1471 fifo_bytes = av_fifo_size(ost->fifo);
1473 /* encode any samples remaining in fifo */
1474 if (fifo_bytes > 0) {
1475 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1476 int fs_tmp = enc->frame_size;
1478 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1479 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1480 enc->frame_size = fifo_bytes / (osize * enc->channels);
1482 int frame_bytes = enc->frame_size*osize*enc->channels;
1483 if (allocated_audio_buf_size < frame_bytes)
1485 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1488 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1489 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1490 ost->st->time_base.num, enc->sample_rate);
1491 enc->frame_size = fs_tmp;
1494 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1497 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1501 pkt.flags |= AV_PKT_FLAG_KEY;
1503 case AVMEDIA_TYPE_VIDEO:
1504 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1506 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1510 if(enc->coded_frame && enc->coded_frame->key_frame)
1511 pkt.flags |= AV_PKT_FLAG_KEY;
1512 if (ost->logfile && enc->stats_out) {
1513 fprintf(ost->logfile, "%s", enc->stats_out);
1522 pkt.data = bit_buffer;
1524 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1525 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1526 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1532 * Check whether a packet from ist should be written into ost at this time
1534 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1536 OutputFile *of = &output_files[ost->file_index];
1537 int ist_index = ist - input_streams;
1539 if (ost->source_index != ist_index)
1542 if (of->start_time && ist->pts < of->start_time)
1545 if (of->recording_time != INT64_MAX &&
1546 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1547 (AVRational){1, 1000000}) >= 0) {
1548 ost->is_past_recording_time = 1;
1555 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1557 OutputFile *of = &output_files[ost->file_index];
1558 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1561 av_init_packet(&opkt);
1563 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1564 !ost->copy_initial_nonkeyframes)
1567 /* force the input stream PTS */
1568 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1569 audio_size += pkt->size;
1570 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1571 video_size += pkt->size;
1575 opkt.stream_index = ost->index;
1576 if (pkt->pts != AV_NOPTS_VALUE)
1577 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1579 opkt.pts = AV_NOPTS_VALUE;
1581 if (pkt->dts == AV_NOPTS_VALUE)
1582 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1584 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1585 opkt.dts -= ost_tb_start_time;
1587 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1588 opkt.flags = pkt->flags;
1590 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1591 if( ost->st->codec->codec_id != CODEC_ID_H264
1592 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1593 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1595 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1596 opkt.destruct = av_destruct_packet;
1598 opkt.data = pkt->data;
1599 opkt.size = pkt->size;
1602 write_frame(of->ctx, &opkt, ost->st->codec, ost->bitstream_filters);
1603 ost->st->codec->frame_number++;
1604 ost->frame_number++;
1605 av_free_packet(&opkt);
1608 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1609 static int output_packet(InputStream *ist, int ist_index,
1610 OutputStream *ost_table, int nb_ostreams,
1611 const AVPacket *pkt)
1613 AVFormatContext *os;
1617 void *buffer_to_free = NULL;
1618 static unsigned int samples_size= 0;
1619 AVSubtitle subtitle, *subtitle_to_free;
1620 int64_t pkt_pts = AV_NOPTS_VALUE;
1622 int frame_available;
1627 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1629 if(ist->next_pts == AV_NOPTS_VALUE)
1630 ist->next_pts= ist->pts;
1634 av_init_packet(&avpkt);
1642 if(pkt->dts != AV_NOPTS_VALUE)
1643 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1644 if(pkt->pts != AV_NOPTS_VALUE)
1645 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1647 //while we have more to decode or while the decoder did output something on EOF
1648 while (avpkt.size > 0 || (!pkt && got_output)) {
1649 uint8_t *decoded_data_buf;
1650 int decoded_data_size;
1651 AVFrame *decoded_frame, *filtered_frame;
1653 ist->pts= ist->next_pts;
1655 if(avpkt.size && avpkt.size != pkt->size)
1656 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1657 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1658 ist->showed_multi_packet_warning=1;
1660 /* decode the packet if needed */
1661 decoded_frame = filtered_frame = NULL;
1662 decoded_data_buf = NULL; /* fail safe */
1663 decoded_data_size= 0;
1664 subtitle_to_free = NULL;
1665 if (ist->decoding_needed) {
1666 switch(ist->st->codec->codec_type) {
1667 case AVMEDIA_TYPE_AUDIO:{
1668 if(pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1669 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1671 samples= av_malloc(samples_size);
1673 decoded_data_size= samples_size;
1674 /* XXX: could avoid copy if PCM 16 bits with same
1675 endianness as CPU */
1676 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1682 got_output = decoded_data_size > 0;
1683 /* Some bug in mpeg audio decoder gives */
1684 /* decoded_data_size < 0, it seems they are overflows */
1686 /* no audio frame */
1689 decoded_data_buf = (uint8_t *)samples;
1690 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1691 (ist->st->codec->sample_rate * ist->st->codec->channels);
1693 case AVMEDIA_TYPE_VIDEO:
1694 if (!(decoded_frame = avcodec_alloc_frame()))
1695 return AVERROR(ENOMEM);
1696 avpkt.pts = pkt_pts;
1697 avpkt.dts = ist->pts;
1698 pkt_pts = AV_NOPTS_VALUE;
1700 ret = avcodec_decode_video2(ist->st->codec,
1701 decoded_frame, &got_output, &avpkt);
1702 quality = same_quant ? decoded_frame->quality : 0;
1706 /* no picture yet */
1707 av_freep(&decoded_frame);
1708 goto discard_packet;
1710 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1711 decoded_frame->pkt_dts);
1712 if (ist->st->codec->time_base.num != 0) {
1713 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1714 ist->next_pts += ((int64_t)AV_TIME_BASE *
1715 ist->st->codec->time_base.num * ticks) /
1716 ist->st->codec->time_base.den;
1719 buffer_to_free = NULL;
1720 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1722 case AVMEDIA_TYPE_SUBTITLE:
1723 ret = avcodec_decode_subtitle2(ist->st->codec,
1724 &subtitle, &got_output, &avpkt);
1728 goto discard_packet;
1730 subtitle_to_free = &subtitle;
1737 switch(ist->st->codec->codec_type) {
1738 case AVMEDIA_TYPE_AUDIO:
1739 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1740 ist->st->codec->sample_rate;
1742 case AVMEDIA_TYPE_VIDEO:
1743 if (ist->st->codec->time_base.num != 0) {
1744 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1745 ist->next_pts += ((int64_t)AV_TIME_BASE *
1746 ist->st->codec->time_base.num * ticks) /
1747 ist->st->codec->time_base.den;
1754 // preprocess audio (volume)
1755 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1756 if (audio_volume != 256) {
1757 switch (ist->st->codec->sample_fmt) {
1758 case AV_SAMPLE_FMT_U8:
1760 uint8_t *volp = samples;
1761 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1762 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1763 *volp++ = av_clip_uint8(v);
1767 case AV_SAMPLE_FMT_S16:
1769 int16_t *volp = samples;
1770 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1771 int v = ((*volp) * audio_volume + 128) >> 8;
1772 *volp++ = av_clip_int16(v);
1776 case AV_SAMPLE_FMT_S32:
1778 int32_t *volp = samples;
1779 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1780 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1781 *volp++ = av_clipl_int32(v);
1785 case AV_SAMPLE_FMT_FLT:
1787 float *volp = samples;
1788 float scale = audio_volume / 256.f;
1789 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1794 case AV_SAMPLE_FMT_DBL:
1796 double *volp = samples;
1797 double scale = audio_volume / 256.;
1798 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1804 av_log(NULL, AV_LOG_FATAL,
1805 "Audio volume adjustment on sample format %s is not supported.\n",
1806 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1812 /* frame rate emulation */
1813 if (input_files[ist->file_index].rate_emu) {
1814 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1815 int64_t now = av_gettime() - ist->start;
1819 /* if output time reached then transcode raw format,
1820 encode packets and output them */
1821 for (i = 0; i < nb_ostreams; i++) {
1824 ost = &ost_table[i];
1826 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1830 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1831 ost->input_video_filter) {
1833 if (ist->st->sample_aspect_ratio.num)
1834 sar = ist->st->sample_aspect_ratio;
1836 sar = ist->st->codec->sample_aspect_ratio;
1837 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, ist->pts, sar);
1838 if (!(filtered_frame = avcodec_alloc_frame())) {
1839 ret = AVERROR(ENOMEM);
1843 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1844 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1845 while (frame_available) {
1846 AVRational ist_pts_tb;
1847 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1848 get_filtered_video_frame(ost->output_video_filter, filtered_frame, &ost->picref, &ist_pts_tb);
1850 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1852 filtered_frame = decoded_frame;
1854 os = output_files[ost->file_index].ctx;
1856 /* set the input output pts pairs */
1857 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1859 if (ost->encoding_needed) {
1860 av_assert0(ist->decoding_needed);
1861 switch(ost->st->codec->codec_type) {
1862 case AVMEDIA_TYPE_AUDIO:
1863 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1865 case AVMEDIA_TYPE_VIDEO:
1867 if (ost->picref->video && !ost->frame_aspect_ratio)
1868 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1870 do_video_out(os, ost, ist, filtered_frame, &frame_size,
1871 same_quant ? quality : ost->st->codec->global_quality);
1872 if (vstats_filename && frame_size)
1873 do_video_stats(os, ost, frame_size);
1875 case AVMEDIA_TYPE_SUBTITLE:
1876 do_subtitle_out(os, ost, ist, &subtitle,
1884 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1885 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1887 avfilter_unref_buffer(ost->picref);
1889 av_freep(&filtered_frame);
1894 av_free(buffer_to_free);
1895 /* XXX: allocate the subtitles in the codec ? */
1896 if (subtitle_to_free) {
1897 avsubtitle_free(subtitle_to_free);
1898 subtitle_to_free = NULL;
1900 av_freep(&decoded_frame);
1906 /* handle stream copy */
1907 for (i = 0; pkt && i < nb_ostreams; i++) {
1908 ost = &ost_table[i];
1910 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
1913 do_streamcopy(ist, ost, pkt);
1919 static void print_sdp(OutputFile *output_files, int n)
1923 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1927 for (i = 0; i < n; i++)
1928 avc[i] = output_files[i].ctx;
1930 av_sdp_create(avc, n, sdp, sizeof(sdp));
1931 printf("SDP:\n%s\n", sdp);
1936 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1937 char *error, int error_len)
1940 InputStream *ist = &input_streams[ist_index];
1941 if (ist->decoding_needed) {
1942 AVCodec *codec = ist->dec;
1944 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
1945 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1946 return AVERROR(EINVAL);
1949 /* update requested sample format for the decoder based on the
1950 corresponding encoder sample format */
1951 for (i = 0; i < nb_output_streams; i++) {
1952 OutputStream *ost = &output_streams[i];
1953 if (ost->source_index == ist_index) {
1954 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1959 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1960 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
1961 ist->file_index, ist->st->index);
1962 return AVERROR(EINVAL);
1964 assert_codec_experimental(ist->st->codec, 0);
1965 assert_avoptions(ist->opts);
1968 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;
1969 ist->next_pts = AV_NOPTS_VALUE;
1970 init_pts_correction(&ist->pts_ctx);
1976 static int transcode_init(OutputFile *output_files,
1977 int nb_output_files,
1978 InputFile *input_files,
1981 int ret = 0, i, j, k;
1982 AVFormatContext *oc;
1983 AVCodecContext *codec, *icodec;
1989 /* init framerate emulation */
1990 for (i = 0; i < nb_input_files; i++) {
1991 InputFile *ifile = &input_files[i];
1992 if (ifile->rate_emu)
1993 for (j = 0; j < ifile->nb_streams; j++)
1994 input_streams[j + ifile->ist_index].start = av_gettime();
1997 /* output stream init */
1998 for (i = 0; i < nb_output_files; i++) {
1999 oc = output_files[i].ctx;
2000 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2001 av_dump_format(oc, i, oc->filename, 1);
2002 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2003 return AVERROR(EINVAL);
2007 /* for each output stream, we compute the right encoding parameters */
2008 for (i = 0; i < nb_output_streams; i++) {
2009 ost = &output_streams[i];
2010 oc = output_files[ost->file_index].ctx;
2011 ist = &input_streams[ost->source_index];
2013 if (ost->attachment_filename)
2016 codec = ost->st->codec;
2017 icodec = ist->st->codec;
2019 ost->st->disposition = ist->st->disposition;
2020 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2021 codec->chroma_sample_location = icodec->chroma_sample_location;
2023 if (ost->stream_copy) {
2024 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2026 if (extra_size > INT_MAX) {
2027 return AVERROR(EINVAL);
2030 /* if stream_copy is selected, no need to decode or encode */
2031 codec->codec_id = icodec->codec_id;
2032 codec->codec_type = icodec->codec_type;
2034 if (!codec->codec_tag) {
2035 if (!oc->oformat->codec_tag ||
2036 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2037 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2038 codec->codec_tag = icodec->codec_tag;
2041 codec->bit_rate = icodec->bit_rate;
2042 codec->rc_max_rate = icodec->rc_max_rate;
2043 codec->rc_buffer_size = icodec->rc_buffer_size;
2044 codec->extradata = av_mallocz(extra_size);
2045 if (!codec->extradata) {
2046 return AVERROR(ENOMEM);
2048 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2049 codec->extradata_size = icodec->extradata_size;
2051 av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) &&
2052 av_q2d(ist->st->time_base) < 1.0/500) {
2053 codec->time_base = icodec->time_base;
2054 codec->time_base.num *= icodec->ticks_per_frame;
2055 av_reduce(&codec->time_base.num, &codec->time_base.den,
2056 codec->time_base.num, codec->time_base.den, INT_MAX);
2058 codec->time_base = ist->st->time_base;
2060 switch(codec->codec_type) {
2061 case AVMEDIA_TYPE_AUDIO:
2062 if(audio_volume != 256) {
2063 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2066 codec->channel_layout = icodec->channel_layout;
2067 codec->sample_rate = icodec->sample_rate;
2068 codec->channels = icodec->channels;
2069 codec->frame_size = icodec->frame_size;
2070 codec->audio_service_type = icodec->audio_service_type;
2071 codec->block_align = icodec->block_align;
2073 case AVMEDIA_TYPE_VIDEO:
2074 codec->pix_fmt = icodec->pix_fmt;
2075 codec->width = icodec->width;
2076 codec->height = icodec->height;
2077 codec->has_b_frames = icodec->has_b_frames;
2078 if (!codec->sample_aspect_ratio.num) {
2079 codec->sample_aspect_ratio =
2080 ost->st->sample_aspect_ratio =
2081 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2082 ist->st->codec->sample_aspect_ratio.num ?
2083 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2086 case AVMEDIA_TYPE_SUBTITLE:
2087 codec->width = icodec->width;
2088 codec->height = icodec->height;
2090 case AVMEDIA_TYPE_DATA:
2091 case AVMEDIA_TYPE_ATTACHMENT:
2098 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2100 ist->decoding_needed = 1;
2101 ost->encoding_needed = 1;
2103 switch(codec->codec_type) {
2104 case AVMEDIA_TYPE_AUDIO:
2105 ost->fifo = av_fifo_alloc(1024);
2107 return AVERROR(ENOMEM);
2109 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2111 if (!codec->sample_rate)
2112 codec->sample_rate = icodec->sample_rate;
2113 choose_sample_rate(ost->st, ost->enc);
2114 codec->time_base = (AVRational){1, codec->sample_rate};
2116 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2117 codec->sample_fmt = icodec->sample_fmt;
2118 choose_sample_fmt(ost->st, ost->enc);
2120 if (!codec->channels)
2121 codec->channels = icodec->channels;
2122 codec->channel_layout = icodec->channel_layout;
2123 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2124 codec->channel_layout = 0;
2126 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2127 icodec->request_channels = codec-> channels;
2128 ost->resample_sample_fmt = icodec->sample_fmt;
2129 ost->resample_sample_rate = icodec->sample_rate;
2130 ost->resample_channels = icodec->channels;
2132 case AVMEDIA_TYPE_VIDEO:
2133 if (codec->pix_fmt == PIX_FMT_NONE)
2134 codec->pix_fmt = icodec->pix_fmt;
2135 choose_pixel_fmt(ost->st, ost->enc);
2137 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2138 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2142 if (!codec->width || !codec->height) {
2143 codec->width = icodec->width;
2144 codec->height = icodec->height;
2147 ost->video_resample = codec->width != icodec->width ||
2148 codec->height != icodec->height ||
2149 codec->pix_fmt != icodec->pix_fmt;
2150 if (ost->video_resample) {
2151 #if !CONFIG_AVFILTER
2152 avcodec_get_frame_defaults(&ost->pict_tmp);
2153 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2154 codec->width, codec->height)) {
2155 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
2158 ost->img_resample_ctx = sws_getContext(
2165 ost->sws_flags, NULL, NULL, NULL);
2166 if (ost->img_resample_ctx == NULL) {
2167 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
2171 codec->bits_per_raw_sample= 0;
2174 ost->resample_height = icodec->height;
2175 ost->resample_width = icodec->width;
2176 ost->resample_pix_fmt = icodec->pix_fmt;
2178 if (!ost->frame_rate.num)
2179 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2180 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2181 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2182 ost->frame_rate = ost->enc->supported_framerates[idx];
2184 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2187 if (configure_video_filters(ist, ost)) {
2188 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2193 case AVMEDIA_TYPE_SUBTITLE:
2200 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2201 char logfilename[1024];
2204 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2205 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2207 if (codec->flags & CODEC_FLAG_PASS1) {
2208 f = fopen(logfilename, "wb");
2210 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2211 logfilename, strerror(errno));
2217 size_t logbuffer_size;
2218 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2219 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2223 codec->stats_in = logbuffer;
2227 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2228 int size = codec->width * codec->height;
2229 bit_buffer_size = FFMAX(bit_buffer_size, 6*size + 200);
2234 bit_buffer = av_malloc(bit_buffer_size);
2236 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2238 return AVERROR(ENOMEM);
2241 /* open each encoder */
2242 for (i = 0; i < nb_output_streams; i++) {
2243 ost = &output_streams[i];
2244 if (ost->encoding_needed) {
2245 AVCodec *codec = ost->enc;
2246 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2248 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2249 ost->st->codec->codec_id, ost->file_index, ost->index);
2250 ret = AVERROR(EINVAL);
2253 if (dec->subtitle_header) {
2254 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2255 if (!ost->st->codec->subtitle_header) {
2256 ret = AVERROR(ENOMEM);
2259 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2260 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2262 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2263 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2264 ost->file_index, ost->index);
2265 ret = AVERROR(EINVAL);
2268 assert_codec_experimental(ost->st->codec, 1);
2269 assert_avoptions(ost->opts);
2270 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2271 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2272 "It takes bits/s as argument, not kbits/s\n");
2273 extra_size += ost->st->codec->extradata_size;
2275 if (ost->st->codec->me_threshold)
2276 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2280 /* init input streams */
2281 for (i = 0; i < nb_input_streams; i++)
2282 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2285 /* discard unused programs */
2286 for (i = 0; i < nb_input_files; i++) {
2287 InputFile *ifile = &input_files[i];
2288 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2289 AVProgram *p = ifile->ctx->programs[j];
2290 int discard = AVDISCARD_ALL;
2292 for (k = 0; k < p->nb_stream_indexes; k++)
2293 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2294 discard = AVDISCARD_DEFAULT;
2297 p->discard = discard;
2301 /* open files and write file headers */
2302 for (i = 0; i < nb_output_files; i++) {
2303 oc = output_files[i].ctx;
2304 oc->interrupt_callback = int_cb;
2305 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2306 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2307 ret = AVERROR(EINVAL);
2310 assert_avoptions(output_files[i].opts);
2311 if (strcmp(oc->oformat->name, "rtp")) {
2317 /* dump the file output parameters - cannot be done before in case
2319 for (i = 0; i < nb_output_files; i++) {
2320 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2323 /* dump the stream mapping */
2324 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2325 for (i = 0; i < nb_output_streams; i++) {
2326 ost = &output_streams[i];
2328 if (ost->attachment_filename) {
2329 /* an attached file */
2330 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2331 ost->attachment_filename, ost->file_index, ost->index);
2334 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2335 input_streams[ost->source_index].file_index,
2336 input_streams[ost->source_index].st->index,
2339 if (ost->sync_ist != &input_streams[ost->source_index])
2340 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2341 ost->sync_ist->file_index,
2342 ost->sync_ist->st->index);
2343 if (ost->stream_copy)
2344 av_log(NULL, AV_LOG_INFO, " (copy)");
2346 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2347 input_streams[ost->source_index].dec->name : "?",
2348 ost->enc ? ost->enc->name : "?");
2349 av_log(NULL, AV_LOG_INFO, "\n");
2353 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2358 print_sdp(output_files, nb_output_files);
2365 * The following code is the main loop of the file converter
2367 static int transcode(OutputFile *output_files,
2368 int nb_output_files,
2369 InputFile *input_files,
2373 AVFormatContext *is, *os;
2377 int no_packet_count=0;
2378 int64_t timer_start;
2380 if (!(no_packet = av_mallocz(nb_input_files)))
2383 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2387 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2390 timer_start = av_gettime();
2392 for(; received_sigterm == 0;) {
2393 int file_index, ist_index;
2398 ipts_min = INT64_MAX;
2401 /* select the stream that we must read now by looking at the
2402 smallest output pts */
2404 for (i = 0; i < nb_output_streams; i++) {
2408 ost = &output_streams[i];
2409 of = &output_files[ost->file_index];
2410 os = output_files[ost->file_index].ctx;
2411 ist = &input_streams[ost->source_index];
2412 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2413 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2415 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2417 if (!input_files[ist->file_index].eof_reached){
2418 if(ipts < ipts_min) {
2420 if(input_sync ) file_index = ist->file_index;
2422 if(opts < opts_min) {
2424 if(!input_sync) file_index = ist->file_index;
2427 if (ost->frame_number >= ost->max_frames) {
2429 for (j = 0; j < of->ctx->nb_streams; j++)
2430 output_streams[of->ost_index + j].is_past_recording_time = 1;
2434 /* if none, if is finished */
2435 if (file_index < 0) {
2436 if(no_packet_count){
2438 memset(no_packet, 0, nb_input_files);
2445 /* read a frame from it and output it in the fifo */
2446 is = input_files[file_index].ctx;
2447 ret= av_read_frame(is, &pkt);
2448 if(ret == AVERROR(EAGAIN)){
2449 no_packet[file_index]=1;
2454 input_files[file_index].eof_reached = 1;
2462 memset(no_packet, 0, nb_input_files);
2465 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2466 is->streams[pkt.stream_index]);
2468 /* the following test is needed in case new streams appear
2469 dynamically in stream : we ignore them */
2470 if (pkt.stream_index >= input_files[file_index].nb_streams)
2471 goto discard_packet;
2472 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2473 ist = &input_streams[ist_index];
2475 goto discard_packet;
2477 if (pkt.dts != AV_NOPTS_VALUE)
2478 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2479 if (pkt.pts != AV_NOPTS_VALUE)
2480 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2482 if(pkt.pts != AV_NOPTS_VALUE)
2483 pkt.pts *= ist->ts_scale;
2484 if(pkt.dts != AV_NOPTS_VALUE)
2485 pkt.dts *= ist->ts_scale;
2487 // 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);
2488 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2489 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2490 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2491 int64_t delta= pkt_dts - ist->next_pts;
2492 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2493 input_files[ist->file_index].ts_offset -= delta;
2494 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2495 delta, input_files[ist->file_index].ts_offset);
2496 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2497 if(pkt.pts != AV_NOPTS_VALUE)
2498 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2502 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2503 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2505 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2506 ist->file_index, ist->st->index);
2509 av_free_packet(&pkt);
2514 av_free_packet(&pkt);
2516 /* dump report by using the output first video and audio streams */
2517 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2520 /* at the end of stream, we must flush the decoder buffers */
2521 for (i = 0; i < nb_input_streams; i++) {
2522 ist = &input_streams[i];
2523 if (ist->decoding_needed) {
2524 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2527 flush_encoders(output_streams, nb_output_streams);
2531 /* write the trailer if needed and close file */
2532 for(i=0;i<nb_output_files;i++) {
2533 os = output_files[i].ctx;
2534 av_write_trailer(os);
2537 /* dump report by using the first video and audio streams */
2538 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2540 /* close each encoder */
2541 for (i = 0; i < nb_output_streams; i++) {
2542 ost = &output_streams[i];
2543 if (ost->encoding_needed) {
2544 av_freep(&ost->st->codec->stats_in);
2545 avcodec_close(ost->st->codec);
2548 avfilter_graph_free(&ost->graph);
2552 /* close each decoder */
2553 for (i = 0; i < nb_input_streams; i++) {
2554 ist = &input_streams[i];
2555 if (ist->decoding_needed) {
2556 avcodec_close(ist->st->codec);
2564 av_freep(&bit_buffer);
2565 av_freep(&no_packet);
2567 if (output_streams) {
2568 for (i = 0; i < nb_output_streams; i++) {
2569 ost = &output_streams[i];
2571 if (ost->stream_copy)
2572 av_freep(&ost->st->codec->extradata);
2574 fclose(ost->logfile);
2575 ost->logfile = NULL;
2577 av_fifo_free(ost->fifo); /* works even if fifo is not
2578 initialized but set to zero */
2579 av_freep(&ost->st->codec->subtitle_header);
2580 av_free(ost->pict_tmp.data[0]);
2581 av_free(ost->forced_kf_pts);
2582 if (ost->video_resample)
2583 sws_freeContext(ost->img_resample_ctx);
2585 audio_resample_close(ost->resample);
2586 if (ost->reformat_ctx)
2587 av_audio_convert_free(ost->reformat_ctx);
2588 av_dict_free(&ost->opts);
2595 static double parse_frame_aspect_ratio(const char *arg)
2602 p = strchr(arg, ':');
2604 x = strtol(arg, &end, 10);
2606 y = strtol(end+1, &end, 10);
2608 ar = (double)x / (double)y;
2610 ar = strtod(arg, NULL);
2613 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2619 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2621 return parse_option(o, "codec:a", arg, options);
2624 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2626 return parse_option(o, "codec:v", arg, options);
2629 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2631 return parse_option(o, "codec:s", arg, options);
2634 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2636 return parse_option(o, "codec:d", arg, options);
2639 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2641 StreamMap *m = NULL;
2642 int i, negative = 0, file_idx;
2643 int sync_file_idx = -1, sync_stream_idx;
2651 map = av_strdup(arg);
2653 /* parse sync stream first, just pick first matching stream */
2654 if (sync = strchr(map, ',')) {
2656 sync_file_idx = strtol(sync + 1, &sync, 0);
2657 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2658 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2663 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2664 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2665 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2666 sync_stream_idx = i;
2669 if (i == input_files[sync_file_idx].nb_streams) {
2670 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2671 "match any streams.\n", arg);
2677 file_idx = strtol(map, &p, 0);
2678 if (file_idx >= nb_input_files || file_idx < 0) {
2679 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2683 /* disable some already defined maps */
2684 for (i = 0; i < o->nb_stream_maps; i++) {
2685 m = &o->stream_maps[i];
2686 if (file_idx == m->file_index &&
2687 check_stream_specifier(input_files[m->file_index].ctx,
2688 input_files[m->file_index].ctx->streams[m->stream_index],
2689 *p == ':' ? p + 1 : p) > 0)
2693 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2694 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2695 *p == ':' ? p + 1 : p) <= 0)
2697 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2698 &o->nb_stream_maps, o->nb_stream_maps + 1);
2699 m = &o->stream_maps[o->nb_stream_maps - 1];
2701 m->file_index = file_idx;
2702 m->stream_index = i;
2704 if (sync_file_idx >= 0) {
2705 m->sync_file_index = sync_file_idx;
2706 m->sync_stream_index = sync_stream_idx;
2708 m->sync_file_index = file_idx;
2709 m->sync_stream_index = i;
2714 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2722 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
2724 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
2725 &o->nb_attachments, o->nb_attachments + 1);
2726 o->attachments[o->nb_attachments - 1] = arg;
2730 static void parse_meta_type(char *arg, char *type, int *index)
2740 if (*(++arg) == ':')
2741 *index = strtol(++arg, NULL, 0);
2744 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2751 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2753 MetadataMap *m, *m1;
2756 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2757 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2759 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2760 m->file = strtol(arg, &p, 0);
2761 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2763 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2764 if (p = strchr(opt, ':'))
2765 parse_meta_type(p + 1, &m1->type, &m1->index);
2769 if (m->type == 'g' || m1->type == 'g')
2770 o->metadata_global_manual = 1;
2771 if (m->type == 's' || m1->type == 's')
2772 o->metadata_streams_manual = 1;
2773 if (m->type == 'c' || m1->type == 'c')
2774 o->metadata_chapters_manual = 1;
2779 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2781 const char *codec_string = encoder ? "encoder" : "decoder";
2785 avcodec_find_encoder_by_name(name) :
2786 avcodec_find_decoder_by_name(name);
2788 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
2791 if(codec->type != type) {
2792 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
2798 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
2800 char *codec_name = NULL;
2802 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2804 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
2805 st->codec->codec_id = codec->id;
2808 return avcodec_find_decoder(st->codec->codec_id);
2812 * Add all the streams from the given input file to the global
2813 * list of input streams.
2815 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2817 int i, rfps, rfps_base;
2819 for (i = 0; i < ic->nb_streams; i++) {
2820 AVStream *st = ic->streams[i];
2821 AVCodecContext *dec = st->codec;
2824 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2825 ist = &input_streams[nb_input_streams - 1];
2827 ist->file_index = nb_input_files;
2829 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2831 ist->ts_scale = 1.0;
2832 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
2834 ist->dec = choose_decoder(o, ic, st);
2836 switch (dec->codec_type) {
2837 case AVMEDIA_TYPE_AUDIO:
2838 if (o->audio_disable)
2839 st->discard= AVDISCARD_ALL;
2841 case AVMEDIA_TYPE_VIDEO:
2842 rfps = ic->streams[i]->r_frame_rate.num;
2843 rfps_base = ic->streams[i]->r_frame_rate.den;
2845 dec->flags |= CODEC_FLAG_EMU_EDGE;
2846 dec->height >>= dec->lowres;
2847 dec->width >>= dec->lowres;
2850 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2852 av_log(NULL, AV_LOG_INFO,"\nSeems stream %d codec frame rate differs from container frame rate: %2.2f (%d/%d) -> %2.2f (%d/%d)\n",
2853 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2854 (float)rfps / rfps_base, rfps, rfps_base);
2857 if (o->video_disable)
2858 st->discard= AVDISCARD_ALL;
2859 else if(video_discard)
2860 st->discard= video_discard;
2862 case AVMEDIA_TYPE_DATA:
2864 case AVMEDIA_TYPE_SUBTITLE:
2865 if (o->subtitle_disable)
2866 st->discard = AVDISCARD_ALL;
2868 case AVMEDIA_TYPE_ATTACHMENT:
2869 case AVMEDIA_TYPE_UNKNOWN:
2877 static void assert_file_overwrite(const char *filename)
2879 if (!file_overwrite &&
2880 (strchr(filename, ':') == NULL || filename[1] == ':' ||
2881 av_strstart(filename, "file:", NULL))) {
2882 if (avio_check(filename, 0) == 0) {
2884 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
2886 if (!read_yesno()) {
2887 fprintf(stderr, "Not overwriting - exiting\n");
2892 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
2899 static void dump_attachment(AVStream *st, const char *filename)
2902 AVIOContext *out = NULL;
2903 AVDictionaryEntry *e;
2905 if (!st->codec->extradata_size) {
2906 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
2907 nb_input_files - 1, st->index);
2910 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
2911 filename = e->value;
2913 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
2914 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
2918 assert_file_overwrite(filename);
2920 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
2921 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
2926 avio_write(out, st->codec->extradata, st->codec->extradata_size);
2931 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2933 AVFormatContext *ic;
2934 AVInputFormat *file_iformat = NULL;
2938 AVDictionary **opts;
2939 int orig_nb_streams; // number of streams before avformat_find_stream_info
2942 if (!(file_iformat = av_find_input_format(o->format))) {
2943 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
2948 if (!strcmp(filename, "-"))
2951 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2952 !strcmp(filename, "/dev/stdin");
2954 /* get default parameters from command line */
2955 ic = avformat_alloc_context();
2957 print_error(filename, AVERROR(ENOMEM));
2960 if (o->nb_audio_sample_rate) {
2961 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2962 av_dict_set(&format_opts, "sample_rate", buf, 0);
2964 if (o->nb_audio_channels) {
2965 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2966 av_dict_set(&format_opts, "channels", buf, 0);
2968 if (o->nb_frame_rates) {
2969 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2971 if (o->nb_frame_sizes) {
2972 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2974 if (o->nb_frame_pix_fmts)
2975 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2977 ic->flags |= AVFMT_FLAG_NONBLOCK;
2978 ic->interrupt_callback = int_cb;
2980 /* open the input file with generic libav function */
2981 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2983 print_error(filename, err);
2986 assert_avoptions(format_opts);
2988 /* apply forced codec ids */
2989 for (i = 0; i < ic->nb_streams; i++)
2990 choose_decoder(o, ic, ic->streams[i]);
2992 /* Set AVCodecContext options for avformat_find_stream_info */
2993 opts = setup_find_stream_info_opts(ic, codec_opts);
2994 orig_nb_streams = ic->nb_streams;
2996 /* If not enough info to get the stream parameters, we decode the
2997 first frames to get it. (used in mpeg case for example) */
2998 ret = avformat_find_stream_info(ic, opts);
3000 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3001 av_close_input_file(ic);
3005 timestamp = o->start_time;
3006 /* add the stream start time */
3007 if (ic->start_time != AV_NOPTS_VALUE)
3008 timestamp += ic->start_time;
3010 /* if seeking requested, we execute it */
3011 if (o->start_time != 0) {
3012 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3014 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3015 filename, (double)timestamp / AV_TIME_BASE);
3019 /* update the current parameters so that they match the one of the input stream */
3020 add_input_streams(o, ic);
3022 /* dump the file content */
3023 av_dump_format(ic, nb_input_files, filename, 0);
3025 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3026 input_files[nb_input_files - 1].ctx = ic;
3027 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3028 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3029 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3030 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3032 for (i = 0; i < o->nb_dump_attachment; i++) {
3035 for (j = 0; j < ic->nb_streams; j++) {
3036 AVStream *st = ic->streams[j];
3038 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3039 dump_attachment(st, o->dump_attachment[i].u.str);
3043 for (i = 0; i < orig_nb_streams; i++)
3044 av_dict_free(&opts[i]);
3051 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3052 AVCodecContext *avctx)
3058 for (p = kf; *p; p++)
3061 ost->forced_kf_count = n;
3062 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3063 if (!ost->forced_kf_pts) {
3064 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3067 for (i = 0; i < n; i++) {
3068 p = i ? strchr(p, ',') + 1 : kf;
3069 t = parse_time_or_die("force_key_frames", p, 1);
3070 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3074 static uint8_t *get_line(AVIOContext *s)
3080 if (avio_open_dyn_buf(&line) < 0) {
3081 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3085 while ((c = avio_r8(s)) && c != '\n')
3088 avio_close_dyn_buf(line, &buf);
3093 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3096 char filename[1000];
3097 const char *base[3] = { getenv("AVCONV_DATADIR"),
3102 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3106 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3107 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3108 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3111 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3112 i != 1 ? "" : "/.avconv", preset_name);
3113 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3119 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3121 char *codec_name = NULL;
3123 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3125 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3126 NULL, ost->st->codec->codec_type);
3127 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3128 } else if (!strcmp(codec_name, "copy"))
3129 ost->stream_copy = 1;
3131 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3132 ost->st->codec->codec_id = ost->enc->id;
3136 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3139 AVStream *st = avformat_new_stream(oc, NULL);
3140 int idx = oc->nb_streams - 1, ret = 0;
3141 char *bsf = NULL, *next, *codec_tag = NULL;
3142 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3144 char *buf = NULL, *arg = NULL, *preset = NULL;
3145 AVIOContext *s = NULL;
3148 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3152 if (oc->nb_streams - 1 < o->nb_streamid_map)
3153 st->id = o->streamid_map[oc->nb_streams - 1];
3155 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3156 nb_output_streams + 1);
3157 ost = &output_streams[nb_output_streams - 1];
3158 ost->file_index = nb_output_files;
3161 st->codec->codec_type = type;
3162 choose_encoder(o, oc, ost);
3164 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3167 avcodec_get_context_defaults3(st->codec, ost->enc);
3168 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3170 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3171 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3174 if (!buf[0] || buf[0] == '#') {
3178 if (!(arg = strchr(buf, '='))) {
3179 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3183 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3185 } while (!s->eof_reached);
3189 av_log(NULL, AV_LOG_FATAL,
3190 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3191 preset, ost->file_index, ost->index);
3195 ost->max_frames = INT64_MAX;
3196 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3198 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3200 if (next = strchr(bsf, ','))
3202 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3203 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3207 bsfc_prev->next = bsfc;
3209 ost->bitstream_filters = bsfc;
3215 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3217 uint32_t tag = strtol(codec_tag, &next, 0);
3219 tag = AV_RL32(codec_tag);
3220 st->codec->codec_tag = tag;
3223 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3224 if (qscale >= 0 || same_quant) {
3225 st->codec->flags |= CODEC_FLAG_QSCALE;
3226 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3229 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3230 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3232 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3236 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3239 const char *p = str;
3246 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3253 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3257 AVCodecContext *video_enc;
3259 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3261 video_enc = st->codec;
3263 if (!ost->stream_copy) {
3264 const char *p = NULL;
3265 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3266 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3267 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3270 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3271 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3272 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3276 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3277 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3278 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3282 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3283 if (frame_aspect_ratio)
3284 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3286 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3287 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3288 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3291 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3293 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3295 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3296 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3299 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3301 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3303 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3304 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3307 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3310 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3313 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3315 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3318 video_enc->rc_override=
3319 av_realloc(video_enc->rc_override,
3320 sizeof(RcOverride)*(i+1));
3321 video_enc->rc_override[i].start_frame= start;
3322 video_enc->rc_override[i].end_frame = end;
3324 video_enc->rc_override[i].qscale= q;
3325 video_enc->rc_override[i].quality_factor= 1.0;
3328 video_enc->rc_override[i].qscale= 0;
3329 video_enc->rc_override[i].quality_factor= -q/100.0;
3334 video_enc->rc_override_count=i;
3335 if (!video_enc->rc_initial_buffer_occupancy)
3336 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3337 video_enc->intra_dc_precision= intra_dc_precision - 8;
3342 video_enc->flags |= CODEC_FLAG_PASS1;
3344 video_enc->flags |= CODEC_FLAG_PASS2;
3348 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3349 if (forced_key_frames)
3350 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3352 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3354 ost->top_field_first = -1;
3355 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3357 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3360 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3362 ost->avfilter = av_strdup(filters);
3369 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3373 AVCodecContext *audio_enc;
3375 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3378 audio_enc = st->codec;
3379 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3381 if (!ost->stream_copy) {
3382 char *sample_fmt = NULL;
3384 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3386 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3388 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3389 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3393 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3399 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3403 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3404 if (!ost->stream_copy) {
3405 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3412 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3414 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3415 ost->stream_copy = 1;
3419 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3423 AVCodecContext *subtitle_enc;
3425 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3427 subtitle_enc = st->codec;
3429 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3434 /* arg format is "output-stream-index:streamid-value". */
3435 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3441 av_strlcpy(idx_str, arg, sizeof(idx_str));
3442 p = strchr(idx_str, ':');
3444 av_log(NULL, AV_LOG_FATAL,
3445 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3450 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3451 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3452 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3456 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3458 AVFormatContext *is = ifile->ctx;
3459 AVFormatContext *os = ofile->ctx;
3462 for (i = 0; i < is->nb_chapters; i++) {
3463 AVChapter *in_ch = is->chapters[i], *out_ch;
3464 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3465 AV_TIME_BASE_Q, in_ch->time_base);
3466 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3467 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3470 if (in_ch->end < ts_off)
3472 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3475 out_ch = av_mallocz(sizeof(AVChapter));
3477 return AVERROR(ENOMEM);
3479 out_ch->id = in_ch->id;
3480 out_ch->time_base = in_ch->time_base;
3481 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3482 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3485 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3488 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3490 return AVERROR(ENOMEM);
3491 os->chapters[os->nb_chapters - 1] = out_ch;
3496 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3499 AVFormatContext *ic = avformat_alloc_context();
3501 ic->interrupt_callback = int_cb;
3502 err = avformat_open_input(&ic, filename, NULL, NULL);
3505 /* copy stream format */
3506 for(i=0;i<ic->nb_streams;i++) {
3511 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3512 ost = new_output_stream(o, s, codec->type);
3515 // FIXME: a more elegant solution is needed
3516 memcpy(st, ic->streams[i], sizeof(AVStream));
3518 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3520 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
3521 choose_sample_fmt(st, codec);
3522 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
3523 choose_pixel_fmt(st, codec);
3526 av_close_input_file(ic);
3530 static void opt_output_file(void *optctx, const char *filename)
3532 OptionsContext *o = optctx;
3533 AVFormatContext *oc;
3535 AVOutputFormat *file_oformat;
3539 if (!strcmp(filename, "-"))
3542 oc = avformat_alloc_context();
3544 print_error(filename, AVERROR(ENOMEM));
3549 file_oformat = av_guess_format(o->format, NULL, NULL);
3550 if (!file_oformat) {
3551 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3555 file_oformat = av_guess_format(NULL, filename, NULL);
3556 if (!file_oformat) {
3557 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3563 oc->oformat = file_oformat;
3564 oc->interrupt_callback = int_cb;
3565 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3567 if (!strcmp(file_oformat->name, "ffm") &&
3568 av_strstart(filename, "http:", NULL)) {
3569 /* special case for files sent to avserver: we get the stream
3570 parameters from avserver */
3571 int err = read_avserver_streams(o, oc, filename);
3573 print_error(filename, err);
3576 } else if (!o->nb_stream_maps) {
3577 /* pick the "best" stream of each type */
3578 #define NEW_STREAM(type, index)\
3580 ost = new_ ## type ## _stream(o, oc);\
3581 ost->source_index = index;\
3582 ost->sync_ist = &input_streams[index];\
3583 input_streams[index].discard = 0;\
3586 /* video: highest resolution */
3587 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3588 int area = 0, idx = -1;
3589 for (i = 0; i < nb_input_streams; i++) {
3590 ist = &input_streams[i];
3591 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3592 ist->st->codec->width * ist->st->codec->height > area) {
3593 area = ist->st->codec->width * ist->st->codec->height;
3597 NEW_STREAM(video, idx);
3600 /* audio: most channels */
3601 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3602 int channels = 0, idx = -1;
3603 for (i = 0; i < nb_input_streams; i++) {
3604 ist = &input_streams[i];
3605 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3606 ist->st->codec->channels > channels) {
3607 channels = ist->st->codec->channels;
3611 NEW_STREAM(audio, idx);
3614 /* subtitles: pick first */
3615 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3616 for (i = 0; i < nb_input_streams; i++)
3617 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3618 NEW_STREAM(subtitle, i);
3622 /* do something with data? */
3624 for (i = 0; i < o->nb_stream_maps; i++) {
3625 StreamMap *map = &o->stream_maps[i];
3630 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3631 switch (ist->st->codec->codec_type) {
3632 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3633 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3634 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3635 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3636 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3638 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
3639 map->file_index, map->stream_index);
3643 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3644 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3645 map->sync_stream_index];
3650 /* handle attached files */
3651 for (i = 0; i < o->nb_attachments; i++) {
3653 uint8_t *attachment;
3657 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
3658 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
3662 if ((len = avio_size(pb)) <= 0) {
3663 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
3667 if (!(attachment = av_malloc(len))) {
3668 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
3672 avio_read(pb, attachment, len);
3674 ost = new_attachment_stream(o, oc);
3675 ost->stream_copy = 0;
3676 ost->source_index = -1;
3677 ost->attachment_filename = o->attachments[i];
3678 ost->st->codec->extradata = attachment;
3679 ost->st->codec->extradata_size = len;
3681 p = strrchr(o->attachments[i], '/');
3682 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
3686 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3687 output_files[nb_output_files - 1].ctx = oc;
3688 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3689 output_files[nb_output_files - 1].recording_time = o->recording_time;
3690 output_files[nb_output_files - 1].start_time = o->start_time;
3691 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3692 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3694 /* check filename in case of an image number is expected */
3695 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3696 if (!av_filename_number_test(oc->filename)) {
3697 print_error(oc->filename, AVERROR(EINVAL));
3702 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3703 /* test if it already exists to avoid loosing precious files */
3704 assert_file_overwrite(filename);
3707 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3708 &oc->interrupt_callback,
3709 &output_files[nb_output_files - 1].opts)) < 0) {
3710 print_error(filename, err);
3715 if (o->mux_preload) {
3717 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
3718 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
3720 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3721 oc->flags |= AVFMT_FLAG_NONBLOCK;
3724 if (o->chapters_input_file >= nb_input_files) {
3725 if (o->chapters_input_file == INT_MAX) {
3726 /* copy chapters from the first input file that has them*/
3727 o->chapters_input_file = -1;
3728 for (i = 0; i < nb_input_files; i++)
3729 if (input_files[i].ctx->nb_chapters) {
3730 o->chapters_input_file = i;
3734 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3735 o->chapters_input_file);
3739 if (o->chapters_input_file >= 0)
3740 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3741 !o->metadata_chapters_manual);
3744 for (i = 0; i < o->nb_meta_data_maps; i++) {
3745 AVFormatContext *files[2];
3746 AVDictionary **meta[2];
3749 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3750 if ((index) < 0 || (index) >= (nb_elems)) {\
3751 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
3756 int in_file_index = o->meta_data_maps[i][1].file;
3757 if (in_file_index < 0)
3759 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3762 files[1] = input_files[in_file_index].ctx;
3764 for (j = 0; j < 2; j++) {
3765 MetadataMap *map = &o->meta_data_maps[i][j];
3767 switch (map->type) {
3769 meta[j] = &files[j]->metadata;
3772 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3773 meta[j] = &files[j]->streams[map->index]->metadata;
3776 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3777 meta[j] = &files[j]->chapters[map->index]->metadata;
3780 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3781 meta[j] = &files[j]->programs[map->index]->metadata;
3786 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3789 /* copy global metadata by default */
3790 if (!o->metadata_global_manual && nb_input_files)
3791 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3792 AV_DICT_DONT_OVERWRITE);
3793 if (!o->metadata_streams_manual)
3794 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3796 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
3798 ist = &input_streams[output_streams[i].source_index];
3799 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3802 /* process manually set metadata */
3803 for (i = 0; i < o->nb_metadata; i++) {
3808 val = strchr(o->metadata[i].u.str, '=');
3810 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
3811 o->metadata[i].u.str);
3816 parse_meta_type(o->metadata[i].specifier, &type, &index);
3822 if (index < 0 || index >= oc->nb_streams) {
3823 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
3826 m = &oc->streams[index]->metadata;
3829 if (index < 0 || index >= oc->nb_chapters) {
3830 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
3833 m = &oc->chapters[index]->metadata;
3836 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3840 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3846 /* same option as mencoder */
3847 static int opt_pass(const char *opt, const char *arg)
3849 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3853 static int64_t getutime(void)
3856 struct rusage rusage;
3858 getrusage(RUSAGE_SELF, &rusage);
3859 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3860 #elif HAVE_GETPROCESSTIMES
3862 FILETIME c, e, k, u;
3863 proc = GetCurrentProcess();
3864 GetProcessTimes(proc, &c, &e, &k, &u);
3865 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3867 return av_gettime();
3871 static int64_t getmaxrss(void)
3873 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3874 struct rusage rusage;
3875 getrusage(RUSAGE_SELF, &rusage);
3876 return (int64_t)rusage.ru_maxrss * 1024;
3877 #elif HAVE_GETPROCESSMEMORYINFO
3879 PROCESS_MEMORY_COUNTERS memcounters;
3880 proc = GetCurrentProcess();
3881 memcounters.cb = sizeof(memcounters);
3882 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3883 return memcounters.PeakPagefileUsage;
3889 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3891 return parse_option(o, "q:a", arg, options);
3894 static void show_usage(void)
3896 printf("Hyper fast Audio and Video encoder\n");
3897 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3901 static void show_help(void)
3903 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3904 av_log_set_callback(log_callback_help);
3906 show_help_options(options, "Main options:\n",
3907 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3908 show_help_options(options, "\nAdvanced options:\n",
3909 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3911 show_help_options(options, "\nVideo options:\n",
3912 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3914 show_help_options(options, "\nAdvanced Video options:\n",
3915 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3916 OPT_VIDEO | OPT_EXPERT);
3917 show_help_options(options, "\nAudio options:\n",
3918 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3920 show_help_options(options, "\nAdvanced Audio options:\n",
3921 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3922 OPT_AUDIO | OPT_EXPERT);
3923 show_help_options(options, "\nSubtitle options:\n",
3924 OPT_SUBTITLE | OPT_GRAB,
3926 show_help_options(options, "\nAudio/Video grab options:\n",
3930 show_help_children(avcodec_get_class(), flags);
3931 show_help_children(avformat_get_class(), flags);
3932 show_help_children(sws_get_class(), flags);
3935 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3937 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3938 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3940 if(!strncmp(arg, "pal-", 4)) {
3943 } else if(!strncmp(arg, "ntsc-", 5)) {
3946 } else if(!strncmp(arg, "film-", 5)) {
3950 /* Try to determine PAL/NTSC by peeking in the input files */
3951 if(nb_input_files) {
3953 for (j = 0; j < nb_input_files; j++) {
3954 for (i = 0; i < input_files[j].nb_streams; i++) {
3955 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3956 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3958 fr = c->time_base.den * 1000 / c->time_base.num;
3962 } else if((fr == 29970) || (fr == 23976)) {
3971 if (norm != UNKNOWN)
3972 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3975 if(norm == UNKNOWN) {
3976 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3977 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3978 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
3982 if(!strcmp(arg, "vcd")) {
3983 opt_video_codec(o, "c:v", "mpeg1video");
3984 opt_audio_codec(o, "c:a", "mp2");
3985 parse_option(o, "f", "vcd", options);
3987 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3988 parse_option(o, "r", frame_rates[norm], options);
3989 opt_default("g", norm == PAL ? "15" : "18");
3991 opt_default("b", "1150000");
3992 opt_default("maxrate", "1150000");
3993 opt_default("minrate", "1150000");
3994 opt_default("bufsize", "327680"); // 40*1024*8;
3996 opt_default("b:a", "224000");
3997 parse_option(o, "ar", "44100", options);
3998 parse_option(o, "ac", "2", options);
4000 opt_default("packetsize", "2324");
4001 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4003 /* We have to offset the PTS, so that it is consistent with the SCR.
4004 SCR starts at 36000, but the first two packs contain only padding
4005 and the first pack from the other stream, respectively, may also have
4006 been written before.
4007 So the real data starts at SCR 36000+3*1200. */
4008 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4009 } else if(!strcmp(arg, "svcd")) {
4011 opt_video_codec(o, "c:v", "mpeg2video");
4012 opt_audio_codec(o, "c:a", "mp2");
4013 parse_option(o, "f", "svcd", options);
4015 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4016 parse_option(o, "r", frame_rates[norm], options);
4017 opt_default("g", norm == PAL ? "15" : "18");
4019 opt_default("b", "2040000");
4020 opt_default("maxrate", "2516000");
4021 opt_default("minrate", "0"); //1145000;
4022 opt_default("bufsize", "1835008"); //224*1024*8;
4023 opt_default("flags", "+scan_offset");
4026 opt_default("b:a", "224000");
4027 parse_option(o, "ar", "44100", options);
4029 opt_default("packetsize", "2324");
4031 } else if(!strcmp(arg, "dvd")) {
4033 opt_video_codec(o, "c:v", "mpeg2video");
4034 opt_audio_codec(o, "c:a", "ac3");
4035 parse_option(o, "f", "dvd", options);
4037 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4038 parse_option(o, "r", frame_rates[norm], options);
4039 opt_default("g", norm == PAL ? "15" : "18");
4041 opt_default("b", "6000000");
4042 opt_default("maxrate", "9000000");
4043 opt_default("minrate", "0"); //1500000;
4044 opt_default("bufsize", "1835008"); //224*1024*8;
4046 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4047 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4049 opt_default("b:a", "448000");
4050 parse_option(o, "ar", "48000", options);
4052 } else if(!strncmp(arg, "dv", 2)) {
4054 parse_option(o, "f", "dv", options);
4056 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4057 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4058 norm == PAL ? "yuv420p" : "yuv411p", options);
4059 parse_option(o, "r", frame_rates[norm], options);
4061 parse_option(o, "ar", "48000", options);
4062 parse_option(o, "ac", "2", options);
4065 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4066 return AVERROR(EINVAL);
4071 static int opt_vstats_file(const char *opt, const char *arg)
4073 av_free (vstats_filename);
4074 vstats_filename=av_strdup (arg);
4078 static int opt_vstats(const char *opt, const char *arg)
4081 time_t today2 = time(NULL);
4082 struct tm *today = localtime(&today2);
4084 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4086 return opt_vstats_file(opt, filename);
4089 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4091 return parse_option(o, "frames:v", arg, options);
4094 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4096 return parse_option(o, "frames:a", arg, options);
4099 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4101 return parse_option(o, "frames:d", arg, options);
4104 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4106 return parse_option(o, "tag:v", arg, options);
4109 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4111 return parse_option(o, "tag:a", arg, options);
4114 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4116 return parse_option(o, "tag:s", arg, options);
4119 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4121 return parse_option(o, "filter:v", arg, options);
4124 #define OFFSET(x) offsetof(OptionsContext, x)
4125 static const OptionDef options[] = {
4127 #include "cmdutils_common_opts.h"
4128 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4129 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4130 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4131 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4132 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4133 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4134 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4135 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4136 "outfile[,metadata]:infile[,metadata]" },
4137 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4138 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4139 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4140 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4141 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4142 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4143 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4144 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4145 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4146 "add timings for benchmarking" },
4147 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4148 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4149 "dump each input packet" },
4150 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4151 "when dumping packets, also dump the payload" },
4152 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4153 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4154 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4155 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4156 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4157 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4158 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4159 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4160 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4161 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4162 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4163 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4164 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4165 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4166 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4168 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4170 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4171 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4172 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4175 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4176 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4177 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4178 { "aspect", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_aspect_ratios)}, "set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)", "aspect" },
4179 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4180 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4181 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4182 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4183 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4184 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4185 "use same quantizer as source (implies VBR)" },
4186 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4187 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4188 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4189 "deinterlace pictures" },
4190 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4191 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4193 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4195 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4196 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4197 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4198 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4199 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4200 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4201 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4202 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4203 { "force_key_frames", OPT_STRING | HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(forced_key_frames)}, "force key frames at specified timestamps", "timestamps" },
4206 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4207 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4208 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4209 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4210 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4211 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4212 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4213 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4214 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4216 /* subtitle options */
4217 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4218 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4219 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4222 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4225 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4226 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4228 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4230 /* data codec support */
4231 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4233 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4237 int main(int argc, char **argv)
4239 OptionsContext o = { 0 };
4244 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4245 parse_loglevel(argc, argv, options);
4247 avcodec_register_all();
4249 avdevice_register_all();
4252 avfilter_register_all();
4255 avformat_network_init();
4260 parse_options(&o, argc, argv, options, opt_output_file);
4262 if(nb_output_files <= 0 && nb_input_files == 0) {
4264 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4268 /* file converter / grab */
4269 if (nb_output_files <= 0) {
4270 fprintf(stderr, "At least one output file must be specified\n");
4274 if (nb_input_files == 0) {
4275 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4280 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4282 ti = getutime() - ti;
4284 int maxrss = getmaxrss() / 1024;
4285 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);