3 * Copyright (c) 2000-2011 The libav developers.
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31 #include "libavformat/avformat.h"
32 #include "libavdevice/avdevice.h"
33 #include "libswscale/swscale.h"
34 #include "libavutil/opt.h"
35 #include "libavcodec/audioconvert.h"
36 #include "libavutil/audioconvert.h"
37 #include "libavutil/parseutils.h"
38 #include "libavutil/samplefmt.h"
39 #include "libavutil/colorspace.h"
40 #include "libavutil/fifo.h"
41 #include "libavutil/intreadwrite.h"
42 #include "libavutil/dict.h"
43 #include "libavutil/mathematics.h"
44 #include "libavutil/pixdesc.h"
45 #include "libavutil/avstring.h"
46 #include "libavutil/libm.h"
47 #include "libavformat/os_support.h"
50 # include "libavfilter/avfilter.h"
51 # include "libavfilter/avfiltergraph.h"
52 # include "libavfilter/vsrc_buffer.h"
55 #if HAVE_SYS_RESOURCE_H
56 #include <sys/types.h>
58 #include <sys/resource.h>
59 #elif HAVE_GETPROCESSTIMES
62 #if HAVE_GETPROCESSMEMORYINFO
68 #include <sys/select.h>
75 #include "libavutil/avassert.h"
77 const char program_name[] = "avconv";
78 const int program_birth_year = 2000;
80 /* select an input stream for an output stream */
81 typedef struct StreamMap {
82 int disabled; /** 1 is this mapping is disabled by a negative map */
86 int sync_stream_index;
90 * select an input file for an output file
92 typedef struct MetadataMap {
93 int file; ///< file index
94 char type; ///< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
95 int index; ///< stream/chapter/program number
98 static const OptionDef options[];
100 static int video_discard = 0;
101 static int same_quant = 0;
102 static int do_deinterlace = 0;
103 static int intra_dc_precision = 8;
104 static int qp_hist = 0;
106 static int file_overwrite = 0;
107 static int do_benchmark = 0;
108 static int do_hex_dump = 0;
109 static int do_pkt_dump = 0;
110 static int do_pass = 0;
111 static char *pass_logfilename_prefix = NULL;
112 static int video_sync_method= -1;
113 static int audio_sync_method= 0;
114 static float audio_drift_threshold= 0.1;
115 static int copy_ts= 0;
117 static int opt_shortest = 0;
118 static char *vstats_filename;
119 static FILE *vstats_file;
121 static int audio_volume = 256;
123 static int exit_on_error = 0;
124 static int using_stdin = 0;
125 static int64_t video_size = 0;
126 static int64_t audio_size = 0;
127 static int64_t extra_size = 0;
128 static int nb_frames_dup = 0;
129 static int nb_frames_drop = 0;
130 static int input_sync;
132 static float dts_delta_threshold = 10;
134 static int print_stats = 1;
136 static uint8_t *audio_buf;
137 static uint8_t *audio_out;
138 static unsigned int allocated_audio_out_size, allocated_audio_buf_size;
140 static void *samples;
142 #define DEFAULT_PASS_LOGFILENAME_PREFIX "av2pass"
144 typedef struct InputStream {
147 int discard; /* true if stream data should be discarded */
148 int decoding_needed; /* true if the packets must be decoded in 'raw_fifo' */
151 int64_t start; /* time when read started */
152 int64_t next_pts; /* synthetic pts for cases where pkt.pts
154 int64_t pts; /* current pts */
155 PtsCorrectionContext pts_ctx;
157 int is_start; /* is 1 at the start and after a discontinuity */
158 int showed_multi_packet_warning;
162 typedef struct InputFile {
163 AVFormatContext *ctx;
164 int eof_reached; /* true if eof reached */
165 int ist_index; /* index of first stream in ist_table */
166 int buffer_size; /* current total buffer size */
168 int nb_streams; /* number of stream that avconv is aware of; may be different
169 from ctx.nb_streams if new streams appear during av_read_frame() */
173 typedef struct OutputStream {
174 int file_index; /* file index */
175 int index; /* stream index in the output file */
176 int source_index; /* InputStream index */
177 AVStream *st; /* stream in the output file */
178 int encoding_needed; /* true if encoding needed for this stream */
180 /* input pts and corresponding output pts
182 //double sync_ipts; /* dts from the AVPacket of the demuxer in second units */
183 struct InputStream *sync_ist; /* input stream to sync against */
184 int64_t sync_opts; /* output frame counter, could be changed to some true timestamp */ //FIXME look at frame_number
185 AVBitStreamFilterContext *bitstream_filters;
191 AVFrame pict_tmp; /* temporary image for resampling */
192 struct SwsContext *img_resample_ctx; /* for image resampling */
195 int resample_pix_fmt;
196 AVRational frame_rate;
200 float frame_aspect_ratio;
202 /* forced key frames */
203 int64_t *forced_kf_pts;
209 ReSampleContext *resample; /* for audio resampling */
210 int resample_sample_fmt;
211 int resample_channels;
212 int resample_sample_rate;
214 AVAudioConvert *reformat_ctx;
215 AVFifoBuffer *fifo; /* for compression: one audio fifo per codec */
219 AVFilterContext *output_video_filter;
220 AVFilterContext *input_video_filter;
221 AVFilterBufferRef *picref;
223 AVFilterGraph *graph;
228 int is_past_recording_time;
230 const char *attachment_filename;
231 int copy_initial_nonkeyframes;
235 typedef struct OutputFile {
236 AVFormatContext *ctx;
238 int ost_index; /* index of the first stream in output_streams */
239 int64_t recording_time; /* desired length of the resulting file in microseconds */
240 int64_t start_time; /* start time in microseconds */
241 uint64_t limit_filesize;
244 static InputStream *input_streams = NULL;
245 static int nb_input_streams = 0;
246 static InputFile *input_files = NULL;
247 static int nb_input_files = 0;
249 static OutputStream *output_streams = NULL;
250 static int nb_output_streams = 0;
251 static OutputFile *output_files = NULL;
252 static int nb_output_files = 0;
254 typedef struct OptionsContext {
255 /* input/output options */
259 SpecifierOpt *codec_names;
261 SpecifierOpt *audio_channels;
262 int nb_audio_channels;
263 SpecifierOpt *audio_sample_rate;
264 int nb_audio_sample_rate;
265 SpecifierOpt *frame_rates;
267 SpecifierOpt *frame_sizes;
269 SpecifierOpt *frame_pix_fmts;
270 int nb_frame_pix_fmts;
273 int64_t input_ts_offset;
276 SpecifierOpt *ts_scale;
278 SpecifierOpt *dump_attachment;
279 int nb_dump_attachment;
282 StreamMap *stream_maps;
284 /* first item specifies output metadata, second is input */
285 MetadataMap (*meta_data_maps)[2];
286 int nb_meta_data_maps;
287 int metadata_global_manual;
288 int metadata_streams_manual;
289 int metadata_chapters_manual;
290 const char **attachments;
293 int chapters_input_file;
295 int64_t recording_time;
296 uint64_t limit_filesize;
302 int subtitle_disable;
305 /* indexed by output file stream index */
309 SpecifierOpt *metadata;
311 SpecifierOpt *max_frames;
313 SpecifierOpt *bitstream_filters;
314 int nb_bitstream_filters;
315 SpecifierOpt *codec_tags;
317 SpecifierOpt *sample_fmts;
319 SpecifierOpt *qscale;
321 SpecifierOpt *forced_key_frames;
322 int nb_forced_key_frames;
323 SpecifierOpt *force_fps;
325 SpecifierOpt *frame_aspect_ratios;
326 int nb_frame_aspect_ratios;
327 SpecifierOpt *rc_overrides;
329 SpecifierOpt *intra_matrices;
330 int nb_intra_matrices;
331 SpecifierOpt *inter_matrices;
332 int nb_inter_matrices;
333 SpecifierOpt *top_field_first;
334 int nb_top_field_first;
335 SpecifierOpt *presets;
337 SpecifierOpt *copy_initial_nonkeyframes;
338 int nb_copy_initial_nonkeyframes;
340 SpecifierOpt *filters;
345 #define MATCH_PER_STREAM_OPT(name, type, outvar, fmtctx, st)\
348 for (i = 0; i < o->nb_ ## name; i++) {\
349 char *spec = o->name[i].specifier;\
350 if ((ret = check_stream_specifier(fmtctx, st, spec)) > 0)\
351 outvar = o->name[i].u.type;\
357 static void reset_options(OptionsContext *o)
359 const OptionDef *po = options;
361 /* all OPT_SPEC and OPT_STRING can be freed in generic way */
363 void *dst = (uint8_t*)o + po->u.off;
365 if (po->flags & OPT_SPEC) {
366 SpecifierOpt **so = dst;
367 int i, *count = (int*)(so + 1);
368 for (i = 0; i < *count; i++) {
369 av_freep(&(*so)[i].specifier);
370 if (po->flags & OPT_STRING)
371 av_freep(&(*so)[i].u.str);
375 } else if (po->flags & OPT_OFFSET && po->flags & OPT_STRING)
380 av_freep(&o->stream_maps);
381 av_freep(&o->meta_data_maps);
382 av_freep(&o->streamid_map);
384 memset(o, 0, sizeof(*o));
386 o->mux_max_delay = 0.7;
387 o->recording_time = INT64_MAX;
388 o->limit_filesize = UINT64_MAX;
389 o->chapters_input_file = INT_MAX;
397 static int configure_video_filters(InputStream *ist, OutputStream *ost)
399 AVFilterContext *last_filter, *filter;
400 /** filter graph containing all filters including input & output */
401 AVCodecContext *codec = ost->st->codec;
402 AVCodecContext *icodec = ist->st->codec;
403 FFSinkContext ffsink_ctx = { .pix_fmt = codec->pix_fmt };
404 AVRational sample_aspect_ratio;
408 ost->graph = avfilter_graph_alloc();
410 if (ist->st->sample_aspect_ratio.num){
411 sample_aspect_ratio = ist->st->sample_aspect_ratio;
413 sample_aspect_ratio = ist->st->codec->sample_aspect_ratio;
415 snprintf(args, 255, "%d:%d:%d:%d:%d:%d:%d", ist->st->codec->width,
416 ist->st->codec->height, ist->st->codec->pix_fmt, 1, AV_TIME_BASE,
417 sample_aspect_ratio.num, sample_aspect_ratio.den);
419 ret = avfilter_graph_create_filter(&ost->input_video_filter, avfilter_get_by_name("buffer"),
420 "src", args, NULL, ost->graph);
423 ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
424 "out", NULL, &ffsink_ctx, ost->graph);
427 last_filter = ost->input_video_filter;
429 if (codec->width != icodec->width || codec->height != icodec->height) {
430 snprintf(args, 255, "%d:%d:flags=0x%X",
433 (unsigned)ost->sws_flags);
434 if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
435 NULL, args, NULL, ost->graph)) < 0)
437 if ((ret = avfilter_link(last_filter, 0, filter, 0)) < 0)
439 last_filter = filter;
442 snprintf(args, sizeof(args), "flags=0x%X", (unsigned)ost->sws_flags);
443 ost->graph->scale_sws_opts = av_strdup(args);
446 AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut));
447 AVFilterInOut *inputs = av_malloc(sizeof(AVFilterInOut));
449 outputs->name = av_strdup("in");
450 outputs->filter_ctx = last_filter;
451 outputs->pad_idx = 0;
452 outputs->next = NULL;
454 inputs->name = av_strdup("out");
455 inputs->filter_ctx = ost->output_video_filter;
459 if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
461 av_freep(&ost->avfilter);
463 if ((ret = avfilter_link(last_filter, 0, ost->output_video_filter, 0)) < 0)
467 if ((ret = avfilter_graph_config(ost->graph, NULL)) < 0)
470 codec->width = ost->output_video_filter->inputs[0]->w;
471 codec->height = ost->output_video_filter->inputs[0]->h;
472 codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
473 ost->frame_aspect_ratio ? // overridden by the -aspect cli option
474 av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
475 ost->output_video_filter->inputs[0]->sample_aspect_ratio;
479 #endif /* CONFIG_AVFILTER */
481 static void term_exit(void)
483 av_log(NULL, AV_LOG_QUIET, "");
486 static volatile int received_sigterm = 0;
487 static volatile int received_nb_signals = 0;
490 sigterm_handler(int sig)
492 received_sigterm = sig;
493 received_nb_signals++;
497 static void term_init(void)
499 signal(SIGINT , sigterm_handler); /* Interrupt (ANSI). */
500 signal(SIGTERM, sigterm_handler); /* Termination (ANSI). */
502 signal(SIGXCPU, sigterm_handler);
506 static int decode_interrupt_cb(void *ctx)
508 return received_nb_signals > 1;
511 static const AVIOInterruptCB int_cb = { decode_interrupt_cb, NULL };
513 void exit_program(int ret)
518 for(i=0;i<nb_output_files;i++) {
519 AVFormatContext *s = output_files[i].ctx;
520 if (!(s->oformat->flags & AVFMT_NOFILE) && s->pb)
522 avformat_free_context(s);
523 av_dict_free(&output_files[i].opts);
525 for(i=0;i<nb_input_files;i++) {
526 av_close_input_file(input_files[i].ctx);
528 for (i = 0; i < nb_input_streams; i++)
529 av_dict_free(&input_streams[i].opts);
533 av_free(vstats_filename);
535 av_freep(&input_streams);
536 av_freep(&input_files);
537 av_freep(&output_streams);
538 av_freep(&output_files);
543 allocated_audio_buf_size= allocated_audio_out_size= 0;
549 avformat_network_deinit();
551 if (received_sigterm) {
552 av_log(NULL, AV_LOG_INFO, "Received signal %d: terminating.\n",
553 (int) received_sigterm);
557 exit(ret); /* not all OS-es handle main() return value */
560 static void assert_avoptions(AVDictionary *m)
562 AVDictionaryEntry *t;
563 if ((t = av_dict_get(m, "", NULL, AV_DICT_IGNORE_SUFFIX))) {
564 av_log(NULL, AV_LOG_FATAL, "Option %s not found.\n", t->key);
569 static void assert_codec_experimental(AVCodecContext *c, int encoder)
571 const char *codec_string = encoder ? "encoder" : "decoder";
573 if (c->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
574 c->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
575 av_log(NULL, AV_LOG_FATAL, "%s '%s' is experimental and might produce bad "
576 "results.\nAdd '-strict experimental' if you want to use it.\n",
577 codec_string, c->codec->name);
578 codec = encoder ? avcodec_find_encoder(c->codec->id) : avcodec_find_decoder(c->codec->id);
579 if (!(codec->capabilities & CODEC_CAP_EXPERIMENTAL))
580 av_log(NULL, AV_LOG_FATAL, "Or use the non experimental %s '%s'.\n",
581 codec_string, codec->name);
586 static void choose_sample_fmt(AVStream *st, AVCodec *codec)
588 if(codec && codec->sample_fmts){
589 const enum AVSampleFormat *p= codec->sample_fmts;
591 if(*p == st->codec->sample_fmt)
595 av_log(NULL, AV_LOG_WARNING,
596 "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
597 av_get_sample_fmt_name(st->codec->sample_fmt),
599 av_get_sample_fmt_name(codec->sample_fmts[0]));
600 st->codec->sample_fmt = codec->sample_fmts[0];
606 * Update the requested input sample format based on the output sample format.
607 * This is currently only used to request float output from decoders which
608 * support multiple sample formats, one of which is AV_SAMPLE_FMT_FLT.
609 * Ideally this will be removed in the future when decoders do not do format
610 * conversion and only output in their native format.
612 static void update_sample_fmt(AVCodecContext *dec, AVCodec *dec_codec,
615 /* if sample formats match or a decoder sample format has already been
616 requested, just return */
617 if (enc->sample_fmt == dec->sample_fmt ||
618 dec->request_sample_fmt > AV_SAMPLE_FMT_NONE)
621 /* if decoder supports more than one output format */
622 if (dec_codec && dec_codec->sample_fmts &&
623 dec_codec->sample_fmts[0] != AV_SAMPLE_FMT_NONE &&
624 dec_codec->sample_fmts[1] != AV_SAMPLE_FMT_NONE) {
625 const enum AVSampleFormat *p;
626 int min_dec = -1, min_inc = -1;
628 /* find a matching sample format in the encoder */
629 for (p = dec_codec->sample_fmts; *p != AV_SAMPLE_FMT_NONE; p++) {
630 if (*p == enc->sample_fmt) {
631 dec->request_sample_fmt = *p;
633 } else if (*p > enc->sample_fmt) {
634 min_inc = FFMIN(min_inc, *p - enc->sample_fmt);
636 min_dec = FFMIN(min_dec, enc->sample_fmt - *p);
639 /* if none match, provide the one that matches quality closest */
640 dec->request_sample_fmt = min_inc > 0 ? enc->sample_fmt + min_inc :
641 enc->sample_fmt - min_dec;
645 static void choose_sample_rate(AVStream *st, AVCodec *codec)
647 if(codec && codec->supported_samplerates){
648 const int *p= codec->supported_samplerates;
650 int best_dist=INT_MAX;
652 int dist= abs(st->codec->sample_rate - *p);
653 if(dist < best_dist){
659 av_log(st->codec, AV_LOG_WARNING, "Requested sampling rate unsupported using closest supported (%d)\n", best);
661 st->codec->sample_rate= best;
665 static void choose_pixel_fmt(AVStream *st, AVCodec *codec)
667 if(codec && codec->pix_fmts){
668 const enum PixelFormat *p= codec->pix_fmts;
669 if(st->codec->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL){
670 if(st->codec->codec_id==CODEC_ID_MJPEG){
671 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE};
672 }else if(st->codec->codec_id==CODEC_ID_LJPEG){
673 p= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_YUVJ444P, PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_YUV444P, PIX_FMT_BGRA, PIX_FMT_NONE};
677 if(*p == st->codec->pix_fmt)
681 if(st->codec->pix_fmt != PIX_FMT_NONE)
682 av_log(NULL, AV_LOG_WARNING,
683 "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
684 av_pix_fmt_descriptors[st->codec->pix_fmt].name,
686 av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
687 st->codec->pix_fmt = codec->pix_fmts[0];
693 get_sync_ipts(const OutputStream *ost)
695 const InputStream *ist = ost->sync_ist;
696 OutputFile *of = &output_files[ost->file_index];
697 return (double)(ist->pts - of->start_time)/AV_TIME_BASE;
700 static void write_frame(AVFormatContext *s, AVPacket *pkt, AVCodecContext *avctx, AVBitStreamFilterContext *bsfc){
704 AVPacket new_pkt= *pkt;
705 int a= av_bitstream_filter_filter(bsfc, avctx, NULL,
706 &new_pkt.data, &new_pkt.size,
707 pkt->data, pkt->size,
708 pkt->flags & AV_PKT_FLAG_KEY);
711 new_pkt.destruct= av_destruct_packet;
713 av_log(NULL, AV_LOG_ERROR, "%s failed for stream %d, codec %s",
714 bsfc->filter->name, pkt->stream_index,
715 avctx->codec ? avctx->codec->name : "copy");
725 ret= av_interleaved_write_frame(s, pkt);
727 print_error("av_interleaved_write_frame()", ret);
732 static void do_audio_out(AVFormatContext *s,
735 unsigned char *buf, int size)
738 int64_t audio_out_size, audio_buf_size;
739 int64_t allocated_for_size= size;
741 int size_out, frame_bytes, ret, resample_changed;
742 AVCodecContext *enc= ost->st->codec;
743 AVCodecContext *dec= ist->st->codec;
744 int osize = av_get_bytes_per_sample(enc->sample_fmt);
745 int isize = av_get_bytes_per_sample(dec->sample_fmt);
746 const int coded_bps = av_get_bits_per_sample(enc->codec->id);
749 audio_buf_size= (allocated_for_size + isize*dec->channels - 1) / (isize*dec->channels);
750 audio_buf_size= (audio_buf_size*enc->sample_rate + dec->sample_rate) / dec->sample_rate;
751 audio_buf_size= audio_buf_size*2 + 10000; //safety factors for the deprecated resampling API
752 audio_buf_size= FFMAX(audio_buf_size, enc->frame_size);
753 audio_buf_size*= osize*enc->channels;
755 audio_out_size= FFMAX(audio_buf_size, enc->frame_size * osize * enc->channels);
756 if(coded_bps > 8*osize)
757 audio_out_size= audio_out_size * coded_bps / (8*osize);
758 audio_out_size += FF_MIN_BUFFER_SIZE;
760 if(audio_out_size > INT_MAX || audio_buf_size > INT_MAX){
761 av_log(NULL, AV_LOG_FATAL, "Buffer sizes too large\n");
765 av_fast_malloc(&audio_buf, &allocated_audio_buf_size, audio_buf_size);
766 av_fast_malloc(&audio_out, &allocated_audio_out_size, audio_out_size);
767 if (!audio_buf || !audio_out){
768 av_log(NULL, AV_LOG_FATAL, "Out of memory in do_audio_out\n");
772 if (enc->channels != dec->channels || enc->sample_rate != dec->sample_rate)
773 ost->audio_resample = 1;
775 resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
776 ost->resample_channels != dec->channels ||
777 ost->resample_sample_rate != dec->sample_rate;
779 if ((ost->audio_resample && !ost->resample) || resample_changed) {
780 if (resample_changed) {
781 av_log(NULL, AV_LOG_INFO, "Input stream #%d:%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
782 ist->file_index, ist->st->index,
783 ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
784 dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
785 ost->resample_sample_fmt = dec->sample_fmt;
786 ost->resample_channels = dec->channels;
787 ost->resample_sample_rate = dec->sample_rate;
789 audio_resample_close(ost->resample);
791 /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
792 if (audio_sync_method <= 1 &&
793 ost->resample_sample_fmt == enc->sample_fmt &&
794 ost->resample_channels == enc->channels &&
795 ost->resample_sample_rate == enc->sample_rate) {
796 ost->resample = NULL;
797 ost->audio_resample = 0;
798 } else if (ost->audio_resample) {
799 if (dec->sample_fmt != AV_SAMPLE_FMT_S16)
800 av_log(NULL, AV_LOG_WARNING, "Using s16 intermediate sample format for resampling\n");
801 ost->resample = av_audio_resample_init(enc->channels, dec->channels,
802 enc->sample_rate, dec->sample_rate,
803 enc->sample_fmt, dec->sample_fmt,
805 if (!ost->resample) {
806 av_log(NULL, AV_LOG_FATAL, "Can not resample %d channels @ %d Hz to %d channels @ %d Hz\n",
807 dec->channels, dec->sample_rate,
808 enc->channels, enc->sample_rate);
814 #define MAKE_SFMT_PAIR(a,b) ((a)+AV_SAMPLE_FMT_NB*(b))
815 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt &&
816 MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt)!=ost->reformat_pair) {
817 if (ost->reformat_ctx)
818 av_audio_convert_free(ost->reformat_ctx);
819 ost->reformat_ctx = av_audio_convert_alloc(enc->sample_fmt, 1,
820 dec->sample_fmt, 1, NULL, 0);
821 if (!ost->reformat_ctx) {
822 av_log(NULL, AV_LOG_FATAL, "Cannot convert %s sample format to %s sample format\n",
823 av_get_sample_fmt_name(dec->sample_fmt),
824 av_get_sample_fmt_name(enc->sample_fmt));
827 ost->reformat_pair=MAKE_SFMT_PAIR(enc->sample_fmt,dec->sample_fmt);
830 if(audio_sync_method){
831 double delta = get_sync_ipts(ost) * enc->sample_rate - ost->sync_opts
832 - av_fifo_size(ost->fifo)/(enc->channels * 2);
833 double idelta= delta*dec->sample_rate / enc->sample_rate;
834 int byte_delta= ((int)idelta)*2*dec->channels;
836 //FIXME resample delay
837 if(fabs(delta) > 50){
838 if(ist->is_start || fabs(delta) > audio_drift_threshold*enc->sample_rate){
840 byte_delta= FFMAX(byte_delta, -size);
843 av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n", (int)-delta);
848 static uint8_t *input_tmp= NULL;
849 input_tmp= av_realloc(input_tmp, byte_delta + size);
851 if(byte_delta > allocated_for_size - size){
852 allocated_for_size= byte_delta + (int64_t)size;
857 memset(input_tmp, 0, byte_delta);
858 memcpy(input_tmp + byte_delta, buf, size);
861 av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", (int)delta);
863 }else if(audio_sync_method>1){
864 int comp= av_clip(delta, -audio_sync_method, audio_sync_method);
865 av_assert0(ost->audio_resample);
866 av_log(NULL, AV_LOG_VERBOSE, "compensating audio timestamp drift:%f compensation:%d in:%d\n",
867 delta, comp, enc->sample_rate);
868 // fprintf(stderr, "drift:%f len:%d opts:%"PRId64" ipts:%"PRId64" fifo:%d\n", delta, -1, ost->sync_opts, (int64_t)(get_sync_ipts(ost) * enc->sample_rate), av_fifo_size(ost->fifo)/(ost->st->codec->channels * 2));
869 av_resample_compensate(*(struct AVResampleContext**)ost->resample, comp, enc->sample_rate);
873 ost->sync_opts= lrintf(get_sync_ipts(ost) * enc->sample_rate)
874 - av_fifo_size(ost->fifo)/(enc->channels * 2); //FIXME wrong
876 if (ost->audio_resample) {
878 size_out = audio_resample(ost->resample,
879 (short *)buftmp, (short *)buf,
880 size / (dec->channels * isize));
881 size_out = size_out * enc->channels * osize;
887 if (!ost->audio_resample && dec->sample_fmt!=enc->sample_fmt) {
888 const void *ibuf[6]= {buftmp};
889 void *obuf[6]= {audio_buf};
890 int istride[6]= {isize};
891 int ostride[6]= {osize};
892 int len= size_out/istride[0];
893 if (av_audio_convert(ost->reformat_ctx, obuf, ostride, ibuf, istride, len)<0) {
894 printf("av_audio_convert() failed\n");
900 size_out = len*osize;
903 /* now encode as many frames as possible */
904 if (enc->frame_size > 1) {
905 /* output resampled raw samples */
906 if (av_fifo_realloc2(ost->fifo, av_fifo_size(ost->fifo) + size_out) < 0) {
907 av_log(NULL, AV_LOG_FATAL, "av_fifo_realloc2() failed\n");
910 av_fifo_generic_write(ost->fifo, buftmp, size_out, NULL);
912 frame_bytes = enc->frame_size * osize * enc->channels;
914 while (av_fifo_size(ost->fifo) >= frame_bytes) {
916 av_init_packet(&pkt);
918 av_fifo_generic_read(ost->fifo, audio_buf, frame_bytes, NULL);
920 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
922 ret = avcodec_encode_audio(enc, audio_out, audio_out_size,
925 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
929 pkt.stream_index= ost->index;
932 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
933 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
934 pkt.flags |= AV_PKT_FLAG_KEY;
935 write_frame(s, &pkt, enc, ost->bitstream_filters);
937 ost->sync_opts += enc->frame_size;
941 av_init_packet(&pkt);
943 ost->sync_opts += size_out / (osize * enc->channels);
945 /* output a pcm frame */
946 /* determine the size of the coded buffer */
949 size_out = size_out*coded_bps/8;
951 if(size_out > audio_out_size){
952 av_log(NULL, AV_LOG_FATAL, "Internal error, buffer size too small\n");
956 //FIXME pass ost->sync_opts as AVFrame.pts in avcodec_encode_audio()
957 ret = avcodec_encode_audio(enc, audio_out, size_out,
960 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
964 pkt.stream_index= ost->index;
967 if(enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
968 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
969 pkt.flags |= AV_PKT_FLAG_KEY;
970 write_frame(s, &pkt, enc, ost->bitstream_filters);
974 static void pre_process_video_frame(InputStream *ist, AVPicture *picture, void **bufp)
978 AVPicture picture_tmp;
981 dec = ist->st->codec;
983 /* deinterlace : must be done before any resize */
984 if (do_deinterlace) {
987 /* create temporary picture */
988 size = avpicture_get_size(dec->pix_fmt, dec->width, dec->height);
989 buf = av_malloc(size);
993 picture2 = &picture_tmp;
994 avpicture_fill(picture2, buf, dec->pix_fmt, dec->width, dec->height);
996 if(avpicture_deinterlace(picture2, picture,
997 dec->pix_fmt, dec->width, dec->height) < 0) {
998 /* if error, do not deinterlace */
999 av_log(NULL, AV_LOG_WARNING, "Deinterlacing failed\n");
1008 if (picture != picture2)
1009 *picture = *picture2;
1013 static void do_subtitle_out(AVFormatContext *s,
1019 static uint8_t *subtitle_out = NULL;
1020 int subtitle_out_max_size = 1024 * 1024;
1021 int subtitle_out_size, nb, i;
1022 AVCodecContext *enc;
1025 if (pts == AV_NOPTS_VALUE) {
1026 av_log(NULL, AV_LOG_ERROR, "Subtitle packets must have a pts\n");
1032 enc = ost->st->codec;
1034 if (!subtitle_out) {
1035 subtitle_out = av_malloc(subtitle_out_max_size);
1038 /* Note: DVB subtitle need one packet to draw them and one other
1039 packet to clear them */
1040 /* XXX: signal it in the codec context ? */
1041 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE)
1046 for(i = 0; i < nb; i++) {
1047 sub->pts = av_rescale_q(pts, ist->st->time_base, AV_TIME_BASE_Q);
1048 // start_display_time is required to be 0
1049 sub->pts += av_rescale_q(sub->start_display_time, (AVRational){1, 1000}, AV_TIME_BASE_Q);
1050 sub->end_display_time -= sub->start_display_time;
1051 sub->start_display_time = 0;
1052 subtitle_out_size = avcodec_encode_subtitle(enc, subtitle_out,
1053 subtitle_out_max_size, sub);
1054 if (subtitle_out_size < 0) {
1055 av_log(NULL, AV_LOG_FATAL, "Subtitle encoding failed\n");
1059 av_init_packet(&pkt);
1060 pkt.stream_index = ost->index;
1061 pkt.data = subtitle_out;
1062 pkt.size = subtitle_out_size;
1063 pkt.pts = av_rescale_q(sub->pts, AV_TIME_BASE_Q, ost->st->time_base);
1064 if (enc->codec_id == CODEC_ID_DVB_SUBTITLE) {
1065 /* XXX: the pts correction is handled here. Maybe handling
1066 it in the codec would be better */
1068 pkt.pts += 90 * sub->start_display_time;
1070 pkt.pts += 90 * sub->end_display_time;
1072 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1076 static int bit_buffer_size= 1024*256;
1077 static uint8_t *bit_buffer= NULL;
1079 static void do_video_resample(OutputStream *ost,
1081 AVFrame *in_picture,
1082 AVFrame **out_picture)
1084 int resample_changed = 0;
1085 AVCodecContext *dec = ist->st->codec;
1086 *out_picture = in_picture;
1088 resample_changed = ost->resample_width != dec->width ||
1089 ost->resample_height != dec->height ||
1090 ost->resample_pix_fmt != dec->pix_fmt;
1092 if (resample_changed) {
1093 av_log(NULL, AV_LOG_INFO,
1094 "Input stream #%d:%d frame changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s\n",
1095 ist->file_index, ist->st->index,
1096 ost->resample_width, ost->resample_height, av_get_pix_fmt_name(ost->resample_pix_fmt),
1097 dec->width , dec->height , av_get_pix_fmt_name(dec->pix_fmt));
1098 if(!ost->video_resample)
1099 ost->video_resample = 1;
1102 #if !CONFIG_AVFILTER
1103 if (ost->video_resample) {
1104 *out_picture = &ost->pict_tmp;
1105 if (resample_changed) {
1106 /* initialize a new scaler context */
1107 sws_freeContext(ost->img_resample_ctx);
1108 ost->img_resample_ctx = sws_getContext(
1109 ist->st->codec->width,
1110 ist->st->codec->height,
1111 ist->st->codec->pix_fmt,
1112 ost->st->codec->width,
1113 ost->st->codec->height,
1114 ost->st->codec->pix_fmt,
1115 ost->sws_flags, NULL, NULL, NULL);
1116 if (ost->img_resample_ctx == NULL) {
1117 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
1121 sws_scale(ost->img_resample_ctx, in_picture->data, in_picture->linesize,
1122 0, ost->resample_height, (*out_picture)->data, (*out_picture)->linesize);
1125 if (resample_changed) {
1126 avfilter_graph_free(&ost->graph);
1127 if (configure_video_filters(ist, ost)) {
1128 av_log(NULL, AV_LOG_FATAL, "Error reinitializing filters!\n");
1133 if (resample_changed) {
1134 ost->resample_width = dec->width;
1135 ost->resample_height = dec->height;
1136 ost->resample_pix_fmt = dec->pix_fmt;
1141 static void do_video_out(AVFormatContext *s,
1144 AVFrame *in_picture,
1145 int *frame_size, float quality)
1147 int nb_frames, i, ret, format_video_sync;
1148 AVFrame *final_picture;
1149 AVCodecContext *enc;
1152 enc = ost->st->codec;
1154 sync_ipts = get_sync_ipts(ost) / av_q2d(enc->time_base);
1156 /* by default, we output a single frame */
1161 format_video_sync = video_sync_method;
1162 if (format_video_sync < 0)
1163 format_video_sync = (s->oformat->flags & AVFMT_VARIABLE_FPS) ? 2 : 1;
1165 if (format_video_sync) {
1166 double vdelta = sync_ipts - ost->sync_opts;
1167 //FIXME set to 0.5 after we fix some dts/pts bugs like in avidec.c
1170 else if (format_video_sync == 2) {
1173 }else if(vdelta>0.6)
1174 ost->sync_opts= lrintf(sync_ipts);
1175 }else if (vdelta > 1.1)
1176 nb_frames = lrintf(vdelta);
1177 //fprintf(stderr, "vdelta:%f, ost->sync_opts:%"PRId64", ost->sync_ipts:%f nb_frames:%d\n", vdelta, ost->sync_opts, get_sync_ipts(ost), nb_frames);
1178 if (nb_frames == 0){
1180 av_log(NULL, AV_LOG_VERBOSE, "*** drop!\n");
1181 }else if (nb_frames > 1) {
1182 nb_frames_dup += nb_frames - 1;
1183 av_log(NULL, AV_LOG_VERBOSE, "*** %d dup!\n", nb_frames-1);
1186 ost->sync_opts= lrintf(sync_ipts);
1188 nb_frames = FFMIN(nb_frames, ost->max_frames - ost->frame_number);
1192 do_video_resample(ost, ist, in_picture, &final_picture);
1194 /* duplicates frame if needed */
1195 for(i=0;i<nb_frames;i++) {
1197 av_init_packet(&pkt);
1198 pkt.stream_index= ost->index;
1200 if (s->oformat->flags & AVFMT_RAWPICTURE) {
1201 /* raw pictures are written as AVPicture structure to
1202 avoid any copies. We support temporarily the older
1204 enc->coded_frame->interlaced_frame = in_picture->interlaced_frame;
1205 enc->coded_frame->top_field_first = in_picture->top_field_first;
1206 pkt.data= (uint8_t *)final_picture;
1207 pkt.size= sizeof(AVPicture);
1208 pkt.pts= av_rescale_q(ost->sync_opts, enc->time_base, ost->st->time_base);
1209 pkt.flags |= AV_PKT_FLAG_KEY;
1211 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1213 AVFrame big_picture;
1215 big_picture= *final_picture;
1216 /* better than nothing: use input picture interlaced
1218 big_picture.interlaced_frame = in_picture->interlaced_frame;
1219 if (ost->st->codec->flags & (CODEC_FLAG_INTERLACED_DCT|CODEC_FLAG_INTERLACED_ME)) {
1220 if (ost->top_field_first == -1)
1221 big_picture.top_field_first = in_picture->top_field_first;
1223 big_picture.top_field_first = !!ost->top_field_first;
1226 /* handles same_quant here. This is not correct because it may
1227 not be a global option */
1228 big_picture.quality = quality;
1229 if (!enc->me_threshold)
1230 big_picture.pict_type = 0;
1231 // big_picture.pts = AV_NOPTS_VALUE;
1232 big_picture.pts= ost->sync_opts;
1233 // big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
1234 //av_log(NULL, AV_LOG_DEBUG, "%"PRId64" -> encoder\n", ost->sync_opts);
1235 if (ost->forced_kf_index < ost->forced_kf_count &&
1236 big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
1237 big_picture.pict_type = AV_PICTURE_TYPE_I;
1238 ost->forced_kf_index++;
1240 ret = avcodec_encode_video(enc,
1241 bit_buffer, bit_buffer_size,
1244 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1249 pkt.data= bit_buffer;
1251 if(enc->coded_frame->pts != AV_NOPTS_VALUE)
1252 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1253 /*av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
1254 pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
1255 pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);*/
1257 if(enc->coded_frame->key_frame)
1258 pkt.flags |= AV_PKT_FLAG_KEY;
1259 write_frame(s, &pkt, ost->st->codec, ost->bitstream_filters);
1262 //fprintf(stderr,"\nFrame: %3d size: %5d type: %d",
1263 // enc->frame_number-1, ret, enc->pict_type);
1264 /* if two pass, output log */
1265 if (ost->logfile && enc->stats_out) {
1266 fprintf(ost->logfile, "%s", enc->stats_out);
1271 ost->frame_number++;
1275 static double psnr(double d){
1276 return -10.0*log(d)/log(10.0);
1279 static void do_video_stats(AVFormatContext *os, OutputStream *ost,
1282 AVCodecContext *enc;
1284 double ti1, bitrate, avg_bitrate;
1286 /* this is executed just the first time do_video_stats is called */
1288 vstats_file = fopen(vstats_filename, "w");
1295 enc = ost->st->codec;
1296 if (enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1297 frame_number = ost->frame_number;
1298 fprintf(vstats_file, "frame= %5d q= %2.1f ", frame_number, enc->coded_frame->quality/(float)FF_QP2LAMBDA);
1299 if (enc->flags&CODEC_FLAG_PSNR)
1300 fprintf(vstats_file, "PSNR= %6.2f ", psnr(enc->coded_frame->error[0]/(enc->width*enc->height*255.0*255.0)));
1302 fprintf(vstats_file,"f_size= %6d ", frame_size);
1303 /* compute pts value */
1304 ti1 = ost->sync_opts * av_q2d(enc->time_base);
1308 bitrate = (frame_size * 8) / av_q2d(enc->time_base) / 1000.0;
1309 avg_bitrate = (double)(video_size * 8) / ti1 / 1000.0;
1310 fprintf(vstats_file, "s_size= %8.0fkB time= %0.3f br= %7.1fkbits/s avg_br= %7.1fkbits/s ",
1311 (double)video_size / 1024, ti1, bitrate, avg_bitrate);
1312 fprintf(vstats_file, "type= %c\n", av_get_picture_type_char(enc->coded_frame->pict_type));
1316 static void print_report(OutputFile *output_files,
1317 OutputStream *ost_table, int nb_ostreams,
1318 int is_last_report, int64_t timer_start)
1322 AVFormatContext *oc;
1324 AVCodecContext *enc;
1325 int frame_number, vid, i;
1326 double bitrate, ti1, pts;
1327 static int64_t last_time = -1;
1328 static int qp_histogram[52];
1330 if (!print_stats && !is_last_report)
1333 if (!is_last_report) {
1335 /* display the report every 0.5 seconds */
1336 cur_time = av_gettime();
1337 if (last_time == -1) {
1338 last_time = cur_time;
1341 if ((cur_time - last_time) < 500000)
1343 last_time = cur_time;
1347 oc = output_files[0].ctx;
1349 total_size = avio_size(oc->pb);
1350 if(total_size<0) // FIXME improve avio_size() so it works with non seekable output too
1351 total_size= avio_tell(oc->pb);
1356 for(i=0;i<nb_ostreams;i++) {
1358 ost = &ost_table[i];
1359 enc = ost->st->codec;
1360 if (!ost->stream_copy && enc->coded_frame)
1361 q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
1362 if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1363 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "q=%2.1f ", q);
1365 if (!vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
1366 float t = (av_gettime()-timer_start) / 1000000.0;
1368 frame_number = ost->frame_number;
1369 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "frame=%5d fps=%3d q=%3.1f ",
1370 frame_number, (t>1)?(int)(frame_number/t+0.5) : 0, q);
1372 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "L");
1376 if(qp>=0 && qp<FF_ARRAY_ELEMS(qp_histogram))
1379 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%X", (int)lrintf(log(qp_histogram[j]+1)/log(2)));
1381 if (enc->flags&CODEC_FLAG_PSNR){
1383 double error, error_sum=0;
1384 double scale, scale_sum=0;
1385 char type[3]= {'Y','U','V'};
1386 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "PSNR=");
1389 error= enc->error[j];
1390 scale= enc->width*enc->height*255.0*255.0*frame_number;
1392 error= enc->coded_frame->error[j];
1393 scale= enc->width*enc->height*255.0*255.0;
1398 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "%c:%2.2f ", type[j], psnr(error/scale));
1400 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), "*:%2.2f ", psnr(error_sum/scale_sum));
1404 /* compute min output value */
1405 pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
1406 if ((pts < ti1) && (pts > 0))
1412 bitrate = (double)(total_size * 8) / ti1 / 1000.0;
1414 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
1415 "size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s",
1416 (double)total_size / 1024, ti1, bitrate);
1418 if (nb_frames_dup || nb_frames_drop)
1419 snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), " dup=%d drop=%d",
1420 nb_frames_dup, nb_frames_drop);
1422 av_log(NULL, AV_LOG_INFO, "%s \r", buf);
1426 if (is_last_report) {
1427 int64_t raw= audio_size + video_size + extra_size;
1428 av_log(NULL, AV_LOG_INFO, "\n");
1429 av_log(NULL, AV_LOG_INFO, "video:%1.0fkB audio:%1.0fkB global headers:%1.0fkB muxing overhead %f%%\n",
1433 100.0*(total_size - raw)/raw
1438 static void generate_silence(uint8_t* buf, enum AVSampleFormat sample_fmt, size_t size)
1440 int fill_char = 0x00;
1441 if (sample_fmt == AV_SAMPLE_FMT_U8)
1443 memset(buf, fill_char, size);
1446 static void flush_encoders(OutputStream *ost_table, int nb_ostreams)
1450 for (i = 0; i < nb_ostreams; i++) {
1451 OutputStream *ost = &ost_table[i];
1452 AVCodecContext *enc = ost->st->codec;
1453 AVFormatContext *os = output_files[ost->file_index].ctx;
1455 if (!ost->encoding_needed)
1458 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO && enc->frame_size <=1)
1460 if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && (os->oformat->flags & AVFMT_RAWPICTURE))
1466 av_init_packet(&pkt);
1467 pkt.stream_index= ost->index;
1469 switch (ost->st->codec->codec_type) {
1470 case AVMEDIA_TYPE_AUDIO:
1471 fifo_bytes = av_fifo_size(ost->fifo);
1473 /* encode any samples remaining in fifo */
1474 if (fifo_bytes > 0) {
1475 int osize = av_get_bytes_per_sample(enc->sample_fmt);
1476 int fs_tmp = enc->frame_size;
1478 av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
1479 if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
1480 enc->frame_size = fifo_bytes / (osize * enc->channels);
1482 int frame_bytes = enc->frame_size*osize*enc->channels;
1483 if (allocated_audio_buf_size < frame_bytes)
1485 generate_silence(audio_buf+fifo_bytes, enc->sample_fmt, frame_bytes - fifo_bytes);
1488 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, (short *)audio_buf);
1489 pkt.duration = av_rescale((int64_t)enc->frame_size*ost->st->time_base.den,
1490 ost->st->time_base.num, enc->sample_rate);
1491 enc->frame_size = fs_tmp;
1494 ret = avcodec_encode_audio(enc, bit_buffer, bit_buffer_size, NULL);
1497 av_log(NULL, AV_LOG_FATAL, "Audio encoding failed\n");
1501 pkt.flags |= AV_PKT_FLAG_KEY;
1503 case AVMEDIA_TYPE_VIDEO:
1504 ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, NULL);
1506 av_log(NULL, AV_LOG_FATAL, "Video encoding failed\n");
1510 if(enc->coded_frame && enc->coded_frame->key_frame)
1511 pkt.flags |= AV_PKT_FLAG_KEY;
1512 if (ost->logfile && enc->stats_out) {
1513 fprintf(ost->logfile, "%s", enc->stats_out);
1522 pkt.data = bit_buffer;
1524 if (enc->coded_frame && enc->coded_frame->pts != AV_NOPTS_VALUE)
1525 pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
1526 write_frame(os, &pkt, ost->st->codec, ost->bitstream_filters);
1532 * Check whether a packet from ist should be written into ost at this time
1534 static int check_output_constraints(InputStream *ist, OutputStream *ost)
1536 OutputFile *of = &output_files[ost->file_index];
1537 int ist_index = ist - input_streams;
1539 if (ost->source_index != ist_index)
1542 if (of->start_time && ist->pts < of->start_time)
1545 if (of->recording_time != INT64_MAX &&
1546 av_compare_ts(ist->pts, AV_TIME_BASE_Q, of->recording_time + of->start_time,
1547 (AVRational){1, 1000000}) >= 0) {
1548 ost->is_past_recording_time = 1;
1555 static void do_streamcopy(InputStream *ist, OutputStream *ost, const AVPacket *pkt)
1557 OutputFile *of = &output_files[ost->file_index];
1558 int64_t ost_tb_start_time = av_rescale_q(of->start_time, AV_TIME_BASE_Q, ost->st->time_base);
1561 av_init_packet(&opkt);
1563 if ((!ost->frame_number && !(pkt->flags & AV_PKT_FLAG_KEY)) &&
1564 !ost->copy_initial_nonkeyframes)
1567 /* force the input stream PTS */
1568 if (ost->st->codec->codec_type == AVMEDIA_TYPE_AUDIO)
1569 audio_size += pkt->size;
1570 else if (ost->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
1571 video_size += pkt->size;
1575 opkt.stream_index = ost->index;
1576 if (pkt->pts != AV_NOPTS_VALUE)
1577 opkt.pts = av_rescale_q(pkt->pts, ist->st->time_base, ost->st->time_base) - ost_tb_start_time;
1579 opkt.pts = AV_NOPTS_VALUE;
1581 if (pkt->dts == AV_NOPTS_VALUE)
1582 opkt.dts = av_rescale_q(ist->pts, AV_TIME_BASE_Q, ost->st->time_base);
1584 opkt.dts = av_rescale_q(pkt->dts, ist->st->time_base, ost->st->time_base);
1585 opkt.dts -= ost_tb_start_time;
1587 opkt.duration = av_rescale_q(pkt->duration, ist->st->time_base, ost->st->time_base);
1588 opkt.flags = pkt->flags;
1590 //FIXME remove the following 2 lines they shall be replaced by the bitstream filters
1591 if( ost->st->codec->codec_id != CODEC_ID_H264
1592 && ost->st->codec->codec_id != CODEC_ID_MPEG1VIDEO
1593 && ost->st->codec->codec_id != CODEC_ID_MPEG2VIDEO
1595 if (av_parser_change(ist->st->parser, ost->st->codec, &opkt.data, &opkt.size, pkt->data, pkt->size, pkt->flags & AV_PKT_FLAG_KEY))
1596 opkt.destruct = av_destruct_packet;
1598 opkt.data = pkt->data;
1599 opkt.size = pkt->size;
1602 write_frame(of->ctx, &opkt, ost->st->codec, ost->bitstream_filters);
1603 ost->st->codec->frame_number++;
1604 ost->frame_number++;
1605 av_free_packet(&opkt);
1608 static void rate_emu_sleep(InputStream *ist)
1610 if (input_files[ist->file_index].rate_emu) {
1611 int64_t pts = av_rescale(ist->pts, 1000000, AV_TIME_BASE);
1612 int64_t now = av_gettime() - ist->start;
1618 /* pkt = NULL means EOF (needed to flush decoder buffers) */
1619 static int output_packet(InputStream *ist, int ist_index,
1620 OutputStream *ost_table, int nb_ostreams,
1621 const AVPacket *pkt)
1623 AVFormatContext *os;
1627 void *buffer_to_free = NULL;
1628 static unsigned int samples_size= 0;
1629 AVSubtitle subtitle, *subtitle_to_free;
1630 int64_t pkt_pts = AV_NOPTS_VALUE;
1632 int frame_available;
1637 int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
1639 if(ist->next_pts == AV_NOPTS_VALUE)
1640 ist->next_pts= ist->pts;
1644 av_init_packet(&avpkt);
1652 if(pkt->dts != AV_NOPTS_VALUE)
1653 ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
1654 if(pkt->pts != AV_NOPTS_VALUE)
1655 pkt_pts = av_rescale_q(pkt->pts, ist->st->time_base, AV_TIME_BASE_Q);
1657 //while we have more to decode or while the decoder did output something on EOF
1658 while (ist->decoding_needed && (avpkt.size > 0 || (!pkt && got_output))) {
1659 uint8_t *decoded_data_buf;
1660 int decoded_data_size;
1661 AVFrame *decoded_frame, *filtered_frame;
1663 ist->pts= ist->next_pts;
1665 if(avpkt.size && avpkt.size != pkt->size)
1666 av_log(NULL, ist->showed_multi_packet_warning ? AV_LOG_VERBOSE : AV_LOG_WARNING,
1667 "Multiple frames in a packet from stream %d\n", pkt->stream_index);
1668 ist->showed_multi_packet_warning=1;
1670 /* decode the packet if needed */
1671 decoded_frame = filtered_frame = NULL;
1672 decoded_data_buf = NULL; /* fail safe */
1673 decoded_data_size= 0;
1674 subtitle_to_free = NULL;
1675 switch(ist->st->codec->codec_type) {
1676 case AVMEDIA_TYPE_AUDIO:{
1677 if(pkt && samples_size < FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE)) {
1678 samples_size = FFMAX(pkt->size * bps, AVCODEC_MAX_AUDIO_FRAME_SIZE);
1680 samples= av_malloc(samples_size);
1682 decoded_data_size= samples_size;
1683 /* XXX: could avoid copy if PCM 16 bits with same
1684 endianness as CPU */
1685 ret = avcodec_decode_audio3(ist->st->codec, samples, &decoded_data_size,
1691 got_output = decoded_data_size > 0;
1692 /* Some bug in mpeg audio decoder gives */
1693 /* decoded_data_size < 0, it seems they are overflows */
1695 /* no audio frame */
1698 decoded_data_buf = (uint8_t *)samples;
1699 ist->next_pts += ((int64_t)AV_TIME_BASE/bps * decoded_data_size) /
1700 (ist->st->codec->sample_rate * ist->st->codec->channels);
1702 case AVMEDIA_TYPE_VIDEO:
1703 if (!(decoded_frame = avcodec_alloc_frame()))
1704 return AVERROR(ENOMEM);
1705 avpkt.pts = pkt_pts;
1706 avpkt.dts = ist->pts;
1707 pkt_pts = AV_NOPTS_VALUE;
1709 ret = avcodec_decode_video2(ist->st->codec,
1710 decoded_frame, &got_output, &avpkt);
1711 quality = same_quant ? decoded_frame->quality : 0;
1715 /* no picture yet */
1716 av_freep(&decoded_frame);
1717 goto discard_packet;
1719 ist->next_pts = ist->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts,
1720 decoded_frame->pkt_dts);
1721 if (ist->st->codec->time_base.num != 0) {
1722 int ticks= ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1723 ist->next_pts += ((int64_t)AV_TIME_BASE *
1724 ist->st->codec->time_base.num * ticks) /
1725 ist->st->codec->time_base.den;
1728 buffer_to_free = NULL;
1729 pre_process_video_frame(ist, (AVPicture *)decoded_frame, &buffer_to_free);
1731 case AVMEDIA_TYPE_SUBTITLE:
1732 ret = avcodec_decode_subtitle2(ist->st->codec,
1733 &subtitle, &got_output, &avpkt);
1737 goto discard_packet;
1739 subtitle_to_free = &subtitle;
1746 // preprocess audio (volume)
1747 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
1748 if (audio_volume != 256) {
1749 switch (ist->st->codec->sample_fmt) {
1750 case AV_SAMPLE_FMT_U8:
1752 uint8_t *volp = samples;
1753 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1754 int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
1755 *volp++ = av_clip_uint8(v);
1759 case AV_SAMPLE_FMT_S16:
1761 int16_t *volp = samples;
1762 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1763 int v = ((*volp) * audio_volume + 128) >> 8;
1764 *volp++ = av_clip_int16(v);
1768 case AV_SAMPLE_FMT_S32:
1770 int32_t *volp = samples;
1771 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1772 int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
1773 *volp++ = av_clipl_int32(v);
1777 case AV_SAMPLE_FMT_FLT:
1779 float *volp = samples;
1780 float scale = audio_volume / 256.f;
1781 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1786 case AV_SAMPLE_FMT_DBL:
1788 double *volp = samples;
1789 double scale = audio_volume / 256.;
1790 for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
1796 av_log(NULL, AV_LOG_FATAL,
1797 "Audio volume adjustment on sample format %s is not supported.\n",
1798 av_get_sample_fmt_name(ist->st->codec->sample_fmt));
1804 /* frame rate emulation */
1805 rate_emu_sleep(ist);
1807 /* if output time reached then transcode raw format,
1808 encode packets and output them */
1809 for (i = 0; i < nb_ostreams; i++) {
1812 ost = &ost_table[i];
1814 if (!check_output_constraints(ist, ost) || !ost->encoding_needed)
1818 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
1819 ost->input_video_filter) {
1821 if (ist->st->sample_aspect_ratio.num)
1822 sar = ist->st->sample_aspect_ratio;
1824 sar = ist->st->codec->sample_aspect_ratio;
1825 av_vsrc_buffer_add_frame(ost->input_video_filter, decoded_frame, ist->pts, sar);
1826 if (!(filtered_frame = avcodec_alloc_frame())) {
1827 ret = AVERROR(ENOMEM);
1831 frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
1832 !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1833 while (frame_available) {
1834 AVRational ist_pts_tb;
1835 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
1836 get_filtered_video_frame(ost->output_video_filter, filtered_frame, &ost->picref, &ist_pts_tb);
1838 ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
1840 filtered_frame = decoded_frame;
1842 os = output_files[ost->file_index].ctx;
1844 /* set the input output pts pairs */
1845 //ost->sync_ipts = (double)(ist->pts + input_files[ist->file_index].ts_offset - start_time)/ AV_TIME_BASE;
1847 av_assert0(ist->decoding_needed);
1848 switch(ost->st->codec->codec_type) {
1849 case AVMEDIA_TYPE_AUDIO:
1850 do_audio_out(os, ost, ist, decoded_data_buf, decoded_data_size);
1852 case AVMEDIA_TYPE_VIDEO:
1854 if (ost->picref->video && !ost->frame_aspect_ratio)
1855 ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
1857 do_video_out(os, ost, ist, filtered_frame, &frame_size,
1858 same_quant ? quality : ost->st->codec->global_quality);
1859 if (vstats_filename && frame_size)
1860 do_video_stats(os, ost, frame_size);
1862 case AVMEDIA_TYPE_SUBTITLE:
1863 do_subtitle_out(os, ost, ist, &subtitle,
1870 frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
1871 ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
1873 avfilter_unref_buffer(ost->picref);
1875 av_freep(&filtered_frame);
1880 av_free(buffer_to_free);
1881 /* XXX: allocate the subtitles in the codec ? */
1882 if (subtitle_to_free) {
1883 avsubtitle_free(subtitle_to_free);
1884 subtitle_to_free = NULL;
1886 av_freep(&decoded_frame);
1892 /* handle stream copy */
1893 if (!ist->decoding_needed) {
1894 rate_emu_sleep(ist);
1895 switch (ist->st->codec->codec_type) {
1896 case AVMEDIA_TYPE_AUDIO:
1897 ist->next_pts += ((int64_t)AV_TIME_BASE * ist->st->codec->frame_size) /
1898 ist->st->codec->sample_rate;
1900 case AVMEDIA_TYPE_VIDEO:
1901 if (ist->st->codec->time_base.num != 0) {
1902 int ticks = ist->st->parser ? ist->st->parser->repeat_pict+1 : ist->st->codec->ticks_per_frame;
1903 ist->next_pts += ((int64_t)AV_TIME_BASE *
1904 ist->st->codec->time_base.num * ticks) /
1905 ist->st->codec->time_base.den;
1910 for (i = 0; pkt && i < nb_ostreams; i++) {
1911 ost = &ost_table[i];
1913 if (!check_output_constraints(ist, ost) || ost->encoding_needed)
1916 do_streamcopy(ist, ost, pkt);
1922 static void print_sdp(OutputFile *output_files, int n)
1926 AVFormatContext **avc = av_malloc(sizeof(*avc)*n);
1930 for (i = 0; i < n; i++)
1931 avc[i] = output_files[i].ctx;
1933 av_sdp_create(avc, n, sdp, sizeof(sdp));
1934 printf("SDP:\n%s\n", sdp);
1939 static int init_input_stream(int ist_index, OutputStream *output_streams, int nb_output_streams,
1940 char *error, int error_len)
1943 InputStream *ist = &input_streams[ist_index];
1944 if (ist->decoding_needed) {
1945 AVCodec *codec = ist->dec;
1947 snprintf(error, error_len, "Decoder (codec id %d) not found for input stream #%d:%d",
1948 ist->st->codec->codec_id, ist->file_index, ist->st->index);
1949 return AVERROR(EINVAL);
1952 /* update requested sample format for the decoder based on the
1953 corresponding encoder sample format */
1954 for (i = 0; i < nb_output_streams; i++) {
1955 OutputStream *ost = &output_streams[i];
1956 if (ost->source_index == ist_index) {
1957 update_sample_fmt(ist->st->codec, codec, ost->st->codec);
1962 if (avcodec_open2(ist->st->codec, codec, &ist->opts) < 0) {
1963 snprintf(error, error_len, "Error while opening decoder for input stream #%d:%d",
1964 ist->file_index, ist->st->index);
1965 return AVERROR(EINVAL);
1967 assert_codec_experimental(ist->st->codec, 0);
1968 assert_avoptions(ist->opts);
1971 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;
1972 ist->next_pts = AV_NOPTS_VALUE;
1973 init_pts_correction(&ist->pts_ctx);
1979 static int transcode_init(OutputFile *output_files,
1980 int nb_output_files,
1981 InputFile *input_files,
1984 int ret = 0, i, j, k;
1985 AVFormatContext *oc;
1986 AVCodecContext *codec, *icodec;
1992 /* init framerate emulation */
1993 for (i = 0; i < nb_input_files; i++) {
1994 InputFile *ifile = &input_files[i];
1995 if (ifile->rate_emu)
1996 for (j = 0; j < ifile->nb_streams; j++)
1997 input_streams[j + ifile->ist_index].start = av_gettime();
2000 /* output stream init */
2001 for (i = 0; i < nb_output_files; i++) {
2002 oc = output_files[i].ctx;
2003 if (!oc->nb_streams && !(oc->oformat->flags & AVFMT_NOSTREAMS)) {
2004 av_dump_format(oc, i, oc->filename, 1);
2005 av_log(NULL, AV_LOG_ERROR, "Output file #%d does not contain any stream\n", i);
2006 return AVERROR(EINVAL);
2010 /* for each output stream, we compute the right encoding parameters */
2011 for (i = 0; i < nb_output_streams; i++) {
2012 ost = &output_streams[i];
2013 oc = output_files[ost->file_index].ctx;
2014 ist = &input_streams[ost->source_index];
2016 if (ost->attachment_filename)
2019 codec = ost->st->codec;
2020 icodec = ist->st->codec;
2022 ost->st->disposition = ist->st->disposition;
2023 codec->bits_per_raw_sample = icodec->bits_per_raw_sample;
2024 codec->chroma_sample_location = icodec->chroma_sample_location;
2026 if (ost->stream_copy) {
2027 uint64_t extra_size = (uint64_t)icodec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE;
2029 if (extra_size > INT_MAX) {
2030 return AVERROR(EINVAL);
2033 /* if stream_copy is selected, no need to decode or encode */
2034 codec->codec_id = icodec->codec_id;
2035 codec->codec_type = icodec->codec_type;
2037 if (!codec->codec_tag) {
2038 if (!oc->oformat->codec_tag ||
2039 av_codec_get_id (oc->oformat->codec_tag, icodec->codec_tag) == codec->codec_id ||
2040 av_codec_get_tag(oc->oformat->codec_tag, icodec->codec_id) <= 0)
2041 codec->codec_tag = icodec->codec_tag;
2044 codec->bit_rate = icodec->bit_rate;
2045 codec->rc_max_rate = icodec->rc_max_rate;
2046 codec->rc_buffer_size = icodec->rc_buffer_size;
2047 codec->extradata = av_mallocz(extra_size);
2048 if (!codec->extradata) {
2049 return AVERROR(ENOMEM);
2051 memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
2052 codec->extradata_size = icodec->extradata_size;
2054 av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) &&
2055 av_q2d(ist->st->time_base) < 1.0/500) {
2056 codec->time_base = icodec->time_base;
2057 codec->time_base.num *= icodec->ticks_per_frame;
2058 av_reduce(&codec->time_base.num, &codec->time_base.den,
2059 codec->time_base.num, codec->time_base.den, INT_MAX);
2061 codec->time_base = ist->st->time_base;
2063 switch(codec->codec_type) {
2064 case AVMEDIA_TYPE_AUDIO:
2065 if(audio_volume != 256) {
2066 av_log(NULL, AV_LOG_FATAL, "-acodec copy and -vol are incompatible (frames are not decoded)\n");
2069 codec->channel_layout = icodec->channel_layout;
2070 codec->sample_rate = icodec->sample_rate;
2071 codec->channels = icodec->channels;
2072 codec->frame_size = icodec->frame_size;
2073 codec->audio_service_type = icodec->audio_service_type;
2074 codec->block_align = icodec->block_align;
2076 case AVMEDIA_TYPE_VIDEO:
2077 codec->pix_fmt = icodec->pix_fmt;
2078 codec->width = icodec->width;
2079 codec->height = icodec->height;
2080 codec->has_b_frames = icodec->has_b_frames;
2081 if (!codec->sample_aspect_ratio.num) {
2082 codec->sample_aspect_ratio =
2083 ost->st->sample_aspect_ratio =
2084 ist->st->sample_aspect_ratio.num ? ist->st->sample_aspect_ratio :
2085 ist->st->codec->sample_aspect_ratio.num ?
2086 ist->st->codec->sample_aspect_ratio : (AVRational){0, 1};
2089 case AVMEDIA_TYPE_SUBTITLE:
2090 codec->width = icodec->width;
2091 codec->height = icodec->height;
2093 case AVMEDIA_TYPE_DATA:
2094 case AVMEDIA_TYPE_ATTACHMENT:
2101 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
2103 ist->decoding_needed = 1;
2104 ost->encoding_needed = 1;
2106 switch(codec->codec_type) {
2107 case AVMEDIA_TYPE_AUDIO:
2108 ost->fifo = av_fifo_alloc(1024);
2110 return AVERROR(ENOMEM);
2112 ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
2114 if (!codec->sample_rate)
2115 codec->sample_rate = icodec->sample_rate;
2116 choose_sample_rate(ost->st, ost->enc);
2117 codec->time_base = (AVRational){1, codec->sample_rate};
2119 if (codec->sample_fmt == AV_SAMPLE_FMT_NONE)
2120 codec->sample_fmt = icodec->sample_fmt;
2121 choose_sample_fmt(ost->st, ost->enc);
2123 if (!codec->channels)
2124 codec->channels = icodec->channels;
2125 codec->channel_layout = icodec->channel_layout;
2126 if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
2127 codec->channel_layout = 0;
2129 ost->audio_resample = codec-> sample_rate != icodec->sample_rate || audio_sync_method > 1;
2130 icodec->request_channels = codec-> channels;
2131 ost->resample_sample_fmt = icodec->sample_fmt;
2132 ost->resample_sample_rate = icodec->sample_rate;
2133 ost->resample_channels = icodec->channels;
2135 case AVMEDIA_TYPE_VIDEO:
2136 if (codec->pix_fmt == PIX_FMT_NONE)
2137 codec->pix_fmt = icodec->pix_fmt;
2138 choose_pixel_fmt(ost->st, ost->enc);
2140 if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
2141 av_log(NULL, AV_LOG_FATAL, "Video pixel format is unknown, stream cannot be encoded\n");
2145 if (!codec->width || !codec->height) {
2146 codec->width = icodec->width;
2147 codec->height = icodec->height;
2150 ost->video_resample = codec->width != icodec->width ||
2151 codec->height != icodec->height ||
2152 codec->pix_fmt != icodec->pix_fmt;
2153 if (ost->video_resample) {
2154 #if !CONFIG_AVFILTER
2155 avcodec_get_frame_defaults(&ost->pict_tmp);
2156 if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
2157 codec->width, codec->height)) {
2158 av_log(NULL, AV_LOG_FATAL, "Cannot allocate temp picture, check pix fmt\n");
2161 ost->img_resample_ctx = sws_getContext(
2168 ost->sws_flags, NULL, NULL, NULL);
2169 if (ost->img_resample_ctx == NULL) {
2170 av_log(NULL, AV_LOG_FATAL, "Cannot get resampling context\n");
2174 codec->bits_per_raw_sample= 0;
2177 ost->resample_height = icodec->height;
2178 ost->resample_width = icodec->width;
2179 ost->resample_pix_fmt = icodec->pix_fmt;
2181 if (!ost->frame_rate.num)
2182 ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
2183 if (ost->enc && ost->enc->supported_framerates && !ost->force_fps) {
2184 int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
2185 ost->frame_rate = ost->enc->supported_framerates[idx];
2187 codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
2190 if (configure_video_filters(ist, ost)) {
2191 av_log(NULL, AV_LOG_FATAL, "Error opening filters!\n");
2196 case AVMEDIA_TYPE_SUBTITLE:
2203 if ((codec->flags & (CODEC_FLAG_PASS1 | CODEC_FLAG_PASS2))) {
2204 char logfilename[1024];
2207 snprintf(logfilename, sizeof(logfilename), "%s-%d.log",
2208 pass_logfilename_prefix ? pass_logfilename_prefix : DEFAULT_PASS_LOGFILENAME_PREFIX,
2210 if (codec->flags & CODEC_FLAG_PASS1) {
2211 f = fopen(logfilename, "wb");
2213 av_log(NULL, AV_LOG_FATAL, "Cannot write log file '%s' for pass-1 encoding: %s\n",
2214 logfilename, strerror(errno));
2220 size_t logbuffer_size;
2221 if (cmdutils_read_file(logfilename, &logbuffer, &logbuffer_size) < 0) {
2222 av_log(NULL, AV_LOG_FATAL, "Error reading log file '%s' for pass-2 encoding\n",
2226 codec->stats_in = logbuffer;
2230 if(codec->codec_type == AVMEDIA_TYPE_VIDEO){
2231 int size = codec->width * codec->height;
2232 bit_buffer_size = FFMAX(bit_buffer_size, 6*size + 200);
2237 bit_buffer = av_malloc(bit_buffer_size);
2239 av_log(NULL, AV_LOG_ERROR, "Cannot allocate %d bytes output buffer\n",
2241 return AVERROR(ENOMEM);
2244 /* open each encoder */
2245 for (i = 0; i < nb_output_streams; i++) {
2246 ost = &output_streams[i];
2247 if (ost->encoding_needed) {
2248 AVCodec *codec = ost->enc;
2249 AVCodecContext *dec = input_streams[ost->source_index].st->codec;
2251 snprintf(error, sizeof(error), "Encoder (codec id %d) not found for output stream #%d:%d",
2252 ost->st->codec->codec_id, ost->file_index, ost->index);
2253 ret = AVERROR(EINVAL);
2256 if (dec->subtitle_header) {
2257 ost->st->codec->subtitle_header = av_malloc(dec->subtitle_header_size);
2258 if (!ost->st->codec->subtitle_header) {
2259 ret = AVERROR(ENOMEM);
2262 memcpy(ost->st->codec->subtitle_header, dec->subtitle_header, dec->subtitle_header_size);
2263 ost->st->codec->subtitle_header_size = dec->subtitle_header_size;
2265 if (avcodec_open2(ost->st->codec, codec, &ost->opts) < 0) {
2266 snprintf(error, sizeof(error), "Error while opening encoder for output stream #%d:%d - maybe incorrect parameters such as bit_rate, rate, width or height",
2267 ost->file_index, ost->index);
2268 ret = AVERROR(EINVAL);
2271 assert_codec_experimental(ost->st->codec, 1);
2272 assert_avoptions(ost->opts);
2273 if (ost->st->codec->bit_rate && ost->st->codec->bit_rate < 1000)
2274 av_log(NULL, AV_LOG_WARNING, "The bitrate parameter is set too low."
2275 "It takes bits/s as argument, not kbits/s\n");
2276 extra_size += ost->st->codec->extradata_size;
2278 if (ost->st->codec->me_threshold)
2279 input_streams[ost->source_index].st->codec->debug |= FF_DEBUG_MV;
2283 /* init input streams */
2284 for (i = 0; i < nb_input_streams; i++)
2285 if ((ret = init_input_stream(i, output_streams, nb_output_streams, error, sizeof(error))) < 0)
2288 /* discard unused programs */
2289 for (i = 0; i < nb_input_files; i++) {
2290 InputFile *ifile = &input_files[i];
2291 for (j = 0; j < ifile->ctx->nb_programs; j++) {
2292 AVProgram *p = ifile->ctx->programs[j];
2293 int discard = AVDISCARD_ALL;
2295 for (k = 0; k < p->nb_stream_indexes; k++)
2296 if (!input_streams[ifile->ist_index + p->stream_index[k]].discard) {
2297 discard = AVDISCARD_DEFAULT;
2300 p->discard = discard;
2304 /* open files and write file headers */
2305 for (i = 0; i < nb_output_files; i++) {
2306 oc = output_files[i].ctx;
2307 oc->interrupt_callback = int_cb;
2308 if (avformat_write_header(oc, &output_files[i].opts) < 0) {
2309 snprintf(error, sizeof(error), "Could not write header for output file #%d (incorrect codec parameters ?)", i);
2310 ret = AVERROR(EINVAL);
2313 assert_avoptions(output_files[i].opts);
2314 if (strcmp(oc->oformat->name, "rtp")) {
2320 /* dump the file output parameters - cannot be done before in case
2322 for (i = 0; i < nb_output_files; i++) {
2323 av_dump_format(output_files[i].ctx, i, output_files[i].ctx->filename, 1);
2326 /* dump the stream mapping */
2327 av_log(NULL, AV_LOG_INFO, "Stream mapping:\n");
2328 for (i = 0; i < nb_output_streams; i++) {
2329 ost = &output_streams[i];
2331 if (ost->attachment_filename) {
2332 /* an attached file */
2333 av_log(NULL, AV_LOG_INFO, " File %s -> Stream #%d:%d\n",
2334 ost->attachment_filename, ost->file_index, ost->index);
2337 av_log(NULL, AV_LOG_INFO, " Stream #%d:%d -> #%d:%d",
2338 input_streams[ost->source_index].file_index,
2339 input_streams[ost->source_index].st->index,
2342 if (ost->sync_ist != &input_streams[ost->source_index])
2343 av_log(NULL, AV_LOG_INFO, " [sync #%d:%d]",
2344 ost->sync_ist->file_index,
2345 ost->sync_ist->st->index);
2346 if (ost->stream_copy)
2347 av_log(NULL, AV_LOG_INFO, " (copy)");
2349 av_log(NULL, AV_LOG_INFO, " (%s -> %s)", input_streams[ost->source_index].dec ?
2350 input_streams[ost->source_index].dec->name : "?",
2351 ost->enc ? ost->enc->name : "?");
2352 av_log(NULL, AV_LOG_INFO, "\n");
2356 av_log(NULL, AV_LOG_ERROR, "%s\n", error);
2361 print_sdp(output_files, nb_output_files);
2368 * The following code is the main loop of the file converter
2370 static int transcode(OutputFile *output_files,
2371 int nb_output_files,
2372 InputFile *input_files,
2376 AVFormatContext *is, *os;
2380 int no_packet_count=0;
2381 int64_t timer_start;
2383 if (!(no_packet = av_mallocz(nb_input_files)))
2386 ret = transcode_init(output_files, nb_output_files, input_files, nb_input_files);
2390 av_log(NULL, AV_LOG_INFO, "Press ctrl-c to stop encoding\n");
2393 timer_start = av_gettime();
2395 for(; received_sigterm == 0;) {
2396 int file_index, ist_index;
2401 ipts_min = INT64_MAX;
2404 /* select the stream that we must read now by looking at the
2405 smallest output pts */
2407 for (i = 0; i < nb_output_streams; i++) {
2411 ost = &output_streams[i];
2412 of = &output_files[ost->file_index];
2413 os = output_files[ost->file_index].ctx;
2414 ist = &input_streams[ost->source_index];
2415 if (ost->is_past_recording_time || no_packet[ist->file_index] ||
2416 (os->pb && avio_tell(os->pb) >= of->limit_filesize))
2418 opts = ost->st->pts.val * av_q2d(ost->st->time_base);
2420 if (!input_files[ist->file_index].eof_reached){
2421 if(ipts < ipts_min) {
2423 if(input_sync ) file_index = ist->file_index;
2425 if(opts < opts_min) {
2427 if(!input_sync) file_index = ist->file_index;
2430 if (ost->frame_number >= ost->max_frames) {
2432 for (j = 0; j < of->ctx->nb_streams; j++)
2433 output_streams[of->ost_index + j].is_past_recording_time = 1;
2437 /* if none, if is finished */
2438 if (file_index < 0) {
2439 if(no_packet_count){
2441 memset(no_packet, 0, nb_input_files);
2448 /* read a frame from it and output it in the fifo */
2449 is = input_files[file_index].ctx;
2450 ret= av_read_frame(is, &pkt);
2451 if(ret == AVERROR(EAGAIN)){
2452 no_packet[file_index]=1;
2457 input_files[file_index].eof_reached = 1;
2465 memset(no_packet, 0, nb_input_files);
2468 av_pkt_dump_log2(NULL, AV_LOG_DEBUG, &pkt, do_hex_dump,
2469 is->streams[pkt.stream_index]);
2471 /* the following test is needed in case new streams appear
2472 dynamically in stream : we ignore them */
2473 if (pkt.stream_index >= input_files[file_index].nb_streams)
2474 goto discard_packet;
2475 ist_index = input_files[file_index].ist_index + pkt.stream_index;
2476 ist = &input_streams[ist_index];
2478 goto discard_packet;
2480 if (pkt.dts != AV_NOPTS_VALUE)
2481 pkt.dts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2482 if (pkt.pts != AV_NOPTS_VALUE)
2483 pkt.pts += av_rescale_q(input_files[ist->file_index].ts_offset, AV_TIME_BASE_Q, ist->st->time_base);
2485 if(pkt.pts != AV_NOPTS_VALUE)
2486 pkt.pts *= ist->ts_scale;
2487 if(pkt.dts != AV_NOPTS_VALUE)
2488 pkt.dts *= ist->ts_scale;
2490 // 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);
2491 if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE
2492 && (is->iformat->flags & AVFMT_TS_DISCONT)) {
2493 int64_t pkt_dts= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q);
2494 int64_t delta= pkt_dts - ist->next_pts;
2495 if((FFABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE || pkt_dts+1<ist->pts)&& !copy_ts){
2496 input_files[ist->file_index].ts_offset -= delta;
2497 av_log(NULL, AV_LOG_DEBUG, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n",
2498 delta, input_files[ist->file_index].ts_offset);
2499 pkt.dts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2500 if(pkt.pts != AV_NOPTS_VALUE)
2501 pkt.pts-= av_rescale_q(delta, AV_TIME_BASE_Q, ist->st->time_base);
2505 //fprintf(stderr,"read #%d.%d size=%d\n", ist->file_index, ist->st->index, pkt.size);
2506 if (output_packet(ist, ist_index, output_streams, nb_output_streams, &pkt) < 0) {
2508 av_log(NULL, AV_LOG_ERROR, "Error while decoding stream #%d:%d\n",
2509 ist->file_index, ist->st->index);
2512 av_free_packet(&pkt);
2517 av_free_packet(&pkt);
2519 /* dump report by using the output first video and audio streams */
2520 print_report(output_files, output_streams, nb_output_streams, 0, timer_start);
2523 /* at the end of stream, we must flush the decoder buffers */
2524 for (i = 0; i < nb_input_streams; i++) {
2525 ist = &input_streams[i];
2526 if (ist->decoding_needed) {
2527 output_packet(ist, i, output_streams, nb_output_streams, NULL);
2530 flush_encoders(output_streams, nb_output_streams);
2534 /* write the trailer if needed and close file */
2535 for(i=0;i<nb_output_files;i++) {
2536 os = output_files[i].ctx;
2537 av_write_trailer(os);
2540 /* dump report by using the first video and audio streams */
2541 print_report(output_files, output_streams, nb_output_streams, 1, timer_start);
2543 /* close each encoder */
2544 for (i = 0; i < nb_output_streams; i++) {
2545 ost = &output_streams[i];
2546 if (ost->encoding_needed) {
2547 av_freep(&ost->st->codec->stats_in);
2548 avcodec_close(ost->st->codec);
2551 avfilter_graph_free(&ost->graph);
2555 /* close each decoder */
2556 for (i = 0; i < nb_input_streams; i++) {
2557 ist = &input_streams[i];
2558 if (ist->decoding_needed) {
2559 avcodec_close(ist->st->codec);
2567 av_freep(&bit_buffer);
2568 av_freep(&no_packet);
2570 if (output_streams) {
2571 for (i = 0; i < nb_output_streams; i++) {
2572 ost = &output_streams[i];
2574 if (ost->stream_copy)
2575 av_freep(&ost->st->codec->extradata);
2577 fclose(ost->logfile);
2578 ost->logfile = NULL;
2580 av_fifo_free(ost->fifo); /* works even if fifo is not
2581 initialized but set to zero */
2582 av_freep(&ost->st->codec->subtitle_header);
2583 av_free(ost->pict_tmp.data[0]);
2584 av_free(ost->forced_kf_pts);
2585 if (ost->video_resample)
2586 sws_freeContext(ost->img_resample_ctx);
2588 audio_resample_close(ost->resample);
2589 if (ost->reformat_ctx)
2590 av_audio_convert_free(ost->reformat_ctx);
2591 av_dict_free(&ost->opts);
2598 static double parse_frame_aspect_ratio(const char *arg)
2605 p = strchr(arg, ':');
2607 x = strtol(arg, &end, 10);
2609 y = strtol(end+1, &end, 10);
2611 ar = (double)x / (double)y;
2613 ar = strtod(arg, NULL);
2616 av_log(NULL, AV_LOG_FATAL, "Incorrect aspect ratio specification.\n");
2622 static int opt_audio_codec(OptionsContext *o, const char *opt, const char *arg)
2624 return parse_option(o, "codec:a", arg, options);
2627 static int opt_video_codec(OptionsContext *o, const char *opt, const char *arg)
2629 return parse_option(o, "codec:v", arg, options);
2632 static int opt_subtitle_codec(OptionsContext *o, const char *opt, const char *arg)
2634 return parse_option(o, "codec:s", arg, options);
2637 static int opt_data_codec(OptionsContext *o, const char *opt, const char *arg)
2639 return parse_option(o, "codec:d", arg, options);
2642 static int opt_map(OptionsContext *o, const char *opt, const char *arg)
2644 StreamMap *m = NULL;
2645 int i, negative = 0, file_idx;
2646 int sync_file_idx = -1, sync_stream_idx;
2654 map = av_strdup(arg);
2656 /* parse sync stream first, just pick first matching stream */
2657 if (sync = strchr(map, ',')) {
2659 sync_file_idx = strtol(sync + 1, &sync, 0);
2660 if (sync_file_idx >= nb_input_files || sync_file_idx < 0) {
2661 av_log(NULL, AV_LOG_FATAL, "Invalid sync file index: %d.\n", sync_file_idx);
2666 for (i = 0; i < input_files[sync_file_idx].nb_streams; i++)
2667 if (check_stream_specifier(input_files[sync_file_idx].ctx,
2668 input_files[sync_file_idx].ctx->streams[i], sync) == 1) {
2669 sync_stream_idx = i;
2672 if (i == input_files[sync_file_idx].nb_streams) {
2673 av_log(NULL, AV_LOG_FATAL, "Sync stream specification in map %s does not "
2674 "match any streams.\n", arg);
2680 file_idx = strtol(map, &p, 0);
2681 if (file_idx >= nb_input_files || file_idx < 0) {
2682 av_log(NULL, AV_LOG_FATAL, "Invalid input file index: %d.\n", file_idx);
2686 /* disable some already defined maps */
2687 for (i = 0; i < o->nb_stream_maps; i++) {
2688 m = &o->stream_maps[i];
2689 if (file_idx == m->file_index &&
2690 check_stream_specifier(input_files[m->file_index].ctx,
2691 input_files[m->file_index].ctx->streams[m->stream_index],
2692 *p == ':' ? p + 1 : p) > 0)
2696 for (i = 0; i < input_files[file_idx].nb_streams; i++) {
2697 if (check_stream_specifier(input_files[file_idx].ctx, input_files[file_idx].ctx->streams[i],
2698 *p == ':' ? p + 1 : p) <= 0)
2700 o->stream_maps = grow_array(o->stream_maps, sizeof(*o->stream_maps),
2701 &o->nb_stream_maps, o->nb_stream_maps + 1);
2702 m = &o->stream_maps[o->nb_stream_maps - 1];
2704 m->file_index = file_idx;
2705 m->stream_index = i;
2707 if (sync_file_idx >= 0) {
2708 m->sync_file_index = sync_file_idx;
2709 m->sync_stream_index = sync_stream_idx;
2711 m->sync_file_index = file_idx;
2712 m->sync_stream_index = i;
2717 av_log(NULL, AV_LOG_FATAL, "Stream map '%s' matches no streams.\n", arg);
2725 static int opt_attach(OptionsContext *o, const char *opt, const char *arg)
2727 o->attachments = grow_array(o->attachments, sizeof(*o->attachments),
2728 &o->nb_attachments, o->nb_attachments + 1);
2729 o->attachments[o->nb_attachments - 1] = arg;
2733 static void parse_meta_type(char *arg, char *type, int *index)
2743 if (*(++arg) == ':')
2744 *index = strtol(++arg, NULL, 0);
2747 av_log(NULL, AV_LOG_FATAL, "Invalid metadata type %c.\n", *arg);
2754 static int opt_map_metadata(OptionsContext *o, const char *opt, const char *arg)
2756 MetadataMap *m, *m1;
2759 o->meta_data_maps = grow_array(o->meta_data_maps, sizeof(*o->meta_data_maps),
2760 &o->nb_meta_data_maps, o->nb_meta_data_maps + 1);
2762 m = &o->meta_data_maps[o->nb_meta_data_maps - 1][1];
2763 m->file = strtol(arg, &p, 0);
2764 parse_meta_type(*p ? p + 1 : p, &m->type, &m->index);
2766 m1 = &o->meta_data_maps[o->nb_meta_data_maps - 1][0];
2767 if (p = strchr(opt, ':'))
2768 parse_meta_type(p + 1, &m1->type, &m1->index);
2772 if (m->type == 'g' || m1->type == 'g')
2773 o->metadata_global_manual = 1;
2774 if (m->type == 's' || m1->type == 's')
2775 o->metadata_streams_manual = 1;
2776 if (m->type == 'c' || m1->type == 'c')
2777 o->metadata_chapters_manual = 1;
2782 static AVCodec *find_codec_or_die(const char *name, enum AVMediaType type, int encoder)
2784 const char *codec_string = encoder ? "encoder" : "decoder";
2788 avcodec_find_encoder_by_name(name) :
2789 avcodec_find_decoder_by_name(name);
2791 av_log(NULL, AV_LOG_FATAL, "Unknown %s '%s'\n", codec_string, name);
2794 if(codec->type != type) {
2795 av_log(NULL, AV_LOG_FATAL, "Invalid %s type '%s'\n", codec_string, name);
2801 static AVCodec *choose_decoder(OptionsContext *o, AVFormatContext *s, AVStream *st)
2803 char *codec_name = NULL;
2805 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, st);
2807 AVCodec *codec = find_codec_or_die(codec_name, st->codec->codec_type, 0);
2808 st->codec->codec_id = codec->id;
2811 return avcodec_find_decoder(st->codec->codec_id);
2815 * Add all the streams from the given input file to the global
2816 * list of input streams.
2818 static void add_input_streams(OptionsContext *o, AVFormatContext *ic)
2820 int i, rfps, rfps_base;
2822 for (i = 0; i < ic->nb_streams; i++) {
2823 AVStream *st = ic->streams[i];
2824 AVCodecContext *dec = st->codec;
2827 input_streams = grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
2828 ist = &input_streams[nb_input_streams - 1];
2830 ist->file_index = nb_input_files;
2832 ist->opts = filter_codec_opts(codec_opts, ist->st->codec->codec_id, ic, st);
2834 ist->ts_scale = 1.0;
2835 MATCH_PER_STREAM_OPT(ts_scale, dbl, ist->ts_scale, ic, st);
2837 ist->dec = choose_decoder(o, ic, st);
2839 switch (dec->codec_type) {
2840 case AVMEDIA_TYPE_AUDIO:
2841 if (o->audio_disable)
2842 st->discard= AVDISCARD_ALL;
2844 case AVMEDIA_TYPE_VIDEO:
2845 rfps = ic->streams[i]->r_frame_rate.num;
2846 rfps_base = ic->streams[i]->r_frame_rate.den;
2848 dec->flags |= CODEC_FLAG_EMU_EDGE;
2849 dec->height >>= dec->lowres;
2850 dec->width >>= dec->lowres;
2853 if (dec->time_base.den != rfps*dec->ticks_per_frame || dec->time_base.num != rfps_base) {
2855 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",
2856 i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
2857 (float)rfps / rfps_base, rfps, rfps_base);
2860 if (o->video_disable)
2861 st->discard= AVDISCARD_ALL;
2862 else if(video_discard)
2863 st->discard= video_discard;
2865 case AVMEDIA_TYPE_DATA:
2867 case AVMEDIA_TYPE_SUBTITLE:
2868 if (o->subtitle_disable)
2869 st->discard = AVDISCARD_ALL;
2871 case AVMEDIA_TYPE_ATTACHMENT:
2872 case AVMEDIA_TYPE_UNKNOWN:
2880 static void assert_file_overwrite(const char *filename)
2882 if (!file_overwrite &&
2883 (strchr(filename, ':') == NULL || filename[1] == ':' ||
2884 av_strstart(filename, "file:", NULL))) {
2885 if (avio_check(filename, 0) == 0) {
2887 fprintf(stderr,"File '%s' already exists. Overwrite ? [y/N] ", filename);
2889 if (!read_yesno()) {
2890 fprintf(stderr, "Not overwriting - exiting\n");
2895 fprintf(stderr,"File '%s' already exists. Exiting.\n", filename);
2902 static void dump_attachment(AVStream *st, const char *filename)
2905 AVIOContext *out = NULL;
2906 AVDictionaryEntry *e;
2908 if (!st->codec->extradata_size) {
2909 av_log(NULL, AV_LOG_WARNING, "No extradata to dump in stream #%d:%d.\n",
2910 nb_input_files - 1, st->index);
2913 if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0)))
2914 filename = e->value;
2916 av_log(NULL, AV_LOG_FATAL, "No filename specified and no 'filename' tag"
2917 "in stream #%d:%d.\n", nb_input_files - 1, st->index);
2921 assert_file_overwrite(filename);
2923 if ((ret = avio_open2(&out, filename, AVIO_FLAG_WRITE, &int_cb, NULL)) < 0) {
2924 av_log(NULL, AV_LOG_FATAL, "Could not open file %s for writing.\n",
2929 avio_write(out, st->codec->extradata, st->codec->extradata_size);
2934 static int opt_input_file(OptionsContext *o, const char *opt, const char *filename)
2936 AVFormatContext *ic;
2937 AVInputFormat *file_iformat = NULL;
2941 AVDictionary **opts;
2942 int orig_nb_streams; // number of streams before avformat_find_stream_info
2945 if (!(file_iformat = av_find_input_format(o->format))) {
2946 av_log(NULL, AV_LOG_FATAL, "Unknown input format: '%s'\n", o->format);
2951 if (!strcmp(filename, "-"))
2954 using_stdin |= !strncmp(filename, "pipe:", 5) ||
2955 !strcmp(filename, "/dev/stdin");
2957 /* get default parameters from command line */
2958 ic = avformat_alloc_context();
2960 print_error(filename, AVERROR(ENOMEM));
2963 if (o->nb_audio_sample_rate) {
2964 snprintf(buf, sizeof(buf), "%d", o->audio_sample_rate[o->nb_audio_sample_rate - 1].u.i);
2965 av_dict_set(&format_opts, "sample_rate", buf, 0);
2967 if (o->nb_audio_channels) {
2968 snprintf(buf, sizeof(buf), "%d", o->audio_channels[o->nb_audio_channels - 1].u.i);
2969 av_dict_set(&format_opts, "channels", buf, 0);
2971 if (o->nb_frame_rates) {
2972 av_dict_set(&format_opts, "framerate", o->frame_rates[o->nb_frame_rates - 1].u.str, 0);
2974 if (o->nb_frame_sizes) {
2975 av_dict_set(&format_opts, "video_size", o->frame_sizes[o->nb_frame_sizes - 1].u.str, 0);
2977 if (o->nb_frame_pix_fmts)
2978 av_dict_set(&format_opts, "pixel_format", o->frame_pix_fmts[o->nb_frame_pix_fmts - 1].u.str, 0);
2980 ic->flags |= AVFMT_FLAG_NONBLOCK;
2981 ic->interrupt_callback = int_cb;
2983 /* open the input file with generic libav function */
2984 err = avformat_open_input(&ic, filename, file_iformat, &format_opts);
2986 print_error(filename, err);
2989 assert_avoptions(format_opts);
2991 /* apply forced codec ids */
2992 for (i = 0; i < ic->nb_streams; i++)
2993 choose_decoder(o, ic, ic->streams[i]);
2995 /* Set AVCodecContext options for avformat_find_stream_info */
2996 opts = setup_find_stream_info_opts(ic, codec_opts);
2997 orig_nb_streams = ic->nb_streams;
2999 /* If not enough info to get the stream parameters, we decode the
3000 first frames to get it. (used in mpeg case for example) */
3001 ret = avformat_find_stream_info(ic, opts);
3003 av_log(NULL, AV_LOG_FATAL, "%s: could not find codec parameters\n", filename);
3004 av_close_input_file(ic);
3008 timestamp = o->start_time;
3009 /* add the stream start time */
3010 if (ic->start_time != AV_NOPTS_VALUE)
3011 timestamp += ic->start_time;
3013 /* if seeking requested, we execute it */
3014 if (o->start_time != 0) {
3015 ret = av_seek_frame(ic, -1, timestamp, AVSEEK_FLAG_BACKWARD);
3017 av_log(NULL, AV_LOG_WARNING, "%s: could not seek to position %0.3f\n",
3018 filename, (double)timestamp / AV_TIME_BASE);
3022 /* update the current parameters so that they match the one of the input stream */
3023 add_input_streams(o, ic);
3025 /* dump the file content */
3026 av_dump_format(ic, nb_input_files, filename, 0);
3028 input_files = grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
3029 input_files[nb_input_files - 1].ctx = ic;
3030 input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
3031 input_files[nb_input_files - 1].ts_offset = o->input_ts_offset - (copy_ts ? 0 : timestamp);
3032 input_files[nb_input_files - 1].nb_streams = ic->nb_streams;
3033 input_files[nb_input_files - 1].rate_emu = o->rate_emu;
3035 for (i = 0; i < o->nb_dump_attachment; i++) {
3038 for (j = 0; j < ic->nb_streams; j++) {
3039 AVStream *st = ic->streams[j];
3041 if (check_stream_specifier(ic, st, o->dump_attachment[i].specifier) == 1)
3042 dump_attachment(st, o->dump_attachment[i].u.str);
3046 for (i = 0; i < orig_nb_streams; i++)
3047 av_dict_free(&opts[i]);
3054 static void parse_forced_key_frames(char *kf, OutputStream *ost,
3055 AVCodecContext *avctx)
3061 for (p = kf; *p; p++)
3064 ost->forced_kf_count = n;
3065 ost->forced_kf_pts = av_malloc(sizeof(*ost->forced_kf_pts) * n);
3066 if (!ost->forced_kf_pts) {
3067 av_log(NULL, AV_LOG_FATAL, "Could not allocate forced key frames array.\n");
3070 for (i = 0; i < n; i++) {
3071 p = i ? strchr(p, ',') + 1 : kf;
3072 t = parse_time_or_die("force_key_frames", p, 1);
3073 ost->forced_kf_pts[i] = av_rescale_q(t, AV_TIME_BASE_Q, avctx->time_base);
3077 static uint8_t *get_line(AVIOContext *s)
3083 if (avio_open_dyn_buf(&line) < 0) {
3084 av_log(NULL, AV_LOG_FATAL, "Could not alloc buffer for reading preset.\n");
3088 while ((c = avio_r8(s)) && c != '\n')
3091 avio_close_dyn_buf(line, &buf);
3096 static int get_preset_file_2(const char *preset_name, const char *codec_name, AVIOContext **s)
3099 char filename[1000];
3100 const char *base[3] = { getenv("AVCONV_DATADIR"),
3105 for (i = 0; i < FF_ARRAY_ELEMS(base) && ret; i++) {
3109 snprintf(filename, sizeof(filename), "%s%s/%s-%s.avpreset", base[i],
3110 i != 1 ? "" : "/.avconv", codec_name, preset_name);
3111 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3114 snprintf(filename, sizeof(filename), "%s%s/%s.avpreset", base[i],
3115 i != 1 ? "" : "/.avconv", preset_name);
3116 ret = avio_open2(s, filename, AVIO_FLAG_READ, &int_cb, NULL);
3122 static void choose_encoder(OptionsContext *o, AVFormatContext *s, OutputStream *ost)
3124 char *codec_name = NULL;
3126 MATCH_PER_STREAM_OPT(codec_names, str, codec_name, s, ost->st);
3128 ost->st->codec->codec_id = av_guess_codec(s->oformat, NULL, s->filename,
3129 NULL, ost->st->codec->codec_type);
3130 ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
3131 } else if (!strcmp(codec_name, "copy"))
3132 ost->stream_copy = 1;
3134 ost->enc = find_codec_or_die(codec_name, ost->st->codec->codec_type, 1);
3135 ost->st->codec->codec_id = ost->enc->id;
3139 static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, enum AVMediaType type)
3142 AVStream *st = avformat_new_stream(oc, NULL);
3143 int idx = oc->nb_streams - 1, ret = 0;
3144 char *bsf = NULL, *next, *codec_tag = NULL;
3145 AVBitStreamFilterContext *bsfc, *bsfc_prev = NULL;
3147 char *buf = NULL, *arg = NULL, *preset = NULL;
3148 AVIOContext *s = NULL;
3151 av_log(NULL, AV_LOG_FATAL, "Could not alloc stream.\n");
3155 if (oc->nb_streams - 1 < o->nb_streamid_map)
3156 st->id = o->streamid_map[oc->nb_streams - 1];
3158 output_streams = grow_array(output_streams, sizeof(*output_streams), &nb_output_streams,
3159 nb_output_streams + 1);
3160 ost = &output_streams[nb_output_streams - 1];
3161 ost->file_index = nb_output_files;
3164 st->codec->codec_type = type;
3165 choose_encoder(o, oc, ost);
3167 ost->opts = filter_codec_opts(codec_opts, ost->enc->id, oc, st);
3170 avcodec_get_context_defaults3(st->codec, ost->enc);
3171 st->codec->codec_type = type; // XXX hack, avcodec_get_context_defaults2() sets type to unknown for stream copy
3173 MATCH_PER_STREAM_OPT(presets, str, preset, oc, st);
3174 if (preset && (!(ret = get_preset_file_2(preset, ost->enc->name, &s)))) {
3177 if (!buf[0] || buf[0] == '#') {
3181 if (!(arg = strchr(buf, '='))) {
3182 av_log(NULL, AV_LOG_FATAL, "Invalid line found in the preset file.\n");
3186 av_dict_set(&ost->opts, buf, arg, AV_DICT_DONT_OVERWRITE);
3188 } while (!s->eof_reached);
3192 av_log(NULL, AV_LOG_FATAL,
3193 "Preset %s specified for stream %d:%d, but could not be opened.\n",
3194 preset, ost->file_index, ost->index);
3198 ost->max_frames = INT64_MAX;
3199 MATCH_PER_STREAM_OPT(max_frames, i64, ost->max_frames, oc, st);
3201 MATCH_PER_STREAM_OPT(bitstream_filters, str, bsf, oc, st);
3203 if (next = strchr(bsf, ','))
3205 if (!(bsfc = av_bitstream_filter_init(bsf))) {
3206 av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf);
3210 bsfc_prev->next = bsfc;
3212 ost->bitstream_filters = bsfc;
3218 MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st);
3220 uint32_t tag = strtol(codec_tag, &next, 0);
3222 tag = AV_RL32(codec_tag);
3223 st->codec->codec_tag = tag;
3226 MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st);
3227 if (qscale >= 0 || same_quant) {
3228 st->codec->flags |= CODEC_FLAG_QSCALE;
3229 st->codec->global_quality = FF_QP2LAMBDA * qscale;
3232 if (oc->oformat->flags & AVFMT_GLOBALHEADER)
3233 st->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
3235 av_opt_get_int(sws_opts, "sws_flags", 0, &ost->sws_flags);
3239 static void parse_matrix_coeffs(uint16_t *dest, const char *str)
3242 const char *p = str;
3249 av_log(NULL, AV_LOG_FATAL, "Syntax error in matrix \"%s\" at coeff %d\n", str, i);
3256 static OutputStream *new_video_stream(OptionsContext *o, AVFormatContext *oc)
3260 AVCodecContext *video_enc;
3262 ost = new_output_stream(o, oc, AVMEDIA_TYPE_VIDEO);
3264 video_enc = st->codec;
3266 if (!ost->stream_copy) {
3267 const char *p = NULL;
3268 char *forced_key_frames = NULL, *frame_rate = NULL, *frame_size = NULL;
3269 char *frame_aspect_ratio = NULL, *frame_pix_fmt = NULL;
3270 char *intra_matrix = NULL, *inter_matrix = NULL, *filters = NULL;
3273 MATCH_PER_STREAM_OPT(frame_rates, str, frame_rate, oc, st);
3274 if (frame_rate && av_parse_video_rate(&ost->frame_rate, frame_rate) < 0) {
3275 av_log(NULL, AV_LOG_FATAL, "Invalid framerate value: %s\n", frame_rate);
3279 MATCH_PER_STREAM_OPT(frame_sizes, str, frame_size, oc, st);
3280 if (frame_size && av_parse_video_size(&video_enc->width, &video_enc->height, frame_size) < 0) {
3281 av_log(NULL, AV_LOG_FATAL, "Invalid frame size: %s.\n", frame_size);
3285 MATCH_PER_STREAM_OPT(frame_aspect_ratios, str, frame_aspect_ratio, oc, st);
3286 if (frame_aspect_ratio)
3287 ost->frame_aspect_ratio = parse_frame_aspect_ratio(frame_aspect_ratio);
3289 MATCH_PER_STREAM_OPT(frame_pix_fmts, str, frame_pix_fmt, oc, st);
3290 if (frame_pix_fmt && (video_enc->pix_fmt = av_get_pix_fmt(frame_pix_fmt)) == PIX_FMT_NONE) {
3291 av_log(NULL, AV_LOG_FATAL, "Unknown pixel format requested: %s.\n", frame_pix_fmt);
3294 st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
3296 MATCH_PER_STREAM_OPT(intra_matrices, str, intra_matrix, oc, st);
3298 if (!(video_enc->intra_matrix = av_mallocz(sizeof(*video_enc->intra_matrix) * 64))) {
3299 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for intra matrix.\n");
3302 parse_matrix_coeffs(video_enc->intra_matrix, intra_matrix);
3304 MATCH_PER_STREAM_OPT(inter_matrices, str, inter_matrix, oc, st);
3306 if (!(video_enc->inter_matrix = av_mallocz(sizeof(*video_enc->inter_matrix) * 64))) {
3307 av_log(NULL, AV_LOG_FATAL, "Could not allocate memory for inter matrix.\n");
3310 parse_matrix_coeffs(video_enc->inter_matrix, inter_matrix);
3313 MATCH_PER_STREAM_OPT(rc_overrides, str, p, oc, st);
3316 int e=sscanf(p, "%d,%d,%d", &start, &end, &q);
3318 av_log(NULL, AV_LOG_FATAL, "error parsing rc_override\n");
3321 video_enc->rc_override=
3322 av_realloc(video_enc->rc_override,
3323 sizeof(RcOverride)*(i+1));
3324 video_enc->rc_override[i].start_frame= start;
3325 video_enc->rc_override[i].end_frame = end;
3327 video_enc->rc_override[i].qscale= q;
3328 video_enc->rc_override[i].quality_factor= 1.0;
3331 video_enc->rc_override[i].qscale= 0;
3332 video_enc->rc_override[i].quality_factor= -q/100.0;
3337 video_enc->rc_override_count=i;
3338 if (!video_enc->rc_initial_buffer_occupancy)
3339 video_enc->rc_initial_buffer_occupancy = video_enc->rc_buffer_size*3/4;
3340 video_enc->intra_dc_precision= intra_dc_precision - 8;
3345 video_enc->flags |= CODEC_FLAG_PASS1;
3347 video_enc->flags |= CODEC_FLAG_PASS2;
3351 MATCH_PER_STREAM_OPT(forced_key_frames, str, forced_key_frames, oc, st);
3352 if (forced_key_frames)
3353 parse_forced_key_frames(forced_key_frames, ost, video_enc);
3355 MATCH_PER_STREAM_OPT(force_fps, i, ost->force_fps, oc, st);
3357 ost->top_field_first = -1;
3358 MATCH_PER_STREAM_OPT(top_field_first, i, ost->top_field_first, oc, st);
3360 MATCH_PER_STREAM_OPT(copy_initial_nonkeyframes, i, ost->copy_initial_nonkeyframes, oc ,st);
3363 MATCH_PER_STREAM_OPT(filters, str, filters, oc, st);
3365 ost->avfilter = av_strdup(filters);
3372 static OutputStream *new_audio_stream(OptionsContext *o, AVFormatContext *oc)
3376 AVCodecContext *audio_enc;
3378 ost = new_output_stream(o, oc, AVMEDIA_TYPE_AUDIO);
3381 audio_enc = st->codec;
3382 audio_enc->codec_type = AVMEDIA_TYPE_AUDIO;
3384 if (!ost->stream_copy) {
3385 char *sample_fmt = NULL;
3387 MATCH_PER_STREAM_OPT(audio_channels, i, audio_enc->channels, oc, st);
3389 MATCH_PER_STREAM_OPT(sample_fmts, str, sample_fmt, oc, st);
3391 (audio_enc->sample_fmt = av_get_sample_fmt(sample_fmt)) == AV_SAMPLE_FMT_NONE) {
3392 av_log(NULL, AV_LOG_FATAL, "Invalid sample format '%s'\n", sample_fmt);
3396 MATCH_PER_STREAM_OPT(audio_sample_rate, i, audio_enc->sample_rate, oc, st);
3402 static OutputStream *new_data_stream(OptionsContext *o, AVFormatContext *oc)
3406 ost = new_output_stream(o, oc, AVMEDIA_TYPE_DATA);
3407 if (!ost->stream_copy) {
3408 av_log(NULL, AV_LOG_FATAL, "Data stream encoding not supported yet (only streamcopy)\n");
3415 static OutputStream *new_attachment_stream(OptionsContext *o, AVFormatContext *oc)
3417 OutputStream *ost = new_output_stream(o, oc, AVMEDIA_TYPE_ATTACHMENT);
3418 ost->stream_copy = 1;
3422 static OutputStream *new_subtitle_stream(OptionsContext *o, AVFormatContext *oc)
3426 AVCodecContext *subtitle_enc;
3428 ost = new_output_stream(o, oc, AVMEDIA_TYPE_SUBTITLE);
3430 subtitle_enc = st->codec;
3432 subtitle_enc->codec_type = AVMEDIA_TYPE_SUBTITLE;
3437 /* arg format is "output-stream-index:streamid-value". */
3438 static int opt_streamid(OptionsContext *o, const char *opt, const char *arg)
3444 av_strlcpy(idx_str, arg, sizeof(idx_str));
3445 p = strchr(idx_str, ':');
3447 av_log(NULL, AV_LOG_FATAL,
3448 "Invalid value '%s' for option '%s', required syntax is 'index:value'\n",
3453 idx = parse_number_or_die(opt, idx_str, OPT_INT, 0, INT_MAX);
3454 o->streamid_map = grow_array(o->streamid_map, sizeof(*o->streamid_map), &o->nb_streamid_map, idx+1);
3455 o->streamid_map[idx] = parse_number_or_die(opt, p, OPT_INT, 0, INT_MAX);
3459 static int copy_chapters(InputFile *ifile, OutputFile *ofile, int copy_metadata)
3461 AVFormatContext *is = ifile->ctx;
3462 AVFormatContext *os = ofile->ctx;
3465 for (i = 0; i < is->nb_chapters; i++) {
3466 AVChapter *in_ch = is->chapters[i], *out_ch;
3467 int64_t ts_off = av_rescale_q(ofile->start_time - ifile->ts_offset,
3468 AV_TIME_BASE_Q, in_ch->time_base);
3469 int64_t rt = (ofile->recording_time == INT64_MAX) ? INT64_MAX :
3470 av_rescale_q(ofile->recording_time, AV_TIME_BASE_Q, in_ch->time_base);
3473 if (in_ch->end < ts_off)
3475 if (rt != INT64_MAX && in_ch->start > rt + ts_off)
3478 out_ch = av_mallocz(sizeof(AVChapter));
3480 return AVERROR(ENOMEM);
3482 out_ch->id = in_ch->id;
3483 out_ch->time_base = in_ch->time_base;
3484 out_ch->start = FFMAX(0, in_ch->start - ts_off);
3485 out_ch->end = FFMIN(rt, in_ch->end - ts_off);
3488 av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
3491 os->chapters = av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
3493 return AVERROR(ENOMEM);
3494 os->chapters[os->nb_chapters - 1] = out_ch;
3499 static int read_avserver_streams(OptionsContext *o, AVFormatContext *s, const char *filename)
3502 AVFormatContext *ic = avformat_alloc_context();
3504 ic->interrupt_callback = int_cb;
3505 err = avformat_open_input(&ic, filename, NULL, NULL);
3508 /* copy stream format */
3509 for(i=0;i<ic->nb_streams;i++) {
3514 codec = avcodec_find_encoder(ic->streams[i]->codec->codec_id);
3515 ost = new_output_stream(o, s, codec->type);
3518 // FIXME: a more elegant solution is needed
3519 memcpy(st, ic->streams[i], sizeof(AVStream));
3521 avcodec_copy_context(st->codec, ic->streams[i]->codec);
3523 if (st->codec->codec_type == AVMEDIA_TYPE_AUDIO && !ost->stream_copy)
3524 choose_sample_fmt(st, codec);
3525 else if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO && !ost->stream_copy)
3526 choose_pixel_fmt(st, codec);
3529 av_close_input_file(ic);
3533 static void opt_output_file(void *optctx, const char *filename)
3535 OptionsContext *o = optctx;
3536 AVFormatContext *oc;
3538 AVOutputFormat *file_oformat;
3542 if (!strcmp(filename, "-"))
3545 oc = avformat_alloc_context();
3547 print_error(filename, AVERROR(ENOMEM));
3552 file_oformat = av_guess_format(o->format, NULL, NULL);
3553 if (!file_oformat) {
3554 av_log(NULL, AV_LOG_FATAL, "Requested output format '%s' is not a suitable output format\n", o->format);
3558 file_oformat = av_guess_format(NULL, filename, NULL);
3559 if (!file_oformat) {
3560 av_log(NULL, AV_LOG_FATAL, "Unable to find a suitable output format for '%s'\n",
3566 oc->oformat = file_oformat;
3567 oc->interrupt_callback = int_cb;
3568 av_strlcpy(oc->filename, filename, sizeof(oc->filename));
3570 if (!strcmp(file_oformat->name, "ffm") &&
3571 av_strstart(filename, "http:", NULL)) {
3572 /* special case for files sent to avserver: we get the stream
3573 parameters from avserver */
3574 int err = read_avserver_streams(o, oc, filename);
3576 print_error(filename, err);
3579 } else if (!o->nb_stream_maps) {
3580 /* pick the "best" stream of each type */
3581 #define NEW_STREAM(type, index)\
3583 ost = new_ ## type ## _stream(o, oc);\
3584 ost->source_index = index;\
3585 ost->sync_ist = &input_streams[index];\
3586 input_streams[index].discard = 0;\
3589 /* video: highest resolution */
3590 if (!o->video_disable && oc->oformat->video_codec != CODEC_ID_NONE) {
3591 int area = 0, idx = -1;
3592 for (i = 0; i < nb_input_streams; i++) {
3593 ist = &input_streams[i];
3594 if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
3595 ist->st->codec->width * ist->st->codec->height > area) {
3596 area = ist->st->codec->width * ist->st->codec->height;
3600 NEW_STREAM(video, idx);
3603 /* audio: most channels */
3604 if (!o->audio_disable && oc->oformat->audio_codec != CODEC_ID_NONE) {
3605 int channels = 0, idx = -1;
3606 for (i = 0; i < nb_input_streams; i++) {
3607 ist = &input_streams[i];
3608 if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO &&
3609 ist->st->codec->channels > channels) {
3610 channels = ist->st->codec->channels;
3614 NEW_STREAM(audio, idx);
3617 /* subtitles: pick first */
3618 if (!o->subtitle_disable && oc->oformat->subtitle_codec != CODEC_ID_NONE) {
3619 for (i = 0; i < nb_input_streams; i++)
3620 if (input_streams[i].st->codec->codec_type == AVMEDIA_TYPE_SUBTITLE) {
3621 NEW_STREAM(subtitle, i);
3625 /* do something with data? */
3627 for (i = 0; i < o->nb_stream_maps; i++) {
3628 StreamMap *map = &o->stream_maps[i];
3633 ist = &input_streams[input_files[map->file_index].ist_index + map->stream_index];
3634 switch (ist->st->codec->codec_type) {
3635 case AVMEDIA_TYPE_VIDEO: ost = new_video_stream(o, oc); break;
3636 case AVMEDIA_TYPE_AUDIO: ost = new_audio_stream(o, oc); break;
3637 case AVMEDIA_TYPE_SUBTITLE: ost = new_subtitle_stream(o, oc); break;
3638 case AVMEDIA_TYPE_DATA: ost = new_data_stream(o, oc); break;
3639 case AVMEDIA_TYPE_ATTACHMENT: ost = new_attachment_stream(o, oc); break;
3641 av_log(NULL, AV_LOG_FATAL, "Cannot map stream #%d:%d - unsupported type.\n",
3642 map->file_index, map->stream_index);
3646 ost->source_index = input_files[map->file_index].ist_index + map->stream_index;
3647 ost->sync_ist = &input_streams[input_files[map->sync_file_index].ist_index +
3648 map->sync_stream_index];
3653 /* handle attached files */
3654 for (i = 0; i < o->nb_attachments; i++) {
3656 uint8_t *attachment;
3660 if ((err = avio_open2(&pb, o->attachments[i], AVIO_FLAG_READ, &int_cb, NULL)) < 0) {
3661 av_log(NULL, AV_LOG_FATAL, "Could not open attachment file %s.\n",
3665 if ((len = avio_size(pb)) <= 0) {
3666 av_log(NULL, AV_LOG_FATAL, "Could not get size of the attachment %s.\n",
3670 if (!(attachment = av_malloc(len))) {
3671 av_log(NULL, AV_LOG_FATAL, "Attachment %s too large to fit into memory.\n",
3675 avio_read(pb, attachment, len);
3677 ost = new_attachment_stream(o, oc);
3678 ost->stream_copy = 0;
3679 ost->source_index = -1;
3680 ost->attachment_filename = o->attachments[i];
3681 ost->st->codec->extradata = attachment;
3682 ost->st->codec->extradata_size = len;
3684 p = strrchr(o->attachments[i], '/');
3685 av_dict_set(&ost->st->metadata, "filename", (p && *p) ? p + 1 : o->attachments[i], AV_DICT_DONT_OVERWRITE);
3689 output_files = grow_array(output_files, sizeof(*output_files), &nb_output_files, nb_output_files + 1);
3690 output_files[nb_output_files - 1].ctx = oc;
3691 output_files[nb_output_files - 1].ost_index = nb_output_streams - oc->nb_streams;
3692 output_files[nb_output_files - 1].recording_time = o->recording_time;
3693 output_files[nb_output_files - 1].start_time = o->start_time;
3694 output_files[nb_output_files - 1].limit_filesize = o->limit_filesize;
3695 av_dict_copy(&output_files[nb_output_files - 1].opts, format_opts, 0);
3697 /* check filename in case of an image number is expected */
3698 if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
3699 if (!av_filename_number_test(oc->filename)) {
3700 print_error(oc->filename, AVERROR(EINVAL));
3705 if (!(oc->oformat->flags & AVFMT_NOFILE)) {
3706 /* test if it already exists to avoid loosing precious files */
3707 assert_file_overwrite(filename);
3710 if ((err = avio_open2(&oc->pb, filename, AVIO_FLAG_WRITE,
3711 &oc->interrupt_callback,
3712 &output_files[nb_output_files - 1].opts)) < 0) {
3713 print_error(filename, err);
3718 if (o->mux_preload) {
3720 snprintf(buf, sizeof(buf), "%d", (int)(o->mux_preload*AV_TIME_BASE));
3721 av_dict_set(&output_files[nb_output_files - 1].opts, "preload", buf, 0);
3723 oc->max_delay = (int)(o->mux_max_delay * AV_TIME_BASE);
3724 oc->flags |= AVFMT_FLAG_NONBLOCK;
3727 if (o->chapters_input_file >= nb_input_files) {
3728 if (o->chapters_input_file == INT_MAX) {
3729 /* copy chapters from the first input file that has them*/
3730 o->chapters_input_file = -1;
3731 for (i = 0; i < nb_input_files; i++)
3732 if (input_files[i].ctx->nb_chapters) {
3733 o->chapters_input_file = i;
3737 av_log(NULL, AV_LOG_FATAL, "Invalid input file index %d in chapter mapping.\n",
3738 o->chapters_input_file);
3742 if (o->chapters_input_file >= 0)
3743 copy_chapters(&input_files[o->chapters_input_file], &output_files[nb_output_files - 1],
3744 !o->metadata_chapters_manual);
3747 for (i = 0; i < o->nb_meta_data_maps; i++) {
3748 AVFormatContext *files[2];
3749 AVDictionary **meta[2];
3752 #define METADATA_CHECK_INDEX(index, nb_elems, desc)\
3753 if ((index) < 0 || (index) >= (nb_elems)) {\
3754 av_log(NULL, AV_LOG_FATAL, "Invalid %s index %d while processing metadata maps\n",\
3759 int in_file_index = o->meta_data_maps[i][1].file;
3760 if (in_file_index < 0)
3762 METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
3765 files[1] = input_files[in_file_index].ctx;
3767 for (j = 0; j < 2; j++) {
3768 MetadataMap *map = &o->meta_data_maps[i][j];
3770 switch (map->type) {
3772 meta[j] = &files[j]->metadata;
3775 METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
3776 meta[j] = &files[j]->streams[map->index]->metadata;
3779 METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
3780 meta[j] = &files[j]->chapters[map->index]->metadata;
3783 METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
3784 meta[j] = &files[j]->programs[map->index]->metadata;
3789 av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
3792 /* copy global metadata by default */
3793 if (!o->metadata_global_manual && nb_input_files)
3794 av_dict_copy(&oc->metadata, input_files[0].ctx->metadata,
3795 AV_DICT_DONT_OVERWRITE);
3796 if (!o->metadata_streams_manual)
3797 for (i = output_files[nb_output_files - 1].ost_index; i < nb_output_streams; i++) {
3799 if (output_streams[i].source_index < 0) /* this is true e.g. for attached files */
3801 ist = &input_streams[output_streams[i].source_index];
3802 av_dict_copy(&output_streams[i].st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
3805 /* process manually set metadata */
3806 for (i = 0; i < o->nb_metadata; i++) {
3811 val = strchr(o->metadata[i].u.str, '=');
3813 av_log(NULL, AV_LOG_FATAL, "No '=' character in metadata string %s.\n",
3814 o->metadata[i].u.str);
3819 parse_meta_type(o->metadata[i].specifier, &type, &index);
3825 if (index < 0 || index >= oc->nb_streams) {
3826 av_log(NULL, AV_LOG_FATAL, "Invalid stream index %d in metadata specifier.\n", index);
3829 m = &oc->streams[index]->metadata;
3832 if (index < 0 || index >= oc->nb_chapters) {
3833 av_log(NULL, AV_LOG_FATAL, "Invalid chapter index %d in metadata specifier.\n", index);
3836 m = &oc->chapters[index]->metadata;
3839 av_log(NULL, AV_LOG_FATAL, "Invalid metadata specifier %s.\n", o->metadata[i].specifier);
3843 av_dict_set(m, o->metadata[i].u.str, *val ? val : NULL, 0);
3849 /* same option as mencoder */
3850 static int opt_pass(const char *opt, const char *arg)
3852 do_pass = parse_number_or_die(opt, arg, OPT_INT, 1, 2);
3856 static int64_t getutime(void)
3859 struct rusage rusage;
3861 getrusage(RUSAGE_SELF, &rusage);
3862 return (rusage.ru_utime.tv_sec * 1000000LL) + rusage.ru_utime.tv_usec;
3863 #elif HAVE_GETPROCESSTIMES
3865 FILETIME c, e, k, u;
3866 proc = GetCurrentProcess();
3867 GetProcessTimes(proc, &c, &e, &k, &u);
3868 return ((int64_t) u.dwHighDateTime << 32 | u.dwLowDateTime) / 10;
3870 return av_gettime();
3874 static int64_t getmaxrss(void)
3876 #if HAVE_GETRUSAGE && HAVE_STRUCT_RUSAGE_RU_MAXRSS
3877 struct rusage rusage;
3878 getrusage(RUSAGE_SELF, &rusage);
3879 return (int64_t)rusage.ru_maxrss * 1024;
3880 #elif HAVE_GETPROCESSMEMORYINFO
3882 PROCESS_MEMORY_COUNTERS memcounters;
3883 proc = GetCurrentProcess();
3884 memcounters.cb = sizeof(memcounters);
3885 GetProcessMemoryInfo(proc, &memcounters, sizeof(memcounters));
3886 return memcounters.PeakPagefileUsage;
3892 static int opt_audio_qscale(OptionsContext *o, const char *opt, const char *arg)
3894 return parse_option(o, "q:a", arg, options);
3897 static void show_usage(void)
3899 printf("Hyper fast Audio and Video encoder\n");
3900 printf("usage: %s [options] [[infile options] -i infile]... {[outfile options] outfile}...\n", program_name);
3904 static void show_help(void)
3906 int flags = AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_ENCODING_PARAM;
3907 av_log_set_callback(log_callback_help);
3909 show_help_options(options, "Main options:\n",
3910 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB, 0);
3911 show_help_options(options, "\nAdvanced options:\n",
3912 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_SUBTITLE | OPT_GRAB,
3914 show_help_options(options, "\nVideo options:\n",
3915 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3917 show_help_options(options, "\nAdvanced Video options:\n",
3918 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3919 OPT_VIDEO | OPT_EXPERT);
3920 show_help_options(options, "\nAudio options:\n",
3921 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3923 show_help_options(options, "\nAdvanced Audio options:\n",
3924 OPT_EXPERT | OPT_AUDIO | OPT_VIDEO | OPT_GRAB,
3925 OPT_AUDIO | OPT_EXPERT);
3926 show_help_options(options, "\nSubtitle options:\n",
3927 OPT_SUBTITLE | OPT_GRAB,
3929 show_help_options(options, "\nAudio/Video grab options:\n",
3933 show_help_children(avcodec_get_class(), flags);
3934 show_help_children(avformat_get_class(), flags);
3935 show_help_children(sws_get_class(), flags);
3938 static int opt_target(OptionsContext *o, const char *opt, const char *arg)
3940 enum { PAL, NTSC, FILM, UNKNOWN } norm = UNKNOWN;
3941 static const char *const frame_rates[] = {"25", "30000/1001", "24000/1001"};
3943 if(!strncmp(arg, "pal-", 4)) {
3946 } else if(!strncmp(arg, "ntsc-", 5)) {
3949 } else if(!strncmp(arg, "film-", 5)) {
3953 /* Try to determine PAL/NTSC by peeking in the input files */
3954 if(nb_input_files) {
3956 for (j = 0; j < nb_input_files; j++) {
3957 for (i = 0; i < input_files[j].nb_streams; i++) {
3958 AVCodecContext *c = input_files[j].ctx->streams[i]->codec;
3959 if(c->codec_type != AVMEDIA_TYPE_VIDEO)
3961 fr = c->time_base.den * 1000 / c->time_base.num;
3965 } else if((fr == 29970) || (fr == 23976)) {
3974 if (norm != UNKNOWN)
3975 av_log(NULL, AV_LOG_INFO, "Assuming %s for target.\n", norm == PAL ? "PAL" : "NTSC");
3978 if(norm == UNKNOWN) {
3979 av_log(NULL, AV_LOG_FATAL, "Could not determine norm (PAL/NTSC/NTSC-Film) for target.\n");
3980 av_log(NULL, AV_LOG_FATAL, "Please prefix target with \"pal-\", \"ntsc-\" or \"film-\",\n");
3981 av_log(NULL, AV_LOG_FATAL, "or set a framerate with \"-r xxx\".\n");
3985 if(!strcmp(arg, "vcd")) {
3986 opt_video_codec(o, "c:v", "mpeg1video");
3987 opt_audio_codec(o, "c:a", "mp2");
3988 parse_option(o, "f", "vcd", options);
3990 parse_option(o, "s", norm == PAL ? "352x288" : "352x240", options);
3991 parse_option(o, "r", frame_rates[norm], options);
3992 opt_default("g", norm == PAL ? "15" : "18");
3994 opt_default("b", "1150000");
3995 opt_default("maxrate", "1150000");
3996 opt_default("minrate", "1150000");
3997 opt_default("bufsize", "327680"); // 40*1024*8;
3999 opt_default("b:a", "224000");
4000 parse_option(o, "ar", "44100", options);
4001 parse_option(o, "ac", "2", options);
4003 opt_default("packetsize", "2324");
4004 opt_default("muxrate", "1411200"); // 2352 * 75 * 8;
4006 /* We have to offset the PTS, so that it is consistent with the SCR.
4007 SCR starts at 36000, but the first two packs contain only padding
4008 and the first pack from the other stream, respectively, may also have
4009 been written before.
4010 So the real data starts at SCR 36000+3*1200. */
4011 o->mux_preload = (36000+3*1200) / 90000.0; //0.44
4012 } else if(!strcmp(arg, "svcd")) {
4014 opt_video_codec(o, "c:v", "mpeg2video");
4015 opt_audio_codec(o, "c:a", "mp2");
4016 parse_option(o, "f", "svcd", options);
4018 parse_option(o, "s", norm == PAL ? "480x576" : "480x480", options);
4019 parse_option(o, "r", frame_rates[norm], options);
4020 opt_default("g", norm == PAL ? "15" : "18");
4022 opt_default("b", "2040000");
4023 opt_default("maxrate", "2516000");
4024 opt_default("minrate", "0"); //1145000;
4025 opt_default("bufsize", "1835008"); //224*1024*8;
4026 opt_default("flags", "+scan_offset");
4029 opt_default("b:a", "224000");
4030 parse_option(o, "ar", "44100", options);
4032 opt_default("packetsize", "2324");
4034 } else if(!strcmp(arg, "dvd")) {
4036 opt_video_codec(o, "c:v", "mpeg2video");
4037 opt_audio_codec(o, "c:a", "ac3");
4038 parse_option(o, "f", "dvd", options);
4040 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4041 parse_option(o, "r", frame_rates[norm], options);
4042 opt_default("g", norm == PAL ? "15" : "18");
4044 opt_default("b", "6000000");
4045 opt_default("maxrate", "9000000");
4046 opt_default("minrate", "0"); //1500000;
4047 opt_default("bufsize", "1835008"); //224*1024*8;
4049 opt_default("packetsize", "2048"); // from www.mpucoder.com: DVD sectors contain 2048 bytes of data, this is also the size of one pack.
4050 opt_default("muxrate", "10080000"); // from mplex project: data_rate = 1260000. mux_rate = data_rate * 8
4052 opt_default("b:a", "448000");
4053 parse_option(o, "ar", "48000", options);
4055 } else if(!strncmp(arg, "dv", 2)) {
4057 parse_option(o, "f", "dv", options);
4059 parse_option(o, "s", norm == PAL ? "720x576" : "720x480", options);
4060 parse_option(o, "pix_fmt", !strncmp(arg, "dv50", 4) ? "yuv422p" :
4061 norm == PAL ? "yuv420p" : "yuv411p", options);
4062 parse_option(o, "r", frame_rates[norm], options);
4064 parse_option(o, "ar", "48000", options);
4065 parse_option(o, "ac", "2", options);
4068 av_log(NULL, AV_LOG_ERROR, "Unknown target: %s\n", arg);
4069 return AVERROR(EINVAL);
4074 static int opt_vstats_file(const char *opt, const char *arg)
4076 av_free (vstats_filename);
4077 vstats_filename=av_strdup (arg);
4081 static int opt_vstats(const char *opt, const char *arg)
4084 time_t today2 = time(NULL);
4085 struct tm *today = localtime(&today2);
4087 snprintf(filename, sizeof(filename), "vstats_%02d%02d%02d.log", today->tm_hour, today->tm_min,
4089 return opt_vstats_file(opt, filename);
4092 static int opt_video_frames(OptionsContext *o, const char *opt, const char *arg)
4094 return parse_option(o, "frames:v", arg, options);
4097 static int opt_audio_frames(OptionsContext *o, const char *opt, const char *arg)
4099 return parse_option(o, "frames:a", arg, options);
4102 static int opt_data_frames(OptionsContext *o, const char *opt, const char *arg)
4104 return parse_option(o, "frames:d", arg, options);
4107 static int opt_video_tag(OptionsContext *o, const char *opt, const char *arg)
4109 return parse_option(o, "tag:v", arg, options);
4112 static int opt_audio_tag(OptionsContext *o, const char *opt, const char *arg)
4114 return parse_option(o, "tag:a", arg, options);
4117 static int opt_subtitle_tag(OptionsContext *o, const char *opt, const char *arg)
4119 return parse_option(o, "tag:s", arg, options);
4122 static int opt_video_filters(OptionsContext *o, const char *opt, const char *arg)
4124 return parse_option(o, "filter:v", arg, options);
4127 #define OFFSET(x) offsetof(OptionsContext, x)
4128 static const OptionDef options[] = {
4130 #include "cmdutils_common_opts.h"
4131 { "f", HAS_ARG | OPT_STRING | OPT_OFFSET, {.off = OFFSET(format)}, "force format", "fmt" },
4132 { "i", HAS_ARG | OPT_FUNC2, {(void*)opt_input_file}, "input file name", "filename" },
4133 { "y", OPT_BOOL, {(void*)&file_overwrite}, "overwrite output files" },
4134 { "c", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4135 { "codec", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(codec_names)}, "codec name", "codec" },
4136 { "pre", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(presets)}, "preset name", "preset" },
4137 { "map", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map}, "set input stream mapping", "file.stream[:syncfile.syncstream]" },
4138 { "map_metadata", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_map_metadata}, "set metadata information of outfile from infile",
4139 "outfile[,metadata]:infile[,metadata]" },
4140 { "map_chapters", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(chapters_input_file)}, "set chapters mapping", "input_file_index" },
4141 { "t", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(recording_time)}, "record or transcode \"duration\" seconds of audio/video", "duration" },
4142 { "fs", HAS_ARG | OPT_INT64 | OPT_OFFSET, {.off = OFFSET(limit_filesize)}, "set the limit file size in bytes", "limit_size" }, //
4143 { "ss", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(start_time)}, "set the start time offset", "time_off" },
4144 { "itsoffset", HAS_ARG | OPT_TIME | OPT_OFFSET, {.off = OFFSET(input_ts_offset)}, "set the input ts offset", "time_off" },
4145 { "itsscale", HAS_ARG | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(ts_scale)}, "set the input ts scale", "scale" },
4146 { "metadata", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(metadata)}, "add metadata", "string=string" },
4147 { "dframes", HAS_ARG | OPT_FUNC2, {(void*)opt_data_frames}, "set the number of data frames to record", "number" },
4148 { "benchmark", OPT_BOOL | OPT_EXPERT, {(void*)&do_benchmark},
4149 "add timings for benchmarking" },
4150 { "timelimit", HAS_ARG, {(void*)opt_timelimit}, "set max runtime in seconds", "limit" },
4151 { "dump", OPT_BOOL | OPT_EXPERT, {(void*)&do_pkt_dump},
4152 "dump each input packet" },
4153 { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump},
4154 "when dumping packets, also dump the payload" },
4155 { "re", OPT_BOOL | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(rate_emu)}, "read input at native frame rate", "" },
4156 { "target", HAS_ARG | OPT_FUNC2, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" },
4157 { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" },
4158 { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" },
4159 { "adrift_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&audio_drift_threshold}, "audio drift threshold", "threshold" },
4160 { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" },
4161 { "copytb", OPT_BOOL | OPT_EXPERT, {(void*)©_tb}, "copy input stream time base when stream copying" },
4162 { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, //
4163 { "dts_delta_threshold", HAS_ARG | OPT_FLOAT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "threshold" },
4164 { "xerror", OPT_BOOL, {(void*)&exit_on_error}, "exit on error", "error" },
4165 { "copyinkf", OPT_BOOL | OPT_EXPERT | OPT_SPEC, {.off = OFFSET(copy_initial_nonkeyframes)}, "copy initial non-keyframes" },
4166 { "frames", OPT_INT64 | HAS_ARG | OPT_SPEC, {.off = OFFSET(max_frames)}, "set the number of frames to record", "number" },
4167 { "tag", OPT_STRING | HAS_ARG | OPT_SPEC, {.off = OFFSET(codec_tags)}, "force codec tag/fourcc", "fourcc/tag" },
4168 { "q", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4169 { "qscale", HAS_ARG | OPT_EXPERT | OPT_DOUBLE | OPT_SPEC, {.off = OFFSET(qscale)}, "use fixed quality scale (VBR)", "q" },
4171 { "filter", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(filters)}, "set stream filterchain", "filter_list" },
4173 { "stats", OPT_BOOL, {&print_stats}, "print progress report during encoding", },
4174 { "attach", HAS_ARG | OPT_FUNC2, {(void*)opt_attach}, "add an attachment to the output file", "filename" },
4175 { "dump_attachment", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(dump_attachment)}, "extract an attachment into a file", "filename" },
4178 { "vframes", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_frames}, "set the number of video frames to record", "number" },
4179 { "r", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_rates)}, "set frame rate (Hz value, fraction or abbreviation)", "rate" },
4180 { "s", HAS_ARG | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_sizes)}, "set frame size (WxH or abbreviation)", "size" },
4181 { "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" },
4182 { "pix_fmt", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(frame_pix_fmts)}, "set pixel format", "format" },
4183 { "vn", OPT_BOOL | OPT_VIDEO | OPT_OFFSET, {.off = OFFSET(video_disable)}, "disable video" },
4184 { "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
4185 { "rc_override", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(rc_overrides)}, "rate control override for specific intervals", "override" },
4186 { "vcodec", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_codec}, "force video codec ('copy' to copy stream)", "codec" },
4187 { "same_quant", OPT_BOOL | OPT_VIDEO, {(void*)&same_quant},
4188 "use same quantizer as source (implies VBR)" },
4189 { "pass", HAS_ARG | OPT_VIDEO, {(void*)opt_pass}, "select the pass number (1 or 2)", "n" },
4190 { "passlogfile", HAS_ARG | OPT_STRING | OPT_VIDEO, {(void*)&pass_logfilename_prefix}, "select two pass log file name prefix", "prefix" },
4191 { "deinterlace", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&do_deinterlace},
4192 "deinterlace pictures" },
4193 { "vstats", OPT_EXPERT | OPT_VIDEO, {(void*)&opt_vstats}, "dump video coding statistics to file" },
4194 { "vstats_file", HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)opt_vstats_file}, "dump video coding statistics to file", "file" },
4196 { "vf", HAS_ARG | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_filters}, "video filters", "filter list" },
4198 { "intra_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(intra_matrices)}, "specify intra matrix coeffs", "matrix" },
4199 { "inter_matrix", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_STRING | OPT_SPEC, {.off = OFFSET(inter_matrices)}, "specify inter matrix coeffs", "matrix" },
4200 { "top", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_INT| OPT_SPEC, {.off = OFFSET(top_field_first)}, "top=1/bottom=0/auto=-1 field first", "" },
4201 { "dc", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_dc_precision}, "intra_dc_precision", "precision" },
4202 { "vtag", HAS_ARG | OPT_EXPERT | OPT_VIDEO | OPT_FUNC2, {(void*)opt_video_tag}, "force video tag/fourcc", "fourcc/tag" },
4203 { "qphist", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, { (void *)&qp_hist }, "show QP histogram" },
4204 { "force_fps", OPT_BOOL | OPT_EXPERT | OPT_VIDEO | OPT_SPEC, {.off = OFFSET(force_fps)}, "force the selected framerate, disable the best supported framerate selection" },
4205 { "streamid", HAS_ARG | OPT_EXPERT | OPT_FUNC2, {(void*)opt_streamid}, "set the value of an outfile streamid", "streamIndex:value" },
4206 { "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" },
4209 { "aframes", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_frames}, "set the number of audio frames to record", "number" },
4210 { "aq", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_qscale}, "set audio quality (codec-specific)", "quality", },
4211 { "ar", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_sample_rate)}, "set audio sampling rate (in Hz)", "rate" },
4212 { "ac", HAS_ARG | OPT_AUDIO | OPT_INT | OPT_SPEC, {.off = OFFSET(audio_channels)}, "set number of audio channels", "channels" },
4213 { "an", OPT_BOOL | OPT_AUDIO | OPT_OFFSET, {.off = OFFSET(audio_disable)}, "disable audio" },
4214 { "acodec", HAS_ARG | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_codec}, "force audio codec ('copy' to copy stream)", "codec" },
4215 { "atag", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_FUNC2, {(void*)opt_audio_tag}, "force audio tag/fourcc", "fourcc/tag" },
4216 { "vol", OPT_INT | HAS_ARG | OPT_AUDIO, {(void*)&audio_volume}, "change audio volume (256=normal)" , "volume" }, //
4217 { "sample_fmt", HAS_ARG | OPT_EXPERT | OPT_AUDIO | OPT_SPEC | OPT_STRING, {.off = OFFSET(sample_fmts)}, "set sample format", "format" },
4219 /* subtitle options */
4220 { "sn", OPT_BOOL | OPT_SUBTITLE | OPT_OFFSET, {.off = OFFSET(subtitle_disable)}, "disable subtitle" },
4221 { "scodec", HAS_ARG | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_codec}, "force subtitle codec ('copy' to copy stream)", "codec" },
4222 { "stag", HAS_ARG | OPT_EXPERT | OPT_SUBTITLE | OPT_FUNC2, {(void*)opt_subtitle_tag}, "force subtitle tag/fourcc", "fourcc/tag" },
4225 { "isync", OPT_BOOL | OPT_EXPERT | OPT_GRAB, {(void*)&input_sync}, "sync read on input", "" },
4228 { "muxdelay", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_max_delay)}, "set the maximum demux-decode delay", "seconds" },
4229 { "muxpreload", OPT_FLOAT | HAS_ARG | OPT_EXPERT | OPT_OFFSET, {.off = OFFSET(mux_preload)}, "set the initial demux-decode delay", "seconds" },
4231 { "bsf", HAS_ARG | OPT_STRING | OPT_SPEC, {.off = OFFSET(bitstream_filters)}, "A comma-separated list of bitstream filters", "bitstream_filters" },
4233 /* data codec support */
4234 { "dcodec", HAS_ARG | OPT_DATA | OPT_FUNC2, {(void*)opt_data_codec}, "force data codec ('copy' to copy stream)", "codec" },
4236 { "default", HAS_ARG | OPT_AUDIO | OPT_VIDEO | OPT_EXPERT, {(void*)opt_default}, "generic catch all option", "" },
4240 int main(int argc, char **argv)
4242 OptionsContext o = { 0 };
4247 av_log_set_flags(AV_LOG_SKIP_REPEATED);
4248 parse_loglevel(argc, argv, options);
4250 avcodec_register_all();
4252 avdevice_register_all();
4255 avfilter_register_all();
4258 avformat_network_init();
4263 parse_options(&o, argc, argv, options, opt_output_file);
4265 if(nb_output_files <= 0 && nb_input_files == 0) {
4267 av_log(NULL, AV_LOG_WARNING, "Use -h to get full help or, even better, run 'man %s'\n", program_name);
4271 /* file converter / grab */
4272 if (nb_output_files <= 0) {
4273 fprintf(stderr, "At least one output file must be specified\n");
4277 if (nb_input_files == 0) {
4278 av_log(NULL, AV_LOG_FATAL, "At least one input file must be specified\n");
4283 if (transcode(output_files, nb_output_files, input_files, nb_input_files) < 0)
4285 ti = getutime() - ti;
4287 int maxrss = getmaxrss() / 1024;
4288 printf("bench: utime=%0.3fs maxrss=%ikB\n", ti / 1000000.0, maxrss);