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;
120 static int copy_initial_nonkeyframes = 0;
122 static int audio_volume = 256;
124 static int exit_on_error = 0;
125 static int using_stdin = 0;
126 static int64_t video_size = 0;
127 static int64_t audio_size = 0;
128 static int64_t extra_size = 0;
129 static int nb_frames_dup = 0;
130 static int nb_frames_drop = 0;
131 static int input_sync;
133 static float dts_delta_threshold = 10;
135 static int print_stats = 1;
137 static uint8_t *audio_buf;
138 static uint8_t *audio_out;
139 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
141 static void *samples;
143 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
145 typedef struct InputStream {
148 int discard; /* true if stream data should be discarded */
149 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
152 int64_t start; /* time when read started */
153 int64_t next_pts; /* synthetic pts for cases where pkt.pts
155 int64_t pts; /* current pts */
156 PtsCorrectionContext pts_ctx;
158 int is_start; /* is 1 at the start and after a discontinuity */
159 int showed_multi_packet_warning;
163 typedef struct InputFile {
164 AVFormatContext *ctx;
165 int eof_reached; /* true if eof reached */
166 int ist_index; /* index of first stream in ist_table */
167 int buffer_size; /* current total buffer size */
169 int nb_streams; /* number of stream that avconv is aware of; may be different
170 from ctx.nb_streams if new streams appear during av_read_frame() */
174 typedef struct OutputStream {
175 int file_index; /* file index */
176 int index; /* stream index in the output file */
177 int source_index; /* InputStream index */
178 AVStream *st; /* stream in the output file */
179 int encoding_needed; /* true if encoding needed for this stream */
181 /* input pts and corresponding output pts
183 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
184 struct InputStream *sync_ist; /* input stream to sync against */
185 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
186 AVBitStreamFilterContext *bitstream_filters;
192 AVFrame pict_tmp; /* temporary image for resampling */
193 struct SwsContext *img_resample_ctx; /* for image resampling */
196 int resample_pix_fmt;
197 AVRational frame_rate;
201 float frame_aspect_ratio;
203 /* forced key frames */
204 int64_t *forced_kf_pts;
210 ReSampleContext *resample; /* for audio resampling */
211 int resample_sample_fmt;
212 int resample_channels;
213 int resample_sample_rate;
215 AVAudioConvert *reformat_ctx;
216 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
220 AVFilterContext *output_video_filter;
221 AVFilterContext *input_video_filter;
222 AVFilterBufferRef *picref;
224 AVFilterGraph *graph;
229 int is_past_recording_time;
233 typedef struct OutputFile {
234 AVFormatContext *ctx;
236 int ost_index; /* index of the first stream in output_streams */
237 int64_t recording_time; /* desired length of the resulting file in microseconds */
238 int64_t start_time; /* start time in microseconds */
239 uint64_t limit_filesize;
242 static InputStream *input_streams = NULL;
243 static int nb_input_streams = 0;
244 static InputFile *input_files = NULL;
245 static int nb_input_files = 0;
247 static OutputStream *output_streams = NULL;
248 static int nb_output_streams = 0;
249 static OutputFile *output_files = NULL;
250 static int nb_output_files = 0;
252 typedef struct OptionsContext {
253 /* input/output options */
257 SpecifierOpt *codec_names;
259 SpecifierOpt *audio_channels;
260 int nb_audio_channels;
261 SpecifierOpt *audio_sample_rate;
262 int nb_audio_sample_rate;
263 SpecifierOpt *frame_rates;
265 SpecifierOpt *frame_sizes;
267 SpecifierOpt *frame_pix_fmts;
268 int nb_frame_pix_fmts;
271 int64_t input_ts_offset;
274 SpecifierOpt *ts_scale;
278 StreamMap *stream_maps;
280 /* first item specifies output metadata, second is input */
281 MetadataMap (*meta_data_maps)[2];
282 int nb_meta_data_maps;
283 int metadata_global_manual;
284 int metadata_streams_manual;
285 int metadata_chapters_manual;
287 int chapters_input_file;
289 int64_t recording_time;
290 uint64_t limit_filesize;
296 int subtitle_disable;
299 /* indexed by output file stream index */
303 SpecifierOpt *metadata;
305 SpecifierOpt *max_frames;
307 SpecifierOpt *bitstream_filters;
308 int nb_bitstream_filters;
309 SpecifierOpt *codec_tags;
311 SpecifierOpt *sample_fmts;
313 SpecifierOpt *qscale;
315 SpecifierOpt *forced_key_frames;
316 int nb_forced_key_frames;
317 SpecifierOpt *force_fps;
319 SpecifierOpt *frame_aspect_ratios;
320 int nb_frame_aspect_ratios;
321 SpecifierOpt *rc_overrides;
323 SpecifierOpt *intra_matrices;
324 int nb_intra_matrices;
325 SpecifierOpt *inter_matrices;
326 int nb_inter_matrices;
327 SpecifierOpt *top_field_first;
328 int nb_top_field_first;
329 SpecifierOpt *presets;
332 SpecifierOpt *filters;
337 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
340 for (i = 0; i < o->nb_ ## name; i++) {\
341 char *spec = o->name[i].specifier;\
342 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
343 outvar = o->name[i].u.type;\
349 static void reset_options(OptionsContext *o)
351 const OptionDef *po = options;
353 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
355 void *dst = (uint8_t*)o + po->u.off;
357 if (po->flags & OPT_SPEC) {
358 SpecifierOpt **so = dst;
359 int i, *count = (int*)(so + 1);
360 for (i = 0; i < *count; i++) {
361 av_freep(&(*so)[i].specifier);
362 if (po->flags & OPT_STRING)
363 av_freep(&(*so)[i].u.str);
367 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
372 av_freep(&o->stream_maps);
373 av_freep(&o->meta_data_maps);
374 av_freep(&o->streamid_map);
376 memset(o, 0, sizeof(*o));
378 o->mux_max_delay = 0.7;
379 o->recording_time = INT64_MAX;
380 o->limit_filesize = UINT64_MAX;
381 o->chapters_input_file = INT_MAX;
389 static int configure_video_filters(InputStream *ist, OutputStream *ost)
391 AVFilterContext *last_filter, *filter;
392 /** filter graph containing all filters including input & output */
393 AVCodecContext *codec = ost->st->codec;
394 AVCodecContext *icodec = ist->st->codec;
395 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
396 AVRational sample_aspect_ratio;
400 ost->graph = avfilter_graph_alloc();
402 if (ist->st->sample_aspect_ratio.num){
403 sample_aspect_ratio = ist->st->sample_aspect_ratio;
405 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
407 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
408 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
409 sample_aspect_ratio.num, sample_aspect_ratio.den);
411 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
412 "src", args, NULL, ost->graph);
415 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
416 "out", NULL, &ffsink_ctx, ost->graph);
419 last_filter = ost->input_video_filter;
421 if (codec->width != icodec->width || codec->height != icodec->height) {
422 snprintf(args, 255, "%d:%d:flags=0x%X",
425 (unsigned)ost->sws_flags);
426 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
427 NULL, args, NULL, ost->graph)) < 0)
429 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
431 last_filter = filter;
434 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
435 ost->graph->scale_sws_opts = av_strdup(args);
438 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
439 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
441 outputs->name = av_strdup("in");
442 outputs->filter_ctx = last_filter;
443 outputs->pad_idx = 0;
444 outputs->next = NULL;
446 inputs->name = av_strdup("out");
447 inputs->filter_ctx = ost->output_video_filter;
451 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
453 av_freep(&ost->avfilter);
455 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
459 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
462 codec->width = ost->output_video_filter->inputs[0]->w;
463 codec->height = ost->output_video_filter->inputs[0]->h;
464 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
465 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
466 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
467 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
471 #endif /* CONFIG_AVFILTER */
473 static void term_exit(void)
475 av_log(NULL, AV_LOG_QUIET, "");
478 static volatile int received_sigterm = 0;
479 static volatile int received_nb_signals = 0;
482 sigterm_handler(int sig)
484 received_sigterm = sig;
485 received_nb_signals++;
489 static void term_init(void)
491 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
492 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
494 signal(SIGXCPU, sigterm_handler);
498 static int decode_interrupt_cb(void)
500 return received_nb_signals > 1;
503 void exit_program(int ret)
508 for(i=0;i<nb_output_files;i++) {
509 AVFormatContext *s = output_files[i].ctx;
510 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
512 avformat_free_context(s);
513 av_dict_free(&output_files[i].opts);
515 for(i=0;i<nb_input_files;i++) {
516 av_close_input_file(input_files[i].ctx);
518 for (i = 0; i < nb_input_streams; i++)
519 av_dict_free(&input_streams[i].opts);
523 av_free(vstats_filename);
525 av_freep(&input_streams);
526 av_freep(&input_files);
527 av_freep(&output_streams);
528 av_freep(&output_files);
533 allocated_audio_buf_size= allocated_audio_out_size= 0;
540 if (received_sigterm) {
541 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
542 (int) received_sigterm);
546 exit(ret); /* not all OS-es handle main() return value */
549 static void assert_avoptions(AVDictionary *m)
551 AVDictionaryEntry *t;
552 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
553 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
558 static void assert_codec_experimental(AVCodecContext *c, int encoder)
560 const char *codec_string = encoder ? "encoder" : "decoder";
562 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
563 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
564 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
565 "results.\nAdd '-strict experimental' if you want to use it.\n",
566 codec_string, c->codec->name);
567 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
568 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
569 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
570 codec_string, codec->name);
575 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
577 if(codec && codec->sample_fmts){
578 const enum AVSampleFormat *p= codec->sample_fmts;
580 if(*p == st->codec->sample_fmt)
584 av_log(NULL, AV_LOG_WARNING,
585 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
586 av_get_sample_fmt_name(st->codec->sample_fmt),
588 av_get_sample_fmt_name(codec->sample_fmts[0]));
589 st->codec->sample_fmt = codec->sample_fmts[0];
595 * Update the requested input sample format based on the output sample format.
596 * This is currently only used to request float output from decoders which
597 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
598 * Ideally this will be removed in the future when decoders do not do format
599 * conversion and only output in their native format.
601 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
604 /* if sample formats match or a decoder sample format has already been
605 requested, just return */
606 if (enc->sample_fmt == dec->sample_fmt ||
607 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
610 /* if decoder supports more than one output format */
611 if (dec_codec && dec_codec->sample_fmts &&
612 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
613 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
614 const enum AVSampleFormat *p;
615 int min_dec = -1, min_inc = -1;
617 /* find a matching sample format in the encoder */
618 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
619 if (*p == enc->sample_fmt) {
620 dec->request_sample_fmt = *p;
622 } else if (*p > enc->sample_fmt) {
623 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
625 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
628 /* if none match, provide the one that matches quality closest */
629 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
630 enc->sample_fmt - min_dec;
634 static void choose_sample_rate(AVStream *st, AVCodec *codec)
636 if(codec && codec->supported_samplerates){
637 const int *p= codec->supported_samplerates;
639 int best_dist=INT_MAX;
641 int dist= abs(st->codec->sample_rate - *p);
642 if(dist < best_dist){
648 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
650 st->codec->sample_rate= best;
654 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
656 if(codec && codec->pix_fmts){
657 const enum PixelFormat *p= codec->pix_fmts;
658 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
659 if(st->codec->codec_id==CODEC_ID_MJPEG){
660 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
661 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
662 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};
666 if(*p == st->codec->pix_fmt)
670 if(st->codec->pix_fmt != PIX_FMT_NONE)
671 av_log(NULL, AV_LOG_WARNING,
672 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
673 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
675 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
676 st->codec->pix_fmt = codec->pix_fmts[0];
682 get_sync_ipts(const OutputStream *ost)
684 const InputStream *ist = ost->sync_ist;
685 OutputFile *of = &output_files[ost->file_index];
686 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
689 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
693 AVPacket new_pkt= *pkt;
694 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
695 &new_pkt.data, &new_pkt.size,
696 pkt->data, pkt->size,
697 pkt->flags & AV_PKT_FLAG_KEY);
700 new_pkt.destruct= av_destruct_packet;
702 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
703 bsfc->filter->name, pkt->stream_index,
704 avctx->codec ? avctx->codec->name : "copy");
714 ret= av_interleaved_write_frame(s, pkt);
716 print_error("av_interleaved_write_frame()", ret);
721 static void do_audio_out(AVFormatContext *s,
724 unsigned char *buf, int size)
727 int64_t audio_out_size, audio_buf_size;
728 int64_t allocated_for_size= size;
730 int size_out, frame_bytes, ret, resample_changed;
731 AVCodecContext *enc= ost->st->codec;
732 AVCodecContext *dec= ist->st->codec;
733 int osize = av_get_bytes_per_sample(enc->sample_fmt);
734 int isize = av_get_bytes_per_sample(dec->sample_fmt);
735 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
738 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
739 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
740 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
741 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
742 audio_buf_size*= osize*enc->channels;
744 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
745 if(coded_bps > 8*osize)
746 audio_out_size= audio_out_size * coded_bps / (8*osize);
747 audio_out_size += FF_MIN_BUFFER_SIZE;
749 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
750 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
754 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
755 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
756 if (!audio_buf || !audio_out){
757 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
761 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
762 ost->audio_resample = 1;
764 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
765 ost->resample_channels != dec->channels ||
766 ost->resample_sample_rate != dec->sample_rate;
768 if ((ost->audio_resample && !ost->resample) || resample_changed) {
769 if (resample_changed) {
770 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",
771 ist->file_index, ist->st->index,
772 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
773 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
774 ost->resample_sample_fmt = dec->sample_fmt;
775 ost->resample_channels = dec->channels;
776 ost->resample_sample_rate = dec->sample_rate;
778 audio_resample_close(ost->resample);
780 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
781 if (audio_sync_method <= 1 &&
782 ost->resample_sample_fmt == enc->sample_fmt &&
783 ost->resample_channels == enc->channels &&
784 ost->resample_sample_rate == enc->sample_rate) {
785 ost->resample = NULL;
786 ost->audio_resample = 0;
787 } else if (ost->audio_resample) {
788 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
789 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
790 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
791 enc->sample_rate, dec->sample_rate,
792 enc->sample_fmt, dec->sample_fmt,
794 if (!ost->resample) {
795 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
796 dec->channels, dec->sample_rate,
797 enc->channels, enc->sample_rate);
803 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
804 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
805 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
806 if (ost->reformat_ctx)
807 av_audio_convert_free(ost->reformat_ctx);
808 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
809 dec->sample_fmt, 1, NULL, 0);
810 if (!ost->reformat_ctx) {
811 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
812 av_get_sample_fmt_name(dec->sample_fmt),
813 av_get_sample_fmt_name(enc->sample_fmt));
816 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
819 if(audio_sync_method){
820 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
821 - av_fifo_size(ost->fifo)/(enc->channels * 2);
822 double idelta= delta*dec->sample_rate / enc->sample_rate;
823 int byte_delta= ((int)idelta)*2*dec->channels;
825 //FIXME resample delay
826 if(fabs(delta) > 50){
827 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
829 byte_delta= FFMAX(byte_delta, -size);
832 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
837 static uint8_t *input_tmp= NULL;
838 input_tmp= av_realloc(input_tmp, byte_delta + size);
840 if(byte_delta > allocated_for_size - size){
841 allocated_for_size= byte_delta + (int64_t)size;
846 memset(input_tmp, 0, byte_delta);
847 memcpy(input_tmp + byte_delta, buf, size);
850 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
852 }else if(audio_sync_method>1){
853 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
854 av_assert0(ost->audio_resample);
855 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
856 delta, comp, enc->sample_rate);
857 // 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));
858 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
862 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
863 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
865 if (ost->audio_resample) {
867 size_out = audio_resample(ost->resample,
868 (short *)buftmp, (short *)buf,
869 size / (dec->channels * isize));
870 size_out = size_out * enc->channels * osize;
876 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
877 const void *ibuf[6]= {buftmp};
878 void *obuf[6]= {audio_buf};
879 int istride[6]= {isize};
880 int ostride[6]= {osize};
881 int len= size_out/istride[0];
882 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
883 printf("av_audio_convert() failed\n");
889 size_out = len*osize;
892 /* now encode as many frames as possible */
893 if (enc->frame_size > 1) {
894 /* output resampled raw samples */
895 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
896 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
899 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
901 frame_bytes = enc->frame_size * osize * enc->channels;
903 while (av_fifo_size(ost->fifo) >= frame_bytes) {
905 av_init_packet(&pkt);
907 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
909 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
911 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
914 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
918 pkt.stream_index= ost->index;
921 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
922 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
923 pkt.flags |= AV_PKT_FLAG_KEY;
924 write_frame(s, &pkt, enc, ost->bitstream_filters);
926 ost->sync_opts += enc->frame_size;
930 av_init_packet(&pkt);
932 ost->sync_opts += size_out / (osize * enc->channels);
934 /* output a pcm frame */
935 /* determine the size of the coded buffer */
938 size_out = size_out*coded_bps/8;
940 if(size_out > audio_out_size){
941 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
945 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
946 ret = avcodec_encode_audio(enc, audio_out, size_out,
949 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
953 pkt.stream_index= ost->index;
956 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
957 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
958 pkt.flags |= AV_PKT_FLAG_KEY;
959 write_frame(s, &pkt, enc, ost->bitstream_filters);
963 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
967 AVPicture picture_tmp;
970 dec = ist->st->codec;
972 /* deinterlace : must be done before any resize */
973 if (do_deinterlace) {
976 /* create temporary picture */
977 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
978 buf = av_malloc(size);
982 picture2 = &picture_tmp;
983 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
985 if(avpicture_deinterlace(picture2, picture,
986 dec->pix_fmt, dec->width, dec->height) < 0) {
987 /* if error, do not deinterlace */
988 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
997 if (picture != picture2)
998 *picture = *picture2;
1002 static void do_subtitle_out(AVFormatContext *s,
1008 static uint8_t *subtitle_out = NULL;
1009 int subtitle_out_max_size = 1024 * 1024;
1010 int subtitle_out_size, nb, i;
1011 AVCodecContext *enc;
1014 if (pts == AV_NOPTS_VALUE) {
1015 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1021 enc = ost->st->codec;
1023 if (!subtitle_out) {
1024 subtitle_out = av_malloc(subtitle_out_max_size);
1027 /* Note: DVB subtitle need one packet to draw them and one other
1028 packet to clear them */
1029 /* XXX: signal it in the codec context ? */
1030 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1035 for(i = 0; i < nb; i++) {
1036 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1037 // start_display_time is required to be 0
1038 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1039 sub->end_display_time -= sub->start_display_time;
1040 sub->start_display_time = 0;
1041 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1042 subtitle_out_max_size, sub);
1043 if (subtitle_out_size < 0) {
1044 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1048 av_init_packet(&pkt);
1049 pkt.stream_index = ost->index;
1050 pkt.data = subtitle_out;
1051 pkt.size = subtitle_out_size;
1052 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1053 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1054 /* XXX: the pts correction is handled here. Maybe handling
1055 it in the codec would be better */
1057 pkt.pts += 90 * sub->start_display_time;
1059 pkt.pts += 90 * sub->end_display_time;
1061 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1065 static int bit_buffer_size= 1024*256;
1066 static uint8_t *bit_buffer= NULL;
1068 static void do_video_resample(OutputStream *ost,
1070 AVFrame *in_picture,
1071 AVFrame **out_picture)
1073 int resample_changed = 0;
1074 AVCodecContext *dec = ist->st->codec;
1075 *out_picture = in_picture;
1077 resample_changed = ost->resample_width != dec->width ||
1078 ost->resample_height != dec->height ||
1079 ost->resample_pix_fmt != dec->pix_fmt;
1081 if (resample_changed) {
1082 av_log(NULL, AV_LOG_INFO,
1083 "Input stream #%d.%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1084 ist->file_index, ist->st->index,
1085 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1086 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1087 if(!ost->video_resample)
1088 ost->video_resample = 1;
1091 #if !CONFIG_AVFILTER
1092 if (ost->video_resample) {
1093 *out_picture = &ost->pict_tmp;
1094 if (resample_changed) {
1095 /* initialize a new scaler context */
1096 sws_freeContext(ost->img_resample_ctx);
1097 ost->img_resample_ctx = sws_getContext(
1098 ist->st->codec->width,
1099 ist->st->codec->height,
1100 ist->st->codec->pix_fmt,
1101 ost->st->codec->width,
1102 ost->st->codec->height,
1103 ost->st->codec->pix_fmt,
1104 ost->sws_flags, NULL, NULL, NULL);
1105 if (ost->img_resample_ctx == NULL) {
1106 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1110 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1111 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1114 if (resample_changed) {
1115 avfilter_graph_free(&ost->graph);
1116 if (configure_video_filters(ist, ost)) {
1117 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1122 if (resample_changed) {
1123 ost->resample_width = dec->width;
1124 ost->resample_height = dec->height;
1125 ost->resample_pix_fmt = dec->pix_fmt;
1130 static void do_video_out(AVFormatContext *s,
1133 AVFrame *in_picture,
1134 int *frame_size, float quality)
1136 int nb_frames, i, ret, format_video_sync;
1137 AVFrame *final_picture;
1138 AVCodecContext *enc;
1141 enc = ost->st->codec;
1143 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1145 /* by default, we output a single frame */
1150 format_video_sync = video_sync_method;
1151 if (format_video_sync < 0)
1152 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1154 if (format_video_sync) {
1155 double vdelta = sync_ipts - ost->sync_opts;
1156 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1159 else if (format_video_sync == 2) {
1162 }else if(vdelta>0.6)
1163 ost->sync_opts= lrintf(sync_ipts);
1164 }else if (vdelta > 1.1)
1165 nb_frames = lrintf(vdelta);
1166 //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);
1167 if (nb_frames == 0){
1169 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1170 }else if (nb_frames > 1) {
1171 nb_frames_dup += nb_frames - 1;
1172 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1175 ost->sync_opts= lrintf(sync_ipts);
1177 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1181 do_video_resample(ost, ist, in_picture, &final_picture);
1183 /* duplicates frame if needed */
1184 for(i=0;i<nb_frames;i++) {
1186 av_init_packet(&pkt);
1187 pkt.stream_index= ost->index;
1189 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1190 /* raw pictures are written as AVPicture structure to
1191 avoid any copies. We support temporarily the older
1193 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1194 enc->coded_frame->top_field_first = in_picture->top_field_first;
1195 pkt.data= (uint8_t *)final_picture;
1196 pkt.size= sizeof(AVPicture);
1197 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1198 pkt.flags |= AV_PKT_FLAG_KEY;
1200 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1202 AVFrame big_picture;
1204 big_picture= *final_picture;
1205 /* better than nothing: use input picture interlaced
1207 big_picture.interlaced_frame = in_picture->interlaced_frame;
1208 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1209 if (ost->top_field_first == -1)
1210 big_picture.top_field_first = in_picture->top_field_first;
1212 big_picture.top_field_first = !!ost->top_field_first;
1215 /* handles same_quant here. This is not correct because it may
1216 not be a global option */
1217 big_picture.quality = quality;
1218 if (!enc->me_threshold)
1219 big_picture.pict_type = 0;
1220 // big_picture.pts = AV_NOPTS_VALUE;
1221 big_picture.pts= ost->sync_opts;
1222 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1223 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1224 if (ost->forced_kf_index < ost->forced_kf_count &&
1225 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1226 big_picture.pict_type = AV_PICTURE_TYPE_I;
1227 ost->forced_kf_index++;
1229 ret = avcodec_encode_video(enc,
1230 bit_buffer, bit_buffer_size,
1233 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1238 pkt.data= bit_buffer;
1240 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1241 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1242 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1243 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1244 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1246 if(enc->coded_frame->key_frame)
1247 pkt.flags |= AV_PKT_FLAG_KEY;
1248 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1251 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1252 // enc->frame_number-1, ret, enc->pict_type);
1253 /* if two pass, output log */
1254 if (ost->logfile && enc->stats_out) {
1255 fprintf(ost->logfile, "%s", enc->stats_out);
1260 ost->frame_number++;
1264 static double psnr(double d){
1265 return -10.0*log(d)/log(10.0);
1268 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1271 AVCodecContext *enc;
1273 double ti1, bitrate, avg_bitrate;
1275 /* this is executed just the first time do_video_stats is called */
1277 vstats_file = fopen(vstats_filename, "w");
1284 enc = ost->st->codec;
1285 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1286 frame_number = ost->frame_number;
1287 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1288 if (enc->flags&CODEC_FLAG_PSNR)
1289 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1291 fprintf(vstats_file,"f_size= %6d ", frame_size);
1292 /* compute pts value */
1293 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1297 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1298 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1299 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1300 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1301 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1305 static void print_report(OutputFile *output_files,
1306 OutputStream *ost_table, int nb_ostreams,
1307 int is_last_report, int64_t timer_start)
1311 AVFormatContext *oc;
1313 AVCodecContext *enc;
1314 int frame_number, vid, i;
1315 double bitrate, ti1, pts;
1316 static int64_t last_time = -1;
1317 static int qp_histogram[52];
1319 if (!print_stats && !is_last_report)
1322 if (!is_last_report) {
1324 /* display the report every 0.5 seconds */
1325 cur_time = av_gettime();
1326 if (last_time == -1) {
1327 last_time = cur_time;
1330 if ((cur_time - last_time) < 500000)
1332 last_time = cur_time;
1336 oc = output_files[0].ctx;
1338 total_size = avio_size(oc->pb);
1339 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1340 total_size= avio_tell(oc->pb);
1345 for(i=0;i<nb_ostreams;i++) {
1347 ost = &ost_table[i];
1348 enc = ost->st->codec;
1349 if (!ost->st->stream_copy && enc->coded_frame)
1350 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1351 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1352 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1354 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1355 float t = (av_gettime()-timer_start) / 1000000.0;
1357 frame_number = ost->frame_number;
1358 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1359 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1361 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1365 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1368 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1370 if (enc->flags&CODEC_FLAG_PSNR){
1372 double error, error_sum=0;
1373 double scale, scale_sum=0;
1374 char type[3]= {'Y','U','V'};
1375 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1378 error= enc->error[j];
1379 scale= enc->width*enc->height*255.0*255.0*frame_number;
1381 error= enc->coded_frame->error[j];
1382 scale= enc->width*enc->height*255.0*255.0;
1387 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1389 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1393 /* compute min output value */
1394 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1395 if ((pts < ti1) && (pts > 0))
1401 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1403 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1404 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1405 (double)total_size / 1024, ti1, bitrate);
1407 if (nb_frames_dup || nb_frames_drop)
1408 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1409 nb_frames_dup, nb_frames_drop);
1411 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1415 if (is_last_report) {
1416 int64_t raw= audio_size + video_size + extra_size;
1417 av_log(NULL, AV_LOG_INFO, "\n");
1418 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1422 100.0*(total_size - raw)/raw
1427 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1429 int fill_char = 0x00;
1430 if (sample_fmt == AV_SAMPLE_FMT_U8)
1432 memset(buf, fill_char, size);
1435 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1439 for (i = 0; i < nb_ostreams; i++) {
1440 OutputStream *ost = &ost_table[i];
1441 AVCodecContext *enc = ost->st->codec;
1442 AVFormatContext *os = output_files[ost->file_index].ctx;
1444 if (!ost->encoding_needed)
1447 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1449 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1455 av_init_packet(&pkt);
1456 pkt.stream_index= ost->index;
1458 switch (ost->st->codec->codec_type) {
1459 case AVMEDIA_TYPE_AUDIO:
1460 fifo_bytes = av_fifo_size(ost->fifo);
1462 /* encode any samples remaining in fifo */
1463 if (fifo_bytes > 0) {
1464 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1465 int fs_tmp = enc->frame_size;
1467 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1468 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1469 enc->frame_size = fifo_bytes / (osize * enc->channels);
1471 int frame_bytes = enc->frame_size*osize*enc->channels;
1472 if (allocated_audio_buf_size < frame_bytes)
1474 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1477 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1478 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1479 ost->st->time_base.num, enc->sample_rate);
1480 enc->frame_size = fs_tmp;
1483 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1486 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1490 pkt.flags |= AV_PKT_FLAG_KEY;
1492 case AVMEDIA_TYPE_VIDEO:
1493 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1495 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1499 if(enc->coded_frame && enc->coded_frame->key_frame)
1500 pkt.flags |= AV_PKT_FLAG_KEY;
1501 if (ost->logfile && enc->stats_out) {
1502 fprintf(ost->logfile, "%s", enc->stats_out);
1511 pkt.data = bit_buffer;
1513 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1514 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1515 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1520 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1521 static int output_packet(InputStream *ist, int ist_index,
1522 OutputStream *ost_table, int nb_ostreams,
1523 const AVPacket *pkt)
1525 AVFormatContext *os;
1529 void *buffer_to_free = NULL;
1530 static unsigned int samples_size= 0;
1531 AVSubtitle subtitle, *subtitle_to_free;
1532 int64_t pkt_pts = AV_NOPTS_VALUE;
1534 int frame_available;
1539 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1541 if(ist->next_pts == AV_NOPTS_VALUE)
1542 ist->next_pts= ist->pts;
1546 av_init_packet(&avpkt);
1554 if(pkt->dts != AV_NOPTS_VALUE)
1555 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1556 if(pkt->pts != AV_NOPTS_VALUE)
1557 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1559 //while we have more to decode or while the decoder did output something on EOF
1560 while (avpkt.size > 0 || (!pkt && got_output)) {
1561 uint8_t *data_buf, *decoded_data_buf;
1562 int data_size, decoded_data_size;
1563 AVFrame *decoded_frame, *filtered_frame;
1565 ist->pts= ist->next_pts;
1567 if(avpkt.size && avpkt.size != pkt->size)
1568 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1569 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1570 ist->showed_multi_packet_warning=1;
1572 /* decode the packet if needed */
1573 decoded_frame = filtered_frame = NULL;
1574 decoded_data_buf = NULL; /* fail safe */
1575 decoded_data_size= 0;
1576 data_buf = avpkt.data;
1577 data_size = avpkt.size;
1578 subtitle_to_free = NULL;
1579 if (ist->decoding_needed) {
1580 switch(ist->st->codec->codec_type) {
1581 case AVMEDIA_TYPE_AUDIO:{
1582 if(pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1583 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1585 samples= av_malloc(samples_size);
1587 decoded_data_size= samples_size;
1588 /* XXX: could avoid copy if PCM 16 bits with same
1589 endianness as CPU */
1590 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1597 got_output = decoded_data_size > 0;
1598 /* Some bug in mpeg audio decoder gives */
1599 /* decoded_data_size < 0, it seems they are overflows */
1601 /* no audio frame */
1604 decoded_data_buf = (uint8_t *)samples;
1605 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1606 (ist->st->codec->sample_rate * ist->st->codec->channels);
1608 case AVMEDIA_TYPE_VIDEO:
1609 if (!(decoded_frame = avcodec_alloc_frame()))
1610 return AVERROR(ENOMEM);
1611 avpkt.pts = pkt_pts;
1612 avpkt.dts = ist->pts;
1613 pkt_pts = AV_NOPTS_VALUE;
1615 ret = avcodec_decode_video2(ist->st->codec,
1616 decoded_frame, &got_output, &avpkt);
1617 quality = same_quant ? decoded_frame->quality : 0;
1621 /* no picture yet */
1622 av_freep(&decoded_frame);
1623 goto discard_packet;
1625 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1626 decoded_frame->pkt_dts);
1627 if (ist->st->codec->time_base.num != 0) {
1628 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1629 ist->next_pts += ((int64_t)AV_TIME_BASE *
1630 ist->st->codec->time_base.num * ticks) /
1631 ist->st->codec->time_base.den;
1634 buffer_to_free = NULL;
1635 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1637 case AVMEDIA_TYPE_SUBTITLE:
1638 ret = avcodec_decode_subtitle2(ist->st->codec,
1639 &subtitle, &got_output, &avpkt);
1643 goto discard_packet;
1645 subtitle_to_free = &subtitle;
1652 switch(ist->st->codec->codec_type) {
1653 case AVMEDIA_TYPE_AUDIO:
1654 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1655 ist->st->codec->sample_rate;
1657 case AVMEDIA_TYPE_VIDEO:
1658 if (ist->st->codec->time_base.num != 0) {
1659 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1660 ist->next_pts += ((int64_t)AV_TIME_BASE *
1661 ist->st->codec->time_base.num * ticks) /
1662 ist->st->codec->time_base.den;
1669 // preprocess audio (volume)
1670 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1671 if (audio_volume != 256) {
1672 switch (ist->st->codec->sample_fmt) {
1673 case AV_SAMPLE_FMT_U8:
1675 uint8_t *volp = samples;
1676 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1677 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1678 *volp++ = av_clip_uint8(v);
1682 case AV_SAMPLE_FMT_S16:
1684 int16_t *volp = samples;
1685 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1686 int v = ((*volp) * audio_volume + 128) >> 8;
1687 *volp++ = av_clip_int16(v);
1691 case AV_SAMPLE_FMT_S32:
1693 int32_t *volp = samples;
1694 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1695 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1696 *volp++ = av_clipl_int32(v);
1700 case AV_SAMPLE_FMT_FLT:
1702 float *volp = samples;
1703 float scale = audio_volume / 256.f;
1704 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1709 case AV_SAMPLE_FMT_DBL:
1711 double *volp = samples;
1712 double scale = audio_volume / 256.;
1713 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1719 av_log(NULL, AV_LOG_FATAL,
1720 "Audio volume adjustment on sample format %s is not supported.\n",
1721 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1727 /* frame rate emulation */
1728 if (input_files[ist->file_index].rate_emu) {
1729 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1730 int64_t now = av_gettime() - ist->start;
1734 /* if output time reached then transcode raw format,
1735 encode packets and output them */
1736 for (i = 0; i < nb_ostreams; i++) {
1737 OutputFile *of = &output_files[ost_table[i].file_index];
1740 ost = &ost_table[i];
1741 if (ost->source_index != ist_index)
1744 if (of->start_time && ist->pts < of->start_time)
1747 if (of->recording_time != INT64_MAX &&
1748 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1749 (AVRational){1, 1000000}) >= 0) {
1750 ost->is_past_recording_time = 1;
1755 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1756 ost->input_video_filter) {
1758 if (ist->st->sample_aspect_ratio.num)
1759 sar = ist->st->sample_aspect_ratio;
1761 sar = ist->st->codec->sample_aspect_ratio;
1762 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, ist->pts, sar);
1763 if (!(filtered_frame = avcodec_alloc_frame())) {
1764 ret = AVERROR(ENOMEM);
1768 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1769 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1770 while (frame_available) {
1771 AVRational ist_pts_tb;
1772 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1773 get_filtered_video_frame(ost->output_video_filter, filtered_frame, &ost->picref, &ist_pts_tb);
1775 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1777 filtered_frame = decoded_frame;
1779 os = output_files[ost->file_index].ctx;
1781 /* set the input output pts pairs */
1782 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1784 if (ost->encoding_needed) {
1785 av_assert0(ist->decoding_needed);
1786 switch(ost->st->codec->codec_type) {
1787 case AVMEDIA_TYPE_AUDIO:
1788 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1790 case AVMEDIA_TYPE_VIDEO:
1792 if (ost->picref->video && !ost->frame_aspect_ratio)
1793 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1795 do_video_out(os, ost, ist, filtered_frame, &frame_size,
1796 same_quant ? quality : ost->st->codec->global_quality);
1797 if (vstats_filename && frame_size)
1798 do_video_stats(os, ost, frame_size);
1800 case AVMEDIA_TYPE_SUBTITLE:
1801 do_subtitle_out(os, ost, ist, &subtitle,
1809 int64_t ost_tb_start_time= av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1811 av_init_packet(&opkt);
1813 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) && !copy_initial_nonkeyframes)
1814 #if !CONFIG_AVFILTER
1820 /* no reencoding needed : output the packet directly */
1821 /* force the input stream PTS */
1823 if(ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1824 audio_size += data_size;
1825 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1826 video_size += data_size;
1830 opkt.stream_index= ost->index;
1831 if(pkt->pts != AV_NOPTS_VALUE)
1832 opkt.pts= av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1834 opkt.pts= AV_NOPTS_VALUE;
1836 if (pkt->dts == AV_NOPTS_VALUE)
1837 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1839 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1840 opkt.dts -= ost_tb_start_time;
1842 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1843 opkt.flags= pkt->flags;
1845 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1846 if( ost->st->codec->codec_id != CODEC_ID_H264
1847 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1848 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1850 if(av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, data_buf, data_size, pkt->flags & AV_PKT_FLAG_KEY))
1851 opkt.destruct= av_destruct_packet;
1853 opkt.data = data_buf;
1854 opkt.size = data_size;
1857 write_frame(os, &opkt, ost->st->codec, ost->bitstream_filters);
1858 ost->st->codec->frame_number++;
1859 ost->frame_number++;
1860 av_free_packet(&opkt);
1864 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1865 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1867 avfilter_unref_buffer(ost->picref);
1869 av_freep(&filtered_frame);
1874 av_free(buffer_to_free);
1875 /* XXX: allocate the subtitles in the codec ? */
1876 if (subtitle_to_free) {
1877 avsubtitle_free(subtitle_to_free);
1878 subtitle_to_free = NULL;
1880 av_freep(&decoded_frame);
1889 static void print_sdp(OutputFile *output_files, int n)
1893 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1897 for (i = 0; i < n; i++)
1898 avc[i] = output_files[i].ctx;
1900 av_sdp_create(avc, n, sdp, sizeof(sdp));
1901 printf("SDP:\n%s\n", sdp);
1906 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1907 char *error, int error_len)
1910 InputStream *ist = &input_streams[ist_index];
1911 if (ist->decoding_needed) {
1912 AVCodec *codec = ist->dec;
1914 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d.%d",
1915 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1916 return AVERROR(EINVAL);
1919 /* update requested sample format for the decoder based on the
1920 corresponding encoder sample format */
1921 for (i = 0; i < nb_output_streams; i++) {
1922 OutputStream *ost = &output_streams[i];
1923 if (ost->source_index == ist_index) {
1924 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1929 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1930 snprintf(error, error_len, "Error while opening decoder for input stream #%d.%d",
1931 ist->file_index, ist->st->index);
1932 return AVERROR(EINVAL);
1934 assert_codec_experimental(ist->st->codec, 0);
1935 assert_avoptions(ist->opts);
1938 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;
1939 ist->next_pts = AV_NOPTS_VALUE;
1940 init_pts_correction(&ist->pts_ctx);
1946 static int transcode_init(OutputFile *output_files,
1947 int nb_output_files,
1948 InputFile *input_files,
1951 int ret = 0, i, j, k;
1952 AVFormatContext *os;
1953 AVCodecContext *codec, *icodec;
1959 /* init framerate emulation */
1960 for (i = 0; i < nb_input_files; i++) {
1961 InputFile *ifile = &input_files[i];
1962 if (ifile->rate_emu)
1963 for (j = 0; j < ifile->nb_streams; j++)
1964 input_streams[j + ifile->ist_index].start = av_gettime();
1967 /* output stream init */
1968 for(i=0;i<nb_output_files;i++) {
1969 os = output_files[i].ctx;
1970 if (!os->nb_streams && !(os->oformat->flags & AVFMT_NOSTREAMS)) {
1971 av_dump_format(os, i, os->filename, 1);
1972 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
1973 return AVERROR(EINVAL);
1977 /* for each output stream, we compute the right encoding parameters */
1978 for (i = 0; i < nb_output_streams; i++) {
1979 ost = &output_streams[i];
1980 os = output_files[ost->file_index].ctx;
1981 ist = &input_streams[ost->source_index];
1983 codec = ost->st->codec;
1984 icodec = ist->st->codec;
1986 ost->st->disposition = ist->st->disposition;
1987 codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
1988 codec->chroma_sample_location = icodec->chroma_sample_location;
1990 if (ost->st->stream_copy) {
1991 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
1993 if (extra_size > INT_MAX) {
1994 return AVERROR(EINVAL);
1997 /* if stream_copy is selected, no need to decode or encode */
1998 codec->codec_id = icodec->codec_id;
1999 codec->codec_type = icodec->codec_type;
2001 if(!codec->codec_tag){
2002 if( !os->oformat->codec_tag
2003 || av_codec_get_id (os->oformat->codec_tag, icodec->codec_tag) == codec->codec_id
2004 || av_codec_get_tag(os->oformat->codec_tag, icodec->codec_id) <= 0)
2005 codec->codec_tag = icodec->codec_tag;
2008 codec->bit_rate = icodec->bit_rate;
2009 codec->rc_max_rate = icodec->rc_max_rate;
2010 codec->rc_buffer_size = icodec->rc_buffer_size;
2011 codec->extradata= av_mallocz(extra_size);
2012 if (!codec->extradata) {
2013 return AVERROR(ENOMEM);
2015 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2016 codec->extradata_size= icodec->extradata_size;
2017 if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
2018 codec->time_base = icodec->time_base;
2019 codec->time_base.num *= icodec->ticks_per_frame;
2020 av_reduce(&codec->time_base.num, &codec->time_base.den,
2021 codec->time_base.num, codec->time_base.den, INT_MAX);
2023 codec->time_base = ist->st->time_base;
2024 switch(codec->codec_type) {
2025 case AVMEDIA_TYPE_AUDIO:
2026 if(audio_volume != 256) {
2027 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2030 codec->channel_layout = icodec->channel_layout;
2031 codec->sample_rate = icodec->sample_rate;
2032 codec->channels = icodec->channels;
2033 codec->frame_size = icodec->frame_size;
2034 codec->audio_service_type = icodec->audio_service_type;
2035 codec->block_align= icodec->block_align;
2036 if(codec->block_align == 1 && codec->codec_id == CODEC_ID_MP3)
2037 codec->block_align= 0;
2038 if(codec->codec_id == CODEC_ID_AC3)
2039 codec->block_align= 0;
2041 case AVMEDIA_TYPE_VIDEO:
2042 codec->pix_fmt = icodec->pix_fmt;
2043 codec->width = icodec->width;
2044 codec->height = icodec->height;
2045 codec->has_b_frames = icodec->has_b_frames;
2046 if (!codec->sample_aspect_ratio.num) {
2047 codec->sample_aspect_ratio =
2048 ost->st->sample_aspect_ratio =
2049 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2050 ist->st->codec->sample_aspect_ratio.num ?
2051 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2054 case AVMEDIA_TYPE_SUBTITLE:
2055 codec->width = icodec->width;
2056 codec->height = icodec->height;
2058 case AVMEDIA_TYPE_DATA:
2059 case AVMEDIA_TYPE_ATTACHMENT:
2066 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2067 ist->decoding_needed = 1;
2068 ost->encoding_needed = 1;
2069 switch(codec->codec_type) {
2070 case AVMEDIA_TYPE_AUDIO:
2071 ost->fifo= av_fifo_alloc(1024);
2073 return AVERROR(ENOMEM);
2075 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2076 if (!codec->sample_rate) {
2077 codec->sample_rate = icodec->sample_rate;
2079 codec->sample_rate >>= icodec->lowres;
2081 choose_sample_rate(ost->st, ost->enc);
2082 codec->time_base = (AVRational){1, codec->sample_rate};
2083 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2084 codec->sample_fmt = icodec->sample_fmt;
2085 choose_sample_fmt(ost->st, ost->enc);
2086 if (!codec->channels)
2087 codec->channels = icodec->channels;
2088 codec->channel_layout = icodec->channel_layout;
2089 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2090 codec->channel_layout = 0;
2091 ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
2092 icodec->request_channels = codec->channels;
2093 ost->resample_sample_fmt = icodec->sample_fmt;
2094 ost->resample_sample_rate = icodec->sample_rate;
2095 ost->resample_channels = icodec->channels;
2097 case AVMEDIA_TYPE_VIDEO:
2098 if (codec->pix_fmt == PIX_FMT_NONE)
2099 codec->pix_fmt = icodec->pix_fmt;
2100 choose_pixel_fmt(ost->st, ost->enc);
2102 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2103 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2107 if (!codec->width || !codec->height) {
2108 codec->width = icodec->width;
2109 codec->height = icodec->height;
2112 ost->video_resample = codec->width != icodec->width ||
2113 codec->height != icodec->height ||
2114 codec->pix_fmt != icodec->pix_fmt;
2115 if (ost->video_resample) {
2116 #if !CONFIG_AVFILTER
2117 avcodec_get_frame_defaults(&ost->pict_tmp);
2118 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2119 codec->width, codec->height)) {
2120 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
2123 ost->img_resample_ctx = sws_getContext(
2130 ost->sws_flags, NULL, NULL, NULL);
2131 if (ost->img_resample_ctx == NULL) {
2132 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
2136 codec->bits_per_raw_sample= 0;
2139 ost->resample_height = icodec->height;
2140 ost->resample_width = icodec->width;
2141 ost->resample_pix_fmt= icodec->pix_fmt;
2143 if (!ost->frame_rate.num)
2144 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2145 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2146 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2147 ost->frame_rate = ost->enc->supported_framerates[idx];
2149 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2152 if (configure_video_filters(ist, ost)) {
2153 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2158 case AVMEDIA_TYPE_SUBTITLE:
2165 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2166 char logfilename[1024];
2169 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2170 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2172 if (codec->flags & CODEC_FLAG_PASS1) {
2173 f = fopen(logfilename, "wb");
2175 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2176 logfilename, strerror(errno));
2182 size_t logbuffer_size;
2183 if (read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2184 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2188 codec->stats_in = logbuffer;
2192 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2193 int size= codec->width * codec->height;
2194 bit_buffer_size= FFMAX(bit_buffer_size, 6*size + 200);
2199 bit_buffer = av_malloc(bit_buffer_size);
2201 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2203 return AVERROR(ENOMEM);
2206 /* open each encoder */
2207 for (i = 0; i < nb_output_streams; i++) {
2208 ost = &output_streams[i];
2209 if (ost->encoding_needed) {
2210 AVCodec *codec = ost->enc;
2211 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2213 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d.%d",
2214 ost->st->codec->codec_id, ost->file_index, ost->index);
2215 ret = AVERROR(EINVAL);
2218 if (dec->subtitle_header) {
2219 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2220 if (!ost->st->codec->subtitle_header) {
2221 ret = AVERROR(ENOMEM);
2224 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2225 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2227 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2228 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d.%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2229 ost->file_index, ost->index);
2230 ret = AVERROR(EINVAL);
2233 assert_codec_experimental(ost->st->codec, 1);
2234 assert_avoptions(ost->opts);
2235 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2236 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2237 "It takes bits/s as argument, not kbits/s\n");
2238 extra_size += ost->st->codec->extradata_size;
2240 if (ost->st->codec->me_threshold)
2241 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2245 /* init input streams */
2246 for (i = 0; i < nb_input_streams; i++)
2247 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2250 /* discard unused programs */
2251 for (i = 0; i < nb_input_files; i++) {
2252 InputFile *ifile = &input_files[i];
2253 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2254 AVProgram *p = ifile->ctx->programs[j];
2255 int discard = AVDISCARD_ALL;
2257 for (k = 0; k < p->nb_stream_indexes; k++)
2258 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2259 discard = AVDISCARD_DEFAULT;
2262 p->discard = discard;
2266 /* open files and write file headers */
2267 for (i = 0; i < nb_output_files; i++) {
2268 os = output_files[i].ctx;
2269 if (avformat_write_header(os, &output_files[i].opts) < 0) {
2270 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2271 ret = AVERROR(EINVAL);
2274 assert_avoptions(output_files[i].opts);
2275 if (strcmp(os->oformat->name, "rtp")) {
2281 /* dump the file output parameters - cannot be done before in case
2283 for(i=0;i<nb_output_files;i++) {
2284 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2287 /* dump the stream mapping */
2288 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2289 for (i = 0; i < nb_output_streams; i++) {
2290 ost = &output_streams[i];
2291 av_log(NULL, AV_LOG_INFO, " Stream #%d.%d -> #%d.%d",
2292 input_streams[ost->source_index].file_index,
2293 input_streams[ost->source_index].st->index,
2296 if (ost->sync_ist != &input_streams[ost->source_index])
2297 av_log(NULL, AV_LOG_INFO, " [sync #%d.%d]",
2298 ost->sync_ist->file_index,
2299 ost->sync_ist->st->index);
2300 if (ost->st->stream_copy)
2301 av_log(NULL, AV_LOG_INFO, " (copy)");
2303 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2304 input_streams[ost->source_index].dec->name : "?",
2305 ost->enc ? ost->enc->name : "?");
2306 av_log(NULL, AV_LOG_INFO, "\n");
2310 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2315 print_sdp(output_files, nb_output_files);
2322 * The following code is the main loop of the file converter
2324 static int transcode(OutputFile *output_files,
2325 int nb_output_files,
2326 InputFile *input_files,
2330 AVFormatContext *is, *os;
2334 int no_packet_count=0;
2335 int64_t timer_start;
2337 if (!(no_packet = av_mallocz(nb_input_files)))
2340 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2344 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2347 timer_start = av_gettime();
2349 for(; received_sigterm == 0;) {
2350 int file_index, ist_index;
2355 ipts_min = INT64_MAX;
2358 /* select the stream that we must read now by looking at the
2359 smallest output pts */
2361 for (i = 0; i < nb_output_streams; i++) {
2365 ost = &output_streams[i];
2366 of = &output_files[ost->file_index];
2367 os = output_files[ost->file_index].ctx;
2368 ist = &input_streams[ost->source_index];
2369 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2370 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2372 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2374 if (!input_files[ist->file_index].eof_reached){
2375 if(ipts < ipts_min) {
2377 if(input_sync ) file_index = ist->file_index;
2379 if(opts < opts_min) {
2381 if(!input_sync) file_index = ist->file_index;
2384 if (ost->frame_number >= ost->max_frames) {
2386 for (j = 0; j < of->ctx->nb_streams; j++)
2387 output_streams[of->ost_index + j].is_past_recording_time = 1;
2391 /* if none, if is finished */
2392 if (file_index < 0) {
2393 if(no_packet_count){
2395 memset(no_packet, 0, nb_input_files);
2402 /* read a frame from it and output it in the fifo */
2403 is = input_files[file_index].ctx;
2404 ret= av_read_frame(is, &pkt);
2405 if(ret == AVERROR(EAGAIN)){
2406 no_packet[file_index]=1;
2411 input_files[file_index].eof_reached = 1;
2419 memset(no_packet, 0, nb_input_files);
2422 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2423 is->streams[pkt.stream_index]);
2425 /* the following test is needed in case new streams appear
2426 dynamically in stream : we ignore them */
2427 if (pkt.stream_index >= input_files[file_index].nb_streams)
2428 goto discard_packet;
2429 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2430 ist = &input_streams[ist_index];
2432 goto discard_packet;
2434 if (pkt.dts != AV_NOPTS_VALUE)
2435 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2436 if (pkt.pts != AV_NOPTS_VALUE)
2437 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2439 if(pkt.pts != AV_NOPTS_VALUE)
2440 pkt.pts *= ist->ts_scale;
2441 if(pkt.dts != AV_NOPTS_VALUE)
2442 pkt.dts *= ist->ts_scale;
2444 // 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);
2445 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2446 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2447 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2448 int64_t delta= pkt_dts - ist->next_pts;
2449 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2450 input_files[ist->file_index].ts_offset -= delta;
2451 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2452 delta, input_files[ist->file_index].ts_offset);
2453 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2454 if(pkt.pts != AV_NOPTS_VALUE)
2455 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2459 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2460 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2462 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d.%d\n",
2463 ist->file_index, ist->st->index);
2466 av_free_packet(&pkt);
2471 av_free_packet(&pkt);
2473 /* dump report by using the output first video and audio streams */
2474 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2477 /* at the end of stream, we must flush the decoder buffers */
2478 for (i = 0; i < nb_input_streams; i++) {
2479 ist = &input_streams[i];
2480 if (ist->decoding_needed) {
2481 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2484 flush_encoders(output_streams, nb_output_streams);
2488 /* write the trailer if needed and close file */
2489 for(i=0;i<nb_output_files;i++) {
2490 os = output_files[i].ctx;
2491 av_write_trailer(os);
2494 /* dump report by using the first video and audio streams */
2495 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2497 /* close each encoder */
2498 for (i = 0; i < nb_output_streams; i++) {
2499 ost = &output_streams[i];
2500 if (ost->encoding_needed) {
2501 av_freep(&ost->st->codec->stats_in);
2502 avcodec_close(ost->st->codec);
2505 avfilter_graph_free(&ost->graph);
2509 /* close each decoder */
2510 for (i = 0; i < nb_input_streams; i++) {
2511 ist = &input_streams[i];
2512 if (ist->decoding_needed) {
2513 avcodec_close(ist->st->codec);
2521 av_freep(&bit_buffer);
2522 av_freep(&no_packet);
2524 if (output_streams) {
2525 for (i = 0; i < nb_output_streams; i++) {
2526 ost = &output_streams[i];
2528 if (ost->st->stream_copy)
2529 av_freep(&ost->st->codec->extradata);
2531 fclose(ost->logfile);
2532 ost->logfile = NULL;
2534 av_fifo_free(ost->fifo); /* works even if fifo is not
2535 initialized but set to zero */
2536 av_freep(&ost->st->codec->subtitle_header);
2537 av_free(ost->pict_tmp.data[0]);
2538 av_free(ost->forced_kf_pts);
2539 if (ost->video_resample)
2540 sws_freeContext(ost->img_resample_ctx);
2542 audio_resample_close(ost->resample);
2543 if (ost->reformat_ctx)
2544 av_audio_convert_free(ost->reformat_ctx);
2545 av_dict_free(&ost->opts);
2552 static double parse_frame_aspect_ratio(const char *arg)
2559 p = strchr(arg, ':');
2561 x = strtol(arg, &end, 10);
2563 y = strtol(end+1, &end, 10);
2565 ar = (double)x / (double)y;
2567 ar = strtod(arg, NULL);
2570 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2576 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2578 return parse_option(o, "codec:a", arg, options);
2581 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2583 return parse_option(o, "codec:v", arg, options);
2586 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2588 return parse_option(o, "codec:s", arg, options);
2591 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2593 return parse_option(o, "codec:d", arg, options);
2596 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2598 StreamMap *m = NULL;
2599 int i, negative = 0, file_idx;
2600 int sync_file_idx = -1, sync_stream_idx;
2608 map = av_strdup(arg);
2610 /* parse sync stream first, just pick first matching stream */
2611 if (sync = strchr(map, ',')) {
2613 sync_file_idx = strtol(sync + 1, &sync, 0);
2614 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2615 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2620 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2621 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2622 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2623 sync_stream_idx = i;
2626 if (i == input_files[sync_file_idx].nb_streams) {
2627 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2628 "match any streams.\n", arg);
2634 file_idx = strtol(map, &p, 0);
2635 if (file_idx >= nb_input_files || file_idx < 0) {
2636 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2640 /* disable some already defined maps */
2641 for (i = 0; i < o->nb_stream_maps; i++) {
2642 m = &o->stream_maps[i];
2643 if (check_stream_specifier(input_files[m->file_index].ctx,
2644 input_files[m->file_index].ctx->streams[m->stream_index],
2645 *p == ':' ? p + 1 : p) > 0)
2649 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2650 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2651 *p == ':' ? p + 1 : p) <= 0)
2653 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2654 &o->nb_stream_maps, o->nb_stream_maps + 1);
2655 m = &o->stream_maps[o->nb_stream_maps - 1];
2657 m->file_index = file_idx;
2658 m->stream_index = i;
2660 if (sync_file_idx >= 0) {
2661 m->sync_file_index = sync_file_idx;
2662 m->sync_stream_index = sync_stream_idx;
2664 m->sync_file_index = file_idx;
2665 m->sync_stream_index = i;
2670 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2678 static void parse_meta_type(char *arg, char *type, int *index)
2688 if (*(++arg) == ':')
2689 *index = strtol(++arg, NULL, 0);
2692 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2699 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2701 MetadataMap *m, *m1;
2704 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2705 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2707 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2708 m->file = strtol(arg, &p, 0);
2709 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2711 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2712 if (p = strchr(opt, ':'))
2713 parse_meta_type(p + 1, &m1->type, &m1->index);
2717 if (m->type == 'g' || m1->type == 'g')
2718 o->metadata_global_manual = 1;
2719 if (m->type == 's' || m1->type == 's')
2720 o->metadata_streams_manual = 1;
2721 if (m->type == 'c' || m1->type == 'c')
2722 o->metadata_chapters_manual = 1;
2727 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2729 const char *codec_string = encoder ? "encoder" : "decoder";
2733 avcodec_find_encoder_by_name(name) :
2734 avcodec_find_decoder_by_name(name);
2736 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
2739 if(codec->type != type) {
2740 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
2746 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
2748 char *codec_name = NULL;
2750 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2752 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
2753 st->codec->codec_id = codec->id;
2756 return avcodec_find_decoder(st->codec->codec_id);
2760 * Add all the streams from the given input file to the global
2761 * list of input streams.
2763 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2765 int i, rfps, rfps_base;
2767 for (i = 0; i < ic->nb_streams; i++) {
2768 AVStream *st = ic->streams[i];
2769 AVCodecContext *dec = st->codec;
2773 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2774 ist = &input_streams[nb_input_streams - 1];
2776 ist->file_index = nb_input_files;
2778 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2780 MATCH_PER_STREAM_OPT(ts_scale, dbl, scale, ic, st);
2781 ist->ts_scale = scale;
2783 ist->dec = choose_decoder(o, ic, st);
2785 switch (dec->codec_type) {
2786 case AVMEDIA_TYPE_AUDIO:
2787 if (o->audio_disable)
2788 st->discard= AVDISCARD_ALL;
2790 case AVMEDIA_TYPE_VIDEO:
2791 rfps = ic->streams[i]->r_frame_rate.num;
2792 rfps_base = ic->streams[i]->r_frame_rate.den;
2794 dec->flags |= CODEC_FLAG_EMU_EDGE;
2795 dec->height >>= dec->lowres;
2796 dec->width >>= dec->lowres;
2799 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2801 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",
2802 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2803 (float)rfps / rfps_base, rfps, rfps_base);
2806 if (o->video_disable)
2807 st->discard= AVDISCARD_ALL;
2808 else if(video_discard)
2809 st->discard= video_discard;
2811 case AVMEDIA_TYPE_DATA:
2813 case AVMEDIA_TYPE_SUBTITLE:
2814 if (o->subtitle_disable)
2815 st->discard = AVDISCARD_ALL;
2817 case AVMEDIA_TYPE_ATTACHMENT:
2818 case AVMEDIA_TYPE_UNKNOWN:
2826 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2828 AVFormatContext *ic;
2829 AVInputFormat *file_iformat = NULL;
2833 AVDictionary **opts;
2834 int orig_nb_streams; // number of streams before avformat_find_stream_info
2837 if (!(file_iformat = av_find_input_format(o->format))) {
2838 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
2843 if (!strcmp(filename, "-"))
2846 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2847 !strcmp(filename, "/dev/stdin");
2849 /* get default parameters from command line */
2850 ic = avformat_alloc_context();
2852 print_error(filename, AVERROR(ENOMEM));
2855 if (o->nb_audio_sample_rate) {
2856 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2857 av_dict_set(&format_opts, "sample_rate", buf, 0);
2859 if (o->nb_audio_channels) {
2860 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2861 av_dict_set(&format_opts, "channels", buf, 0);
2863 if (o->nb_frame_rates) {
2864 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2866 if (o->nb_frame_sizes) {
2867 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2869 if (o->nb_frame_pix_fmts)
2870 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2872 ic->flags |= AVFMT_FLAG_NONBLOCK;
2874 /* open the input file with generic libav function */
2875 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2877 print_error(filename, err);
2880 assert_avoptions(format_opts);
2882 /* apply forced codec ids */
2883 for (i = 0; i < ic->nb_streams; i++)
2884 choose_decoder(o, ic, ic->streams[i]);
2886 /* Set AVCodecContext options for avformat_find_stream_info */
2887 opts = setup_find_stream_info_opts(ic, codec_opts);
2888 orig_nb_streams = ic->nb_streams;
2890 /* If not enough info to get the stream parameters, we decode the
2891 first frames to get it. (used in mpeg case for example) */
2892 ret = avformat_find_stream_info(ic, opts);
2894 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
2895 av_close_input_file(ic);
2899 timestamp = o->start_time;
2900 /* add the stream start time */
2901 if (ic->start_time != AV_NOPTS_VALUE)
2902 timestamp += ic->start_time;
2904 /* if seeking requested, we execute it */
2905 if (o->start_time != 0) {
2906 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
2908 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
2909 filename, (double)timestamp / AV_TIME_BASE);
2913 /* update the current parameters so that they match the one of the input stream */
2914 add_input_streams(o, ic);
2916 /* dump the file content */
2917 av_dump_format(ic, nb_input_files, filename, 0);
2919 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
2920 input_files[nb_input_files - 1].ctx = ic;
2921 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
2922 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
2923 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
2924 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
2926 for (i = 0; i < orig_nb_streams; i++)
2927 av_dict_free(&opts[i]);
2934 static void parse_forced_key_frames(char *kf, OutputStream *ost,
2935 AVCodecContext *avctx)
2941 for (p = kf; *p; p++)
2944 ost->forced_kf_count = n;
2945 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
2946 if (!ost->forced_kf_pts) {
2947 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
2950 for (i = 0; i < n; i++) {
2951 p = i ? strchr(p, ',') + 1 : kf;
2952 t = parse_time_or_die("force_key_frames", p, 1);
2953 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
2957 static uint8_t *get_line(AVIOContext *s)
2963 if (avio_open_dyn_buf(&line) < 0) {
2964 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
2968 while ((c = avio_r8(s)) && c != '\n')
2971 avio_close_dyn_buf(line, &buf);
2976 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
2979 char filename[1000];
2980 const char *base[3] = { getenv("AVCONV_DATADIR"),
2985 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
2989 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
2990 i != 1 ? "" : "/.avconv", codec_name, preset_name);
2991 ret = avio_open(s, filename, AVIO_FLAG_READ);
2994 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
2995 i != 1 ? "" : "/.avconv", preset_name);
2996 ret = avio_open(s, filename, AVIO_FLAG_READ);
3002 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3004 char *codec_name = NULL;
3006 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3008 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3009 NULL, ost->st->codec->codec_type);
3010 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3011 } else if (!strcmp(codec_name, "copy"))
3012 ost->st->stream_copy = 1;
3014 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3015 ost->st->codec->codec_id = ost->enc->id;
3019 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3022 AVStream *st = avformat_new_stream(oc, NULL);
3023 int idx = oc->nb_streams - 1, ret = 0;
3024 int64_t max_frames = INT64_MAX;
3025 char *bsf = NULL, *next, *codec_tag = NULL;
3026 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3028 char *buf = NULL, *arg = NULL, *preset = NULL;
3029 AVIOContext *s = NULL;
3032 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3036 if (oc->nb_streams - 1 < o->nb_streamid_map)
3037 st->id = o->streamid_map[oc->nb_streams - 1];
3039 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3040 nb_output_streams + 1);
3041 ost = &output_streams[nb_output_streams - 1];
3042 ost->file_index = nb_output_files;
3045 st->codec->codec_type = type;
3046 choose_encoder(o, oc, ost);
3048 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3051 avcodec_get_context_defaults3(st->codec, ost->enc);
3052 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3054 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3055 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3058 if (!buf[0] || buf[0] == '#') {
3062 if (!(arg = strchr(buf, '='))) {
3063 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3067 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3069 } while (!s->eof_reached);
3073 av_log(NULL, AV_LOG_FATAL,
3074 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3075 preset, ost->file_index, ost->index);
3079 MATCH_PER_STREAM_OPT(max_frames, i64, max_frames, oc, st);
3080 ost->max_frames = max_frames;
3082 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3084 if (next = strchr(bsf, ','))
3086 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3087 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3091 bsfc_prev->next = bsfc;
3093 ost->bitstream_filters = bsfc;
3099 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3101 uint32_t tag = strtol(codec_tag, &next, 0);
3103 tag = AV_RL32(codec_tag);
3104 st->codec->codec_tag = tag;
3107 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3108 if (qscale >= 0 || same_quant) {
3109 st->codec->flags |= CODEC_FLAG_QSCALE;
3110 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3113 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3114 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3116 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3120 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3123 const char *p = str;
3130 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3137 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3141 AVCodecContext *video_enc;
3143 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3145 video_enc = st->codec;
3147 if (!st->stream_copy) {
3148 const char *p = NULL;
3149 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3150 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3151 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3152 int i, force_fps = 0, top_field_first = -1;
3154 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3155 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3156 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3160 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3161 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3162 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3166 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3167 if (frame_aspect_ratio)
3168 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3170 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3171 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3172 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3175 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3177 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3179 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3180 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3183 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3185 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3187 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3188 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3191 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3194 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3197 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3199 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3202 video_enc->rc_override=
3203 av_realloc(video_enc->rc_override,
3204 sizeof(RcOverride)*(i+1));
3205 video_enc->rc_override[i].start_frame= start;
3206 video_enc->rc_override[i].end_frame = end;
3208 video_enc->rc_override[i].qscale= q;
3209 video_enc->rc_override[i].quality_factor= 1.0;
3212 video_enc->rc_override[i].qscale= 0;
3213 video_enc->rc_override[i].quality_factor= -q/100.0;
3218 video_enc->rc_override_count=i;
3219 if (!video_enc->rc_initial_buffer_occupancy)
3220 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3221 video_enc->intra_dc_precision= intra_dc_precision - 8;
3226 video_enc->flags |= CODEC_FLAG_PASS1;
3228 video_enc->flags |= CODEC_FLAG_PASS2;
3232 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3233 if (forced_key_frames)
3234 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3236 MATCH_PER_STREAM_OPT(force_fps, i, force_fps, oc, st);
3237 ost->force_fps = force_fps;
3239 MATCH_PER_STREAM_OPT(top_field_first, i, top_field_first, oc, st);
3240 ost->top_field_first = top_field_first;
3243 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3245 ost->avfilter = av_strdup(filters);
3252 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3256 AVCodecContext *audio_enc;
3258 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3261 audio_enc = st->codec;
3262 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3264 if (!st->stream_copy) {
3265 char *sample_fmt = NULL;
3267 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3269 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3271 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3272 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3276 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3282 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3287 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3289 if (!st->stream_copy) {
3290 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3297 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3299 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3300 ost->st->stream_copy = 1;
3304 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3308 AVCodecContext *subtitle_enc;
3310 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3312 subtitle_enc = st->codec;
3314 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3319 /* arg format is "output-stream-index:streamid-value". */
3320 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3326 av_strlcpy(idx_str, arg, sizeof(idx_str));
3327 p = strchr(idx_str, ':');
3329 av_log(NULL, AV_LOG_FATAL,
3330 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3335 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3336 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3337 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3341 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3343 AVFormatContext *is = ifile->ctx;
3344 AVFormatContext *os = ofile->ctx;
3347 for (i = 0; i < is->nb_chapters; i++) {
3348 AVChapter *in_ch = is->chapters[i], *out_ch;
3349 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3350 AV_TIME_BASE_Q, in_ch->time_base);
3351 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3352 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3355 if (in_ch->end < ts_off)
3357 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3360 out_ch = av_mallocz(sizeof(AVChapter));
3362 return AVERROR(ENOMEM);
3364 out_ch->id = in_ch->id;
3365 out_ch->time_base = in_ch->time_base;
3366 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3367 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3370 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3373 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3375 return AVERROR(ENOMEM);
3376 os->chapters[os->nb_chapters - 1] = out_ch;
3381 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3384 AVFormatContext *ic = NULL;
3386 err = avformat_open_input(&ic, filename, NULL, NULL);
3389 /* copy stream format */
3390 for(i=0;i<ic->nb_streams;i++) {
3395 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3396 ost = new_output_stream(o, s, codec->type);
3399 // FIXME: a more elegant solution is needed
3400 memcpy(st, ic->streams[i], sizeof(AVStream));
3402 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3404 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !st->stream_copy)
3405 choose_sample_fmt(st, codec);
3406 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !st->stream_copy)
3407 choose_pixel_fmt(st, codec);
3410 av_close_input_file(ic);
3414 static void opt_output_file(void *optctx, const char *filename)
3416 OptionsContext *o = optctx;
3417 AVFormatContext *oc;
3419 AVOutputFormat *file_oformat;
3423 if (!strcmp(filename, "-"))
3426 oc = avformat_alloc_context();
3428 print_error(filename, AVERROR(ENOMEM));
3433 file_oformat = av_guess_format(o->format, NULL, NULL);
3434 if (!file_oformat) {
3435 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3439 file_oformat = av_guess_format(NULL, filename, NULL);
3440 if (!file_oformat) {
3441 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3447 oc->oformat = file_oformat;
3448 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3450 if (!strcmp(file_oformat->name, "ffm") &&
3451 av_strstart(filename, "http:", NULL)) {
3452 /* special case for files sent to avserver: we get the stream
3453 parameters from avserver */
3454 int err = read_avserver_streams(o, oc, filename);
3456 print_error(filename, err);
3459 } else if (!o->nb_stream_maps) {
3460 /* pick the "best" stream of each type */
3461 #define NEW_STREAM(type, index)\
3463 ost = new_ ## type ## _stream(o, oc);\
3464 ost->source_index = index;\
3465 ost->sync_ist = &input_streams[index];\
3466 input_streams[index].discard = 0;\
3469 /* video: highest resolution */
3470 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3471 int area = 0, idx = -1;
3472 for (i = 0; i < nb_input_streams; i++) {
3473 ist = &input_streams[i];
3474 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3475 ist->st->codec->width * ist->st->codec->height > area) {
3476 area = ist->st->codec->width * ist->st->codec->height;
3480 NEW_STREAM(video, idx);
3483 /* audio: most channels */
3484 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3485 int channels = 0, idx = -1;
3486 for (i = 0; i < nb_input_streams; i++) {
3487 ist = &input_streams[i];
3488 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3489 ist->st->codec->channels > channels) {
3490 channels = ist->st->codec->channels;
3494 NEW_STREAM(audio, idx);
3497 /* subtitles: pick first */
3498 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3499 for (i = 0; i < nb_input_streams; i++)
3500 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3501 NEW_STREAM(subtitle, i);
3505 /* do something with data? */
3507 for (i = 0; i < o->nb_stream_maps; i++) {
3508 StreamMap *map = &o->stream_maps[i];
3513 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3514 switch (ist->st->codec->codec_type) {
3515 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3516 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3517 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3518 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3519 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3521 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d.%d - unsupported type.\n",
3522 map->file_index, map->stream_index);
3526 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3527 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3528 map->sync_stream_index];
3533 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3534 output_files[nb_output_files - 1].ctx = oc;
3535 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3536 output_files[nb_output_files - 1].recording_time = o->recording_time;
3537 output_files[nb_output_files - 1].start_time = o->start_time;
3538 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3539 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3541 /* check filename in case of an image number is expected */
3542 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3543 if (!av_filename_number_test(oc->filename)) {
3544 print_error(oc->filename, AVERROR(EINVAL));
3549 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3550 /* test if it already exists to avoid loosing precious files */
3551 if (!file_overwrite &&
3552 (strchr(filename, ':') == NULL ||
3553 filename[1] == ':' ||
3554 av_strstart(filename, "file:", NULL))) {
3555 if (avio_check(filename, 0) == 0) {
3557 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
3559 if (!read_yesno()) {
3560 fprintf(stderr, "Not overwriting - exiting\n");
3565 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
3572 if ((err = avio_open(&oc->pb, filename, AVIO_FLAG_WRITE)) < 0) {
3573 print_error(filename, err);
3578 if (o->mux_preload) {
3580 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
3581 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
3583 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3584 oc->flags |= AVFMT_FLAG_NONBLOCK;
3587 if (o->chapters_input_file >= nb_input_files) {
3588 if (o->chapters_input_file == INT_MAX) {
3589 /* copy chapters from the first input file that has them*/
3590 o->chapters_input_file = -1;
3591 for (i = 0; i < nb_input_files; i++)
3592 if (input_files[i].ctx->nb_chapters) {
3593 o->chapters_input_file = i;
3597 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3598 o->chapters_input_file);
3602 if (o->chapters_input_file >= 0)
3603 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3604 !o->metadata_chapters_manual);
3607 for (i = 0; i < o->nb_meta_data_maps; i++) {
3608 AVFormatContext *files[2];
3609 AVDictionary **meta[2];
3612 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3613 if ((index) < 0 || (index) >= (nb_elems)) {\
3614 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
3619 int in_file_index = o->meta_data_maps[i][1].file;
3620 if (in_file_index < 0)
3622 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3625 files[1] = input_files[in_file_index].ctx;
3627 for (j = 0; j < 2; j++) {
3628 MetadataMap *map = &o->meta_data_maps[i][j];
3630 switch (map->type) {
3632 meta[j] = &files[j]->metadata;
3635 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3636 meta[j] = &files[j]->streams[map->index]->metadata;
3639 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3640 meta[j] = &files[j]->chapters[map->index]->metadata;
3643 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3644 meta[j] = &files[j]->programs[map->index]->metadata;
3649 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3652 /* copy global metadata by default */
3653 if (!o->metadata_global_manual && nb_input_files)
3654 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3655 AV_DICT_DONT_OVERWRITE);
3656 if (!o->metadata_streams_manual)
3657 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3658 InputStream *ist = &input_streams[output_streams[i].source_index];
3659 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3662 /* process manually set metadata */
3663 for (i = 0; i < o->nb_metadata; i++) {
3668 val = strchr(o->metadata[i].u.str, '=');
3670 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
3671 o->metadata[i].u.str);
3676 parse_meta_type(o->metadata[i].specifier, &type, &index);
3682 if (index < 0 || index >= oc->nb_streams) {
3683 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
3686 m = &oc->streams[index]->metadata;
3689 if (index < 0 || index >= oc->nb_chapters) {
3690 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
3693 m = &oc->chapters[index]->metadata;
3696 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3700 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3706 /* same option as mencoder */
3707 static int opt_pass(const char *opt, const char *arg)
3709 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3713 static int64_t getutime(void)
3716 struct rusage rusage;
3718 getrusage(RUSAGE_SELF, &rusage);
3719 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3720 #elif HAVE_GETPROCESSTIMES
3722 FILETIME c, e, k, u;
3723 proc = GetCurrentProcess();
3724 GetProcessTimes(proc, &c, &e, &k, &u);
3725 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3727 return av_gettime();
3731 static int64_t getmaxrss(void)
3733 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3734 struct rusage rusage;
3735 getrusage(RUSAGE_SELF, &rusage);
3736 return (int64_t)rusage.ru_maxrss * 1024;
3737 #elif HAVE_GETPROCESSMEMORYINFO
3739 PROCESS_MEMORY_COUNTERS memcounters;
3740 proc = GetCurrentProcess();
3741 memcounters.cb = sizeof(memcounters);
3742 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3743 return memcounters.PeakPagefileUsage;
3749 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3751 return parse_option(o, "q:a", arg, options);
3754 static void show_usage(void)
3756 printf("Hyper fast Audio and Video encoder\n");
3757 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3761 static void show_help(void)
3763 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3764 av_log_set_callback(log_callback_help);
3766 show_help_options(options, "Main options:\n",
3767 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3768 show_help_options(options, "\nAdvanced options:\n",
3769 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3771 show_help_options(options, "\nVideo options:\n",
3772 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3774 show_help_options(options, "\nAdvanced Video options:\n",
3775 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3776 OPT_VIDEO | OPT_EXPERT);
3777 show_help_options(options, "\nAudio options:\n",
3778 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3780 show_help_options(options, "\nAdvanced Audio options:\n",
3781 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3782 OPT_AUDIO | OPT_EXPERT);
3783 show_help_options(options, "\nSubtitle options:\n",
3784 OPT_SUBTITLE | OPT_GRAB,
3786 show_help_options(options, "\nAudio/Video grab options:\n",
3790 show_help_children(avcodec_get_class(), flags);
3791 show_help_children(avformat_get_class(), flags);
3792 show_help_children(sws_get_class(), flags);
3795 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3797 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3798 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3800 if(!strncmp(arg, "pal-", 4)) {
3803 } else if(!strncmp(arg, "ntsc-", 5)) {
3806 } else if(!strncmp(arg, "film-", 5)) {
3810 /* Try to determine PAL/NTSC by peeking in the input files */
3811 if(nb_input_files) {
3813 for (j = 0; j < nb_input_files; j++) {
3814 for (i = 0; i < input_files[j].nb_streams; i++) {
3815 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3816 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3818 fr = c->time_base.den * 1000 / c->time_base.num;
3822 } else if((fr == 29970) || (fr == 23976)) {
3831 if (norm != UNKNOWN)
3832 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3835 if(norm == UNKNOWN) {
3836 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3837 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3838 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
3842 if(!strcmp(arg, "vcd")) {
3843 opt_video_codec(o, "c:v", "mpeg1video");
3844 opt_audio_codec(o, "c:a", "mp2");
3845 parse_option(o, "f", "vcd", options);
3847 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3848 parse_option(o, "r", frame_rates[norm], options);
3849 opt_default("g", norm == PAL ? "15" : "18");
3851 opt_default("b", "1150000");
3852 opt_default("maxrate", "1150000");
3853 opt_default("minrate", "1150000");
3854 opt_default("bufsize", "327680"); // 40*1024*8;
3856 opt_default("b:a", "224000");
3857 parse_option(o, "ar", "44100", options);
3858 parse_option(o, "ac", "2", options);
3860 opt_default("packetsize", "2324");
3861 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
3863 /* We have to offset the PTS, so that it is consistent with the SCR.
3864 SCR starts at 36000, but the first two packs contain only padding
3865 and the first pack from the other stream, respectively, may also have
3866 been written before.
3867 So the real data starts at SCR 36000+3*1200. */
3868 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
3869 } else if(!strcmp(arg, "svcd")) {
3871 opt_video_codec(o, "c:v", "mpeg2video");
3872 opt_audio_codec(o, "c:a", "mp2");
3873 parse_option(o, "f", "svcd", options);
3875 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
3876 parse_option(o, "r", frame_rates[norm], options);
3877 opt_default("g", norm == PAL ? "15" : "18");
3879 opt_default("b", "2040000");
3880 opt_default("maxrate", "2516000");
3881 opt_default("minrate", "0"); //1145000;
3882 opt_default("bufsize", "1835008"); //224*1024*8;
3883 opt_default("flags", "+scan_offset");
3886 opt_default("b:a", "224000");
3887 parse_option(o, "ar", "44100", options);
3889 opt_default("packetsize", "2324");
3891 } else if(!strcmp(arg, "dvd")) {
3893 opt_video_codec(o, "c:v", "mpeg2video");
3894 opt_audio_codec(o, "c:a", "ac3");
3895 parse_option(o, "f", "dvd", options);
3897 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3898 parse_option(o, "r", frame_rates[norm], options);
3899 opt_default("g", norm == PAL ? "15" : "18");
3901 opt_default("b", "6000000");
3902 opt_default("maxrate", "9000000");
3903 opt_default("minrate", "0"); //1500000;
3904 opt_default("bufsize", "1835008"); //224*1024*8;
3906 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
3907 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
3909 opt_default("b:a", "448000");
3910 parse_option(o, "ar", "48000", options);
3912 } else if(!strncmp(arg, "dv", 2)) {
3914 parse_option(o, "f", "dv", options);
3916 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
3917 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
3918 norm == PAL ? "yuv420p" : "yuv411p", options);
3919 parse_option(o, "r", frame_rates[norm], options);
3921 parse_option(o, "ar", "48000", options);
3922 parse_option(o, "ac", "2", options);
3925 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
3926 return AVERROR(EINVAL);
3931 static int opt_vstats_file(const char *opt, const char *arg)
3933 av_free (vstats_filename);
3934 vstats_filename=av_strdup (arg);
3938 static int opt_vstats(const char *opt, const char *arg)
3941 time_t today2 = time(NULL);
3942 struct tm *today = localtime(&today2);
3944 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
3946 return opt_vstats_file(opt, filename);
3949 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
3951 return parse_option(o, "frames:v", arg, options);
3954 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
3956 return parse_option(o, "frames:a", arg, options);
3959 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
3961 return parse_option(o, "frames:d", arg, options);
3964 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
3966 return parse_option(o, "tag:v", arg, options);
3969 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
3971 return parse_option(o, "tag:a", arg, options);
3974 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
3976 return parse_option(o, "tag:s", arg, options);
3979 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
3981 return parse_option(o, "filter:v", arg, options);
3984 #define OFFSET(x) offsetof(OptionsContext, x)
3985 static const OptionDef options[] = {
3987 #include "cmdutils_common_opts.h"
3988 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
3989 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
3990 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
3991 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3992 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
3993 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
3994 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
3995 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
3996 "outfile[,metadata]:infile[,metadata]" },
3997 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
3998 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
3999 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4000 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4001 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4002 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4003 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4004 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4005 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4006 "add timings for benchmarking" },
4007 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4008 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4009 "dump each input packet" },
4010 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4011 "when dumping packets, also dump the payload" },
4012 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4013 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4014 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4015 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4016 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4017 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4018 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4019 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4020 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4021 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4022 { "copyinkf", OPT_BOOL | OPT_EXPERT, {(void*)©_initial_nonkeyframes}, "copy initial non-keyframes" },
4023 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4024 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4025 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4026 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4028 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4030 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4033 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4034 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4035 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4036 { "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" },
4037 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4038 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4039 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4040 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4041 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4042 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4043 "use same quantizer as source (implies VBR)" },
4044 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4045 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4046 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4047 "deinterlace pictures" },
4048 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4049 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4051 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4053 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4054 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4055 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4056 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4057 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4058 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4059 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4060 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4061 { "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" },
4064 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4065 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4066 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4067 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4068 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4069 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4070 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4071 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4072 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4074 /* subtitle options */
4075 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4076 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4077 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4080 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4083 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4084 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4086 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4088 /* data codec support */
4089 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4091 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4095 int main(int argc, char **argv)
4097 OptionsContext o = { 0 };
4102 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4103 parse_loglevel(argc, argv, options);
4105 avcodec_register_all();
4107 avdevice_register_all();
4110 avfilter_register_all();
4114 avio_set_interrupt_cb(decode_interrupt_cb);
4119 parse_options(&o, argc, argv, options, opt_output_file);
4121 if(nb_output_files <= 0 && nb_input_files == 0) {
4123 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4127 /* file converter / grab */
4128 if (nb_output_files <= 0) {
4129 fprintf(stderr, "At least one output file must be specified\n");
4133 if (nb_input_files == 0) {
4134 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4139 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4141 ti = getutime() - ti;
4143 int maxrss = getmaxrss() / 1024;
4144 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);